diff options
Diffstat (limited to 'net-p2p/py-bittorrent-devel/files/zurllib.py')
-rw-r--r-- | net-p2p/py-bittorrent-devel/files/zurllib.py | 61 |
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() |