Various utilities to deal with HTTP stuff.


Keywords
http, dechunk, decompress, client, request, asynchronous
License
MIT
Install
pip install httputil==0.6.2

Documentation

httputil

Utilities for dealing with HTTP data

Example httputil.read_body_stream() usage:

    import httputil

    with open(http_file_path, 'rb') as fh:
        print(b''.join(httputil.read_body_stream(
            fh, chunked=True, compression=httputil.GZIP))

Example request engines use to implement API clients:

    from httputil.request_engines import async
    from httputil.request_engines import sync
    from httputil.request_engines import errors


    DEF_REQUEST_TIMEOUT = 10
    DEF_CONNECT_TIMEOUT = 3
    DEF_NUM_RETRIES = 3


    log = logging.getLogger('http_client')

    API_BASE_URL = 'http://echo.jsontest.com'
    ECHO_URL = '/key/value/one/two'
    HEADERS = {'Content-Type': 'application/json'}


    class SyncAPIClient(object):

        def __init__(self, connect_timeout=DEF_CONNECT_TIMEOUT,
                     request_timeout=DEF_REQUEST_TIMEOUT,
                     connection_retries=DEF_NUM_RETRIES):
            """Constructor.
            """

            self._engine = sync.SyncRequestEngine(
                API_BASE_URL, connect_timeout, request_timeout, connection_retries)

        def echo(self):

            return self._engine.request(ECHO_URL, headers=HEADERS,
                                        result_callback=lambda res: json.loads(res))


    class AsyncAPIClient(object):

        def __init__(self, connect_timeout=DEF_CONNECT_TIMEOUT,
                     request_timeout=DEF_REQUEST_TIMEOUT,
                     connection_retries=DEF_NUM_RETRIES):
            """Constructor.
            """

            self._engine = async.AsyncRequestEngine(
                API_BASE_URL, connect_timeout, request_timeout, connection_retries)

        def echo(self):

            return self._engine.request(ECHO_URL, headers=HEADERS,
                                        result_callback=lambda res: json.loads(res))


    @gen.coroutine
    def example_async_client(api_client):
        """Example async client.
        """

        try:
            pprint((yield from api_client.echo()))
        except errors.RequestError as exc:
            log.exception('Exception occurred: %s', exc)

        yield gen.Task(lambda *args, **kwargs: ioloop.IOLoop.current().stop())


    def example_sync_client(api_client):
        """Example sync client use with.
        """

        try:
            pprint(api_client.echo())
        except errors.RequestError as exc:
            log.exception('Exception occurred: %s', exc)


    def main():
        """Run the examples.
        """

        logging.basicConfig(level=logging.INFO)

        example_sync_client(SyncAPIClient())
        example_async_client(AsyncAPIClient())

        io_loop = ioloop.IOLoop.current()
        io_loop.start()


    if __name__ == '__main__':
        main()