def __init__(self, agent=None, timeout=60, keep_alive=1, default_headers={}, max_redirect=7, with_exceptions=False): self.timeout = timeout self.max_redirect = max_redirect self._handlers = Handlers() self._with_exceptions = with_exceptions if agent is None: self.agent = "python-httpclient/{version}".format( version=__version__) else: self.agent = agent if len(default_headers) == 0: default_headers = [( 'Connection', 'keep-alive', )] self._default_headers = Headers(default_headers) if 'User-Agent' not in default_headers: self._default_headers.add('User-Agent', self.agent) self._default_headers.add('User-Agent', 'foooo') self._poolmanager = PoolManager( maxsize=keep_alive )
def test_date_header(self): headers = Headers([self.ct_headers]) now = datetime(2011, 12, 12, 12, 0, 0) headers.if_unmodified_since = now self.assertEqual(headers.if_unmodified_since.year, now.year) self.assertEqual(headers.get('If-Unmodified-Since'), 'Mon, 12 Dec 2011 12:00:00 GMT') headers.if_modified_since = 'Mon, 12 Dec 2011 12:00:00 GMT' self.assertEqual(headers.if_modified_since.year, now.year)
def test_set(self): headers = Headers() headers.add('Content-Type', 'application/json') headers.set('Content-Type', 'application/xml') self.assertEqual(headers.get('Content-Type'), 'application/xml') headers = Headers() headers.set('Content-Type', 'application/xml') self.assertEqual(headers.get('Content-Type'), 'application/xml')
def test_multi(self): headers = Headers() self.assertTrue(headers) headers.add('X-Foo', 'bar') headers.add('X-Foo', 'baz') self.assertEqual(headers.get('X-Foo'), 'bar') self.assertEqual(headers.get_all('X-Foo'), ['bar', 'baz']) headers = Headers() headers.add('X-Foo', 'bar', 'baz', 'foo') self.assertEqual(headers.get_all('X-Foo'), ['bar', 'baz', 'foo']) self.assertEqual(headers.get_all('x-fOo'), ['bar', 'baz', 'foo'])
def test_headers(self): request = Request('GET', 'http', {'Connection': 'keep-alive'}) self.assertIsInstance(request.headers, Headers) headers = Headers({'Connection': 'keep-alive'}) request = Request('GET', 'http', headers) self.assertTrue(request) self.assertEqual(request.header('connection'), 'keep-alive')
def test_normalization(self): headers = Headers([self.ct_headers]) self.assertTrue(headers.get('Content-Type')) self.assertTrue(headers.get('content-type')) self.assertEqual(headers.get('content-type'), 'application/json') headers.add('User-Agent', 'fluffy') self.assertTrue(headers.get('User-Agent')) self.assertTrue(headers.get('user-agent')) self.assertEqual(headers.get('user-agent'), 'fluffy')
def test_content(self): headers = Headers([self.ct_headers]) self.assertFalse(headers.content_is_text) def test_ct(ct, should_be): headers.remove('Content-Type') headers.add('Content-Type', ct) method = getattr(headers, should_be) self.assertTrue(method) test_ct('application/json', 'content_is_json') test_ct('text/html', 'content_is_text') test_ct('application/xhtml+xml', 'content_is_xhtml') test_ct('text/xml', 'content_is_xml') test_ct('application/xml', 'content_is_xml') test_ct('application/xhtml+xml', 'content_is_xml') test_ct('application/xhtml+xml; charset=UTF-8', 'content_is_xml')
def _build_response(self, r, request): status = r.status headers = Headers(r.headers) content = r.data resp = Response( status=status, headers=headers, content=content, message=r.reason, request=request ) new_resp = self._handlers.dispatch('response_done', resp) if new_resp is not None: resp = new_resp req = self._handlers.dispatch('response_redirect', resp) if req is not None and isinstance(req, Request): return self.request(req) return resp
def test_simple(self): headers = Headers([self.ct_headers]) self.assertTrue(headers) self.assertEqual(headers.content_type, 'application/json')
def test_remove(self): headers = Headers([self.ct_headers]) headers.remove('Content-Type') ct = headers.content_type self.assertFalse(ct)
class HTTPClient(object): def __init__(self, agent=None, timeout=60, keep_alive=1, default_headers={}, max_redirect=7, with_exceptions=False): self.timeout = timeout self.max_redirect = max_redirect self._handlers = Handlers() self._with_exceptions = with_exceptions if agent is None: self.agent = "python-httpclient/{version}".format( version=__version__) else: self.agent = agent if len(default_headers) == 0: default_headers = [( 'Connection', 'keep-alive', )] self._default_headers = Headers(default_headers) if 'User-Agent' not in default_headers: self._default_headers.add('User-Agent', self.agent) self._default_headers.add('User-Agent', 'foooo') self._poolmanager = PoolManager( maxsize=keep_alive ) def HTTPException(fn): def wrapper(*args): res = fn(*args) if args[0]._with_exceptions: if res.is_error: raise http_exception(res) return res return wrapper def add_handler(self, position, cb): self._handlers.add_handler(position, cb) def remove_handler(self, position): self._handler.remove_handler(position) def default_header(self, key): return self.default_headers.get('key') @property def default_headers(self): return self._default_headers @HTTPException def request(self, request): return self._request(request) @HTTPException def head(self, url, headers={}): request = Request('HEAD', url, headers=headers) return self._request(request) @HTTPException def get(self, url, headers={}): request = Request('GET', url, headers=headers) return self._request(request) @HTTPException def put(self, url, headers={}, content=None): request = Request('PUT', url, headers=headers, content=content) return self._request(request) @HTTPException def post(self, url, headers={}, content=None): request = Request('POST', url, headers=headers, content=content) return self._request(request) @HTTPException def delete(self, url, headers={}, content=None): request = Request('DELETE', url, headers=headers) return self._request(request) @HTTPException def mirror(self, url, filename): req = Request('GET', url) res = self.request(req) if res.is_success: f = open(filename, 'w') f.write(res.content) f.close() last_modified = Date.time2epoch(res.last_modified) if last_modified: os.utime(file, (last_modified, last_modified)) def _request(self, request): try: resp = self._make_request(request) except Exception, e: print e raise e if resp.is_redirect and len(resp.redirects) < self.max_redirect: try: return self._follow_redirect(resp, request) except Exception, e: raise e
def _merge_headers(self, headers): final_headers = Headers( self.default_headers.items() + headers.items()) return final_headers
def test_iteritems(self): headers = Headers([self.ct_headers])
def test_str(self): headers = Headers([self.ct_headers])
def test_content_params(self): headers = Headers({'Content-type': 'text/html; charset=UTF-8'}) self.assertEqual(headers.content_type_params, {'charset': 'UTF-8'}) headers = Headers({'Content-type': 'text/html'}) self.assertEqual(headers.content_type_params, {})