2.3.10 (2018-02-02)
===================

- Fix 100% CPU usage on HTTP GET and websocket connection just after it (#1955)

- Patch broken `ssl.match_hostname()` on Python<3.7 (#2674)

2.3.9 (2018-01-16)
==================

- Fix colon handing in path for dynamic resources (#2670)

2.3.8 (2018-01-15)
==================

- Do not use `yarl.unquote` internal function in aiohttp.  Fix
  incorrectly unquoted path part in URL dispatcher (#2662)

- Fix compatibility with `yarl==1.0.0` (#2662)

2.3.7 (2017-12-27)
==================

- Fixed race-condition for iterating addresses from the DNSCache. (#2620)
- Fix docstring for request.host (#2591)
- Fix docstring for request.remote (#2592)


2.3.6 (2017-12-04)
==================

- Correct `request.app` context (for handlers not just middlewares). (#2577)


2.3.5 (2017-11-30)
==================

- Fix compatibility with `pytest` 3.3+ (#2565)


2.3.4 (2017-11-29)
==================

- Make `request.app` point to proper application instance when using nested
  applications (with middlewares). (#2550)
- Change base class of ClientConnectorSSLError to ClientSSLError from
  ClientConnectorError. (#2563)
- Return client connection back to free pool on error in `connector.connect()`.
  (#2567)


2.3.3 (2017-11-17)
==================

- Having a `;` in Response content type does not assume it contains a charset
  anymore. (#2197)
- Use `getattr(asyncio, 'async')` for keeping compatibility with Python 3.7.
  (#2476)
- Ignore `NotImplementedError` raised by `set_child_watcher` from `uvloop`.
  (#2491)
- Fix warning in `ClientSession.__del__` by stopping to try to close it.
  (#2523)
- Fixed typo's in Third-party libraries page. And added async-v20 to the list
  (#2510)


2.3.2 (2017-11-01)
==================

- Fix passing client max size on cloning request obj. (#2385)
- Fix ClientConnectorSSLError and ClientProxyConnectionError for proxy
  connector. (#2408)
- Drop generated `_http_parser` shared object from tarball distribution. (#2414)
- Fix connector convert OSError to ClientConnectorError. (#2423)
- Fix connection attempts for multiple dns hosts. (#2424)
- Fix ValueError for AF_INET6 sockets if a preexisting INET6 socket to the
  `aiohttp.web.run_app` function. (#2431)
- `_SessionRequestContextManager` closes the session properly now. (#2441)
- Rename `from_env` to `trust_env` in client reference. (#2451)


2.3.1 (2017-10-18)
==================

- Relax attribute lookup in warning about old-styled middleware (#2340)


2.3.0 (2017-10-18)
==================

Features
--------

- Add SSL related params to `ClientSession.request` (#1128)
- Make enable_compression work on HTTP/1.0 (#1828)
- Deprecate registering synchronous web handlers (#1993)
- Switch to `multidict 3.0`. All HTTP headers preserve casing now but compared
  in case-insensitive way. (#1994)
- Improvement for `normalize_path_middleware`. Added possibility to handle URLs
  with query string. (#1995)
- Use towncrier for CHANGES.txt build (#1997)
- Implement `trust_env=True` param in `ClientSession`. (#1998)
- Added variable to customize proxy headers (#2001)
- Implement `router.add_routes` and router decorators. (#2004)
- Deprecated `BaseRequest.has_body` in favor of
  `BaseRequest.can_read_body` Added `BaseRequest.body_exists`
  attribute that stays static for the lifetime of the request (#2005)
- Provide `BaseRequest.loop` attribute (#2024)
- Make `_CoroGuard` awaitable and fix `ClientSession.close` warning message
  (#2026)
- Responses to redirects without Location header are returned instead of
  raising a RuntimeError (#2030)
- Added `get_client`, `get_server`, `setUpAsync` and `tearDownAsync` methods to
  AioHTTPTestCase (#2032)
- Add automatically a SafeChildWatcher to the test loop (#2058)
- add ability to disable automatic response decompression (#2110)
- Add support for throttling DNS request, avoiding the requests saturation when
  there is a miss in the DNS cache and many requests getting into the connector
  at the same time. (#2111)
- Use request for getting access log information instead of message/transport
  pair. Add `RequestBase.remote` property for accessing to IP of client
  initiated HTTP request. (#2123)
- json() raises a ContentTypeError exception if the content-type does not meet
  the requirements instead of raising a generic ClientResponseError. (#2136)
- Make the HTTP client able to return HTTP chunks when chunked transfer
  encoding is used. (#2150)
- add `append_version` arg into `StaticResource.url` and
  `StaticResource.url_for` methods for getting an url with hash (version) of
  the file. (#2157)
- Fix parsing the Forwarded header. * commas and semicolons are allowed inside
  quoted-strings; * empty forwarded-pairs (as in for=_1;;by=_2) are allowed; *
  non-standard parameters are allowed (although this alone could be easily done
  in the previous parser). (#2173)
- Don't require ssl module to run. aiohttp does not require SSL to function.
  The code paths involved with SSL will only be hit upon SSL usage. Raise
  `RuntimeError` if HTTPS protocol is required but ssl module is not present.
  (#2221)
- Accept coroutine fixtures in pytest plugin (#2223)
- Call `shutdown_asyncgens` before event loop closing on Python 3.6. (#2227)
- Speed up Signals when there are no receivers (#2229)
- Raise `InvalidURL` instead of `ValueError` on fetches with invalid URL.
  (#2241)
- Move `DummyCookieJar` into `cookiejar.py` (#2242)
- `run_app`: Make `print=None` disable printing (#2260)
- Support `brotli` encoding (generic-purpose lossless compression algorithm)
  (#2270)
- Add server support for WebSockets Per-Message Deflate. Add client option to
  add deflate compress header in WebSockets request header. If calling
  ClientSession.ws_connect() with `compress=15` the client will support deflate
  compress negotiation. (#2273)
- Support `verify_ssl`, `fingerprint`, `ssl_context` and `proxy_headers` by
  `client.ws_connect`. (#2292)
- Added `aiohttp.ClientConnectorSSLError` when connection fails due
  `ssl.SSLError` (#2294)
- `aiohttp.web.Application.make_handler` support `access_log_class` (#2315)
- Build HTTP parser extension in non-strict mode by default. (#2332)


Bugfixes
--------

- Clear auth information on redirecting to other domain (#1699)
- Fix missing app.loop on startup hooks during tests (#2060)
- Fix issue with synchronous session closing when using `ClientSession` as an
  asynchronous context manager. (#2063)
- Fix issue with `CookieJar` incorrectly expiring cookies in some edge cases.
  (#2084)
- Force use of IPv4 during test, this will make tests run in a Docker container
  (#2104)
- Warnings about unawaited coroutines now correctly point to the user's code.
  (#2106)
- Fix issue with `IndexError` being raised by the `StreamReader.iter_chunks()`
  generator. (#2112)
- Support HTTP 308 Permanent redirect in client class. (#2114)
- Fix `FileResponse` sending empty chunked body on 304. (#2143)
- Do not add `Content-Length: 0` to GET/HEAD/TRACE/OPTIONS requests by default.
  (#2167)
- Fix parsing the Forwarded header according to RFC 7239. (#2170)
- Securely determining remote/scheme/host #2171 (#2171)
- Fix header name parsing, if name is split into multiple lines (#2183)
- Handle session close during connection, `KeyError:
  <aiohttp.connector._TransportPlaceholder>` (#2193)
- Fixes uncaught `TypeError` in `helpers.guess_filename` if `name` is not a
  string (#2201)
- Raise OSError on async DNS lookup if resolved domain is an alias for another
  one, which does not have an A or CNAME record. (#2231)
- Fix incorrect warning in `StreamReader`. (#2251)
- Properly clone state of web request (#2284)
- Fix C HTTP parser for cases when status line is split into different TCP
  packets. (#2311)
- Fix `web.FileResponse` overriding user supplied Content-Type (#2317)


Improved Documentation
----------------------

- Add a note about possible performance degradation in `await resp.text()` if
  charset was not provided by `Content-Type` HTTP header. Pass explicit
  encoding to solve it. (#1811)
- Drop `disqus` widget from documentation pages. (#2018)
- Add a graceful shutdown section to the client usage documentation. (#2039)
- Document `connector_owner` parameter. (#2072)
- Update the doc of web.Application (#2081)
- Fix mistake about access log disabling. (#2085)
- Add example usage of on_startup and on_shutdown signals by creating and
  disposing an aiopg connection engine. (#2131)
- Document `encoded=True` for `yarl.URL`, it disables all yarl transformations.
  (#2198)
- Document that all app's middleware factories are run for every request.
  (#2225)
- Reflect the fact that default resolver is threaded one starting from aiohttp
  1.1 (#2228)


Deprecations and Removals
-------------------------

- Drop deprecated `Server.finish_connections` (#2006)
- Drop %O format from logging, use %b instead. Drop %e format from logging,
  environment variables are not supported anymore. (#2123)
- Drop deprecated secure_proxy_ssl_header support (#2171)
- Removed TimeService in favor of simple caching. TimeService also had a bug
  where it lost about 0.5 seconds per second. (#2176)
- Drop unused response_factory from static files API (#2290)


Misc
----

- #2013, #2014, #2048, #2094, #2149, #2187, #2214, #2225, #2243, #2248


2.2.5 (2017-08-03)
==================

- Don't raise deprecation warning on
  `loop.run_until_complete(client.close())` (#2065)

2.2.4 (2017-08-02)
==================

- Fix issue with synchronous session closing when using ClientSession
  as an asynchronous context manager.  (#2063)

2.2.3 (2017-07-04)
==================

- Fix `_CoroGuard` for python 3.4

2.2.2 (2017-07-03)
==================

- Allow `await session.close()` along with `yield from session.close()`


2.2.1 (2017-07-02)
==================

- Relax `yarl` requirement to 0.11+

- Backport #2026: `session.close` *is* a coroutine (#2029)


2.2.0 (2017-06-20)
==================

- Add doc for add_head, update doc for add_get. (#1944)

- Fixed consecutive calls for `Response.write_eof`.

- Retain method attributes (e.g. :code:`__doc__`) when registering synchronous
  handlers for resources. (#1953)

- Added signal TERM handling in `run_app` to gracefully exit (#1932)

- Fix websocket issues caused by frame fragmentation. (#1962)

- Raise RuntimeError is you try to set the Content Length and enable
  chunked encoding at the same time (#1941)

- Small update for `unittest_run_loop`

- Use CIMultiDict for ClientRequest.skip_auto_headers (#1970)

- Fix wrong startup sequence: test server and `run_app()` are not raise
  `DeprecationWarning` now (#1947)

- Make sure cleanup signal is sent if startup signal has been sent (#1959)

- Fixed server keep-alive handler, could cause 100% cpu utilization (#1955)

- Connection can be destroyed before response get processed if
  `await aiohttp.request(..)` is used (#1981)

- MultipartReader does not work with -OO (#1969)

- Fixed `ClientPayloadError` with blank `Content-Encoding` header (#1931)

- Support `deflate` encoding implemented in `httpbin.org/deflate` (#1918)

- Fix BadStatusLine caused by extra `CRLF` after `POST` data (#1792)

- Keep a reference to `ClientSession` in response object (#1985)

- Deprecate undocumented `app.on_loop_available` signal (#1978)



2.1.0 (2017-05-26)
==================

- Added support for experimental `async-tokio` event loop written in Rust
  https://github.com/PyO3/tokio

- Write to transport ``\r\n`` before closing after keepalive timeout,
  otherwise client can not detect socket disconnection. (#1883)

- Only call `loop.close` in `run_app` if the user did *not* supply a loop.
  Useful for allowing clients to specify their own cleanup before closing the
  asyncio loop if they wish to tightly control loop behavior

- Content disposition with semicolon in filename (#917)

- Added `request_info` to response object and `ClientResponseError`. (#1733)

- Added `history` to `ClientResponseError`. (#1741)

- Allow to disable redirect url re-quoting (#1474)

- Handle RuntimeError from transport (#1790)

- Dropped "%O" in access logger (#1673)

- Added `args` and `kwargs` to `unittest_run_loop`. Useful with other
  decorators, for example `@patch`. (#1803)

- Added `iter_chunks` to response.content object. (#1805)

- Avoid creating TimerContext when there is no timeout to allow
  compatibility with Tornado. (#1817) (#1180)

- Add `proxy_from_env` to `ClientRequest` to read from environment
  variables. (#1791)

- Add DummyCookieJar helper. (#1830)

- Fix assertion errors in Python 3.4 from noop helper. (#1847)

- Do not unquote `+` in match_info values (#1816)

- Use Forwarded, X-Forwarded-Scheme and X-Forwarded-Host for better scheme and
  host resolution. (#1134)

- Fix sub-application middlewares resolution order (#1853)

- Fix applications comparison (#1866)

- Fix static location in index when prefix is used (#1662)

- Make test server more reliable (#1896)

- Extend list of web exceptions, add HTTPUnprocessableEntity,
  HTTPFailedDependency, HTTPInsufficientStorage status codes (#1920)


2.0.7 (2017-04-12)
==================

- Fix *pypi* distribution

- Fix exception description (#1807)

- Handle socket error in FileResponse (#1773)

- Cancel websocket heartbeat on close (#1793)


2.0.6 (2017-04-04)
==================

- Keeping blank values for `request.post()` and `multipart.form()` (#1765)

- TypeError in data_received of ResponseHandler (#1770)

- Fix ``web.run_app`` not to bind to default host-port pair if only socket is
  passed (#1786)


2.0.5 (2017-03-29)
==================

- Memory leak with aiohttp.request (#1756)

- Disable cleanup closed ssl transports by default.

- Exception in request handling if the server responds before the body
  is sent (#1761)


2.0.4 (2017-03-27)
==================

- Memory leak with aiohttp.request (#1756)

- Encoding is always UTF-8 in POST data (#1750)

- Do not add "Content-Disposition" header by default (#1755)


2.0.3 (2017-03-24)
==================

- Call https website through proxy will cause error (#1745)

- Fix exception on multipart/form-data post if content-type is not set (#1743)


2.0.2 (2017-03-21)
==================

- Fixed Application.on_loop_available signal (#1739)

- Remove debug code


2.0.1 (2017-03-21)
==================

- Fix allow-head to include name on route (#1737)

- Fixed AttributeError in WebSocketResponse.can_prepare (#1736)


2.0.0 (2017-03-20)
==================

- Added `json` to `ClientSession.request()` method (#1726)

- Added session's `raise_for_status` parameter, automatically calls
  raise_for_status() on any request. (#1724)

- `response.json()` raises `ClientReponseError` exception if response's
  content type does not match (#1723)

  - Cleanup timer and loop handle on any client exception.

- Deprecate `loop` parameter for Application's constructor


`2.0.0rc1` (2017-03-15)
=======================

- Properly handle payload errors (#1710)

- Added `ClientWebSocketResponse.get_extra_info()` (#1717)

- It is not possible to combine Transfer-Encoding and chunked parameter,
  same for compress and Content-Encoding (#1655)

- Connector's `limit` parameter indicates total concurrent connections.
  New `limit_per_host` added, indicates total connections per endpoint. (#1601)

- Use url's `raw_host` for name resolution (#1685)

- Change `ClientResponse.url` to `yarl.URL` instance (#1654)

- Add max_size parameter to web.Request reading methods (#1133)

- Web Request.post() stores data in temp files (#1469)

- Add the `allow_head=True` keyword argument for `add_get` (#1618)

- `run_app` and the Command Line Interface now support serving over
  Unix domain sockets for faster inter-process communication.

- `run_app` now supports passing a preexisting socket object. This can be useful
  e.g. for socket-based activated applications, when binding of a socket is
  done by the parent process.

- Implementation for Trailer headers parser is broken (#1619)

- Fix FileResponse to not fall on bad request (range out of file size)

- Fix FileResponse to correct stream video to Chromes

- Deprecate public low-level api (#1657)

- Deprecate `encoding` parameter for ClientSession.request() method

- Dropped aiohttp.wsgi (#1108)

- Dropped `version` from ClientSession.request() method

- Dropped websocket version 76 support (#1160)

- Dropped: `aiohttp.protocol.HttpPrefixParser`  (#1590)

- Dropped: Servers response's `.started`, `.start()` and
  `.can_start()` method (#1591)

- Dropped:  Adding `sub app` via `app.router.add_subapp()` is deprecated
  use `app.add_subapp()` instead (#1592)

- Dropped: `Application.finish()` and `Application.register_on_finish()` (#1602)

- Dropped: `web.Request.GET` and `web.Request.POST`

- Dropped: aiohttp.get(), aiohttp.options(), aiohttp.head(),
  aiohttp.post(), aiohttp.put(), aiohttp.patch(), aiohttp.delete(), and
  aiohttp.ws_connect() (#1593)

- Dropped: `aiohttp.web.WebSocketResponse.receive_msg()` (#1605)

- Dropped: `ServerHttpProtocol.keep_alive_timeout` attribute and
  `keep-alive`, `keep_alive_on`, `timeout`, `log` constructor parameters (#1606)

- Dropped: `TCPConnector's`` `.resolve`, `.resolved_hosts`,
  `.clear_resolved_hosts()` attributes and `resolve` constructor
  parameter (#1607)

- Dropped `ProxyConnector` (#1609)


1.3.5 (2017-03-16)
==================

- Fixed None timeout support (#1720)


1.3.4 (2017-03-14)
==================

- Revert timeout handling in client request

- Fix StreamResponse representation after eof

- Fix file_sender to not fall on bad request (range out of file size)

- Fix file_sender to correct stream video to Chromes

- Fix NotImplementedError server exception (#1703)

- Clearer error message for URL without a host name. (#1691)

- Silence deprecation warning in __repr__ (#1690)

- IDN + HTTPS = `ssl.CertificateError` (#1685)


1.3.3 (2017-02-19)
==================

- Fixed memory leak in time service (#1656)


1.3.2 (2017-02-16)
==================

- Awaiting on WebSocketResponse.send_* does not work (#1645)

- Fix multiple calls to client ws_connect when using a shared header
  dict (#1643)

- Make CookieJar.filter_cookies() accept plain string parameter. (#1636)


1.3.1 (2017-02-09)
==================

- Handle CLOSING in WebSocketResponse.__anext__

- Fixed AttributeError 'drain' for server websocket handler (#1613)


1.3.0 (2017-02-08)
==================

- Multipart writer validates the data on append instead of on a
  request send (#920)

- Multipart reader accepts multipart messages with or without their epilogue
  to consistently handle valid and legacy behaviors (#1526) (#1581)

- Separate read + connect + request timeouts # 1523

- Do not swallow Upgrade header (#1587)

- Fix polls demo run application (#1487)

- Ignore unknown 1XX status codes in client (#1353)

- Fix sub-Multipart messages missing their headers on serialization (#1525)

- Do not use readline when reading the content of a part
  in the multipart reader (#1535)

- Add optional flag for quoting `FormData` fields (#916)

- 416 Range Not Satisfiable if requested range end > file size (#1588)

- Having a `:` or `@` in a route does not work (#1552)

- Added `receive_timeout` timeout for websocket to receive complete
  message. (#1325)

- Added `heartbeat` parameter for websocket to automatically send
  `ping` message. (#1024) (#777)

- Remove `web.Application` dependency from `web.UrlDispatcher` (#1510)

- Accepting back-pressure from slow websocket clients (#1367)

- Do not pause transport during set_parser stage (#1211)

- Lingering close does not terminate before timeout (#1559)

- `setsockopt` may raise `OSError` exception if socket is closed already (#1595)

- Lots of CancelledError when requests are interrupted (#1565)

- Allow users to specify what should happen to decoding errors
  when calling a responses `text()` method (#1542)

- Back port std module `http.cookies` for python3.4.2 (#1566)

- Maintain url's fragment in client response (#1314)

- Allow concurrently close WebSocket connection (#754)

- Gzipped responses with empty body raises ContentEncodingError (#609)

- Return 504 if request handle raises TimeoutError.

- Refactor how we use keep-alive and close lingering timeouts.

- Close response connection if we can not consume whole http
  message during client response release

- Abort closed ssl client transports, broken servers can keep socket
  open un-limit time (#1568)

- Log warning instead of `RuntimeError` is websocket connection is closed.

- Deprecated: `aiohttp.protocol.HttpPrefixParser`
  will be removed in 1.4 (#1590)

- Deprecated: Servers response's `.started`, `.start()` and
  `.can_start()` method will be removed in 1.4 (#1591)

- Deprecated: Adding `sub app` via `app.router.add_subapp()` is deprecated
  use `app.add_subapp()` instead, will be removed in 1.4 (#1592)

- Deprecated: aiohttp.get(), aiohttp.options(), aiohttp.head(), aiohttp.post(),
  aiohttp.put(), aiohttp.patch(), aiohttp.delete(), and aiohttp.ws_connect()
  will be removed in 1.4 (#1593)

- Deprecated: `Application.finish()` and `Application.register_on_finish()`
  will be removed in 1.4 (#1602)


1.2.0 (2016-12-17)
==================

- Extract `BaseRequest` from `web.Request`, introduce `web.Server`
  (former `RequestHandlerFactory`), introduce new low-level web server
  which is not coupled with `web.Application` and routing (#1362)

- Make `TestServer.make_url` compatible with `yarl.URL` (#1389)

- Implement range requests for static files (#1382)

- Support task attribute for StreamResponse (#1410)

- Drop `TestClient.app` property, use `TestClient.server.app` instead
  (BACKWARD INCOMPATIBLE)

- Drop `TestClient.handler` property, use `TestClient.server.handler` instead
  (BACKWARD INCOMPATIBLE)

- `TestClient.server` property returns a test server instance, was
  `asyncio.AbstractServer` (BACKWARD INCOMPATIBLE)

- Follow gunicorn's signal semantics in `Gunicorn[UVLoop]WebWorker` (#1201)

- Call worker_int and worker_abort callbacks in
  `Gunicorn[UVLoop]WebWorker` (#1202)

- Has functional tests for client proxy (#1218)

- Fix bugs with client proxy target path and proxy host with port (#1413)

- Fix bugs related to the use of unicode hostnames (#1444)

- Preserve cookie quoting/escaping (#1453)

- FileSender will send gzipped response if gzip version available (#1426)

- Don't override `Content-Length` header in `web.Response` if no body
  was set (#1400)

- Introduce `router.post_init()` for solving (#1373)

- Fix raise error in case of multiple calls of `TimeServive.stop()`

- Allow to raise web exceptions on router resolving stage (#1460)

- Add a warning for session creation outside of coroutine (#1468)

- Avoid a race when application might start accepting incoming requests
  but startup signals are not processed yet e98e8c6

- Raise a `RuntimeError` when trying to change the status of the HTTP response
  after the headers have been sent (#1480)

- Fix bug with https proxy acquired cleanup (#1340)

- Use UTF-8 as the default encoding for multipart text parts (#1484)


1.1.6 (2016-11-28)
==================

- Fix `BodyPartReader.read_chunk` bug about returns zero bytes before
  `EOF` (#1428)

1.1.5 (2016-11-16)
==================

- Fix static file serving in fallback mode (#1401)

1.1.4 (2016-11-14)
==================

- Make `TestServer.make_url` compatible with `yarl.URL` (#1389)

- Generate informative exception on redirects from server which
  does not provide redirection headers (#1396)


1.1.3 (2016-11-10)
==================

- Support *root* resources for sub-applications (#1379)


1.1.2 (2016-11-08)
==================

- Allow starting variables with an underscore (#1379)

- Properly process UNIX sockets by gunicorn worker (#1375)

- Fix ordering for `FrozenList`

- Don't propagate pre and post signals to sub-application (#1377)

1.1.1 (2016-11-04)
==================

- Fix documentation generation (#1120)

1.1.0 (2016-11-03)
==================

- Drop deprecated `WSClientDisconnectedError` (BACKWARD INCOMPATIBLE)

- Use `yarl.URL` in client API. The change is 99% backward compatible
  but `ClientResponse.url` is an `yarl.URL` instance now. (#1217)

- Close idle keep-alive connections on shutdown (#1222)

- Modify regex in AccessLogger to accept underscore and numbers (#1225)

- Use `yarl.URL` in web server API. `web.Request.rel_url` and
  `web.Request.url` are added. URLs and templates are percent-encoded
  now. (#1224)

- Accept `yarl.URL` by server redirections (#1278)

- Return `yarl.URL` by `.make_url()` testing utility (#1279)

- Properly format IPv6 addresses by `aiohttp.web.run_app` (#1139)

- Use `yarl.URL` by server API (#1288)

  * Introduce `resource.url_for()`, deprecate `resource.url()`.

  * Implement `StaticResource`.

  * Inherit `SystemRoute` from `AbstractRoute`

  * Drop old-style routes: `Route`, `PlainRoute`, `DynamicRoute`,
    `StaticRoute`, `ResourceAdapter`.

- Revert `resp.url` back to `str`, introduce `resp.url_obj` (#1292)

- Raise ValueError if BasicAuth login has a ":" character (#1307)

- Fix bug when ClientRequest send payload file with opened as
  open('filename', 'r+b') (#1306)

- Enhancement to AccessLogger (pass *extra* dict) (#1303)

- Show more verbose message on import errors (#1319)

- Added save and load functionality for `CookieJar` (#1219)

- Added option on `StaticRoute` to follow symlinks (#1299)

- Force encoding of `application/json` content type to utf-8 (#1339)

- Fix invalid invocations of `errors.LineTooLong` (#1335)

- Websockets: Stop `async for` iteration when connection is closed (#1144)

- Ensure TestClient HTTP methods return a context manager (#1318)

- Raise `ClientDisconnectedError` to `FlowControlStreamReader` read function
  if `ClientSession` object is closed by client when reading data. (#1323)

- Document deployment without `Gunicorn` (#1120)

- Add deprecation warning for MD5 and SHA1 digests when used for fingerprint
  of site certs in TCPConnector. (#1186)

- Implement sub-applications (#1301)

- Don't inherit `web.Request` from `dict` but implement
  `MutableMapping` protocol.

- Implement frozen signals

- Don't inherit `web.Application` from `dict` but implement
  `MutableMapping` protocol.

- Support freezing for web applications

- Accept access_log parameter in `web.run_app`, use `None` to disable logging

- Don't flap `tcp_cork` and `tcp_nodelay` in regular request handling.
  `tcp_nodelay` is still enabled by default.

- Improve performance of web server by removing premature computing of
  Content-Type if the value was set by `web.Response` constructor.

  While the patch boosts speed of trivial `web.Response(text='OK',
  content_type='text/plain)` very well please don't expect significant
  boost of your application -- a couple DB requests and business logic
  is still the main bottleneck.

- Boost performance by adding a custom time service (#1350)

- Extend `ClientResponse` with `content_type` and `charset`
  properties like in `web.Request`. (#1349)

- Disable aiodns by default (#559)

- Don't flap `tcp_cork` in client code, use TCP_NODELAY mode by default.

- Implement `web.Request.clone()` (#1361)

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)


0.22.5 (08-02-2016)
===================

- Pin miltidict version to >=1.2.2

0.22.3 (07-26-2016)
===================

- Do not filter cookies if unsafe flag provided (#1005)


0.22.2 (07-23-2016)
===================

- Suppress CancelledError when Timeout raises TimeoutError (#970)

- Don't expose `aiohttp.__version__`

- Add unsafe parameter to CookieJar (#968)

- Use unsafe cookie jar in test client tools

- Expose aiohttp.CookieJar name


0.22.1 (07-16-2016)
===================

- Large cookie expiration/max-age does not break an event loop from now
  (fixes (#967))


0.22.0 (07-15-2016)
===================

- Fix bug in serving static directory (#803)

- Fix command line arg parsing (#797)

- Fix a documentation chapter about cookie usage (#790)

- Handle empty body with gzipped encoding (#758)

- Support 451 Unavailable For Legal Reasons http status  (#697)

- Fix Cookie share example and few small typos in docs (#817)

- UrlDispatcher.add_route with partial coroutine handler (#814)

- Optional support for aiodns (#728)

- Add ServiceRestart and TryAgainLater websocket close codes (#828)

- Fix prompt message for `web.run_app` (#832)

- Allow to pass None as a timeout value to disable timeout logic (#834)

- Fix leak of connection slot during connection error (#835)

- Gunicorn worker with uvloop support
  `aiohttp.worker.GunicornUVLoopWebWorker` (#878)

- Don't send body in response to HEAD request (#838)

- Skip the preamble in MultipartReader (#881)

- Implement BasicAuth decode classmethod. (#744)

- Don't crash logger when transport is None (#889)

- Use a create_future compatibility wrapper instead of creating
  Futures directly (#896)

- Add test utilities to aiohttp (#902)

- Improve Request.__repr__ (#875)

- Skip DNS resolving if provided host is already an ip address (#874)

- Add headers to ClientSession.ws_connect (#785)

- Document that server can send pre-compressed data (#906)

- Don't add Content-Encoding and Transfer-Encoding if no body (#891)

- Add json() convenience methods to websocket message objects (#897)

- Add client_resp.raise_for_status() (#908)

- Implement cookie filter (#799)

- Include an example of middleware to handle error pages (#909)

- Fix error handling in StaticFileMixin (#856)

- Add mocked request helper (#900)

- Fix empty ALLOW Response header for cls based View (#929)

- Respect CONNECT method to implement a proxy server (#847)

- Add pytest_plugin (#914)

- Add tutorial

- Add backlog option to support more than 128 (default value in
  "create_server" function) concurrent connections (#892)

- Allow configuration of header size limits (#912)

- Separate sending file logic from StaticRoute dispatcher (#901)

- Drop deprecated share_cookies connector option (BACKWARD INCOMPATIBLE)

- Drop deprecated support for tuple as auth parameter.
  Use aiohttp.BasicAuth instead (BACKWARD INCOMPATIBLE)

- Remove deprecated `request.payload` property, use `content` instead.
  (BACKWARD INCOMPATIBLE)

- Drop all mentions about api changes in documentation for versions
  older than 0.16

- Allow to override default cookie jar (#963)

- Add manylinux wheel builds

- Dup a socket for sendfile usage (#964)

0.21.6 (05-05-2016)
===================

- Drop initial query parameters on redirects (#853)


0.21.5 (03-22-2016)
===================

- Fix command line arg parsing (#797)

0.21.4 (03-12-2016)
===================

- Fix ResourceAdapter: don't add method to allowed if resource is not
  match (#826)

- Fix Resource: append found method to returned allowed methods

0.21.2 (02-16-2016)
===================

- Fix a regression: support for handling ~/path in static file routes was
  broken (#782)

0.21.1 (02-10-2016)
===================

- Make new resources classes public (#767)

- Add `router.resources()` view

- Fix cmd-line parameter names in doc

0.21.0 (02-04-2016)
===================

- Introduce on_shutdown signal (#722)

- Implement raw input headers (#726)

- Implement web.run_app utility function (#734)

- Introduce on_cleanup signal

- Deprecate Application.finish() / Application.register_on_finish() in favor of
  on_cleanup.

- Get rid of bare aiohttp.request(), aiohttp.get() and family in docs (#729)

- Deprecate bare aiohttp.request(), aiohttp.get() and family (#729)

- Refactor keep-alive support (#737):

  - Enable keepalive for HTTP 1.0 by default

  - Disable it for HTTP 0.9 (who cares about 0.9, BTW?)

  - For keepalived connections

      - Send `Connection: keep-alive` for HTTP 1.0 only

      - don't send `Connection` header for HTTP 1.1

  - For non-keepalived connections

      - Send `Connection: close` for HTTP 1.1 only

      - don't send `Connection` header for HTTP 1.0

- Add version parameter to ClientSession constructor,
  deprecate it for session.request() and family (#736)

- Enable access log by default (#735)

- Deprecate app.router.register_route() (the method was not documented
  intentionally BTW).

- Deprecate app.router.named_routes() in favor of app.router.named_resources()

- route.add_static accepts pathlib.Path now (#743)

- Add command line support: `$ python -m aiohttp.web package.main` (#740)

- FAQ section was added to docs. Enjoy and fill free to contribute new topics

- Add async context manager support to ClientSession

- Document ClientResponse's host, method, url properties

- Use CORK/NODELAY in client API (#748)

- ClientSession.close and Connector.close are coroutines now

- Close client connection on exception in ClientResponse.release()

- Allow to read multipart parts without content-length specified (#750)

- Add support for unix domain sockets to gunicorn worker (#470)

- Add test for default Expect handler (#601)

- Add the first demo project

- Rename `loader` keyword argument in `web.Request.json` method. (#646)

- Add local socket binding for TCPConnector (#678)

0.20.2 (01-07-2016)
===================

- Enable use of `await` for a class based view (#717)

- Check address family to fill wsgi env properly (#718)

- Fix memory leak in headers processing (thanks to Marco Paolini) (#723)

0.20.1 (12-30-2015)
===================

- Raise RuntimeError is Timeout context manager was used outside of
  task context.

- Add number of bytes to stream.read_nowait (#700)

- Use X-FORWARDED-PROTO for wsgi.url_scheme when available


0.20.0 (12-28-2015)
===================

- Extend list of web exceptions, add HTTPMisdirectedRequest,
  HTTPUpgradeRequired, HTTPPreconditionRequired, HTTPTooManyRequests,
  HTTPRequestHeaderFieldsTooLarge, HTTPVariantAlsoNegotiates,
  HTTPNotExtended, HTTPNetworkAuthenticationRequired status codes (#644)

- Do not remove AUTHORIZATION header by WSGI handler (#649)

- Fix broken support for https proxies with authentication (#617)

- Get REMOTE_* and SEVER_* http vars from headers when listening on
  unix socket (#654)

- Add HTTP 308 support (#663)

- Add Tf format (time to serve request in seconds, %06f format) to
  access log (#669)

- Remove one and a half years long deprecated
  ClientResponse.read_and_close() method

- Optimize chunked encoding: use a single syscall instead of 3 calls
  on sending chunked encoded data

- Use TCP_CORK and TCP_NODELAY to optimize network latency and
  throughput (#680)

- Websocket XOR performance improved (#687)

- Avoid sending cookie attributes in Cookie header (#613)

- Round server timeouts to seconds for grouping pending calls.  That
  leads to less amount of poller syscalls e.g. epoll.poll(). (#702)

- Close connection on websocket handshake error (#703)

- Implement class based views (#684)

- Add *headers* parameter to ws_connect() (#709)

- Drop unused function `parse_remote_addr()` (#708)

- Close session on exception (#707)

- Store http code and headers in WSServerHandshakeError (#706)

- Make some low-level message properties readonly (#710)


0.19.0 (11-25-2015)
===================

- Memory leak in ParserBuffer (#579)

- Support gunicorn's `max_requests` settings in gunicorn worker

- Fix wsgi environment building (#573)

- Improve access logging (#572)

- Drop unused host and port from low-level server (#586)

- Add Python 3.5 `async for` implementation to server websocket (#543)

- Add Python 3.5 `async for` implementation to client websocket

- Add Python 3.5 `async with` implementation to client websocket

- Add charset parameter to web.Response constructor (#593)

- Forbid passing both Content-Type header and content_type or charset
  params into web.Response constructor

- Forbid duplicating of web.Application and web.Request (#602)

- Add an option to pass Origin header in ws_connect (#607)

- Add json_response function (#592)

- Make concurrent connections respect limits (#581)

- Collect history of responses if redirects occur (#614)

- Enable passing pre-compressed data in requests (#621)

- Expose named routes via UrlDispatcher.named_routes() (#622)

- Allow disabling sendfile by environment variable AIOHTTP_NOSENDFILE (#629)

- Use ensure_future if available

- Always quote params for Content-Disposition (#641)

- Support async for in multipart reader (#640)

- Add Timeout context manager (#611)

0.18.4 (13-11-2015)
===================

- Relax rule for router names again by adding dash to allowed
  characters: they may contain identifiers, dashes, dots and columns

0.18.3 (25-10-2015)
===================

- Fix formatting for _RequestContextManager helper (#590)

0.18.2 (22-10-2015)
===================

- Fix regression for OpenSSL < 1.0.0 (#583)

0.18.1 (20-10-2015)
===================

- Relax rule for router names: they may contain dots and columns
  starting from now

0.18.0 (19-10-2015)
===================

- Use errors.HttpProcessingError.message as HTTP error reason and
  message (#459)

- Optimize cythonized multidict a bit

- Change repr's of multidicts and multidict views

- default headers in ClientSession are now case-insensitive

- Make '=' char and 'wss://' schema safe in urls (#477)

- `ClientResponse.close()` forces connection closing by default from now (#479)

  N.B. Backward incompatible change: was `.close(force=False) Using
  `force` parameter for the method is deprecated: use `.release()`
  instead.

- Properly requote URL's path (#480)

- add `skip_auto_headers` parameter for client API (#486)

- Properly parse URL path in aiohttp.web.Request (#489)

- Raise RuntimeError when chunked enabled and HTTP is 1.0 (#488)

- Fix a bug with processing io.BytesIO as data parameter for client API (#500)

- Skip auto-generation of Content-Type header (#507)

- Use sendfile facility for static file handling (#503)

- Default `response_factory` in `app.router.add_static` now is
  `StreamResponse`, not `None`. The functionality is not changed if
  default is not specified.

- Drop `ClientResponse.message` attribute, it was always implementation detail.

- Streams are optimized for speed and mostly memory in case of a big
  HTTP message sizes (#496)

- Fix a bug for server-side cookies for dropping cookie and setting it
  again without Max-Age parameter.

- Don't trim redirect URL in client API (#499)

- Extend precision of access log "D" to milliseconds (#527)

- Deprecate `StreamResponse.start()` method in favor of
  `StreamResponse.prepare()` coroutine (#525)

  `.start()` is still supported but responses begun with `.start()`
  does not call signal for response preparing to be sent.

- Add `StreamReader.__repr__`

- Drop Python 3.3 support, from now minimal required version is Python
  3.4.1 (#541)

- Add `async with` support for `ClientSession.request()` and family (#536)

- Ignore message body on 204 and 304 responses (#505)

- `TCPConnector` processed both IPv4 and IPv6 by default (#559)

- Add `.routes()` view for urldispatcher (#519)

- Route name should be a valid identifier name from now (#567)

- Implement server signals (#562)

- Drop a year-old deprecated *files* parameter from client API.

- Added `async for` support for aiohttp stream (#542)

0.17.4 (09-29-2015)
===================

- Properly parse URL path in aiohttp.web.Request (#489)

- Add missing coroutine decorator, the client api is await-compatible now

0.17.3 (08-28-2015)
===================

- Remove Content-Length header on compressed responses (#450)

- Support Python 3.5

- Improve performance of transport in-use list (#472)

- Fix connection pooling (#473)

0.17.2 (08-11-2015)
===================

- Don't forget to pass `data` argument forward (#462)

- Fix multipart read bytes count (#463)

0.17.1 (08-10-2015)
===================

- Fix multidict comparison to arbitrary abc.Mapping

0.17.0 (08-04-2015)
===================

- Make StaticRoute support Last-Modified and If-Modified-Since headers (#386)

- Add Request.if_modified_since and Stream.Response.last_modified properties

- Fix deflate compression when writing a chunked response (#395)

- Request`s content-length header is cleared now after redirect from
  POST method (#391)

- Return a 400 if server received a non HTTP content (#405)

- Fix keep-alive support for aiohttp clients (#406)

- Allow gzip compression in high-level server response interface (#403)

- Rename TCPConnector.resolve and family to dns_cache (#415)

- Make UrlDispatcher ignore quoted characters during url matching (#414)
  Backward-compatibility warning: this may change the url matched by
  your queries if they send quoted character (like %2F for /) (#414)

- Use optional cchardet accelerator if present (#418)

- Borrow loop from Connector in ClientSession if loop is not set

- Add context manager support to ClientSession for session closing.

- Add toplevel get(), post(), put(), head(), delete(), options(),
  patch() coroutines.

- Fix IPv6 support for client API (#425)

- Pass SSL context through proxy connector (#421)

- Make the rule: path for add_route should start with slash

- Don't process request finishing by low-level server on closed event loop

- Don't override data if multiple files are uploaded with same key (#433)

- Ensure multipart.BodyPartReader.read_chunk read all the necessary data
  to avoid false assertions about malformed multipart payload

- Don't send body for 204, 205 and 304 http exceptions (#442)

- Correctly skip Cython compilation in MSVC not found (#453)

- Add response factory to StaticRoute (#456)

- Don't append trailing CRLF for multipart.BodyPartReader (#454)


0.16.6 (07-15-2015)
===================

- Skip compilation on Windows if vcvarsall.bat cannot be found (#438)

0.16.5 (06-13-2015)
===================

- Get rid of all comprehensions and yielding in _multidict (#410)


0.16.4 (06-13-2015)
===================

- Don't clear current exception in multidict's `__repr__` (cythonized
  versions) (#410)


0.16.3 (05-30-2015)
===================

- Fix StaticRoute vulnerability to directory traversal attacks (#380)


0.16.2 (05-27-2015)
===================

- Update python version required for `__del__` usage: it's actually
  3.4.1 instead of 3.4.0

- Add check for presence of loop.is_closed() method before call the
  former (#378)


0.16.1 (05-27-2015)
===================

- Fix regression in static file handling (#377)

0.16.0 (05-26-2015)
===================

- Unset waiter future after cancellation (#363)

- Update request url with query parameters (#372)

- Support new `fingerprint` param of TCPConnector to enable verifying
  SSL certificates via MD5, SHA1, or SHA256 digest (#366)

- Setup uploaded filename if field value is binary and transfer
  encoding is not specified (#349)

- Implement `ClientSession.close()` method

- Implement `connector.closed` readonly property

- Implement `ClientSession.closed` readonly property

- Implement `ClientSession.connector` readonly property

- Implement `ClientSession.detach` method

- Add `__del__` to client-side objects: sessions, connectors,
  connections, requests, responses.

- Refactor connections cleanup by connector (#357)

- Add `limit` parameter to connector constructor (#358)

- Add `request.has_body` property (#364)

- Add `response_class` parameter to `ws_connect()` (#367)

- `ProxyConnector` does not support keep-alive requests by default
  starting from now (#368)

- Add `connector.force_close` property

- Add ws_connect to ClientSession (#374)

- Support optional `chunk_size` parameter in `router.add_static()`


0.15.3 (04-22-2015)
===================

- Fix graceful shutdown handling

- Fix `Expect` header handling for not found and not allowed routes (#340)


0.15.2 (04-19-2015)
===================

- Flow control subsystem refactoring

- HTTP server performance optimizations

- Allow to match any request method with `*`

- Explicitly call drain on transport (#316)

- Make chardet module dependency mandatory (#318)

- Support keep-alive for HTTP 1.0 (#325)

- Do not chunk single file during upload (#327)

- Add ClientSession object for cookie storage and default headers (#328)

- Add `keep_alive_on` argument for HTTP server handler.


0.15.1 (03-31-2015)
===================

- Pass Autobahn Testsuite tests

- Fixed websocket fragmentation

- Fixed websocket close procedure

- Fixed parser buffer limits

- Added `timeout` parameter to WebSocketResponse ctor

- Added `WebSocketResponse.close_code` attribute


0.15.0 (03-27-2015)
===================

- Client WebSockets support

- New Multipart system (#273)

- Support for "Except" header (#287) (#267)

- Set default Content-Type for post requests (#184)

- Fix issue with construction dynamic route with regexps and trailing slash (#266)

- Add repr to web.Request

- Add repr to web.Response

- Add repr for NotFound and NotAllowed match infos

- Add repr for web.Application

- Add repr to UrlMappingMatchInfo (#217)

- Gunicorn 19.2.x compatibility


0.14.4 (01-29-2015)
===================

- Fix issue with error during constructing of url with regex parts (#264)


0.14.3 (01-28-2015)
===================

- Use path='/' by default for cookies (#261)


0.14.2 (01-23-2015)
===================

- Connections leak in BaseConnector (#253)

- Do not swallow websocket reader exceptions (#255)

- web.Request's read, text, json are memorized (#250)


0.14.1 (01-15-2015)
===================

- HttpMessage._add_default_headers does not overwrite existing headers (#216)

- Expose multidict classes at package level

- add `aiohttp.web.WebSocketResponse`

- According to RFC 6455 websocket subprotocol preference order is
  provided by client, not by server

- websocket's ping and pong accept optional message parameter

- multidict views do not accept `getall` parameter anymore, it
  returns the full body anyway.

- multidicts have optional Cython optimization, cythonized version of
  multidicts is about 5 times faster than pure Python.

- multidict.getall() returns `list`, not `tuple`.

- Backward incompatible change: now there are two mutable multidicts
  (`MultiDict`, `CIMultiDict`) and two immutable multidict proxies
  (`MultiDictProxy` and `CIMultiDictProxy`). Previous edition of
  multidicts was not a part of public API BTW.

- Router refactoring to push Not Allowed and Not Found in middleware processing

- Convert `ConnectionError` to `aiohttp.DisconnectedError` and don't
  eat `ConnectionError` exceptions from web handlers.

- Remove hop headers from Response class, wsgi response still uses hop headers.

- Allow to send raw chunked encoded response.

- Allow to encode output bytes stream into chunked encoding.

- Allow to compress output bytes stream with `deflate` encoding.

- Server has 75 seconds keepalive timeout now, was non-keepalive by default.

- Application does not accept `**kwargs` anymore ((#243)).

- Request is inherited from dict now for making per-request storage to
  middlewares ((#242)).


0.13.1 (12-31-2014)
===================

- Add `aiohttp.web.StreamResponse.started` property (#213)

- HTML escape traceback text in `ServerHttpProtocol.handle_error`

- Mention handler and middlewares in `aiohttp.web.RequestHandler.handle_request`
  on error ((#218))


0.13.0 (12-29-2014)
===================

- `StreamResponse.charset` converts value to lower-case on assigning.

- Chain exceptions when raise `ClientRequestError`.

- Support custom regexps in route variables (#204)

- Fixed graceful shutdown, disable keep-alive on connection closing.

- Decode HTTP message with `utf-8` encoding, some servers send headers
  in utf-8 encoding (#207)

- Support `aiohtt.web` middlewares (#209)

- Add ssl_context to TCPConnector (#206)


0.12.0 (12-12-2014)
===================

- Deep refactoring of `aiohttp.web` in backward-incompatible manner.
  Sorry, we have to do this.

- Automatically force aiohttp.web handlers to coroutines in
  `UrlDispatcher.add_route()` (#186)

- Rename `Request.POST()` function to `Request.post()`

- Added POST attribute

- Response processing refactoring: constructor does not accept Request
  instance anymore.

- Pass application instance to finish callback

- Exceptions refactoring

- Do not unquote query string in `aiohttp.web.Request`

- Fix concurrent access to payload in `RequestHandle.handle_request()`

- Add access logging to `aiohttp.web`

- Gunicorn worker for `aiohttp.web`

- Removed deprecated `AsyncGunicornWorker`

- Removed deprecated HttpClient


0.11.0 (11-29-2014)
===================

- Support named routes in `aiohttp.web.UrlDispatcher` (#179)

- Make websocket subprotocols conform to spec (#181)


0.10.2 (11-19-2014)
===================

- Don't unquote `environ['PATH_INFO']` in wsgi.py (#177)


0.10.1 (11-17-2014)
===================

- aiohttp.web.HTTPException and descendants now files response body
  with string like `404: NotFound`

- Fix multidict `__iter__`, the method should iterate over keys, not
  (key, value) pairs.


0.10.0 (11-13-2014)
===================

- Add aiohttp.web subpackage for highlevel HTTP server support.

- Add *reason* optional parameter to aiohttp.protocol.Response ctor.

- Fix aiohttp.client bug for sending file without content-type.

- Change error text for connection closed between server responses
  from 'Can not read status line' to explicit 'Connection closed by
  server'

- Drop closed connections from connector (#173)

- Set server.transport to None on .closing() (#172)


0.9.3 (10-30-2014)
==================

- Fix compatibility with asyncio 3.4.1+ (#170)


0.9.2 (10-16-2014)
==================

- Improve redirect handling (#157)

- Send raw files as is (#153)

- Better websocket support (#150)


0.9.1 (08-30-2014)
==================

- Added MultiDict support for client request params and data (#114).

- Fixed parameter type for IncompleteRead exception (#118).

- Strictly require ASCII headers names and values (#137)

- Keep port in ProxyConnector (#128).

- Python 3.4.1 compatibility (#131).


0.9.0 (07-08-2014)
==================

- Better client basic authentication support (#112).

- Fixed incorrect line splitting in HttpRequestParser (#97).

- Support StreamReader and DataQueue as request data.

- Client files handling refactoring (#20).

- Backward incompatible: Replace DataQueue with StreamReader for
  request payload (#87).


0.8.4 (07-04-2014)
==================

- Change ProxyConnector authorization parameters.


0.8.3 (07-03-2014)
==================

- Publish TCPConnector properties: verify_ssl, family, resolve, resolved_hosts.

- Don't parse message body for HEAD responses.

- Refactor client response decoding.


0.8.2 (06-22-2014)
==================

- Make ProxyConnector.proxy immutable property.

- Make UnixConnector.path immutable property.

- Fix resource leak for aiohttp.request() with implicit connector.

- Rename Connector's reuse_timeout to keepalive_timeout.


0.8.1 (06-18-2014)
==================

- Use case insensitive multidict for server request/response headers.

- MultiDict.getall() accepts default value.

- Catch server ConnectionError.

- Accept MultiDict (and derived) instances in aiohttp.request header argument.

- Proxy 'CONNECT' support.


0.8.0 (06-06-2014)
==================

- Add support for utf-8 values in HTTP headers

- Allow to use custom response class instead of HttpResponse

- Use MultiDict for client request headers

- Use MultiDict for server request/response headers

- Store response headers in ClientResponse.headers attribute

- Get rid of timeout parameter in aiohttp.client API

- Exceptions refactoring


0.7.3 (05-20-2014)
==================

- Simple HTTP proxy support.


0.7.2 (05-14-2014)
==================

- Get rid of `__del__` methods

- Use ResourceWarning instead of logging warning record.


0.7.1 (04-28-2014)
==================

- Do not unquote client request urls.

- Allow multiple waiters on transport drain.

- Do not return client connection to pool in case of exceptions.

- Rename SocketConnector to TCPConnector and UnixSocketConnector to
  UnixConnector.


0.7.0 (04-16-2014)
==================

- Connection flow control.

- HTTP client session/connection pool refactoring.

- Better handling for bad server requests.


0.6.5 (03-29-2014)
==================

- Added client session reuse timeout.

- Better client request cancellation support.

- Better handling responses without content length.

- Added HttpClient verify_ssl parameter support.


0.6.4 (02-27-2014)
==================

- Log content-length missing warning only for put and post requests.


0.6.3 (02-27-2014)
==================

- Better support for server exit.

- Read response body until EOF if content-length is not defined (#14)


0.6.2 (02-18-2014)
==================

- Fix trailing char in allowed_methods.

- Start slow request timer for first request.


0.6.1 (02-17-2014)
==================

- Added utility method HttpResponse.read_and_close()

- Added slow request timeout.

- Enable socket SO_KEEPALIVE if available.


0.6.0 (02-12-2014)
==================

- Better handling for process exit.


0.5.0 (01-29-2014)
==================

- Allow to use custom HttpRequest client class.

- Use gunicorn keepalive setting for asynchronous worker.

- Log leaking responses.

- python 3.4 compatibility


0.4.4 (11-15-2013)
==================

- Resolve only AF_INET family, because it is not clear how to pass
  extra info to asyncio.


0.4.3 (11-15-2013)
==================

- Allow to wait completion of request with `HttpResponse.wait_for_close()`


0.4.2 (11-14-2013)
==================

- Handle exception in client request stream.

- Prevent host resolving for each client request.


0.4.1 (11-12-2013)
==================

- Added client support for `expect: 100-continue` header.


0.4 (11-06-2013)
================

- Added custom wsgi application close procedure

- Fixed concurrent host failure in HttpClient


0.3 (11-04-2013)
================

- Added PortMapperWorker

- Added HttpClient

- Added TCP connection timeout to HTTP client

- Better client connection errors handling

- Gracefully handle process exit


0.2
===

- Fix packaging
