zurllib.py

来自「这是一个嵌入式linux系统下的命令工具包」· Python 代码 · 共 101 行

PY
101
字号
# Written by John Hoffman# see LICENSE.txt for license informationfrom httplib import HTTPConnection, HTTPSConnection, HTTPExceptionfrom urlparse import urlparsefrom bencode import bdecodeimport socketfrom gzip import GzipFilefrom StringIO import StringIOfrom urllib import quote, unquotefrom __init__ import product_name, version_shortVERSION = product_name+'/'+version_shortMAX_REDIRECTS = 10class btHTTPcon(HTTPConnection): # attempt to add automatic connection timeout    def connect(self):        HTTPConnection.connect(self)        try:            self.sock.settimeout(30)        except:            passclass btHTTPScon(HTTPSConnection): # attempt to add automatic connection timeout    def connect(self):        HTTPSConnection.connect(self)        try:            self.sock.settimeout(30)        except:            pass class urlopen:    def __init__(self, url):        self.tries = 0        self._open(url.strip())        self.error_return = None    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' and scheme != 'https':            raise IOError, ('url error', 'unknown url type', scheme, url)        url = path        if pars:            url += ';'+pars        if query:            url += '?'+query#        if fragment:        try:            if scheme == 'http':                self.connection = btHTTPcon(netloc)            else:                self.connection = btHTTPScon(netloc)            self.connection.request('GET', url, None,                                { 'User-Agent': VERSION,                                  'Accept-Encoding': 'gzip' } )            self.response = self.connection.getresponse()        except HTTPException, e:            raise IOError, ('http error', str(e))        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:            try:                data = self._read()                d = bdecode(data)                if d.has_key('failure reason'):                    self.error_return = data                    return            except:                pass            raise IOError, ('http error', status, self.response.reason)    def read(self):        if self.error_return:            return self.error_return        return self._read()    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()

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?