Metadata-Version: 2.0
Name: aiohttp
Version: 1.0.5
Summary: http client/server for asyncio
Home-page: https://github.com/KeepSafe/aiohttp/
Author: Andrew Svetlov
Author-email: andrew.svetlov@gmail.com
License: Apache 2
Platform: UNKNOWN
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Intended Audience :: Developers
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Topic :: Internet :: WWW/HTTP
Requires-Dist: async-timeout
Requires-Dist: chardet
Requires-Dist: multidict (>=2.0)

http client/server for asyncio
==============================

.. image:: https://raw.github.com/KeepSafe/aiohttp/master/docs/_static/aiohttp-icon-128x128.png
  :height: 64px
  :width: 64px
  :alt: aiohttp logo

.. image:: https://travis-ci.org/KeepSafe/aiohttp.svg?branch=master
  :target:  https://travis-ci.org/KeepSafe/aiohttp
  :align: right

.. image:: https://codecov.io/gh/KeepSafe/aiohttp/branch/master/graph/badge.svg
  :target: https://codecov.io/gh/KeepSafe/aiohttp

.. image:: https://badge.fury.io/py/aiohttp.svg
    :target: https://badge.fury.io/py/aiohttp

Features
--------

- Supports both client and server side of HTTP protocol.
- Supports both client and server Web-Sockets out-of-the-box.
- Web-server has middlewares and pluggable routing.


Getting started
---------------

Client
^^^^^^

To retrieve something from the web:

.. code-block:: python

  import aiohttp
  import asyncio

  async def fetch(session, url):
      with aiohttp.Timeout(10, loop=session.loop):
          async with session.get(url) as response:
              return await response.text()

  async def main(loop):
      async with aiohttp.ClientSession(loop=loop) as session:
          html = await fetch(session, 'http://python.org')
          print(html)

  if __name__ == '__main__':
      loop = asyncio.get_event_loop()
      loop.run_until_complete(main(loop))


Server
^^^^^^

This is simple usage example:

.. code-block:: python

    from aiohttp import web

    async def handle(request):
        name = request.match_info.get('name', "Anonymous")
        text = "Hello, " + name
        return web.Response(text=text)

    async def wshandler(request):
        ws = web.WebSocketResponse()
        await ws.prepare(request)

        async for msg in ws:
            if msg.type == web.MsgType.text:
                ws.send_str("Hello, {}".format(msg.data))
            elif msg.type == web.MsgType.binary:
                ws.send_bytes(msg.data)
            elif msg.type == web.MsgType.close:
                break

        return ws


    app = web.Application()
    app.router.add_get('/echo', wshandler)
    app.router.add_get('/', handle)
    app.router.add_get('/{name}', handle)

    web.run_app(app)


Note: examples are written for Python 3.5+ and utilize PEP-492 aka
async/await.  If you are using Python 3.4 please replace ``await`` with
``yield from`` and ``async def`` with ``@coroutine`` e.g.::

    async def coro(...):
        ret = await f()

should be replaced by::

    @asyncio.coroutine
    def coro(...):
        ret = yield from f()

Documentation
-------------

https://aiohttp.readthedocs.io/

Discussion list
---------------

*aio-libs* google group: https://groups.google.com/forum/#!forum/aio-libs

Requirements
------------

- Python >= 3.4.2
- chardet_
- multidict_

Optionally you may install the cChardet_ and aiodns_ libraries (highly
recommended for sake of speed).

.. _chardet: https://pypi.python.org/pypi/chardet
.. _aiodns: https://pypi.python.org/pypi/aiodns
.. _multidict: https://pypi.python.org/pypi/multidict
.. _cChardet: https://pypi.python.org/pypi/cchardet

License
-------

``aiohttp`` is offered under the Apache 2 license.


Source code
------------

The latest developer version is available in a github repository:
https://github.com/KeepSafe/aiohttp

Benchmarks
----------

If you are interested in by efficiency, AsyncIO community maintains a
list of benchmarks on the official wiki:
https://github.com/python/asyncio/wiki/Benchmarks

CHANGES
=======

1.0.5 (2016-10-11)
------------------

- Fix StreamReader._read_nowait to return all available
  data up to the requested amount #1297


1.0.4 (2016-09-22)
------------------

- Fix FlowControlStreamReader.read_nowait so that it checks
  whether the transport is paused #1206


1.0.2 (2016-09-22)
------------------

- Make CookieJar compatible with 32-bit systems #1188

- Add missing `WSMsgType` to `web_ws.__all__`, see #1200

- Fix `CookieJar` ctor when called with `loop=None` #1203

- Fix broken upper-casing in wsgi support #1197


1.0.1 (2016-09-16)
------------------

- Restore `aiohttp.web.MsgType` alias for `aiohttp.WSMsgType` for sake
  of backward compatibility #1178

- Tune alabaster schema.

- Use `text/html` content type for displaying index pages by static
  file handler.

- Fix `AssertionError` in static file handling #1177

- Fix access log formats `%O` and `%b` for static file handling

- Remove `debug` setting of GunicornWorker, use `app.debug`
  to control its debug-mode instead


1.0.0 (2016-09-16)
-------------------

- Change default size for client session's connection pool from
  unlimited to 20 #977

- Add IE support for cookie deletion. #994

- Remove deprecated `WebSocketResponse.wait_closed` method (BACKWARD
  INCOMPATIBLE)

- Remove deprecated `force` parameter for `ClientResponse.close`
  method (BACKWARD INCOMPATIBLE)

- Avoid using of mutable CIMultiDict kw param in make_mocked_request
  #997

- Make WebSocketResponse.close a little bit faster by avoiding new
  task creating just for timeout measurement

- Add `proxy` and `proxy_auth` params to `client.get()` and family,
  deprecate `ProxyConnector` #998

- Add support for websocket send_json and receive_json, synchronize
  server and client API for websockets #984

- Implement router shourtcuts for most useful HTTP methods, use
  `app.router.add_get()`, `app.router.add_post()` etc. instead of
  `app.router.add_route()` #986

- Support SSL connections for gunicorn worker #1003

- Move obsolete examples to legacy folder

- Switch to multidict 2.0 and title-cased strings #1015

- `{FOO}e` logger format is case-sensitive now

- Fix logger report for unix socket 8e8469b

- Rename aiohttp.websocket to aiohttp._ws_impl

- Rename aiohttp.MsgType tp aiohttp.WSMsgType

- Introduce aiohttp.WSMessage officially

- Rename Message -> WSMessage

- Remove deprecated decode param from resp.read(decode=True)

- Use 5min default client timeout #1028

- Relax HTTP method validation in UrlDispatcher #1037

- Pin minimal supported asyncio version to 3.4.2+ (`loop.is_close()`
  should be present)

- Remove aiohttp.websocket module (BACKWARD INCOMPATIBLE)
  Please use high-level client and server approaches

- Link header for 451 status code is mandatory

- Fix test_client fixture to allow multiple clients per test #1072

- make_mocked_request now accepts dict as headers #1073

- Add Python 3.5.2/3.6+ compatibility patch for async generator
  protocol change #1082

- Improvement test_client can accept instance object #1083

- Simplify ServerHttpProtocol implementation #1060

- Add a flag for optional showing directory index for static file
  handling #921

- Define `web.Application.on_startup()` signal handler #1103

- Drop ChunkedParser and LinesParser #1111

- Call `Application.startup` in GunicornWebWorker #1105

- Fix client handling hostnames with 63 bytes when a port is given in
  the url #1044

- Implement proxy support for ClientSession.ws_connect #1025

- Return named tuple from WebSocketResponse.can_prepare #1016

- Fix access_log_format in `GunicornWebWorker` #1117

- Setup Content-Type to application/octet-stream by default #1124

- Deprecate debug parameter from app.make_handler(), use
  `Application(debug=True)` instead #1121

- Remove fragment string in request path #846

- Use aiodns.DNSResolver.gethostbyname() if available #1136

- Fix static file sending on uvloop when sendfile is available #1093

- Make prettier urls if query is empty dict #1143

- Fix redirects for HEAD requests #1147

- Default value for `StreamReader.read_nowait` is -1 from now #1150

- `aiohttp.StreamReader` is not inherited from `asyncio.StreamReader` from now
  (BACKWARD INCOMPATIBLE) #1150

- Streams documentation added #1150

- Add `multipart` coroutine method for web Request object #1067

- Publish ClientSession.loop property #1149

- Fix static file with spaces #1140

- Fix piling up asyncio loop by cookie expiration callbacks #1061

- Drop `Timeout` class for sake of `async_timeout` external library.
  `aiohttp.Timeout` is an alias for `async_timeout.timeout`

- `use_dns_cache` parameter of `aiohttp.TCPConnector` is `True` by
  default (BACKWARD INCOMPATIBLE) #1152

- `aiohttp.TCPConnector` uses asynchronous DNS resolver if available by
  default (BACKWARD INCOMPATIBLE) #1152

- Conform to RFC3986 - do not include url fragments in client requests #1174

- Drop `ClientSession.cookies` (BACKWARD INCOMPATIBLE) #1173

- Refactor `AbstractCookieJar` public API (BACKWARD INCOMPATIBLE) #1173

- Fix clashing cookies with have the same name but belong to different
  domains (BACKWARD INCOMPATIBLE) #1125

- Support binary Content-Transfer-Encoding #1169