Example #1
0
    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
        )
Example #2
0
    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)
Example #3
0
    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)
Example #4
0
    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')
Example #5
0
    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'])
Example #6
0
    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')
Example #7
0
    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')
Example #8
0
    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')
Example #9
0
    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')
Example #10
0
    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
Example #11
0
 def test_simple(self):
     headers = Headers([self.ct_headers])
     self.assertTrue(headers)
     self.assertEqual(headers.content_type, 'application/json')
Example #12
0
 def test_remove(self):
     headers = Headers([self.ct_headers])
     headers.remove('Content-Type')
     ct = headers.content_type
     self.assertFalse(ct)
Example #13
0
    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'])
Example #14
0
 def test_remove(self):
     headers = Headers([self.ct_headers])
     headers.remove('Content-Type')
     ct = headers.content_type
     self.assertFalse(ct)
Example #15
0
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
Example #16
0
 def _merge_headers(self, headers):
     final_headers = Headers(
             self.default_headers.items() + headers.items())
     return final_headers
Example #17
0
    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')
Example #18
0
 def test_iteritems(self):
     headers = Headers([self.ct_headers])
Example #19
0
 def test_str(self):
     headers = Headers([self.ct_headers])
Example #20
0
 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, {})