aboutsummaryrefslogtreecommitdiff
path: root/net-p2p/py-bittorrent-devel/files/zurllib.py
diff options
context:
space:
mode:
Diffstat (limited to 'net-p2p/py-bittorrent-devel/files/zurllib.py')
-rw-r--r--net-p2p/py-bittorrent-devel/files/zurllib.py61
1 files changed, 61 insertions, 0 deletions
diff --git a/net-p2p/py-bittorrent-devel/files/zurllib.py b/net-p2p/py-bittorrent-devel/files/zurllib.py
new file mode 100644
index 000000000000..a99ca51142bb
--- /dev/null
+++ b/net-p2p/py-bittorrent-devel/files/zurllib.py
@@ -0,0 +1,61 @@
+# Written by John Hoffman
+# see LICENSE.txt for license information
+
+from httplib import HTTPConnection
+from urlparse import urlparse
+import socket
+from gzip import GzipFile
+from StringIO import StringIO
+from urllib import quote, unquote
+from __init__ import version
+
+MAX_REDIRECTS = 10
+
+class urlopen:
+ def __init__(self, url):
+ self.tries = 0
+ self._open(url)
+
+ def _open(self, url):
+ self.tries += 1
+ if self.tries > MAX_REDIRECTS:
+ raise IOError, ('http error', 500,
+ "Internal Server Error: Redirect Recursion")
+ (scheme, netloc, path, pars, query, fragment) = urlparse(url)
+ if scheme != 'http':
+ raise IOError, ('url error', 'unknown url type', scheme, url)
+ url = path
+ if pars:
+ url += ';'+pars
+ if query:
+ url += '?'+query
+# if fragment:
+ self.connection = HTTPConnection(netloc)
+ self.connection.request('GET', url, None,
+ { 'User-Agent': 'BitTorrent/' + version,
+ 'Accept-Encoding': 'gzip' } )
+ self.response = self.connection.getresponse()
+ status = self.response.status
+ if status in (301,302):
+ try:
+ self.connection.close()
+ except:
+ pass
+ self._open(self.response.getheader('Location'))
+ return
+ if status != 200:
+ raise IOError, ('http error', status, self.response.reason)
+
+ def read(self):
+ data = self.response.read()
+ if self.response.getheader('Content-Encoding','').find('gzip') >= 0:
+ try:
+ compressed = StringIO(data)
+ f = GzipFile(fileobj = compressed)
+ data = f.read()
+ except:
+ raise IOError, ('http error', 'got corrupt response')
+ return data
+
+ def close(self):
+ self.connection.close()