Changelog
### 3.9.3
```
Bug fixes
---------
- Fixed backwards compatibility breakage (in 3.9.2) of ``ssl`` parameter when set outside
of ``ClientSession`` (e.g. directly in ``TCPConnector``) -- by :user:`Dreamsorcerer`.
*Related issues and pull requests on GitHub:*
8097, 8098.
Miscellaneous internal changes
------------------------------
- Improved test suite handling of paths and temp files to consistently use pathlib and pytest fixtures.
*Related issues and pull requests on GitHub:*
3957.
----
```
### 3.9.2
```
Bug fixes
---------
- Fixed server-side websocket connection leak.
*Related issues and pull requests on GitHub:*
7978.
- Fixed ``web.FileResponse`` doing blocking I/O in the event loop.
*Related issues and pull requests on GitHub:*
8012.
- Fixed double compress when compression enabled and compressed file exists in server file responses.
*Related issues and pull requests on GitHub:*
8014.
- Added runtime type check for ``ClientSession`` ``timeout`` parameter.
*Related issues and pull requests on GitHub:*
8021.
- Fixed an unhandled exception in the Python HTTP parser on header lines starting with a colon -- by :user:`pajod`.
Invalid request lines with anything but a dot between the HTTP major and minor version are now rejected.
Invalid header field names containing question mark or slash are now rejected.
Such requests are incompatible with :rfc:`9110section-5.6.2` and are not known to be of any legitimate use.
*Related issues and pull requests on GitHub:*
8074.
- Improved validation of paths for static resources requests to the server -- by :user:`bdraco`.
*Related issues and pull requests on GitHub:*
8079.
Features
--------
- Added support for passing :py:data:`True` to ``ssl`` parameter in ``ClientSession`` while
deprecating :py:data:`None` -- by :user:`xiangyan99`.
*Related issues and pull requests on GitHub:*
7698.
Breaking changes
----------------
- Fixed an unhandled exception in the Python HTTP parser on header lines starting with a colon -- by :user:`pajod`.
Invalid request lines with anything but a dot between the HTTP major and minor version are now rejected.
Invalid header field names containing question mark or slash are now rejected.
Such requests are incompatible with :rfc:`9110section-5.6.2` and are not known to be of any legitimate use.
*Related issues and pull requests on GitHub:*
8074.
Improved documentation
----------------------
- Fixed examples of ``fallback_charset_resolver`` function in the :doc:`client_advanced` document. -- by :user:`henry0312`.
*Related issues and pull requests on GitHub:*
7995.
- The Sphinx setup was updated to avoid showing the empty
changelog draft section in the tagged release documentation
builds on Read The Docs -- by :user:`webknjaz`.
*Related issues and pull requests on GitHub:*
8067.
Packaging updates and notes for downstreams
-------------------------------------------
- The changelog categorization was made clearer. The
contributors can now mark their fragment files more
accurately -- by :user:`webknjaz`.
The new category tags are:
* ``bugfix``
* ``feature``
* ``deprecation``
* ``breaking`` (previously, ``removal``)
* ``doc``
* ``packaging``
* ``contrib``
* ``misc``
*Related issues and pull requests on GitHub:*
8066.
Contributor-facing changes
--------------------------
- Updated :ref:`contributing/Tests coverage <aiohttp-contributing>` section to show how we use ``codecov`` -- by :user:`Dreamsorcerer`.
*Related issues and pull requests on GitHub:*
7916.
- The changelog categorization was made clearer. The
contributors can now mark their fragment files more
accurately -- by :user:`webknjaz`.
The new category tags are:
* ``bugfix``
* ``feature``
* ``deprecation``
* ``breaking`` (previously, ``removal``)
* ``doc``
* ``packaging``
* ``contrib``
* ``misc``
*Related issues and pull requests on GitHub:*
8066.
Miscellaneous internal changes
------------------------------
- Replaced all ``tmpdir`` fixtures with ``tmp_path`` in test suite.
*Related issues and pull requests on GitHub:*
3551.
----
```
### 3.9.1
```
Bugfixes
--------
- Fixed importing aiohttp under PyPy on Windows.
(7848)
- Fixed async concurrency safety in websocket compressor.
(7865)
- Fixed ``ClientResponse.close()`` releasing the connection instead of closing.
(7869)
- Fixed a regression where connection may get closed during upgrade. -- by :user:`Dreamsorcerer`
(7879)
- Fixed messages being reported as upgraded without an Upgrade header in Python parser. -- by :user:`Dreamsorcerer`
(7895)
----
```
### 3.9.0
```
Features
--------
- Introduced ``AppKey`` for static typing support of ``Application`` storage.
See https://docs.aiohttp.org/en/stable/web_advanced.html#application-s-config
(5864)
- Added a graceful shutdown period which allows pending tasks to complete before the application's cleanup is called.
The period can be adjusted with the ``shutdown_timeout`` parameter. -- by :user:`Dreamsorcerer`.
See https://docs.aiohttp.org/en/latest/web_advanced.html#graceful-shutdown
(7188)
- Added `handler_cancellation <https://docs.aiohttp.org/en/stable/web_advanced.html#web-handler-cancellation>`_ parameter to cancel web handler on client disconnection. -- by :user:`mosquito`
This (optionally) reintroduces a feature removed in a previous release.
Recommended for those looking for an extra level of protection against denial-of-service attacks.
(7056)
- Added support for setting response header parameters ``max_line_size`` and ``max_field_size``.
(2304)
- Added ``auto_decompress`` parameter to ``ClientSession.request`` to override ``ClientSession._auto_decompress``. -- by :user:`Daste745`
(3751)
- Changed ``raise_for_status`` to allow a coroutine.
(3892)
- Added client brotli compression support (optional with runtime check).
(5219)
- Added ``client_max_size`` to ``BaseRequest.clone()`` to allow overriding the request body size. -- :user:`anesabml`.
(5704)
- Added a middleware type alias ``aiohttp.typedefs.Middleware``.
(5898)
- Exported ``HTTPMove`` which can be used to catch any redirection request
that has a location -- :user:`dreamsorcerer`.
(6594)
- Changed the ``path`` parameter in ``web.run_app()`` to accept a ``pathlib.Path`` object.
(6839)
- Performance: Skipped filtering ``CookieJar`` when the jar is empty or all cookies have expired.
(7819)
- Performance: Only check origin if insecure scheme and there are origins to treat as secure, in ``CookieJar.filter_cookies()``.
(7821)
- Performance: Used timestamp instead of ``datetime`` to achieve faster cookie expiration in ``CookieJar``.
(7824)
- Added support for passing a custom server name parameter to HTTPS connection.
(7114)
- Added support for using Basic Auth credentials from :file:`.netrc` file when making HTTP requests with the
:py:class:`~aiohttp.ClientSession` ``trust_env`` argument is set to ``True``. -- by :user:`yuvipanda`.
(7131)
- Turned access log into no-op when the logger is disabled.
(7240)
- Added typing information to ``RawResponseMessage``. -- by :user:`Gobot1234`
(7365)
- Removed ``async-timeout`` for Python 3.11+ (replaced with ``asyncio.timeout()`` on newer releases).
(7502)
- Added support for ``brotlicffi`` as an alternative to ``brotli`` (fixing Brotli support on PyPy).
(7611)
- Added ``WebSocketResponse.get_extra_info()`` to access a protocol transport's extra info.
(7078)
- Allow ``link`` argument to be set to None/empty in HTTP 451 exception.
(7689)
Bugfixes
--------
- Implemented stripping the trailing dots from fully-qualified domain names in ``Host`` headers and TLS context when acting as an HTTP client.
This allows the client to connect to URLs with FQDN host name like ``https://example.com./``.
-- by :user:`martin-sucha`.
(3636)
- Fixed client timeout not working when incoming data is always available without waiting. -- by :user:`Dreamsorcerer`.
(5854)
- Fixed ``readuntil`` to work with a delimiter of more than one character.
(6701)
- Added ``__repr__`` to ``EmptyStreamReader`` to avoid ``AttributeError``.
(6916)
- Fixed bug when using ``TCPConnector`` with ``ttl_dns_cache=0``.
(7014)
- Fixed response returned from expect handler being thrown away. -- by :user:`Dreamsorcerer`
(7025)
- Avoided raising ``UnicodeDecodeError`` in multipart and in HTTP headers parsing.
(7044)
- Changed ``sock_read`` timeout to start after writing has finished, avoiding read timeouts caused by an unfinished write. -- by :user:`dtrifiro`
(7149)
- Fixed missing query in tracing method URLs when using ``yarl`` 1.9+.
(7259)
- Changed max 32-bit timestamp to an aware datetime object, for consistency with the non-32-bit one, and to avoid a ``DeprecationWarning`` on Python 3.12.
(7302)
- Fixed ``EmptyStreamReader.iter_chunks()`` never ending. -- by :user:`mind1m`
(7616)
- Fixed a rare ``RuntimeError: await wasn't used with future`` exception. -- by :user:`stalkerg`
(7785)
- Fixed issue with insufficient HTTP method and version validation.
(7700)
- Added check to validate that absolute URIs have schemes.
(7712)
- Fixed unhandled exception when Python HTTP parser encounters unpaired Unicode surrogates.
(7715)
- Updated parser to disallow invalid characters in header field names and stop accepting LF as a request line separator.
(7719)
- Fixed Python HTTP parser not treating 204/304/1xx as an empty body.
(7755)
- Ensure empty body response for 1xx/204/304 per RFC 9112 sec 6.3.
(7756)
- Fixed an issue when a client request is closed before completing a chunked payload. -- by :user:`Dreamsorcerer`
(7764)
- Edge Case Handling for ResponseParser for missing reason value.
(7776)
- Fixed ``ClientWebSocketResponse.close_code`` being erroneously set to ``None`` when there are concurrent async tasks receiving data and closing the connection.
(7306)
- Added HTTP method validation.
(6533)
- Fixed arbitrary sequence types being allowed to inject values via version parameter. -- by :user:`Dreamsorcerer`
(7835)
- Performance: Fixed increase in latency with small messages from websocket compression changes.
(7797)
Improved Documentation
----------------------
- Fixed the `ClientResponse.release`'s type in the doc. Changed from `comethod` to `method`.
(5836)
- Added information on behavior of base_url parameter in `ClientSession`.
(6647)
- Fixed `ClientResponseError` docs.
(6700)
- Updated Redis code examples to follow the latest API.
(6907)
- Added a note about possibly needing to update headers when using ``on_response_prepare``. -- by :user:`Dreamsorcerer`
(7283)
- Completed ``trust_env`` parameter description to honor ``wss_proxy``, ``ws_proxy`` or ``no_proxy`` env.
(7325)
- Expanded SSL documentation with more examples (e.g. how to use certifi). -- by :user:`Dreamsorcerer`
(7334)
- Fix, update, and improve client exceptions documentation.
(7733)
Deprecations and Removals
-------------------------
- Added ``shutdown_timeout`` parameter to ``BaseRunner``, while
deprecating ``shutdown_timeout`` parameter from ``BaseSite``. -- by :user:`Dreamsorcerer`
(7718)
- Dropped Python 3.6 support.
(6378)
- Dropped Python 3.7 support. -- by :user:`Dreamsorcerer`
(7336)
- Removed support for abandoned ``tokio`` event loop. -- by :user:`Dreamsorcerer`
(7281)
Misc
----
- Made ``print`` argument in ``run_app()`` optional.
(3690)
- Improved performance of ``ceil_timeout`` in some cases.
(6316)
- Changed importing Gunicorn to happen on-demand, decreasing import time by ~53%. -- :user:`Dreamsorcerer`
(6591)
- Improved import time by replacing ``http.server`` with ``http.HTTPStatus``.
(6903)
- Fixed annotation of ``ssl`` parameter to disallow ``True``. -- by :user:`Dreamsorcerer`.
(7335)
----
```
### 3.9.0rc0
```
Features
--------
- Performance: Skipped filtering ``CookieJar`` when the jar is empty or all cookies have expired.
(7819)
- Performance: Only check origin if insecure scheme and there are origins to treat as secure, in ``CookieJar.filter_cookies()``.
(7821)
- Performance: Used timestamp instead of ``datetime`` to achieve faster cookie expiration in ``CookieJar``.
(7824)
Bugfixes
--------
- Fixed an issue where the client could go into an infinite loop. -- by :user:`Dreamsorcerer`
(7815)
- Added HTTP method validation.
(6533)
- Fixed arbitrary sequence types being allowed to inject values via version parameter. -- by :user:`Dreamsorcerer`
(7835)
- Performance: Fixed increase in latency with small messages from websocket compression changes.
(7797)
----
```
### 3.9.0b1
```
Features
--------
- Added ``WebSocketResponse.get_extra_info()`` to access a protocol transport's extra info.
(7078)
- Allow ``link`` argument to be set to None/empty in HTTP 451 exception.
(7689)
- Added ``shutdown_timeout`` parameter to ``BaseRunner``, while
deprecating ``shutdown_timeout`` parameter from ``BaseSite``. -- by :user:`Dreamsorcerer`
(7718)
Bugfixes
--------
- Fixed keep-alive connections stopping a graceful shutdown. -- by :user:`Dreamsorcerer`
(7718)
- Fixed ``ClientWebSocketResponse.close_code`` being erroneously set to ``None`` when there are concurrent async tasks receiving data and closing the connection.
(7306)
- Changed ``AppKey`` warning to ``web.NotAppKeyWarning`` and stop it being displayed by default. -- by :user:`Dreamsorcerer`
(7677)
- Fix issue with insufficient HTTP method and version validation.
(7700)
- Add check to validate that absolute URIs have schemes.
(7712)
- Fix unhandled exception when Python HTTP parser encounters unpaired Unicode surrogates.
(7715)
- Update parser to disallow invalid characters in header field names and stop accepting LF as a request line separator.
(7719)
- Fix py http parser not treating 204/304/1xx as an empty body
(7755)
- Ensure empty body response for 1xx/204/304 per RFC 9112 sec 6.3
(7756)
- Fixed an issue when a client request is closed before completing a chunked payload -- by :user:`Dreamsorcerer`
(7764)
- Edge Case Handling for ResponseParser for missing reason value
(7776)
- Fixed a rare `RuntimeError: await wasn't used with future` exception -- by :user:`stalkerg`
(7785)
Improved Documentation
----------------------
- Fix, update, and improve client exceptions documentation.
(7733)
----
```
### 3.9.0b0
```
Features
--------
- Introduced ``AppKey`` for static typing support of ``Application`` storage.
See https://docs.aiohttp.org/en/stable/web_advanced.html#application-s-config
(5864)
- Added a graceful shutdown period which allows pending tasks to complete before the application's cleanup is called.
The period can be adjusted with the ``shutdown_timeout`` parameter. -- by :user:`Dreamsorcerer`.
See https://docs.aiohttp.org/en/latest/web_advanced.html#graceful-shutdown
(7188)
- Added `handler_cancellation <https://docs.aiohttp.org/en/stable/web_advanced.html#web-handler-cancellation>`_ parameter to cancel web handler on client disconnection. -- by :user:`mosquito`
This (optionally) reintroduces a feature removed in a previous release.
Recommended for those looking for an extra level of protection against denial-of-service attacks.
(7056)
- Added support for setting response header parameters ``max_line_size`` and ``max_field_size``.
(2304)
- Added ``auto_decompress`` parameter to ``ClientSession.request`` to override ``ClientSession._auto_decompress``. -- by :user:`Daste745`
(3751)
- Changed ``raise_for_status`` to allow a coroutine.
(3892)
- Added client brotli compression support (optional with runtime check).
(5219)
- Added ``client_max_size`` to ``BaseRequest.clone()`` to allow overriding the request body size -- :user:`anesabml`.
(5704)
- Added a middleware type alias ``aiohttp.typedefs.Middleware``.
(5898)
- Exported ``HTTPMove`` which can be used to catch any redirection request
that has a location -- :user:`dreamsorcerer`.
(6594)
- Changed the ``path`` parameter in ``web.run_app()`` to accept a ``pathlib.Path`` object.
(6839)
- Added support for passing a custom server name parameter to HTTPS connection.
(7114)
- Added support for using Basic Auth credentials from :file:`.netrc` file when making HTTP requests with the :py:class:`~aiohttp.ClientSession` ``trust_env`` argument is set to ``True`` -- by :user:`yuvipanda`.
(7131)
- Turned access log into no-op when the logger is disabled.
(7240)
- Added typing information to ``RawResponseMessage`` -- by :user:`Gobot1234`
(7365)
- Removed ``async-timeout`` for Python 3.11+ (replaced with ``asyncio.timeout()`` on newer releases).
(7502)
- Added support for ``brotlicffi`` as an alternative to ``brotli`` (fixing Brotli support on PyPy).
(7611)
Bugfixes
--------
- Implemented stripping the trailing dots from fully-qualified domain names in ``Host`` headers and TLS context when acting as an HTTP client.
This allows the client to connect to URLs with FQDN host name like ``https://example.com./``.
-- by :user:`martin-sucha`.
(3636)
- Fixed client timeout not working when incoming data is always available without waiting -- by :user:`Dreamsorcerer`.
(5854)
- Fixed ``readuntil`` to work with a delimiter of more than one character
(6701)
- Added ``__repr__`` to ``EmptyStreamReader`` to avoid ``AttributeError``.
(6916)
- Fixed bug when using ``TCPConnector`` with ``ttl_dns_cache=0``.
(7014)
- Fixed response returned from expect handler being thrown away. -- by :user:`Dreamsorcerer`
(7025)
- Avoided raising ``UnicodeDecodeError`` in multipart and in HTTP headers parsing.
(7044)
- Changed ``sock_read`` timeout to start after writing has finished, avoiding read timeouts caused by an unfinished write. -- by :user:`dtrifiro`
(7149)
- Fixed missing query in tracing method URLs when using ``yarl`` 1.9+.
(7259)
- Changed max 32-bit timestamp to an aware datetime object, for consistency with the non-32-bit one, and to avoid a ``DeprecationWarning`` on Python 3.12.
(7302)
- Fixed ``EmptyStreamReader.iter_chunks()`` never ending. -- by :user:`mind1m`
(7616)
Improved Documentation
----------------------
- Fixed the `ClientResponse.release`'s type in the doc. Changed from `comethod` to `method`.
(5836)
- Added information on behavior of base_url parameter in `ClientSession`.
(6647)
- Fixed `ClientResponseError` docs.
(6700)
- Updated Redis code examples to follow the latest API.
(6907)
- Added a note about possibly needing to update headers when using ``on_response_prepare``. -- by :user:`Dreamsorcerer`
(7283)
- Completed ``trust_env`` parameter description to honor ``wss_proxy``, ``ws_proxy`` or ``no_proxy`` env.
(7325)
- Expanded SSL documentation with more examples (e.g. how to use certifi). -- by :user:`Dreamsorcerer`
(7334)
Deprecations and Removals
-------------------------
- Dropped Python 3.6 support.
(6378)
- Dropped Python 3.7 support. -- by :user:`Dreamsorcerer`
(7336)
- Removed support for abandoned ``tokio`` event loop. -- by :user:`Dreamsorcerer`
(7281)
Misc
----
- Made ``print`` argument in ``run_app()`` optional.
(3690)
- Improved performance of ``ceil_timeout`` in some cases.
(6316)
- Changed importing Gunicorn to happen on-demand, decreasing import time by ~53%. -- :user:`Dreamsorcerer`
(6591)
- Improved import time by replacing ``http.server`` with ``http.HTTPStatus``.
(6903)
- Fixed annotation of ``ssl`` parameter to disallow ``True``. -- by :user:`Dreamsorcerer`
(7335)
----
```
### 3.8.6
```
Security bugfixes
-----------------
- Upgraded the vendored copy of llhttp_ to v9.1.3 -- by :user:`Dreamsorcerer`
Thanks to :user:`kenballus` for reporting this, see
https://github.com/aio-libs/aiohttp/security/advisories/GHSA-pjjw-qhg8-p2p9.
.. _llhttp: https://llhttp.org
(7647)
- Updated Python parser to comply with RFCs 9110/9112 -- by :user:`Dreamorcerer`
Thanks to :user:`kenballus` for reporting this, see
https://github.com/aio-libs/aiohttp/security/advisories/GHSA-gfw2-4jvh-wgfg.
(7663)
Deprecation
-----------
- Added ``fallback_charset_resolver`` parameter in ``ClientSession`` to allow a user-supplied
character set detection function.
Character set detection will no longer be included in 3.9 as a default. If this feature is needed,
please use `fallback_charset_resolver <https://docs.aiohttp.org/en/stable/client_advanced.html#character-set-detection>`_.
(7561)
Features
--------
- Enabled lenient response parsing for more flexible parsing in the client
(this should resolve some regressions when dealing with badly formatted HTTP responses). -- by :user:`Dreamsorcerer`
(7490)
Bugfixes
--------
- Fixed ``PermissionError`` when ``.netrc`` is unreadable due to permissions.
(7237)
- Fixed output of parsing errors pointing to a ``\n``. -- by :user:`Dreamsorcerer`
(7468)
- Fixed ``GunicornWebWorker`` max_requests_jitter not working.
(7518)
- Fixed sorting in ``filter_cookies`` to use cookie with longest path. -- by :user:`marq24`.
(7577)
- Fixed display of ``BadStatusLine`` messages from llhttp_. -- by :user:`Dreamsorcerer`
(7651)
----
```
### 3.8.5
```
Security bugfixes
-----------------
- Upgraded the vendored copy of llhttp_ to v8.1.1 -- by :user:`webknjaz`
and :user:`Dreamsorcerer`.
Thanks to :user:`sethmlarson` for reporting this and providing us with
comprehensive reproducer, workarounds and fixing details! For more
information, see
https://github.com/aio-libs/aiohttp/security/advisories/GHSA-45c4-8wx5-qw6w.
.. _llhttp: https://llhttp.org
(7346)
Features
--------
- Added information to C parser exceptions to show which character caused the error. -- by :user:`Dreamsorcerer`
(7366)
Bugfixes
--------
- Fixed a transport is :data:`None` error -- by :user:`Dreamsorcerer`.
(3355)
----
```
### 3.8.4
```
Bugfixes
--------
- Fixed incorrectly overwriting cookies with the same name and domain, but different path.
(6638)
- Fixed ``ConnectionResetError`` not being raised after client disconnection in SSL environments.
(7180)
----
```
### 3.8.3
```
.. attention::
This is the last :doc:`aiohttp <index>` release tested under
Python 3.6. The 3.9 stream is dropping it from the CI and the
distribution package metadata.
Bugfixes
--------
- Increased the upper boundary of the :doc:`multidict:index` dependency
to allow for the version 6 -- by :user:`hugovk`.
It used to be limited below version 7 in :doc:`aiohttp <index>` v3.8.1 but
was lowered in v3.8.2 via :pr:`6550` and never brought back, causing
problems with dependency pins when upgrading. :doc:`aiohttp <index>` v3.8.3
fixes that by recovering the original boundary of ``< 7``.
(6950)
----
```
### 3.8.2
```
.. note::
This release has some compatibility fixes for Python 3.11 but it may
still have some quirks. Some tests are still flaky in the CI.
.. attention::
This is the last :doc:`aiohttp <index>` release tested under
Python 3.6. The 3.9 stream is dropping it from the CI and the
distribution package metadata.
Bugfixes
--------
- Added support for registering :rfc:`OPTIONS <9110OPTIONS>`
HTTP method handlers via :py:class:`~aiohttp.web.RouteTableDef`.
(4663)
- Started supporting :rfc:`authority-form <9112authority-form>` and
:rfc:`absolute-form <9112absolute-form>` URLs on the server-side.
(6227)
- Fixed Python 3.11 incompatibilities by using Cython 0.29.25.
(6396)
- Extended the ``sock`` argument typing declaration of the
:py:func:`~aiohttp.web.run_app` function as optionally
accepting iterables.
(6401)
- Fixed a regression where :py:exc:`~asyncio.CancelledError`
occurs on client disconnection.
(6719)
- Started exporting :py:class:`~aiohttp.web.PrefixedSubAppResource`
under :py:mod:`aiohttp.web` -- by :user:`Dreamsorcerer`.
This fixes a regression introduced by :pr:`3469`.
(6889)
- Dropped the :class:`object` type possibility from
the :py:attr:`aiohttp.ClientSession.timeout`
property return type declaration.
(6917),
(6923)
Improved Documentation
----------------------
- Added clarification on configuring the app object with
settings such as a database connection.
(4137)
- Extended the ``sock`` argument typing declaration of the
:py:func:`~aiohttp.web.run_app` function as optionally
accepting iterables.
(6401)
- Dropped the :class:`object` type possibility from
the :py:attr:`aiohttp.ClientSession.timeout`
property return type declaration.
(6917),
(6923)
Deprecations and Removals
-------------------------
- Dropped Python 3.5 support, :doc:`aiohttp <index>` only works
under Python 3.6 and higher from now on.
(4046)
Misc
----
- Removed a deprecated usage of :py:func:`pytest.warns(None)
<pytest.warns>` in tests.
(6663)
- (6369), (6399), (6550), (6708), (6757), (6857), (6872).
----
```
### 3.8.1
```
Bugfixes
--------
- Fix the error in handling the return value of `getaddrinfo`.
`getaddrinfo` will return an `(int, bytes)` tuple, if CPython could not handle the address family.
It will cause a index out of range error in aiohttp. For example, if user compile CPython with
`--disable-ipv6` option but his system enable the ipv6.
(5901)
- Do not install "examples" as a top-level package.
(6189)
- Restored ability to connect IPv6-only host.
(6195)
- Remove ``Signal`` from ``__all__``, replace ``aiohttp.Signal`` with ``aiosignal.Signal`` in docs
(6201)
- Made chunked encoding HTTP header check stricter.
(6305)
Improved Documentation
----------------------
- update quick starter demo codes.
(6240)
- Added an explanation of how tiny timeouts affect performance to the client reference document.
(6274)
- Add flake8-docstrings to flake8 configuration, enable subset of checks.
(6276)
- Added information on running complex applications with additional tasks/processes -- :user:`Dreamsorcerer`.
(6278)
Misc
----
- (6205)
----
```
### 3.8.0
```
Features
--------
- Added a ``GunicornWebWorker`` feature for extending the aiohttp server configuration by allowing the 'wsgi' coroutine to return ``web.AppRunner`` object.
(2988)_
- Switch from ``http-parser`` to ``llhttp``
(3561)_
- Use Brotli instead of brotlipy
(3803)_
- Disable implicit switch-back to pure python mode. The build fails loudly if aiohttp
cannot be compiled with C Accelerators. Use AIOHTTP_NO_EXTENSIONS=1 to explicitly
disable C Extensions complication and switch to Pure-Python mode. Note that Pure-Python
mode is significantly slower than compiled one.
(3828)_
- Make access log use local time with timezone
(3853)_
- Implemented ``readuntil`` in ``StreamResponse``
(4054)_
- FileResponse now supports ETag.
(4594)_
- Add a request handler type alias ``aiohttp.typedefs.Handler``.
(4686)_
- ``AioHTTPTestCase`` is more async friendly now.
For people who use unittest and are used to use :py:exc:`~unittest.TestCase`
it will be easier to write new test cases like the sync version of the :py:exc:`~unittest.TestCase` class,
without using the decorator `unittest_run_loop`, just `async def test_*`.
The only difference is that for the people using python3.7 and below a new dependency is needed, it is ``asynctestcase``.
(4700)_
- Add validation of HTTP header keys and values to prevent header injection.
(4818)_
- Add predicate to ``AbstractCookieJar.clear``.
Add ``AbstractCookieJar.clear_domain`` to clean all domain and subdomains cookies only.
(4942)_
- Add keepalive_timeout parameter to web.run_app.
(5094)_
- Tracing for client sent headers
(5105)_
- Make type hints for http parser stricter
(5267)_
- Add final declarations for constants.
(5275)_
- Switch to external frozenlist and aiosignal libraries.
(5293)_
- Don't send secure cookies by insecure transports.
By default, the transport is secure if https or wss scheme is used.
Use `CookieJar(treat_as_secure_origin="http://127.0.0.1")` to override the default security checker.
(5571)_
- Always create a new event loop in ``aiohttp.web.run_app()``.
This adds better compatibility with ``asyncio.run()`` or if trying to run multiple apps in sequence.
(5572)_
- Add ``aiohttp.pytest_plugin.AiohttpClient`` for static typing of pytest plugin.
(5585)_
- Added a ``socket_factory`` argument to ``BaseTestServer``.
(5844)_
- Add compression strategy parameter to enable_compression method.
(5909)_
- Added support for Python 3.10 to Github Actions CI/CD workflows and fix the related deprecation warnings -- :user:`Hanaasagi`.
(5927)_
- Switched ``chardet`` to ``charset-normalizer`` for guessing the HTTP payload body encoding -- :user:`Ousret`.
(5930)_
- Added optional auto_decompress argument for HttpRequestParser
(5957)_
- Added support for HTTPS proxies to the extent CPython's
:py:mod:`asyncio` supports it -- by :user:`bmbouter`,
:user:`jborean93` and :user:`webknjaz`.
(5992)_
- Added ``base_url`` parameter to the initializer of :class:`~aiohttp.ClientSession`.
(6013)_
- Add Trove classifier and create binary wheels for 3.10. -- :user:`hugovk`.
(6079)_
- Started shipping platform-specific wheels with the ``musl`` tag targeting typical Alpine Linux runtimes — :user:`asvetlov`.
(6139)_
- Started shipping platform-specific arm64 wheels for Apple Silicon — :user:`asvetlov`.
(6139)_
Bugfixes
--------
- Modify _drain_helper() to handle concurrent `await resp.write(...)` or `ws.send_json(...)` calls without race-condition.
(2934)_
- Started using `MultiLoopChildWatcher` when it's available under POSIX while setting up the test I/O loop.
(3450)_
- Only encode content-disposition filename parameter using percent-encoding.
Other parameters are encoded to quoted-string or RFC2231 extended parameter
value.
(4012)_
- Fixed HTTP client requests to honor ``no_proxy`` environment variables.
(4431)_
- Fix supporting WebSockets proxies configured via environment variables.
(4648)_
- Change return type on URLDispatcher to UrlMappingMatchInfo to improve type annotations.
(4748)_
- Ensure a cleanup context is cleaned up even when an exception occurs during startup.
(4799)_
- Added a new exception type for Unix socket client errors which provides a more useful error message.
(4984)_
- Remove Transfer-Encoding and Content-Type headers for 204 in StreamResponse
(5106)_
- Only depend on typing_extensions for Python <3.8
(5107)_
- Add ABNORMAL_CLOSURE and BAD_GATEWAY to WSCloseCode
(5192)_
- Fix cookies disappearing from HTTPExceptions.
(5233)_
- StaticResource prefixes no longer match URLs with a non-folder prefix. For example ``routes.static('/foo', '/foo')`` no longer matches the URL ``/foobar``. Previously, this would attempt to load the file ``/foo/ar``.
(5250)_
- Acquire the connection before running traces to prevent race condition.
(5259)_
- Add missing slots to _RequestContextManager`` and ``_WSRequestContextManager``
(5329)_
- Ensure sending a zero byte file does not throw an exception (round 2)
(5380)_
- Set "text/plain" when data is an empty string in client requests.
(5392)_
- Stop automatically releasing the ``ClientResponse`` object on calls to the ``ok`` property for the failed requests.
(5403)_
- Include query parameters from `params` keyword argument in tracing `URL`.
(5432)_
- Fix annotations
(5466)_
- Fixed the multipart POST requests processing to always release file
descriptors for the ``tempfile.Temporaryfile``-created
``_io.BufferedRandom`` instances of files sent within multipart request
bodies via HTTP POST requests -- by :user:`webknjaz`.
(5494)_
- Fix 0 being incorrectly treated as an immediate timeout.
(5527)_
- Fixes failing tests when an environment variable <scheme>_proxy is set.
(5554)_
- Replace deprecated app handler design in ``tests/autobahn/server.py`` with call to ``web.run_app``; replace deprecated ``aiohttp.ws_connect`` calls in ``tests/autobahn/client.py`` with ``aiohttp.ClienSession.ws_connect``.
(5606)_
- Fixed test for ``HTTPUnauthorized`` that access the ``text`` argument. This is not used in any part of the code, so it's removed now.
(5657)_
- Remove incorrect default from docs
(5727)_
- Remove external test dependency to http://httpbin.org
(5840)_
- Don't cancel current task when entering a cancelled timer.
(5853)_
- Added ``params`` keyword argument to ``ClientSession.ws_connect``. -- :user:`hoh`.
(5868)_
- Uses :py:class:`~asyncio.ThreadedChildWatcher` under POSIX to allow setting up test loop in non-main thread.
(5877)_
- Fix the error in handling the return value of `getaddrinfo`.
`getaddrinfo` will return an `(int, bytes)` tuple, if CPython could not handle the address family.
It will cause a index out of range error in aiohttp. For example, if user compile CPython with
`--disable-ipv6` option but his system enable the ipv6.
(5901)_
- Removed the deprecated ``loop`` argument from the ``asyncio.sleep``/``gather`` calls
(5905)_
- Return ``None`` from ``request.if_modified_since``, ``request.if_unmodified_since``, ``request.if_range`` and ``response.last_modified`` when corresponding http date headers are invalid.
(5925)_
- Fix resetting `SIGCHLD` signals in Gunicorn aiohttp Worker to fix `subprocesses` that capture output having an incorrect `returncode`.
(6130)_
- Raise ``400: Content-Length can't be present with Transfer-Encoding`` if both ``Content-Length`` and ``Transfer-Encoding`` are sent by peer by both C and Python implementations
(6182)_
Improved Documentation
----------------------
- Refactored OpenAPI/Swagger aiohttp addons, added ``aio-openapi``
(5326)_
- Fixed docs on request cookies type, so it matches what is actually used in the code (a
read-only dictionary-like object).
(5725)_
- Documented that the HTTP client ``Authorization`` header is removed
on redirects to a different host or protocol.
(5850)_
Misc
----
- (3927)_, (4247)_, (4247)_, (5389)_, (5457)_, (5486)_, (5494)_, (5515)_, (5625)_, (5635)_, (5648)_, (5657)_, (5890)_, (5914)_, (5932)_, (6002)_, (6045)_, (6131)_, (6156)_, (6165)_, (6166)_
----
```
### 3.8.0b0
```
Features
--------
- Added a ``GunicornWebWorker`` feature for extending the aiohttp server configuration by allowing the 'wsgi' coroutine to return ``web.AppRunner`` object.
(2988)_
- Switch from ``http-parser`` to ``llhttp``
(3561)_
- Use Brotli instead of brotlipy
(3803)_
- Disable implicit switch-back to pure python mode. The build fails loudly if aiohttp
cannot be compiled with C Accelerators. Use AIOHTTP_NO_EXTENSIONS=1 to explicitly
disable C Extensions complication and switch to Pure-Python mode. Note that Pure-Python
mode is significantly slower than compiled one.
(3828)_
- Make access log use local time with timezone
(3853)_
- Implemented ``readuntil`` in ``StreamResponse``
(4054)_
- FileResponse now supports ETag.
(4594)_
- Add a request handler type alias ``aiohttp.typedefs.Handler``.
(4686)_
- ``AioHTTPTestCase`` is more async friendly now.
For people who use unittest and are used to use :py:exc:`~unittest.TestCase`
it will be easier to write new test cases like the sync version of the :py:exc:`~unittest.TestCase` class,
without using the decorator `unittest_run_loop`, just `async def test_*`.
The only difference is that for the people using python3.7 and below a new dependency is needed, it is ``asynctestcase``.
(4700)_
- Add validation of HTTP header keys and values to prevent header injection.
(4818)_
- Add predicate to ``AbstractCookieJar.clear``.
Add ``AbstractCookieJar.clear_domain`` to clean all domain and subdomains cookies only.
(4942)_
- Add keepalive_timeout parameter to web.run_app.
(5094)_
- Tracing for client sent headers
(5105)_
- Make type hints for http parser stricter
(5267)_
- Add final declarations for constants.
(5275)_
- Switch to external frozenlist and aiosignal libraries.
(5293)_
- Don't send secure cookies by insecure transports.
By default, the transport is secure if https or wss scheme is used.
Use `CookieJar(treat_as_secure_origin="http://127.0.0.1")` to override the default security checker.
(5571)_
- Always create a new event loop in ``aiohttp.web.run_app()``.
This adds better compatibility with ``asyncio.run()`` or if trying to run multiple apps in sequence.
(5572)_
- Add ``aiohttp.pytest_plugin.AiohttpClient`` for static typing of pytest plugin.
(5585)_
- Added a ``socket_factory`` argument to ``BaseTestServer``.
(5844)_
- Add compression strategy parameter to enable_compression method.
(5909)_
- Added support for Python 3.10 to Github Actions CI/CD workflows and fix the related deprecation warnings -- :user:`Hanaasagi`.
(5927)_
- Switched ``chardet`` to ``charset-normalizer`` for guessing the HTTP payload body encoding -- :user:`Ousret`.
(5930)_
- Added optional auto_decompress argument for HttpRequestParser
(5957)_
- Added support for HTTPS proxies to the extent CPython's
:py:mod:`asyncio` supports it -- by :user:`bmbouter`,
:user:`jborean93` and :user:`webknjaz`.
(5992)_
- Added ``base_url`` parameter to the initializer of :class:`~aiohttp.ClientSession`.
(6013)_
- Add Trove classifier and create binary wheels for 3.10. -- :user:`hugovk`.
(6079)_
- Started shipping platform-specific wheels with the ``musl`` tag targeting typical Alpine Linux runtimes — :user:`asvetlov`.
(6139)_
- Started shipping platform-specific arm64 wheels for Apple Silicon — :user:`asvetlov`.
(6139)_
Bugfixes
--------
- Modify _drain_helper() to handle concurrent `await resp.write(...)` or `ws.send_json(...)` calls without race-condition.
(2934)_
- Started using `MultiLoopChildWatcher` when it's available under POSIX while setting up the test I/O loop.
(3450)_
- Only encode content-disposition filename parameter using percent-encoding.
Other parameters are encoded to quoted-string or RFC2231 extended parameter
value.
(4012)_
- Fixed HTTP client requests to honor ``no_proxy`` environment variables.
(4431)_
- Change return type on URLDispatcher to UrlMappingMatchInfo to improve type annotations.
(4748)_
- Ensure a cleanup context is cleaned up even when an exception occurs during startup.
(4799)_
- Added a new exception type for Unix socket client errors which provides a more useful error message.
(4984)_
- Remove Transfer-Encoding and Content-Type headers for 204 in StreamResponse
(5106)_
- Only depend on typing_extensions for Python <3.8
(5107)_
- Add ABNORMAL_CLOSURE and BAD_GATEWAY to WSCloseCode
(5192)_
- Fix cookies disappearing from HTTPExceptions.
(5233)_
- StaticResource prefixes no longer match URLs with a non-folder prefix. For example ``routes.static('/foo', '/foo')`` no longer matches the URL ``/foobar``. Previously, this would attempt to load the file ``/foo/ar``.
(5250)_
- Acquire the connection before running traces to prevent race condition.
(5259)_
- Add missing slots to _RequestContextManager`` and ``_WSRequestContextManager``
(5329)_
- Ensure sending a zero byte file does not throw an exception (round 2)
(5380)_
- Set "text/plain" when data is an empty string in client requests.
(5392)_
- Stop automatically releasing the ``ClientResponse`` object on calls to the ``ok`` property for the failed requests.
(5403)_
- Include query parameters from `params` keyword argument in tracing `URL`.
(5432)_
- Fix annotations
(5466)_
- Fixed the multipart POST requests processing to always release file
descriptors for the ``tempfile.Temporaryfile``-created
``_io.BufferedRandom`` instances of files sent within multipart request
bodies via HTTP POST requests -- by :user:`webknjaz`.
(5494)_
- Fix 0 being incorrectly treated as an immediate timeout.
(5527)_
- Replace deprecated app handler design in ``tests/autobahn/server.py`` with call to ``web.run_app``; replace deprecated ``aiohttp.ws_connect`` calls in ``tests/autobahn/client.py`` with ``aiohttp.ClienSession.ws_connect``.
(5606)_
- Fixed test for ``HTTPUnauthorized`` that access the ``text`` argument. This is not used in any part of the code, so it's removed now.
(5657)_
- Remove incorrect default from docs
(5727)_
- Remove external test dependency to http://httpbin.org
(5840)_
- Don't cancel current task when entering a cancelled timer.
(5853)_
- Added ``params`` keyword argument to ``ClientSession.ws_connect``. -- :user:`hoh`.
(5868)_
- Uses :py:class:`~asyncio.ThreadedChildWatcher` under POSIX to allow setting up test loop in non-main thread.
(5877)_
- Fix the error in handling the return value of `getaddrinfo`.
`getaddrinfo` will return an `(int, bytes)` tuple, if CPython could not handle the address family.
It will cause a index out of range error in aiohttp. For example, if user compile CPython with
`--disable-ipv6` option but his system enable the ipv6.
(5901)_
- Removed the deprecated ``loop`` argument from the ``asyncio.sleep``/``gather`` calls
(5905)_
- Return ``None`` from ``request.if_modified_since``, ``request.if_unmodified_since``, ``request.if_range`` and ``response.last_modified`` when corresponding http date headers are invalid.
(5925)_
- Fix resetting `SIGCHLD` signals in Gunicorn aiohttp Worker to fix `subprocesses` that capture output having an incorrect `returncode`.
(6130)_
- Raise ``400: Content-Length can't be present with Transfer-Encoding`` if both ``Content-Length`` and ``Transfer-Encoding`` are sent by peer by both C and Python implementations
(6182)_
Improved Documentation
----------------------
- Refactored OpenAPI/Swagger aiohttp addons, added ``aio-openapi``
(5326)_
- Fixed docs on request cookies type, so it matches what is actually used in the code (a
read-only dictionary-like object).
(5725)_
- Documented that the HTTP client ``Authorization`` header is removed
on redirects to a different host or protocol.
(5850)_
Misc
----
- (3927)_, (4247)_, (4247)_, (5389)_, (5457)_, (5486)_, (5494)_, (5515)_, (5625)_, (5635)_, (5648)_, (5657)_, (5890)_, (5914)_, (5932)_, (6002)_, (6045)_, (6131)_, (6156)_, (6165)_, (6166)_
----
```
### 3.8.0a7
```
Features
--------
- Added a ``GunicornWebWorker`` feature for extending the aiohttp server configuration by allowing the 'wsgi' coroutine to return ``web.AppRunner`` object.
(2988)_
- Switch from ``http-parser`` to ``llhttp``
(3561)_
- Use Brotli instead of brotlipy
(3803)_
- Disable implicit switch-back to pure python mode. The build fails loudly if aiohttp
cannot be compiled with C Accelerators. Use AIOHTTP_NO_EXTENSIONS=1 to explicitly
disable C Extensions complication and switch to Pure-Python mode. Note that Pure-Python
mode is significantly slower than compiled one.
(3828)_
- Make access log use local time with timezone
(3853)_
- Implemented ``readuntil`` in ``StreamResponse``
(4054)_
- FileResponse now supports ETag.
(4594)_
- Add a request handler type alias ``aiohttp.typedefs.Handler``.
(4686)_
- ``AioHTTPTestCase`` is more async friendly now.
For people who use unittest and are used to use :py:exc:`~unittest.TestCase`
it will be easier to write new test cases like the sync version of the :py:exc:`~unittest.TestCase` class,
without using the decorator `unittest_run_loop`, just `async def test_*`.
The only difference is that for the people using python3.7 and below a new dependency is needed, it is ``asynctestcase``.
(4700)_
- Add validation of HTTP header keys and values to prevent header injection.
(4818)_
- Add predicate to ``AbstractCookieJar.clear``.
Add ``AbstractCookieJar.clear_domain`` to clean all domain and subdomains cookies only.
(4942)_
- Add keepalive_timeout parameter to web.run_app.
(5094)_
- Tracing for client sent headers
(5105)_
- Make type hints for http parser stricter
(5267)_
- Add final declarations for constants.
(5275)_
- Switch to external frozenlist and aiosignal libraries.
(5293)_
- Don't send secure cookies by insecure transports.
By default, the transport is secure if https or wss scheme is used.
Use `CookieJar(treat_as_secure_origin="http://127.0.0.1")` to override the default security checker.
(5571)_
- Always create a new event loop in ``aiohttp.web.run_app()``.
This adds better compatibility with ``asyncio.run()`` or if trying to run multiple apps in sequence.
(5572)_
- Add ``aiohttp.pytest_plugin.AiohttpClient`` for static typing of pytest plugin.
(5585)_
- Added a ``socket_factory`` argument to ``BaseTestServer``.
(5844)_
- Add compression strategy parameter to enable_compression method.
(5909)_
- Added support for Python 3.10 to Github Actions CI/CD workflows and fix the related deprecation warnings -- :user:`Hanaasagi`.
(5927)_
- Switched ``chardet`` to ``charset-normalizer`` for guessing the HTTP payload body encoding -- :user:`Ousret`.
(5930)_
- Added optional auto_decompress argument for HttpRequestParser
(5957)_
- Added support for HTTPS proxies to the extent CPython's
:py:mod:`asyncio` supports it -- by :user:`bmbouter`,
:user:`jborean93` and :user:`webknjaz`.
(5992)_
- Add Trove classifier and create binary wheels for 3.10. -- :user:`hugovk`.
(6079)_
- Started shipping platform-specific wheels with the ``musl`` tag targeting typical Alpine Linux runtimes — :user:`asvetlov`.
(6139)_
- Started shipping platform-specific arm64 wheels for Apple Silicon — :user:`asvetlov`.
(6139)_
Bugfixes
--------
- Modify _drain_helper() to handle concurrent `await resp.write(...)` or `ws.send_json(...)` calls without race-condition.
(2934)_
- Started using `MultiLoopChildWatcher` when it's available under POSIX while setting up the test I/O loop.
(3450)_
- Only encode content-disposition filename parameter using percent-encoding.
Other parameters are encoded to quoted-string or RFC2231 extended parameter
value.
(4012)_
- Fixed HTTP client requests to honor ``no_proxy`` environment variables.
(4431)_
- Change return type on URLDispatcher to UrlMappingMatchInfo to improve type annotations.
(4748)_
- Ensure a cleanup context is cleaned up even when an exception occurs during startup.
(4799)_
- Added a new exception type for Unix socket client errors which provides a more useful error message.
(4984)_
- Remove Transfer-Encoding and Content-Type headers for 204 in StreamResponse
(5106)_
- Only depend on typing_extensions for Python <3.8
(5107)_
- Add ABNORMAL_CLOSURE and BAD_GATEWAY to WSCloseCode
(5192)_
- Fix cookies disappearing from HTTPExceptions.
(5233)_
- Acquire the connection before running traces to prevent race condition.
(5259)_
- Add missing slots to _RequestContextManager`` and ``_WSRequestContextManager``
(5329)_
- Ensure sending a zero byte file does not throw an exception (round 2)
(5380)_
- Set "text/plain" when data is an empty string in client requests.
(5392)_
- Stop automatically releasing the ``ClientResponse`` object on calls to the ``ok`` property for the failed requests.
(5403)_
- Include query parameters from `params` keyword argument in tracing `URL`.
(5432)_
- Fix annotations
(5466)_
- Fixed the multipart POST requests processing to always release file
descriptors for the ``tempfile.Temporaryfile``-created
``_io.BufferedRandom`` instances of files sent within multipart request
bodies via HTTP POST requests -- by :user:`webknjaz`.
(5494)_
- Fix 0 being incorrectly treated as an immediate timeout.
(5527)_
- Replace deprecated app handler design in ``tests/autobahn/server.py`` with call to ``web.run_app``; replace deprecated ``aiohttp.ws_connect`` calls in ``tests/autobahn/client.py`` with ``aiohttp.ClienSession.ws_connect``.
(5606)_
- Fixed test for ``HTTPUnauthorized`` that access the ``text`` argument. This is not used in any part of the code, so it's removed now.
(5657)_
- Remove incorrect default from docs
(5727)_
- Remove external test dependency to http://httpbin.org
(5840)_
- Don't cancel current task when entering a cancelled timer.
(5853)_
- Added ``params`` keyword argument to ``ClientSession.ws_connect``. -- :user:`hoh`.
(5868)_
- Uses :py:class:`~asyncio.ThreadedChildWatcher` under POSIX to allow setting up test loop in non-main thread.
(5877)_
- Fix the error in handling the return value of `getaddrinfo`.
`getaddrinfo` will return an `(int, bytes)` tuple, if CPython could not handle the address family.
It will cause a index out of range error in aiohttp. For example, if user compile CPython with
`--disable-ipv6` option but his system enable the ipv6.
(5901)_
- Removed the deprecated ``loop`` argument from the ``asyncio.sleep``/``gather`` calls
(5905)_
- Return ``None`` from ``request.if_modified_since``, ``request.if_unmodified_since``, ``request.if_range`` and ``response.last_modified`` when corresponding http date headers are invalid.
(5925)_
- Fix resetting `SIGCHLD` signals in Gunicorn aiohttp Worker to fix `subprocesses` that capture output having an incorrect `returncode`.
(6130)_
Improved Documentation
----------------------
- Refactored OpenAPI/Swagger aiohttp addons, added ``aio-openapi``
(5326)_
- Fixed docs on request cookies type, so it matches what is actually used in the code (a
read-only dictionary-like object).
(5725)_
- Documented that the HTTP client ``Authorization`` header is removed
on redirects to a different host or protocol.
(5850)_
Misc
----
- (3927)_, (4247)_, (4247)_, (5389)_, (5457)_, (5486)_, (5494)_, (5515)_, (5625)_, (5635)_, (5648)_, (5657)_, (5890)_, (5914)_, (5932)_, (6002)_, (6045)_, (6131)_, (6156)_, (6165)_, (6166)_
----
```
### 3.7.4.post0
```
========================
Misc
----
- Bumped upper bound of the ``chardet`` runtime dependency
to allow their v4.0 version stream.
(5366)_
----
```
### 3.7.3
```
Features
--------
- Use Brotli instead of brotlipy
`3803 <https://github.com/aio-libs/aiohttp/issues/3803>`_
- Made exceptions pickleable. Also changed the repr of some exceptions.
`4077 <https://github.com/aio-libs/aiohttp/issues/4077>`_
Bugfixes
--------
- Raise a ClientResponseError instead of an AssertionError for a blank
HTTP Reason Phrase.
`3532 <https://github.com/aio-libs/aiohttp/issues/3532>`_
- Fix ``web_middlewares.normalize_path_middleware`` behavior for patch without slash.
`3669 <https://github.com/aio-libs/aiohttp/issues/3669>`_
- Fix overshadowing of overlapped sub-applications prefixes.
`3701 <https://github.com/aio-libs/aiohttp/issues/3701>`_
- Make `BaseConnector.close()` a coroutine and wait until the client closes all connections. Drop deprecated "with Connector():" syntax.
`3736 <https://github.com/aio-libs/aiohttp/issues/3736>`_
- Reset the ``sock_read`` timeout each time data is received for a ``aiohttp.client`` response.
`3808 <https://github.com/aio-libs/aiohttp/issues/3808>`_
- Fixed type annotation for add_view method of UrlDispatcher to accept any subclass of View
`3880 <https://github.com/aio-libs/aiohttp/issues/3880>`_
- Fixed querying the address families from DNS that the current host supports.
`5156 <https://github.com/aio-libs/aiohttp/issues/5156>`_
- Change return type of MultipartReader.__aiter__() and BodyPartReader.__aiter__() to AsyncIterator.
`5163 <https://github.com/aio-libs/aiohttp/issues/5163>`_
- Provide x86 Windows wheels.
`5230 <https://github.com/aio-libs/aiohttp/issues/5230>`_
Improved Documentation
----------------------
- Add documentation for ``aiohttp.web.FileResponse``.
`3958 <https://github.com/aio-libs/aiohttp/issues/3958>`_
- Removed deprecation warning in tracing example docs
`3964 <https://github.com/aio-libs/aiohttp/issues/3964>`_
- Fixed wrong "Usage" docstring of ``aiohttp.client.request``.
`4603 <https://github.com/aio-libs/aiohttp/issues/4603>`_
- Add aiohttp-pydantic to third party libraries
`5228 <https://github.com/aio-libs/aiohttp/issues/5228>`_
Misc
----
- `4102 <https://github.com/aio-libs/aiohttp/issues/4102>`_
```
### 3.7.2
```
Bugfixes
--------
- Fixed static files handling for loops without ``.sendfile()`` support
`5149 <https://github.com/aio-libs/aiohttp/issues/5149>`_
```
### 3.7.1
```
Bugfixes
--------
- Fixed a type error caused by the conditional import of `Protocol`.
`5111 <https://github.com/aio-libs/aiohttp/issues/5111>`_
- Server doesn't send Content-Length for 1xx or 204
`4901 <https://github.com/aio-libs/aiohttp/issues/4901>`_
- Fix run_app typing
`4957 <https://github.com/aio-libs/aiohttp/issues/4957>`_
- Always require ``typing_extensions`` library.
`5107 <https://github.com/aio-libs/aiohttp/issues/5107>`_
- Fix a variable-shadowing bug causing `ThreadedResolver.resolve` to
return the resolved IP as the ``hostname`` in each record, which prevented
validation of HTTPS connections.
`5110 <https://github.com/aio-libs/aiohttp/issues/5110>`_
- Added annotations to all public attributes.
`5115 <https://github.com/aio-libs/aiohttp/issues/5115>`_
- Fix flaky test_when_timeout_smaller_second
`5116 <https://github.com/aio-libs/aiohttp/issues/5116>`_
- Ensure sending a zero byte file does not throw an exception
`5124 <https://github.com/aio-libs/aiohttp/issues/5124>`_
- Fix a bug in ``web.run_app()`` about Python version checking on Windows
`5127 <https://github.com/aio-libs/aiohttp/issues/5127>`_
```
### 3.7.0
```
Features
--------
- Response headers are now prepared prior to running ``on_response_prepare`` hooks, directly before headers are sent to the client.
`1958 <https://github.com/aio-libs/aiohttp/issues/1958>`_
- Add a ``quote_cookie`` option to ``CookieJar``, a way to skip quotation wrapping of cookies containing special characters.
`2571 <https://github.com/aio-libs/aiohttp/issues/2571>`_
- Call ``AccessLogger.log`` with the current exception available from ``sys.exc_info()``.
`3557 <https://github.com/aio-libs/aiohttp/issues/3557>`_
- `web.UrlDispatcher.add_routes` and `web.Application.add_routes` return a list
of registered `AbstractRoute` instances. `AbstractRouteDef.register` (and all
subclasses) return a list of registered resources registered resource.
`3866 <https://github.com/aio-libs/aiohttp/issues/3866>`_
- Added properties of default ClientSession params to ClientSession class so it is available for introspection
`3882 <https://github.com/aio-libs/aiohttp/issues/3882>`_
- Don't cancel web handler on peer disconnection, raise `OSError` on reading/writing instead.
`4080 <https://github.com/aio-libs/aiohttp/issues/4080>`_
- Implement BaseRequest.get_extra_info() to access a protocol transports' extra info.
`4189 <https://github.com/aio-libs/aiohttp/issues/4189>`_
- Added `ClientSession.timeout` property.
`4191 <https://github.com/aio-libs/aiohttp/issues/4191>`_
- allow use of SameSite in cookies.
`4224 <https://github.com/aio-libs/aiohttp/issues/4224>`_
- Use ``loop.sendfile()`` instead of custom implementation if available.
`4269 <https://github.com/aio-libs/aiohttp/issues/4269>`_
- Apply SO_REUSEADDR to test server's socket.
`4393 <https://github.com/aio-libs/aiohttp/issues/4393>`_
- Use .raw_host instead of slower .host in client API
`4402 <https://github.com/aio-libs/aiohttp/issues/4402>`_
- Allow configuring the buffer size of input stream by passing ``read_bufsize`` argument.
`4453 <https://github.com/aio-libs/aiohttp/issues/4453>`_
- Pass tests on Python 3.8 for Windows.
`4513 <https://github.com/aio-libs/aiohttp/issues/4513>`_
- Add `method` and `url` attributes to `TraceRequestChunkSentParams` and `TraceResponseChunkReceivedParams`.
`4674 <https://github.com/aio-libs/aiohttp/issues/4674>`_
- Add ClientResponse.ok property for checking status code under 400.
`4711 <https://github.com/aio-libs/aiohttp/issues/4711>`_
- Don't ceil timeouts that are smaller than 5 seconds.
`4850 <https://github.com/aio-libs/aiohttp/issues/4850>`_
- TCPSite now listens by default on all interfaces instead of just IPv4 when `None` is passed in as the host.
`4894 <https://github.com/aio-libs/aiohttp/issues/4894>`_
- Bump ``http_parser`` to 2.9.4
`5070 <https://github.com/aio-libs/aiohttp/issues/5070>`_
Bugfixes
--------
- Fix keepalive connections not being closed in time
`3296 <https://github.com/aio-libs/aiohttp/issues/3296>`_
- Fix failed websocket handshake leaving connection hanging.
`3380 <https://github.com/aio-libs/aiohttp/issues/3380>`_
- Fix tasks cancellation order on exit. The run_app task needs to be cancelled first for cleanup hooks to run with all tasks intact.
`3805 <https://github.com/aio-libs/aiohttp/issues/3805>`_
- Don't start heartbeat until _writer is set
`4062 <https://github.com/aio-libs/aiohttp/issues/4062>`_
- Fix handling of multipart file uploads without a content type.
`4089 <https://github.com/aio-libs/aiohttp/issues/4089>`_
- Preserve view handler function attributes across middlewares
`4174 <https://github.com/aio-libs/aiohttp/issues/4174>`_
- Fix the string representation of ``ServerDisconnectedError``.
`4175 <https://github.com/aio-libs/aiohttp/issues/4175>`_
- Raising RuntimeError when trying to get encoding from not read body
`4214 <https://github.com/aio-libs/aiohttp/issues/4214>`_
- Remove warning messages from noop.
`4282 <https://github.com/aio-libs/aiohttp/issues/4282>`_
- Raise ClientPayloadError if FormData re-processed.
`4345 <https://github.com/aio-libs/aiohttp/issues/4345>`_
- Fix a warning about unfinished task in ``web_protocol.py``
`4408 <https://github.com/aio-libs/aiohttp/issues/4408>`_
- Fixed 'deflate' compression. According to RFC 2616 now.
`4506 <https://github.com/aio-libs/aiohttp/issues/4506>`_
- Fixed OverflowError on platforms with 32-bit time_t
`4515 <https://github.com/aio-libs/aiohttp/issues/4515>`_
- Fixed request.body_exists returns wrong value for methods without body.
`4528 <https://github.com/aio-libs/aiohttp/issues/4528>`_
- Fix connecting to link-local IPv6 addresses.
`4554 <https://github.com/aio-libs/aiohttp/issues/4554>`_
- Fix a problem with connection waiters that are never awaited.
`4562 <https://github.com/aio-libs/aiohttp/issues/4562>`_
- Always make sure transport is not closing before reuse a connection.
Reuse a protocol based on keepalive in headers is unreliable.
For example, uWSGI will not support keepalive even it serves a
HTTP 1.1 request, except explicitly configure uWSGI with a
``--http-keepalive`` option.
Servers designed like uWSGI could cause aiohttp intermittently
raise a ConnectionResetException when the protocol poll runs
out and some protocol is reused.
`4587 <https://github.com/aio-libs/aiohttp/issues/4587>`_
- Handle the last CRLF correctly even if it is received via separate TCP segment.
`4630 <https://github.com/aio-libs/aiohttp/issues/4630>`_
- Fix the register_resource function to validate route name before splitting it so that route name can include python keywords.
`4691 <https://github.com/aio-libs/aiohttp/issues/4691>`_
- Improve typing annotations for ``web.Request``, ``aiohttp.ClientResponse`` and
``multipart`` module.
`4736 <https://github.com/aio-libs/aiohttp/issues/4736>`_
- Fix resolver task is not awaited when connector is cancelled
`4795 <https://github.com/aio-libs/aiohttp/issues/4795>`_
- Fix a bug "Aiohttp doesn't return any error on invalid request methods"
`4798 <https://github.com/aio-libs/aiohttp/issues/4798>`_
- Fix HEAD requests for static content.
`4809 <https://github.com/aio-libs/aiohttp/issues/4809>`_
- Fix incorrect size calculation for memoryview
`4890 <https://github.com/aio-libs/aiohttp/issues/4890>`_
- Add HTTPMove to _all__.
`4897 <https://github.com/aio-libs/aiohttp/issues/4897>`_
- Fixed the type annotations in the ``tracing`` module.
`4912 <https://github.com/aio-libs/aiohttp/issues/4912>`_
- Fix typing for multipart ``__aiter__``.
`4931 <https://github.com/aio-libs/aiohttp/issues/4931>`_
- Fix for race condition on connections in BaseConnector that leads to exceeding the connection limit.
`4936 <https://github.com/aio-libs/aiohttp/issues/4936>`_
- Add forced UTF-8 encoding for ``application/rdap+json`` responses.
`4938 <https://github.com/aio-libs/aiohttp/issues/4938>`_
- Fix inconsistency between Python and C http request parsers in parsing pct-encoded URL.
`4972 <https://github.com/aio-libs/aiohttp/issues/4972>`_
- Fix connection closing issue in HEAD request.
`5012 <https://github.com/aio-libs/aiohttp/issues/5012>`_
- Fix type hint on BaseRunner.addresses (from ``List[str]`` to ``List[Any]``)
`5086 <https://github.com/aio-libs/aiohttp/issues/5086>`_
- Make `web.run_app()` more responsive to Ctrl+C on Windows for Python < 3.8. It slightly
increases CPU load as a side effect.
`5098 <https://github.com/aio-libs/aiohttp/issues/5098>`_
Improved Documentation
----------------------
- Fix example code in client quick-start
`3376 <https://github.com/aio-libs/aiohttp/issues/3376>`_
- Updated the docs so there is no contradiction in ``ttl_dns_cache`` default value
`3512 <https://github.com/aio-libs/aiohttp/issues/3512>`_
- Add 'Deploy with SSL' to docs.
`4201 <https://github.com/aio-libs/aiohttp/issues/4201>`_
- Change typing of the secure argument on StreamResponse.set_cookie from ``Optional[str]`` to ``Optional[bool]``
`4204 <https://github.com/aio-libs/aiohttp/issues/4204>`_
- Changes ``ttl_dns_cache`` type from int to Optional[int].
`4270 <https://github.com/aio-libs/aiohttp/issues/4270>`_
- Simplify README hello word example and add a documentation page for people coming from requests.
`4272 <https://github.com/aio-libs/aiohttp/issues/4272>`_
- Improve some code examples in the documentation involving websockets and starting a simple HTTP site with an AppRunner.
`4285 <https://github.com/aio-libs/aiohttp/issues/4285>`_
- Fix typo in code example in Multipart docs
`4312 <https://github.com/aio-libs/aiohttp/issues/4312>`_
- Fix code example in Multipart section.
`4314 <https://github.com/aio-libs/aiohttp/issues/4314>`_
- Update contributing guide so new contributors read the most recent version of that guide. Update command used to create test coverage reporting.
`4810 <https://github.com/aio-libs/aiohttp/issues/4810>`_
- Spelling: Change "canonize" to "canonicalize".
`4986 <https://github.com/aio-libs/aiohttp/issues/4986>`_
- Add ``aiohttp-sse-client`` library to third party usage list.
`5084 <https://github.com/aio-libs/aiohttp/issues/5084>`_
Misc
----
- `2856 <https://github.com/aio-libs/aiohttp/issues/2856>`_, `#4218 <https://github.com/aio-libs/aiohttp/issues/4218>`_, `#4250 <https://github.com/aio-libs/aiohttp/issues/4250>`_
```
### 3.6.2
```
It contains several bufixes.
Changes
------------
Features
--------
- Made exceptions pickleable. Also changed the repr of some exceptions.
`4077 <https://github.com/aio-libs/aiohttp/issues/4077>`_
- Use ``Iterable`` type hint instead of ``Sequence`` for ``Application`` *middleware*
parameter. `4125 <https://github.com/aio-libs/aiohttp/issues/4125>`_
Bugfixes
--------
- Reset the ``sock_read`` timeout each time data is received for a
``aiohttp.ClientResponse``. `3808
<https://github.com/aio-libs/aiohttp/issues/3808>`_
- Fix handling of expired cookies so they are not stored in CookieJar.
`4063 <https://github.com/aio-libs/aiohttp/issues/4063>`_
- Fix misleading message in the string representation of ``ClientConnectorError``;
``self.ssl == None`` means default SSL context, not SSL disabled `
Update aiohttp from 3.5.4 to 3.9.3.
Changelog
### 3.9.3 ``` Bug fixes --------- - Fixed backwards compatibility breakage (in 3.9.2) of ``ssl`` parameter when set outside of ``ClientSession`` (e.g. directly in ``TCPConnector``) -- by :user:`Dreamsorcerer`. *Related issues and pull requests on GitHub:* 8097, 8098. Miscellaneous internal changes ------------------------------ - Improved test suite handling of paths and temp files to consistently use pathlib and pytest fixtures. *Related issues and pull requests on GitHub:* 3957. ---- ``` ### 3.9.2 ``` Bug fixes --------- - Fixed server-side websocket connection leak. *Related issues and pull requests on GitHub:* 7978. - Fixed ``web.FileResponse`` doing blocking I/O in the event loop. *Related issues and pull requests on GitHub:* 8012. - Fixed double compress when compression enabled and compressed file exists in server file responses. *Related issues and pull requests on GitHub:* 8014. - Added runtime type check for ``ClientSession`` ``timeout`` parameter. *Related issues and pull requests on GitHub:* 8021. - Fixed an unhandled exception in the Python HTTP parser on header lines starting with a colon -- by :user:`pajod`. Invalid request lines with anything but a dot between the HTTP major and minor version are now rejected. Invalid header field names containing question mark or slash are now rejected. Such requests are incompatible with :rfc:`9110section-5.6.2` and are not known to be of any legitimate use. *Related issues and pull requests on GitHub:* 8074. - Improved validation of paths for static resources requests to the server -- by :user:`bdraco`. *Related issues and pull requests on GitHub:* 8079. Features -------- - Added support for passing :py:data:`True` to ``ssl`` parameter in ``ClientSession`` while deprecating :py:data:`None` -- by :user:`xiangyan99`. *Related issues and pull requests on GitHub:* 7698. Breaking changes ---------------- - Fixed an unhandled exception in the Python HTTP parser on header lines starting with a colon -- by :user:`pajod`. Invalid request lines with anything but a dot between the HTTP major and minor version are now rejected. Invalid header field names containing question mark or slash are now rejected. Such requests are incompatible with :rfc:`9110section-5.6.2` and are not known to be of any legitimate use. *Related issues and pull requests on GitHub:* 8074. Improved documentation ---------------------- - Fixed examples of ``fallback_charset_resolver`` function in the :doc:`client_advanced` document. -- by :user:`henry0312`. *Related issues and pull requests on GitHub:* 7995. - The Sphinx setup was updated to avoid showing the empty changelog draft section in the tagged release documentation builds on Read The Docs -- by :user:`webknjaz`. *Related issues and pull requests on GitHub:* 8067. Packaging updates and notes for downstreams ------------------------------------------- - The changelog categorization was made clearer. The contributors can now mark their fragment files more accurately -- by :user:`webknjaz`. The new category tags are: * ``bugfix`` * ``feature`` * ``deprecation`` * ``breaking`` (previously, ``removal``) * ``doc`` * ``packaging`` * ``contrib`` * ``misc`` *Related issues and pull requests on GitHub:* 8066. Contributor-facing changes -------------------------- - Updated :ref:`contributing/Tests coverage <aiohttp-contributing>` section to show how we use ``codecov`` -- by :user:`Dreamsorcerer`. *Related issues and pull requests on GitHub:* 7916. - The changelog categorization was made clearer. The contributors can now mark their fragment files more accurately -- by :user:`webknjaz`. The new category tags are: * ``bugfix`` * ``feature`` * ``deprecation`` * ``breaking`` (previously, ``removal``) * ``doc`` * ``packaging`` * ``contrib`` * ``misc`` *Related issues and pull requests on GitHub:* 8066. Miscellaneous internal changes ------------------------------ - Replaced all ``tmpdir`` fixtures with ``tmp_path`` in test suite. *Related issues and pull requests on GitHub:* 3551. ---- ``` ### 3.9.1 ``` Bugfixes -------- - Fixed importing aiohttp under PyPy on Windows. (7848) - Fixed async concurrency safety in websocket compressor. (7865) - Fixed ``ClientResponse.close()`` releasing the connection instead of closing. (7869) - Fixed a regression where connection may get closed during upgrade. -- by :user:`Dreamsorcerer` (7879) - Fixed messages being reported as upgraded without an Upgrade header in Python parser. -- by :user:`Dreamsorcerer` (7895) ---- ``` ### 3.9.0 ``` Features -------- - Introduced ``AppKey`` for static typing support of ``Application`` storage. See https://docs.aiohttp.org/en/stable/web_advanced.html#application-s-config (5864) - Added a graceful shutdown period which allows pending tasks to complete before the application's cleanup is called. The period can be adjusted with the ``shutdown_timeout`` parameter. -- by :user:`Dreamsorcerer`. See https://docs.aiohttp.org/en/latest/web_advanced.html#graceful-shutdown (7188) - Added `handler_cancellation <https://docs.aiohttp.org/en/stable/web_advanced.html#web-handler-cancellation>`_ parameter to cancel web handler on client disconnection. -- by :user:`mosquito` This (optionally) reintroduces a feature removed in a previous release. Recommended for those looking for an extra level of protection against denial-of-service attacks. (7056) - Added support for setting response header parameters ``max_line_size`` and ``max_field_size``. (2304) - Added ``auto_decompress`` parameter to ``ClientSession.request`` to override ``ClientSession._auto_decompress``. -- by :user:`Daste745` (3751) - Changed ``raise_for_status`` to allow a coroutine. (3892) - Added client brotli compression support (optional with runtime check). (5219) - Added ``client_max_size`` to ``BaseRequest.clone()`` to allow overriding the request body size. -- :user:`anesabml`. (5704) - Added a middleware type alias ``aiohttp.typedefs.Middleware``. (5898) - Exported ``HTTPMove`` which can be used to catch any redirection request that has a location -- :user:`dreamsorcerer`. (6594) - Changed the ``path`` parameter in ``web.run_app()`` to accept a ``pathlib.Path`` object. (6839) - Performance: Skipped filtering ``CookieJar`` when the jar is empty or all cookies have expired. (7819) - Performance: Only check origin if insecure scheme and there are origins to treat as secure, in ``CookieJar.filter_cookies()``. (7821) - Performance: Used timestamp instead of ``datetime`` to achieve faster cookie expiration in ``CookieJar``. (7824) - Added support for passing a custom server name parameter to HTTPS connection. (7114) - Added support for using Basic Auth credentials from :file:`.netrc` file when making HTTP requests with the :py:class:`~aiohttp.ClientSession` ``trust_env`` argument is set to ``True``. -- by :user:`yuvipanda`. (7131) - Turned access log into no-op when the logger is disabled. (7240) - Added typing information to ``RawResponseMessage``. -- by :user:`Gobot1234` (7365) - Removed ``async-timeout`` for Python 3.11+ (replaced with ``asyncio.timeout()`` on newer releases). (7502) - Added support for ``brotlicffi`` as an alternative to ``brotli`` (fixing Brotli support on PyPy). (7611) - Added ``WebSocketResponse.get_extra_info()`` to access a protocol transport's extra info. (7078) - Allow ``link`` argument to be set to None/empty in HTTP 451 exception. (7689) Bugfixes -------- - Implemented stripping the trailing dots from fully-qualified domain names in ``Host`` headers and TLS context when acting as an HTTP client. This allows the client to connect to URLs with FQDN host name like ``https://example.com./``. -- by :user:`martin-sucha`. (3636) - Fixed client timeout not working when incoming data is always available without waiting. -- by :user:`Dreamsorcerer`. (5854) - Fixed ``readuntil`` to work with a delimiter of more than one character. (6701) - Added ``__repr__`` to ``EmptyStreamReader`` to avoid ``AttributeError``. (6916) - Fixed bug when using ``TCPConnector`` with ``ttl_dns_cache=0``. (7014) - Fixed response returned from expect handler being thrown away. -- by :user:`Dreamsorcerer` (7025) - Avoided raising ``UnicodeDecodeError`` in multipart and in HTTP headers parsing. (7044) - Changed ``sock_read`` timeout to start after writing has finished, avoiding read timeouts caused by an unfinished write. -- by :user:`dtrifiro` (7149) - Fixed missing query in tracing method URLs when using ``yarl`` 1.9+. (7259) - Changed max 32-bit timestamp to an aware datetime object, for consistency with the non-32-bit one, and to avoid a ``DeprecationWarning`` on Python 3.12. (7302) - Fixed ``EmptyStreamReader.iter_chunks()`` never ending. -- by :user:`mind1m` (7616) - Fixed a rare ``RuntimeError: await wasn't used with future`` exception. -- by :user:`stalkerg` (7785) - Fixed issue with insufficient HTTP method and version validation. (7700) - Added check to validate that absolute URIs have schemes. (7712) - Fixed unhandled exception when Python HTTP parser encounters unpaired Unicode surrogates. (7715) - Updated parser to disallow invalid characters in header field names and stop accepting LF as a request line separator. (7719) - Fixed Python HTTP parser not treating 204/304/1xx as an empty body. (7755) - Ensure empty body response for 1xx/204/304 per RFC 9112 sec 6.3. (7756) - Fixed an issue when a client request is closed before completing a chunked payload. -- by :user:`Dreamsorcerer` (7764) - Edge Case Handling for ResponseParser for missing reason value. (7776) - Fixed ``ClientWebSocketResponse.close_code`` being erroneously set to ``None`` when there are concurrent async tasks receiving data and closing the connection. (7306) - Added HTTP method validation. (6533) - Fixed arbitrary sequence types being allowed to inject values via version parameter. -- by :user:`Dreamsorcerer` (7835) - Performance: Fixed increase in latency with small messages from websocket compression changes. (7797) Improved Documentation ---------------------- - Fixed the `ClientResponse.release`'s type in the doc. Changed from `comethod` to `method`. (5836) - Added information on behavior of base_url parameter in `ClientSession`. (6647) - Fixed `ClientResponseError` docs. (6700) - Updated Redis code examples to follow the latest API. (6907) - Added a note about possibly needing to update headers when using ``on_response_prepare``. -- by :user:`Dreamsorcerer` (7283) - Completed ``trust_env`` parameter description to honor ``wss_proxy``, ``ws_proxy`` or ``no_proxy`` env. (7325) - Expanded SSL documentation with more examples (e.g. how to use certifi). -- by :user:`Dreamsorcerer` (7334) - Fix, update, and improve client exceptions documentation. (7733) Deprecations and Removals ------------------------- - Added ``shutdown_timeout`` parameter to ``BaseRunner``, while deprecating ``shutdown_timeout`` parameter from ``BaseSite``. -- by :user:`Dreamsorcerer` (7718) - Dropped Python 3.6 support. (6378) - Dropped Python 3.7 support. -- by :user:`Dreamsorcerer` (7336) - Removed support for abandoned ``tokio`` event loop. -- by :user:`Dreamsorcerer` (7281) Misc ---- - Made ``print`` argument in ``run_app()`` optional. (3690) - Improved performance of ``ceil_timeout`` in some cases. (6316) - Changed importing Gunicorn to happen on-demand, decreasing import time by ~53%. -- :user:`Dreamsorcerer` (6591) - Improved import time by replacing ``http.server`` with ``http.HTTPStatus``. (6903) - Fixed annotation of ``ssl`` parameter to disallow ``True``. -- by :user:`Dreamsorcerer`. (7335) ---- ``` ### 3.9.0rc0 ``` Features -------- - Performance: Skipped filtering ``CookieJar`` when the jar is empty or all cookies have expired. (7819) - Performance: Only check origin if insecure scheme and there are origins to treat as secure, in ``CookieJar.filter_cookies()``. (7821) - Performance: Used timestamp instead of ``datetime`` to achieve faster cookie expiration in ``CookieJar``. (7824) Bugfixes -------- - Fixed an issue where the client could go into an infinite loop. -- by :user:`Dreamsorcerer` (7815) - Added HTTP method validation. (6533) - Fixed arbitrary sequence types being allowed to inject values via version parameter. -- by :user:`Dreamsorcerer` (7835) - Performance: Fixed increase in latency with small messages from websocket compression changes. (7797) ---- ``` ### 3.9.0b1 ``` Features -------- - Added ``WebSocketResponse.get_extra_info()`` to access a protocol transport's extra info. (7078) - Allow ``link`` argument to be set to None/empty in HTTP 451 exception. (7689) - Added ``shutdown_timeout`` parameter to ``BaseRunner``, while deprecating ``shutdown_timeout`` parameter from ``BaseSite``. -- by :user:`Dreamsorcerer` (7718) Bugfixes -------- - Fixed keep-alive connections stopping a graceful shutdown. -- by :user:`Dreamsorcerer` (7718) - Fixed ``ClientWebSocketResponse.close_code`` being erroneously set to ``None`` when there are concurrent async tasks receiving data and closing the connection. (7306) - Changed ``AppKey`` warning to ``web.NotAppKeyWarning`` and stop it being displayed by default. -- by :user:`Dreamsorcerer` (7677) - Fix issue with insufficient HTTP method and version validation. (7700) - Add check to validate that absolute URIs have schemes. (7712) - Fix unhandled exception when Python HTTP parser encounters unpaired Unicode surrogates. (7715) - Update parser to disallow invalid characters in header field names and stop accepting LF as a request line separator. (7719) - Fix py http parser not treating 204/304/1xx as an empty body (7755) - Ensure empty body response for 1xx/204/304 per RFC 9112 sec 6.3 (7756) - Fixed an issue when a client request is closed before completing a chunked payload -- by :user:`Dreamsorcerer` (7764) - Edge Case Handling for ResponseParser for missing reason value (7776) - Fixed a rare `RuntimeError: await wasn't used with future` exception -- by :user:`stalkerg` (7785) Improved Documentation ---------------------- - Fix, update, and improve client exceptions documentation. (7733) ---- ``` ### 3.9.0b0 ``` Features -------- - Introduced ``AppKey`` for static typing support of ``Application`` storage. See https://docs.aiohttp.org/en/stable/web_advanced.html#application-s-config (5864) - Added a graceful shutdown period which allows pending tasks to complete before the application's cleanup is called. The period can be adjusted with the ``shutdown_timeout`` parameter. -- by :user:`Dreamsorcerer`. See https://docs.aiohttp.org/en/latest/web_advanced.html#graceful-shutdown (7188) - Added `handler_cancellation <https://docs.aiohttp.org/en/stable/web_advanced.html#web-handler-cancellation>`_ parameter to cancel web handler on client disconnection. -- by :user:`mosquito` This (optionally) reintroduces a feature removed in a previous release. Recommended for those looking for an extra level of protection against denial-of-service attacks. (7056) - Added support for setting response header parameters ``max_line_size`` and ``max_field_size``. (2304) - Added ``auto_decompress`` parameter to ``ClientSession.request`` to override ``ClientSession._auto_decompress``. -- by :user:`Daste745` (3751) - Changed ``raise_for_status`` to allow a coroutine. (3892) - Added client brotli compression support (optional with runtime check). (5219) - Added ``client_max_size`` to ``BaseRequest.clone()`` to allow overriding the request body size -- :user:`anesabml`. (5704) - Added a middleware type alias ``aiohttp.typedefs.Middleware``. (5898) - Exported ``HTTPMove`` which can be used to catch any redirection request that has a location -- :user:`dreamsorcerer`. (6594) - Changed the ``path`` parameter in ``web.run_app()`` to accept a ``pathlib.Path`` object. (6839) - Added support for passing a custom server name parameter to HTTPS connection. (7114) - Added support for using Basic Auth credentials from :file:`.netrc` file when making HTTP requests with the :py:class:`~aiohttp.ClientSession` ``trust_env`` argument is set to ``True`` -- by :user:`yuvipanda`. (7131) - Turned access log into no-op when the logger is disabled. (7240) - Added typing information to ``RawResponseMessage`` -- by :user:`Gobot1234` (7365) - Removed ``async-timeout`` for Python 3.11+ (replaced with ``asyncio.timeout()`` on newer releases). (7502) - Added support for ``brotlicffi`` as an alternative to ``brotli`` (fixing Brotli support on PyPy). (7611) Bugfixes -------- - Implemented stripping the trailing dots from fully-qualified domain names in ``Host`` headers and TLS context when acting as an HTTP client. This allows the client to connect to URLs with FQDN host name like ``https://example.com./``. -- by :user:`martin-sucha`. (3636) - Fixed client timeout not working when incoming data is always available without waiting -- by :user:`Dreamsorcerer`. (5854) - Fixed ``readuntil`` to work with a delimiter of more than one character (6701) - Added ``__repr__`` to ``EmptyStreamReader`` to avoid ``AttributeError``. (6916) - Fixed bug when using ``TCPConnector`` with ``ttl_dns_cache=0``. (7014) - Fixed response returned from expect handler being thrown away. -- by :user:`Dreamsorcerer` (7025) - Avoided raising ``UnicodeDecodeError`` in multipart and in HTTP headers parsing. (7044) - Changed ``sock_read`` timeout to start after writing has finished, avoiding read timeouts caused by an unfinished write. -- by :user:`dtrifiro` (7149) - Fixed missing query in tracing method URLs when using ``yarl`` 1.9+. (7259) - Changed max 32-bit timestamp to an aware datetime object, for consistency with the non-32-bit one, and to avoid a ``DeprecationWarning`` on Python 3.12. (7302) - Fixed ``EmptyStreamReader.iter_chunks()`` never ending. -- by :user:`mind1m` (7616) Improved Documentation ---------------------- - Fixed the `ClientResponse.release`'s type in the doc. Changed from `comethod` to `method`. (5836) - Added information on behavior of base_url parameter in `ClientSession`. (6647) - Fixed `ClientResponseError` docs. (6700) - Updated Redis code examples to follow the latest API. (6907) - Added a note about possibly needing to update headers when using ``on_response_prepare``. -- by :user:`Dreamsorcerer` (7283) - Completed ``trust_env`` parameter description to honor ``wss_proxy``, ``ws_proxy`` or ``no_proxy`` env. (7325) - Expanded SSL documentation with more examples (e.g. how to use certifi). -- by :user:`Dreamsorcerer` (7334) Deprecations and Removals ------------------------- - Dropped Python 3.6 support. (6378) - Dropped Python 3.7 support. -- by :user:`Dreamsorcerer` (7336) - Removed support for abandoned ``tokio`` event loop. -- by :user:`Dreamsorcerer` (7281) Misc ---- - Made ``print`` argument in ``run_app()`` optional. (3690) - Improved performance of ``ceil_timeout`` in some cases. (6316) - Changed importing Gunicorn to happen on-demand, decreasing import time by ~53%. -- :user:`Dreamsorcerer` (6591) - Improved import time by replacing ``http.server`` with ``http.HTTPStatus``. (6903) - Fixed annotation of ``ssl`` parameter to disallow ``True``. -- by :user:`Dreamsorcerer` (7335) ---- ``` ### 3.8.6 ``` Security bugfixes ----------------- - Upgraded the vendored copy of llhttp_ to v9.1.3 -- by :user:`Dreamsorcerer` Thanks to :user:`kenballus` for reporting this, see https://github.com/aio-libs/aiohttp/security/advisories/GHSA-pjjw-qhg8-p2p9. .. _llhttp: https://llhttp.org (7647) - Updated Python parser to comply with RFCs 9110/9112 -- by :user:`Dreamorcerer` Thanks to :user:`kenballus` for reporting this, see https://github.com/aio-libs/aiohttp/security/advisories/GHSA-gfw2-4jvh-wgfg. (7663) Deprecation ----------- - Added ``fallback_charset_resolver`` parameter in ``ClientSession`` to allow a user-supplied character set detection function. Character set detection will no longer be included in 3.9 as a default. If this feature is needed, please use `fallback_charset_resolver <https://docs.aiohttp.org/en/stable/client_advanced.html#character-set-detection>`_. (7561) Features -------- - Enabled lenient response parsing for more flexible parsing in the client (this should resolve some regressions when dealing with badly formatted HTTP responses). -- by :user:`Dreamsorcerer` (7490) Bugfixes -------- - Fixed ``PermissionError`` when ``.netrc`` is unreadable due to permissions. (7237) - Fixed output of parsing errors pointing to a ``\n``. -- by :user:`Dreamsorcerer` (7468) - Fixed ``GunicornWebWorker`` max_requests_jitter not working. (7518) - Fixed sorting in ``filter_cookies`` to use cookie with longest path. -- by :user:`marq24`. (7577) - Fixed display of ``BadStatusLine`` messages from llhttp_. -- by :user:`Dreamsorcerer` (7651) ---- ``` ### 3.8.5 ``` Security bugfixes ----------------- - Upgraded the vendored copy of llhttp_ to v8.1.1 -- by :user:`webknjaz` and :user:`Dreamsorcerer`. Thanks to :user:`sethmlarson` for reporting this and providing us with comprehensive reproducer, workarounds and fixing details! For more information, see https://github.com/aio-libs/aiohttp/security/advisories/GHSA-45c4-8wx5-qw6w. .. _llhttp: https://llhttp.org (7346) Features -------- - Added information to C parser exceptions to show which character caused the error. -- by :user:`Dreamsorcerer` (7366) Bugfixes -------- - Fixed a transport is :data:`None` error -- by :user:`Dreamsorcerer`. (3355) ---- ``` ### 3.8.4 ``` Bugfixes -------- - Fixed incorrectly overwriting cookies with the same name and domain, but different path. (6638) - Fixed ``ConnectionResetError`` not being raised after client disconnection in SSL environments. (7180) ---- ``` ### 3.8.3 ``` .. attention:: This is the last :doc:`aiohttp <index>` release tested under Python 3.6. The 3.9 stream is dropping it from the CI and the distribution package metadata. Bugfixes -------- - Increased the upper boundary of the :doc:`multidict:index` dependency to allow for the version 6 -- by :user:`hugovk`. It used to be limited below version 7 in :doc:`aiohttp <index>` v3.8.1 but was lowered in v3.8.2 via :pr:`6550` and never brought back, causing problems with dependency pins when upgrading. :doc:`aiohttp <index>` v3.8.3 fixes that by recovering the original boundary of ``< 7``. (6950) ---- ``` ### 3.8.2 ``` .. note:: This release has some compatibility fixes for Python 3.11 but it may still have some quirks. Some tests are still flaky in the CI. .. attention:: This is the last :doc:`aiohttp <index>` release tested under Python 3.6. The 3.9 stream is dropping it from the CI and the distribution package metadata. Bugfixes -------- - Added support for registering :rfc:`OPTIONS <9110OPTIONS>` HTTP method handlers via :py:class:`~aiohttp.web.RouteTableDef`. (4663) - Started supporting :rfc:`authority-form <9112authority-form>` and :rfc:`absolute-form <9112absolute-form>` URLs on the server-side. (6227) - Fixed Python 3.11 incompatibilities by using Cython 0.29.25. (6396) - Extended the ``sock`` argument typing declaration of the :py:func:`~aiohttp.web.run_app` function as optionally accepting iterables. (6401) - Fixed a regression where :py:exc:`~asyncio.CancelledError` occurs on client disconnection. (6719) - Started exporting :py:class:`~aiohttp.web.PrefixedSubAppResource` under :py:mod:`aiohttp.web` -- by :user:`Dreamsorcerer`. This fixes a regression introduced by :pr:`3469`. (6889) - Dropped the :class:`object` type possibility from the :py:attr:`aiohttp.ClientSession.timeout` property return type declaration. (6917), (6923) Improved Documentation ---------------------- - Added clarification on configuring the app object with settings such as a database connection. (4137) - Extended the ``sock`` argument typing declaration of the :py:func:`~aiohttp.web.run_app` function as optionally accepting iterables. (6401) - Dropped the :class:`object` type possibility from the :py:attr:`aiohttp.ClientSession.timeout` property return type declaration. (6917), (6923) Deprecations and Removals ------------------------- - Dropped Python 3.5 support, :doc:`aiohttp <index>` only works under Python 3.6 and higher from now on. (4046) Misc ---- - Removed a deprecated usage of :py:func:`pytest.warns(None) <pytest.warns>` in tests. (6663) - (6369), (6399), (6550), (6708), (6757), (6857), (6872). ---- ``` ### 3.8.1 ``` Bugfixes -------- - Fix the error in handling the return value of `getaddrinfo`. `getaddrinfo` will return an `(int, bytes)` tuple, if CPython could not handle the address family. It will cause a index out of range error in aiohttp. For example, if user compile CPython with `--disable-ipv6` option but his system enable the ipv6. (5901) - Do not install "examples" as a top-level package. (6189) - Restored ability to connect IPv6-only host. (6195) - Remove ``Signal`` from ``__all__``, replace ``aiohttp.Signal`` with ``aiosignal.Signal`` in docs (6201) - Made chunked encoding HTTP header check stricter. (6305) Improved Documentation ---------------------- - update quick starter demo codes. (6240) - Added an explanation of how tiny timeouts affect performance to the client reference document. (6274) - Add flake8-docstrings to flake8 configuration, enable subset of checks. (6276) - Added information on running complex applications with additional tasks/processes -- :user:`Dreamsorcerer`. (6278) Misc ---- - (6205) ---- ``` ### 3.8.0 ``` Features -------- - Added a ``GunicornWebWorker`` feature for extending the aiohttp server configuration by allowing the 'wsgi' coroutine to return ``web.AppRunner`` object. (2988)_ - Switch from ``http-parser`` to ``llhttp`` (3561)_ - Use Brotli instead of brotlipy (3803)_ - Disable implicit switch-back to pure python mode. The build fails loudly if aiohttp cannot be compiled with C Accelerators. Use AIOHTTP_NO_EXTENSIONS=1 to explicitly disable C Extensions complication and switch to Pure-Python mode. Note that Pure-Python mode is significantly slower than compiled one. (3828)_ - Make access log use local time with timezone (3853)_ - Implemented ``readuntil`` in ``StreamResponse`` (4054)_ - FileResponse now supports ETag. (4594)_ - Add a request handler type alias ``aiohttp.typedefs.Handler``. (4686)_ - ``AioHTTPTestCase`` is more async friendly now. For people who use unittest and are used to use :py:exc:`~unittest.TestCase` it will be easier to write new test cases like the sync version of the :py:exc:`~unittest.TestCase` class, without using the decorator `unittest_run_loop`, just `async def test_*`. The only difference is that for the people using python3.7 and below a new dependency is needed, it is ``asynctestcase``. (4700)_ - Add validation of HTTP header keys and values to prevent header injection. (4818)_ - Add predicate to ``AbstractCookieJar.clear``. Add ``AbstractCookieJar.clear_domain`` to clean all domain and subdomains cookies only. (4942)_ - Add keepalive_timeout parameter to web.run_app. (5094)_ - Tracing for client sent headers (5105)_ - Make type hints for http parser stricter (5267)_ - Add final declarations for constants. (5275)_ - Switch to external frozenlist and aiosignal libraries. (5293)_ - Don't send secure cookies by insecure transports. By default, the transport is secure if https or wss scheme is used. Use `CookieJar(treat_as_secure_origin="http://127.0.0.1")` to override the default security checker. (5571)_ - Always create a new event loop in ``aiohttp.web.run_app()``. This adds better compatibility with ``asyncio.run()`` or if trying to run multiple apps in sequence. (5572)_ - Add ``aiohttp.pytest_plugin.AiohttpClient`` for static typing of pytest plugin. (5585)_ - Added a ``socket_factory`` argument to ``BaseTestServer``. (5844)_ - Add compression strategy parameter to enable_compression method. (5909)_ - Added support for Python 3.10 to Github Actions CI/CD workflows and fix the related deprecation warnings -- :user:`Hanaasagi`. (5927)_ - Switched ``chardet`` to ``charset-normalizer`` for guessing the HTTP payload body encoding -- :user:`Ousret`. (5930)_ - Added optional auto_decompress argument for HttpRequestParser (5957)_ - Added support for HTTPS proxies to the extent CPython's :py:mod:`asyncio` supports it -- by :user:`bmbouter`, :user:`jborean93` and :user:`webknjaz`. (5992)_ - Added ``base_url`` parameter to the initializer of :class:`~aiohttp.ClientSession`. (6013)_ - Add Trove classifier and create binary wheels for 3.10. -- :user:`hugovk`. (6079)_ - Started shipping platform-specific wheels with the ``musl`` tag targeting typical Alpine Linux runtimes — :user:`asvetlov`. (6139)_ - Started shipping platform-specific arm64 wheels for Apple Silicon — :user:`asvetlov`. (6139)_ Bugfixes -------- - Modify _drain_helper() to handle concurrent `await resp.write(...)` or `ws.send_json(...)` calls without race-condition. (2934)_ - Started using `MultiLoopChildWatcher` when it's available under POSIX while setting up the test I/O loop. (3450)_ - Only encode content-disposition filename parameter using percent-encoding. Other parameters are encoded to quoted-string or RFC2231 extended parameter value. (4012)_ - Fixed HTTP client requests to honor ``no_proxy`` environment variables. (4431)_ - Fix supporting WebSockets proxies configured via environment variables. (4648)_ - Change return type on URLDispatcher to UrlMappingMatchInfo to improve type annotations. (4748)_ - Ensure a cleanup context is cleaned up even when an exception occurs during startup. (4799)_ - Added a new exception type for Unix socket client errors which provides a more useful error message. (4984)_ - Remove Transfer-Encoding and Content-Type headers for 204 in StreamResponse (5106)_ - Only depend on typing_extensions for Python <3.8 (5107)_ - Add ABNORMAL_CLOSURE and BAD_GATEWAY to WSCloseCode (5192)_ - Fix cookies disappearing from HTTPExceptions. (5233)_ - StaticResource prefixes no longer match URLs with a non-folder prefix. For example ``routes.static('/foo', '/foo')`` no longer matches the URL ``/foobar``. Previously, this would attempt to load the file ``/foo/ar``. (5250)_ - Acquire the connection before running traces to prevent race condition. (5259)_ - Add missing slots to _RequestContextManager`` and ``_WSRequestContextManager`` (5329)_ - Ensure sending a zero byte file does not throw an exception (round 2) (5380)_ - Set "text/plain" when data is an empty string in client requests. (5392)_ - Stop automatically releasing the ``ClientResponse`` object on calls to the ``ok`` property for the failed requests. (5403)_ - Include query parameters from `params` keyword argument in tracing `URL`. (5432)_ - Fix annotations (5466)_ - Fixed the multipart POST requests processing to always release file descriptors for the ``tempfile.Temporaryfile``-created ``_io.BufferedRandom`` instances of files sent within multipart request bodies via HTTP POST requests -- by :user:`webknjaz`. (5494)_ - Fix 0 being incorrectly treated as an immediate timeout. (5527)_ - Fixes failing tests when an environment variable <scheme>_proxy is set. (5554)_ - Replace deprecated app handler design in ``tests/autobahn/server.py`` with call to ``web.run_app``; replace deprecated ``aiohttp.ws_connect`` calls in ``tests/autobahn/client.py`` with ``aiohttp.ClienSession.ws_connect``. (5606)_ - Fixed test for ``HTTPUnauthorized`` that access the ``text`` argument. This is not used in any part of the code, so it's removed now. (5657)_ - Remove incorrect default from docs (5727)_ - Remove external test dependency to http://httpbin.org (5840)_ - Don't cancel current task when entering a cancelled timer. (5853)_ - Added ``params`` keyword argument to ``ClientSession.ws_connect``. -- :user:`hoh`. (5868)_ - Uses :py:class:`~asyncio.ThreadedChildWatcher` under POSIX to allow setting up test loop in non-main thread. (5877)_ - Fix the error in handling the return value of `getaddrinfo`. `getaddrinfo` will return an `(int, bytes)` tuple, if CPython could not handle the address family. It will cause a index out of range error in aiohttp. For example, if user compile CPython with `--disable-ipv6` option but his system enable the ipv6. (5901)_ - Removed the deprecated ``loop`` argument from the ``asyncio.sleep``/``gather`` calls (5905)_ - Return ``None`` from ``request.if_modified_since``, ``request.if_unmodified_since``, ``request.if_range`` and ``response.last_modified`` when corresponding http date headers are invalid. (5925)_ - Fix resetting `SIGCHLD` signals in Gunicorn aiohttp Worker to fix `subprocesses` that capture output having an incorrect `returncode`. (6130)_ - Raise ``400: Content-Length can't be present with Transfer-Encoding`` if both ``Content-Length`` and ``Transfer-Encoding`` are sent by peer by both C and Python implementations (6182)_ Improved Documentation ---------------------- - Refactored OpenAPI/Swagger aiohttp addons, added ``aio-openapi`` (5326)_ - Fixed docs on request cookies type, so it matches what is actually used in the code (a read-only dictionary-like object). (5725)_ - Documented that the HTTP client ``Authorization`` header is removed on redirects to a different host or protocol. (5850)_ Misc ---- - (3927)_, (4247)_, (4247)_, (5389)_, (5457)_, (5486)_, (5494)_, (5515)_, (5625)_, (5635)_, (5648)_, (5657)_, (5890)_, (5914)_, (5932)_, (6002)_, (6045)_, (6131)_, (6156)_, (6165)_, (6166)_ ---- ``` ### 3.8.0b0 ``` Features -------- - Added a ``GunicornWebWorker`` feature for extending the aiohttp server configuration by allowing the 'wsgi' coroutine to return ``web.AppRunner`` object. (2988)_ - Switch from ``http-parser`` to ``llhttp`` (3561)_ - Use Brotli instead of brotlipy (3803)_ - Disable implicit switch-back to pure python mode. The build fails loudly if aiohttp cannot be compiled with C Accelerators. Use AIOHTTP_NO_EXTENSIONS=1 to explicitly disable C Extensions complication and switch to Pure-Python mode. Note that Pure-Python mode is significantly slower than compiled one. (3828)_ - Make access log use local time with timezone (3853)_ - Implemented ``readuntil`` in ``StreamResponse`` (4054)_ - FileResponse now supports ETag. (4594)_ - Add a request handler type alias ``aiohttp.typedefs.Handler``. (4686)_ - ``AioHTTPTestCase`` is more async friendly now. For people who use unittest and are used to use :py:exc:`~unittest.TestCase` it will be easier to write new test cases like the sync version of the :py:exc:`~unittest.TestCase` class, without using the decorator `unittest_run_loop`, just `async def test_*`. The only difference is that for the people using python3.7 and below a new dependency is needed, it is ``asynctestcase``. (4700)_ - Add validation of HTTP header keys and values to prevent header injection. (4818)_ - Add predicate to ``AbstractCookieJar.clear``. Add ``AbstractCookieJar.clear_domain`` to clean all domain and subdomains cookies only. (4942)_ - Add keepalive_timeout parameter to web.run_app. (5094)_ - Tracing for client sent headers (5105)_ - Make type hints for http parser stricter (5267)_ - Add final declarations for constants. (5275)_ - Switch to external frozenlist and aiosignal libraries. (5293)_ - Don't send secure cookies by insecure transports. By default, the transport is secure if https or wss scheme is used. Use `CookieJar(treat_as_secure_origin="http://127.0.0.1")` to override the default security checker. (5571)_ - Always create a new event loop in ``aiohttp.web.run_app()``. This adds better compatibility with ``asyncio.run()`` or if trying to run multiple apps in sequence. (5572)_ - Add ``aiohttp.pytest_plugin.AiohttpClient`` for static typing of pytest plugin. (5585)_ - Added a ``socket_factory`` argument to ``BaseTestServer``. (5844)_ - Add compression strategy parameter to enable_compression method. (5909)_ - Added support for Python 3.10 to Github Actions CI/CD workflows and fix the related deprecation warnings -- :user:`Hanaasagi`. (5927)_ - Switched ``chardet`` to ``charset-normalizer`` for guessing the HTTP payload body encoding -- :user:`Ousret`. (5930)_ - Added optional auto_decompress argument for HttpRequestParser (5957)_ - Added support for HTTPS proxies to the extent CPython's :py:mod:`asyncio` supports it -- by :user:`bmbouter`, :user:`jborean93` and :user:`webknjaz`. (5992)_ - Added ``base_url`` parameter to the initializer of :class:`~aiohttp.ClientSession`. (6013)_ - Add Trove classifier and create binary wheels for 3.10. -- :user:`hugovk`. (6079)_ - Started shipping platform-specific wheels with the ``musl`` tag targeting typical Alpine Linux runtimes — :user:`asvetlov`. (6139)_ - Started shipping platform-specific arm64 wheels for Apple Silicon — :user:`asvetlov`. (6139)_ Bugfixes -------- - Modify _drain_helper() to handle concurrent `await resp.write(...)` or `ws.send_json(...)` calls without race-condition. (2934)_ - Started using `MultiLoopChildWatcher` when it's available under POSIX while setting up the test I/O loop. (3450)_ - Only encode content-disposition filename parameter using percent-encoding. Other parameters are encoded to quoted-string or RFC2231 extended parameter value. (4012)_ - Fixed HTTP client requests to honor ``no_proxy`` environment variables. (4431)_ - Change return type on URLDispatcher to UrlMappingMatchInfo to improve type annotations. (4748)_ - Ensure a cleanup context is cleaned up even when an exception occurs during startup. (4799)_ - Added a new exception type for Unix socket client errors which provides a more useful error message. (4984)_ - Remove Transfer-Encoding and Content-Type headers for 204 in StreamResponse (5106)_ - Only depend on typing_extensions for Python <3.8 (5107)_ - Add ABNORMAL_CLOSURE and BAD_GATEWAY to WSCloseCode (5192)_ - Fix cookies disappearing from HTTPExceptions. (5233)_ - StaticResource prefixes no longer match URLs with a non-folder prefix. For example ``routes.static('/foo', '/foo')`` no longer matches the URL ``/foobar``. Previously, this would attempt to load the file ``/foo/ar``. (5250)_ - Acquire the connection before running traces to prevent race condition. (5259)_ - Add missing slots to _RequestContextManager`` and ``_WSRequestContextManager`` (5329)_ - Ensure sending a zero byte file does not throw an exception (round 2) (5380)_ - Set "text/plain" when data is an empty string in client requests. (5392)_ - Stop automatically releasing the ``ClientResponse`` object on calls to the ``ok`` property for the failed requests. (5403)_ - Include query parameters from `params` keyword argument in tracing `URL`. (5432)_ - Fix annotations (5466)_ - Fixed the multipart POST requests processing to always release file descriptors for the ``tempfile.Temporaryfile``-created ``_io.BufferedRandom`` instances of files sent within multipart request bodies via HTTP POST requests -- by :user:`webknjaz`. (5494)_ - Fix 0 being incorrectly treated as an immediate timeout. (5527)_ - Replace deprecated app handler design in ``tests/autobahn/server.py`` with call to ``web.run_app``; replace deprecated ``aiohttp.ws_connect`` calls in ``tests/autobahn/client.py`` with ``aiohttp.ClienSession.ws_connect``. (5606)_ - Fixed test for ``HTTPUnauthorized`` that access the ``text`` argument. This is not used in any part of the code, so it's removed now. (5657)_ - Remove incorrect default from docs (5727)_ - Remove external test dependency to http://httpbin.org (5840)_ - Don't cancel current task when entering a cancelled timer. (5853)_ - Added ``params`` keyword argument to ``ClientSession.ws_connect``. -- :user:`hoh`. (5868)_ - Uses :py:class:`~asyncio.ThreadedChildWatcher` under POSIX to allow setting up test loop in non-main thread. (5877)_ - Fix the error in handling the return value of `getaddrinfo`. `getaddrinfo` will return an `(int, bytes)` tuple, if CPython could not handle the address family. It will cause a index out of range error in aiohttp. For example, if user compile CPython with `--disable-ipv6` option but his system enable the ipv6. (5901)_ - Removed the deprecated ``loop`` argument from the ``asyncio.sleep``/``gather`` calls (5905)_ - Return ``None`` from ``request.if_modified_since``, ``request.if_unmodified_since``, ``request.if_range`` and ``response.last_modified`` when corresponding http date headers are invalid. (5925)_ - Fix resetting `SIGCHLD` signals in Gunicorn aiohttp Worker to fix `subprocesses` that capture output having an incorrect `returncode`. (6130)_ - Raise ``400: Content-Length can't be present with Transfer-Encoding`` if both ``Content-Length`` and ``Transfer-Encoding`` are sent by peer by both C and Python implementations (6182)_ Improved Documentation ---------------------- - Refactored OpenAPI/Swagger aiohttp addons, added ``aio-openapi`` (5326)_ - Fixed docs on request cookies type, so it matches what is actually used in the code (a read-only dictionary-like object). (5725)_ - Documented that the HTTP client ``Authorization`` header is removed on redirects to a different host or protocol. (5850)_ Misc ---- - (3927)_, (4247)_, (4247)_, (5389)_, (5457)_, (5486)_, (5494)_, (5515)_, (5625)_, (5635)_, (5648)_, (5657)_, (5890)_, (5914)_, (5932)_, (6002)_, (6045)_, (6131)_, (6156)_, (6165)_, (6166)_ ---- ``` ### 3.8.0a7 ``` Features -------- - Added a ``GunicornWebWorker`` feature for extending the aiohttp server configuration by allowing the 'wsgi' coroutine to return ``web.AppRunner`` object. (2988)_ - Switch from ``http-parser`` to ``llhttp`` (3561)_ - Use Brotli instead of brotlipy (3803)_ - Disable implicit switch-back to pure python mode. The build fails loudly if aiohttp cannot be compiled with C Accelerators. Use AIOHTTP_NO_EXTENSIONS=1 to explicitly disable C Extensions complication and switch to Pure-Python mode. Note that Pure-Python mode is significantly slower than compiled one. (3828)_ - Make access log use local time with timezone (3853)_ - Implemented ``readuntil`` in ``StreamResponse`` (4054)_ - FileResponse now supports ETag. (4594)_ - Add a request handler type alias ``aiohttp.typedefs.Handler``. (4686)_ - ``AioHTTPTestCase`` is more async friendly now. For people who use unittest and are used to use :py:exc:`~unittest.TestCase` it will be easier to write new test cases like the sync version of the :py:exc:`~unittest.TestCase` class, without using the decorator `unittest_run_loop`, just `async def test_*`. The only difference is that for the people using python3.7 and below a new dependency is needed, it is ``asynctestcase``. (4700)_ - Add validation of HTTP header keys and values to prevent header injection. (4818)_ - Add predicate to ``AbstractCookieJar.clear``. Add ``AbstractCookieJar.clear_domain`` to clean all domain and subdomains cookies only. (4942)_ - Add keepalive_timeout parameter to web.run_app. (5094)_ - Tracing for client sent headers (5105)_ - Make type hints for http parser stricter (5267)_ - Add final declarations for constants. (5275)_ - Switch to external frozenlist and aiosignal libraries. (5293)_ - Don't send secure cookies by insecure transports. By default, the transport is secure if https or wss scheme is used. Use `CookieJar(treat_as_secure_origin="http://127.0.0.1")` to override the default security checker. (5571)_ - Always create a new event loop in ``aiohttp.web.run_app()``. This adds better compatibility with ``asyncio.run()`` or if trying to run multiple apps in sequence. (5572)_ - Add ``aiohttp.pytest_plugin.AiohttpClient`` for static typing of pytest plugin. (5585)_ - Added a ``socket_factory`` argument to ``BaseTestServer``. (5844)_ - Add compression strategy parameter to enable_compression method. (5909)_ - Added support for Python 3.10 to Github Actions CI/CD workflows and fix the related deprecation warnings -- :user:`Hanaasagi`. (5927)_ - Switched ``chardet`` to ``charset-normalizer`` for guessing the HTTP payload body encoding -- :user:`Ousret`. (5930)_ - Added optional auto_decompress argument for HttpRequestParser (5957)_ - Added support for HTTPS proxies to the extent CPython's :py:mod:`asyncio` supports it -- by :user:`bmbouter`, :user:`jborean93` and :user:`webknjaz`. (5992)_ - Add Trove classifier and create binary wheels for 3.10. -- :user:`hugovk`. (6079)_ - Started shipping platform-specific wheels with the ``musl`` tag targeting typical Alpine Linux runtimes — :user:`asvetlov`. (6139)_ - Started shipping platform-specific arm64 wheels for Apple Silicon — :user:`asvetlov`. (6139)_ Bugfixes -------- - Modify _drain_helper() to handle concurrent `await resp.write(...)` or `ws.send_json(...)` calls without race-condition. (2934)_ - Started using `MultiLoopChildWatcher` when it's available under POSIX while setting up the test I/O loop. (3450)_ - Only encode content-disposition filename parameter using percent-encoding. Other parameters are encoded to quoted-string or RFC2231 extended parameter value. (4012)_ - Fixed HTTP client requests to honor ``no_proxy`` environment variables. (4431)_ - Change return type on URLDispatcher to UrlMappingMatchInfo to improve type annotations. (4748)_ - Ensure a cleanup context is cleaned up even when an exception occurs during startup. (4799)_ - Added a new exception type for Unix socket client errors which provides a more useful error message. (4984)_ - Remove Transfer-Encoding and Content-Type headers for 204 in StreamResponse (5106)_ - Only depend on typing_extensions for Python <3.8 (5107)_ - Add ABNORMAL_CLOSURE and BAD_GATEWAY to WSCloseCode (5192)_ - Fix cookies disappearing from HTTPExceptions. (5233)_ - Acquire the connection before running traces to prevent race condition. (5259)_ - Add missing slots to _RequestContextManager`` and ``_WSRequestContextManager`` (5329)_ - Ensure sending a zero byte file does not throw an exception (round 2) (5380)_ - Set "text/plain" when data is an empty string in client requests. (5392)_ - Stop automatically releasing the ``ClientResponse`` object on calls to the ``ok`` property for the failed requests. (5403)_ - Include query parameters from `params` keyword argument in tracing `URL`. (5432)_ - Fix annotations (5466)_ - Fixed the multipart POST requests processing to always release file descriptors for the ``tempfile.Temporaryfile``-created ``_io.BufferedRandom`` instances of files sent within multipart request bodies via HTTP POST requests -- by :user:`webknjaz`. (5494)_ - Fix 0 being incorrectly treated as an immediate timeout. (5527)_ - Replace deprecated app handler design in ``tests/autobahn/server.py`` with call to ``web.run_app``; replace deprecated ``aiohttp.ws_connect`` calls in ``tests/autobahn/client.py`` with ``aiohttp.ClienSession.ws_connect``. (5606)_ - Fixed test for ``HTTPUnauthorized`` that access the ``text`` argument. This is not used in any part of the code, so it's removed now. (5657)_ - Remove incorrect default from docs (5727)_ - Remove external test dependency to http://httpbin.org (5840)_ - Don't cancel current task when entering a cancelled timer. (5853)_ - Added ``params`` keyword argument to ``ClientSession.ws_connect``. -- :user:`hoh`. (5868)_ - Uses :py:class:`~asyncio.ThreadedChildWatcher` under POSIX to allow setting up test loop in non-main thread. (5877)_ - Fix the error in handling the return value of `getaddrinfo`. `getaddrinfo` will return an `(int, bytes)` tuple, if CPython could not handle the address family. It will cause a index out of range error in aiohttp. For example, if user compile CPython with `--disable-ipv6` option but his system enable the ipv6. (5901)_ - Removed the deprecated ``loop`` argument from the ``asyncio.sleep``/``gather`` calls (5905)_ - Return ``None`` from ``request.if_modified_since``, ``request.if_unmodified_since``, ``request.if_range`` and ``response.last_modified`` when corresponding http date headers are invalid. (5925)_ - Fix resetting `SIGCHLD` signals in Gunicorn aiohttp Worker to fix `subprocesses` that capture output having an incorrect `returncode`. (6130)_ Improved Documentation ---------------------- - Refactored OpenAPI/Swagger aiohttp addons, added ``aio-openapi`` (5326)_ - Fixed docs on request cookies type, so it matches what is actually used in the code (a read-only dictionary-like object). (5725)_ - Documented that the HTTP client ``Authorization`` header is removed on redirects to a different host or protocol. (5850)_ Misc ---- - (3927)_, (4247)_, (4247)_, (5389)_, (5457)_, (5486)_, (5494)_, (5515)_, (5625)_, (5635)_, (5648)_, (5657)_, (5890)_, (5914)_, (5932)_, (6002)_, (6045)_, (6131)_, (6156)_, (6165)_, (6166)_ ---- ``` ### 3.7.4.post0 ``` ======================== Misc ---- - Bumped upper bound of the ``chardet`` runtime dependency to allow their v4.0 version stream. (5366)_ ---- ``` ### 3.7.3 ``` Features -------- - Use Brotli instead of brotlipy `3803 <https://github.com/aio-libs/aiohttp/issues/3803>`_ - Made exceptions pickleable. Also changed the repr of some exceptions. `4077 <https://github.com/aio-libs/aiohttp/issues/4077>`_ Bugfixes -------- - Raise a ClientResponseError instead of an AssertionError for a blank HTTP Reason Phrase. `3532 <https://github.com/aio-libs/aiohttp/issues/3532>`_ - Fix ``web_middlewares.normalize_path_middleware`` behavior for patch without slash. `3669 <https://github.com/aio-libs/aiohttp/issues/3669>`_ - Fix overshadowing of overlapped sub-applications prefixes. `3701 <https://github.com/aio-libs/aiohttp/issues/3701>`_ - Make `BaseConnector.close()` a coroutine and wait until the client closes all connections. Drop deprecated "with Connector():" syntax. `3736 <https://github.com/aio-libs/aiohttp/issues/3736>`_ - Reset the ``sock_read`` timeout each time data is received for a ``aiohttp.client`` response. `3808 <https://github.com/aio-libs/aiohttp/issues/3808>`_ - Fixed type annotation for add_view method of UrlDispatcher to accept any subclass of View `3880 <https://github.com/aio-libs/aiohttp/issues/3880>`_ - Fixed querying the address families from DNS that the current host supports. `5156 <https://github.com/aio-libs/aiohttp/issues/5156>`_ - Change return type of MultipartReader.__aiter__() and BodyPartReader.__aiter__() to AsyncIterator. `5163 <https://github.com/aio-libs/aiohttp/issues/5163>`_ - Provide x86 Windows wheels. `5230 <https://github.com/aio-libs/aiohttp/issues/5230>`_ Improved Documentation ---------------------- - Add documentation for ``aiohttp.web.FileResponse``. `3958 <https://github.com/aio-libs/aiohttp/issues/3958>`_ - Removed deprecation warning in tracing example docs `3964 <https://github.com/aio-libs/aiohttp/issues/3964>`_ - Fixed wrong "Usage" docstring of ``aiohttp.client.request``. `4603 <https://github.com/aio-libs/aiohttp/issues/4603>`_ - Add aiohttp-pydantic to third party libraries `5228 <https://github.com/aio-libs/aiohttp/issues/5228>`_ Misc ---- - `4102 <https://github.com/aio-libs/aiohttp/issues/4102>`_ ``` ### 3.7.2 ``` Bugfixes -------- - Fixed static files handling for loops without ``.sendfile()`` support `5149 <https://github.com/aio-libs/aiohttp/issues/5149>`_ ``` ### 3.7.1 ``` Bugfixes -------- - Fixed a type error caused by the conditional import of `Protocol`. `5111 <https://github.com/aio-libs/aiohttp/issues/5111>`_ - Server doesn't send Content-Length for 1xx or 204 `4901 <https://github.com/aio-libs/aiohttp/issues/4901>`_ - Fix run_app typing `4957 <https://github.com/aio-libs/aiohttp/issues/4957>`_ - Always require ``typing_extensions`` library. `5107 <https://github.com/aio-libs/aiohttp/issues/5107>`_ - Fix a variable-shadowing bug causing `ThreadedResolver.resolve` to return the resolved IP as the ``hostname`` in each record, which prevented validation of HTTPS connections. `5110 <https://github.com/aio-libs/aiohttp/issues/5110>`_ - Added annotations to all public attributes. `5115 <https://github.com/aio-libs/aiohttp/issues/5115>`_ - Fix flaky test_when_timeout_smaller_second `5116 <https://github.com/aio-libs/aiohttp/issues/5116>`_ - Ensure sending a zero byte file does not throw an exception `5124 <https://github.com/aio-libs/aiohttp/issues/5124>`_ - Fix a bug in ``web.run_app()`` about Python version checking on Windows `5127 <https://github.com/aio-libs/aiohttp/issues/5127>`_ ``` ### 3.7.0 ``` Features -------- - Response headers are now prepared prior to running ``on_response_prepare`` hooks, directly before headers are sent to the client. `1958 <https://github.com/aio-libs/aiohttp/issues/1958>`_ - Add a ``quote_cookie`` option to ``CookieJar``, a way to skip quotation wrapping of cookies containing special characters. `2571 <https://github.com/aio-libs/aiohttp/issues/2571>`_ - Call ``AccessLogger.log`` with the current exception available from ``sys.exc_info()``. `3557 <https://github.com/aio-libs/aiohttp/issues/3557>`_ - `web.UrlDispatcher.add_routes` and `web.Application.add_routes` return a list of registered `AbstractRoute` instances. `AbstractRouteDef.register` (and all subclasses) return a list of registered resources registered resource. `3866 <https://github.com/aio-libs/aiohttp/issues/3866>`_ - Added properties of default ClientSession params to ClientSession class so it is available for introspection `3882 <https://github.com/aio-libs/aiohttp/issues/3882>`_ - Don't cancel web handler on peer disconnection, raise `OSError` on reading/writing instead. `4080 <https://github.com/aio-libs/aiohttp/issues/4080>`_ - Implement BaseRequest.get_extra_info() to access a protocol transports' extra info. `4189 <https://github.com/aio-libs/aiohttp/issues/4189>`_ - Added `ClientSession.timeout` property. `4191 <https://github.com/aio-libs/aiohttp/issues/4191>`_ - allow use of SameSite in cookies. `4224 <https://github.com/aio-libs/aiohttp/issues/4224>`_ - Use ``loop.sendfile()`` instead of custom implementation if available. `4269 <https://github.com/aio-libs/aiohttp/issues/4269>`_ - Apply SO_REUSEADDR to test server's socket. `4393 <https://github.com/aio-libs/aiohttp/issues/4393>`_ - Use .raw_host instead of slower .host in client API `4402 <https://github.com/aio-libs/aiohttp/issues/4402>`_ - Allow configuring the buffer size of input stream by passing ``read_bufsize`` argument. `4453 <https://github.com/aio-libs/aiohttp/issues/4453>`_ - Pass tests on Python 3.8 for Windows. `4513 <https://github.com/aio-libs/aiohttp/issues/4513>`_ - Add `method` and `url` attributes to `TraceRequestChunkSentParams` and `TraceResponseChunkReceivedParams`. `4674 <https://github.com/aio-libs/aiohttp/issues/4674>`_ - Add ClientResponse.ok property for checking status code under 400. `4711 <https://github.com/aio-libs/aiohttp/issues/4711>`_ - Don't ceil timeouts that are smaller than 5 seconds. `4850 <https://github.com/aio-libs/aiohttp/issues/4850>`_ - TCPSite now listens by default on all interfaces instead of just IPv4 when `None` is passed in as the host. `4894 <https://github.com/aio-libs/aiohttp/issues/4894>`_ - Bump ``http_parser`` to 2.9.4 `5070 <https://github.com/aio-libs/aiohttp/issues/5070>`_ Bugfixes -------- - Fix keepalive connections not being closed in time `3296 <https://github.com/aio-libs/aiohttp/issues/3296>`_ - Fix failed websocket handshake leaving connection hanging. `3380 <https://github.com/aio-libs/aiohttp/issues/3380>`_ - Fix tasks cancellation order on exit. The run_app task needs to be cancelled first for cleanup hooks to run with all tasks intact. `3805 <https://github.com/aio-libs/aiohttp/issues/3805>`_ - Don't start heartbeat until _writer is set `4062 <https://github.com/aio-libs/aiohttp/issues/4062>`_ - Fix handling of multipart file uploads without a content type. `4089 <https://github.com/aio-libs/aiohttp/issues/4089>`_ - Preserve view handler function attributes across middlewares `4174 <https://github.com/aio-libs/aiohttp/issues/4174>`_ - Fix the string representation of ``ServerDisconnectedError``. `4175 <https://github.com/aio-libs/aiohttp/issues/4175>`_ - Raising RuntimeError when trying to get encoding from not read body `4214 <https://github.com/aio-libs/aiohttp/issues/4214>`_ - Remove warning messages from noop. `4282 <https://github.com/aio-libs/aiohttp/issues/4282>`_ - Raise ClientPayloadError if FormData re-processed. `4345 <https://github.com/aio-libs/aiohttp/issues/4345>`_ - Fix a warning about unfinished task in ``web_protocol.py`` `4408 <https://github.com/aio-libs/aiohttp/issues/4408>`_ - Fixed 'deflate' compression. According to RFC 2616 now. `4506 <https://github.com/aio-libs/aiohttp/issues/4506>`_ - Fixed OverflowError on platforms with 32-bit time_t `4515 <https://github.com/aio-libs/aiohttp/issues/4515>`_ - Fixed request.body_exists returns wrong value for methods without body. `4528 <https://github.com/aio-libs/aiohttp/issues/4528>`_ - Fix connecting to link-local IPv6 addresses. `4554 <https://github.com/aio-libs/aiohttp/issues/4554>`_ - Fix a problem with connection waiters that are never awaited. `4562 <https://github.com/aio-libs/aiohttp/issues/4562>`_ - Always make sure transport is not closing before reuse a connection. Reuse a protocol based on keepalive in headers is unreliable. For example, uWSGI will not support keepalive even it serves a HTTP 1.1 request, except explicitly configure uWSGI with a ``--http-keepalive`` option. Servers designed like uWSGI could cause aiohttp intermittently raise a ConnectionResetException when the protocol poll runs out and some protocol is reused. `4587 <https://github.com/aio-libs/aiohttp/issues/4587>`_ - Handle the last CRLF correctly even if it is received via separate TCP segment. `4630 <https://github.com/aio-libs/aiohttp/issues/4630>`_ - Fix the register_resource function to validate route name before splitting it so that route name can include python keywords. `4691 <https://github.com/aio-libs/aiohttp/issues/4691>`_ - Improve typing annotations for ``web.Request``, ``aiohttp.ClientResponse`` and ``multipart`` module. `4736 <https://github.com/aio-libs/aiohttp/issues/4736>`_ - Fix resolver task is not awaited when connector is cancelled `4795 <https://github.com/aio-libs/aiohttp/issues/4795>`_ - Fix a bug "Aiohttp doesn't return any error on invalid request methods" `4798 <https://github.com/aio-libs/aiohttp/issues/4798>`_ - Fix HEAD requests for static content. `4809 <https://github.com/aio-libs/aiohttp/issues/4809>`_ - Fix incorrect size calculation for memoryview `4890 <https://github.com/aio-libs/aiohttp/issues/4890>`_ - Add HTTPMove to _all__. `4897 <https://github.com/aio-libs/aiohttp/issues/4897>`_ - Fixed the type annotations in the ``tracing`` module. `4912 <https://github.com/aio-libs/aiohttp/issues/4912>`_ - Fix typing for multipart ``__aiter__``. `4931 <https://github.com/aio-libs/aiohttp/issues/4931>`_ - Fix for race condition on connections in BaseConnector that leads to exceeding the connection limit. `4936 <https://github.com/aio-libs/aiohttp/issues/4936>`_ - Add forced UTF-8 encoding for ``application/rdap+json`` responses. `4938 <https://github.com/aio-libs/aiohttp/issues/4938>`_ - Fix inconsistency between Python and C http request parsers in parsing pct-encoded URL. `4972 <https://github.com/aio-libs/aiohttp/issues/4972>`_ - Fix connection closing issue in HEAD request. `5012 <https://github.com/aio-libs/aiohttp/issues/5012>`_ - Fix type hint on BaseRunner.addresses (from ``List[str]`` to ``List[Any]``) `5086 <https://github.com/aio-libs/aiohttp/issues/5086>`_ - Make `web.run_app()` more responsive to Ctrl+C on Windows for Python < 3.8. It slightly increases CPU load as a side effect. `5098 <https://github.com/aio-libs/aiohttp/issues/5098>`_ Improved Documentation ---------------------- - Fix example code in client quick-start `3376 <https://github.com/aio-libs/aiohttp/issues/3376>`_ - Updated the docs so there is no contradiction in ``ttl_dns_cache`` default value `3512 <https://github.com/aio-libs/aiohttp/issues/3512>`_ - Add 'Deploy with SSL' to docs. `4201 <https://github.com/aio-libs/aiohttp/issues/4201>`_ - Change typing of the secure argument on StreamResponse.set_cookie from ``Optional[str]`` to ``Optional[bool]`` `4204 <https://github.com/aio-libs/aiohttp/issues/4204>`_ - Changes ``ttl_dns_cache`` type from int to Optional[int]. `4270 <https://github.com/aio-libs/aiohttp/issues/4270>`_ - Simplify README hello word example and add a documentation page for people coming from requests. `4272 <https://github.com/aio-libs/aiohttp/issues/4272>`_ - Improve some code examples in the documentation involving websockets and starting a simple HTTP site with an AppRunner. `4285 <https://github.com/aio-libs/aiohttp/issues/4285>`_ - Fix typo in code example in Multipart docs `4312 <https://github.com/aio-libs/aiohttp/issues/4312>`_ - Fix code example in Multipart section. `4314 <https://github.com/aio-libs/aiohttp/issues/4314>`_ - Update contributing guide so new contributors read the most recent version of that guide. Update command used to create test coverage reporting. `4810 <https://github.com/aio-libs/aiohttp/issues/4810>`_ - Spelling: Change "canonize" to "canonicalize". `4986 <https://github.com/aio-libs/aiohttp/issues/4986>`_ - Add ``aiohttp-sse-client`` library to third party usage list. `5084 <https://github.com/aio-libs/aiohttp/issues/5084>`_ Misc ---- - `2856 <https://github.com/aio-libs/aiohttp/issues/2856>`_, `#4218 <https://github.com/aio-libs/aiohttp/issues/4218>`_, `#4250 <https://github.com/aio-libs/aiohttp/issues/4250>`_ ``` ### 3.6.2 ``` It contains several bufixes. Changes ------------ Features -------- - Made exceptions pickleable. Also changed the repr of some exceptions. `4077 <https://github.com/aio-libs/aiohttp/issues/4077>`_ - Use ``Iterable`` type hint instead of ``Sequence`` for ``Application`` *middleware* parameter. `4125 <https://github.com/aio-libs/aiohttp/issues/4125>`_ Bugfixes -------- - Reset the ``sock_read`` timeout each time data is received for a ``aiohttp.ClientResponse``. `3808 <https://github.com/aio-libs/aiohttp/issues/3808>`_ - Fix handling of expired cookies so they are not stored in CookieJar. `4063 <https://github.com/aio-libs/aiohttp/issues/4063>`_ - Fix misleading message in the string representation of ``ClientConnectorError``; ``self.ssl == None`` means default SSL context, not SSL disabled `