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