diff --git a/CHANGES.rst b/CHANGES.rst index 5b02623067a..618aa3b2dd9 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -10,6 +10,316 @@ .. towncrier release notes start +3.10.0 (2024-07-30) +======================== + +Bug fixes +--------- + +- Fixed server response headers for ``Content-Type`` and ``Content-Encoding`` for + static compressed files -- by :user:`steverep`. + + Server will now respond with a ``Content-Type`` appropriate for the compressed + file (e.g. ``"application/gzip"``), and omit the ``Content-Encoding`` header. + Users should expect that most clients will no longer decompress such responses + by default. + + + *Related issues and pull requests on GitHub:* + :issue:`4462`. + + + +- Fix duplicate cookie expiration calls in the CookieJar implementation + + + *Related issues and pull requests on GitHub:* + :issue:`7784`. + + + +- Adjusted ``FileResponse`` to check file existence and access when preparing the response -- by :user:`steverep`. + + The :py:class:`~aiohttp.web.FileResponse` class was modified to respond with + 403 Forbidden or 404 Not Found as appropriate. Previously, it would cause a + server error if the path did not exist or could not be accessed. Checks for + existence, non-regular files, and permissions were expected to be done in the + route handler. For static routes, this now permits a compressed file to exist + without its uncompressed variant and still be served. In addition, this + changes the response status for files without read permission to 403, and for + non-regular files from 404 to 403 for consistency. + + + *Related issues and pull requests on GitHub:* + :issue:`8182`. + + + +- Fix ``AsyncResolver`` to match ``ThreadedResolver`` behavior + -- by :user:`bdraco`. + + On system with IPv6 support, the :py:class:`~aiohttp.resolver.AsyncResolver` would not fallback + to providing A records when AAAA records were not available. + Additionally, unlike the :py:class:`~aiohttp.resolver.ThreadedResolver`, the :py:class:`~aiohttp.resolver.AsyncResolver` + did not handle link-local addresses correctly. + + This change makes the behavior consistent with the :py:class:`~aiohttp.resolver.ThreadedResolver`. + + + *Related issues and pull requests on GitHub:* + :issue:`8270`. + + + +- Fixed ``ws_connect`` not respecting `receive_timeout`` on WS(S) connection. + -- by :user:`arcivanov`. + + + *Related issues and pull requests on GitHub:* + :issue:`8444`. + + + +- Removed blocking I/O in the event loop for static resources and refactored + exception handling -- by :user:`steverep`. + + File system calls when handling requests for static routes were moved to a + separate thread to potentially improve performance. Exception handling + was tightened in order to only return 403 Forbidden or 404 Not Found responses + for expected scenarios; 500 Internal Server Error would be returned for any + unknown errors. + + + *Related issues and pull requests on GitHub:* + :issue:`8507`. + + + + +Features +-------- + +- Added a Request.wait_for_disconnection() method, as means of allowing request handlers to be notified of premature client disconnections. + + + *Related issues and pull requests on GitHub:* + :issue:`2492`. + + + +- Added 5 new exceptions: :py:exc:`~aiohttp.InvalidUrlClientError`, :py:exc:`~aiohttp.RedirectClientError`, + :py:exc:`~aiohttp.NonHttpUrlClientError`, :py:exc:`~aiohttp.InvalidUrlRedirectClientError`, + :py:exc:`~aiohttp.NonHttpUrlRedirectClientError` + + :py:exc:`~aiohttp.InvalidUrlRedirectClientError`, :py:exc:`~aiohttp.NonHttpUrlRedirectClientError` + are raised instead of :py:exc:`ValueError` or :py:exc:`~aiohttp.InvalidURL` when the redirect URL is invalid. Classes + :py:exc:`~aiohttp.InvalidUrlClientError`, :py:exc:`~aiohttp.RedirectClientError`, + :py:exc:`~aiohttp.NonHttpUrlClientError` are base for them. + + The :py:exc:`~aiohttp.InvalidURL` now exposes a ``description`` property with the text explanation of the error details. + + -- by :user:`setla`, :user:`AraHaan`, and :user:`bdraco` + + + *Related issues and pull requests on GitHub:* + :issue:`2507`, :issue:`3315`, :issue:`6722`, :issue:`8481`, :issue:`8482`. + + + +- Added a feature to retry closed connections automatically for idempotent methods. -- by :user:`Dreamsorcerer` + + + *Related issues and pull requests on GitHub:* + :issue:`7297`. + + + +- Implemented filter_cookies() with domain-matching and path-matching on the keys, instead of testing every single cookie. + This may break existing cookies that have been saved with `CookieJar.save()`. Cookies can be migrated with this script:: + + import pickle + with file_path.open("rb") as f: + cookies = pickle.load(f) + + morsels = [(name, m) for c in cookies.values() for name, m in c.items()] + cookies.clear() + for name, m in morsels: + cookies[(m["domain"], m["path"].rstrip("/"))][name] = m + + with file_path.open("wb") as f: + pickle.dump(cookies, f, pickle.HIGHEST_PROTOCOL) + + + *Related issues and pull requests on GitHub:* + :issue:`7583`, :issue:`8535`. + + + +- Separated connection and socket timeout errors, from ServerTimeoutError. + + + *Related issues and pull requests on GitHub:* + :issue:`7801`. + + + +- Implement happy eyeballs + + + *Related issues and pull requests on GitHub:* + :issue:`7954`. + + + +- Added server capability to check for static files with Brotli compression via a ``.br`` extension -- by :user:`steverep`. + + + *Related issues and pull requests on GitHub:* + :issue:`8062`. + + + + +Removals and backward incompatible breaking changes +--------------------------------------------------- + +- The shutdown logic in 3.9 waited on all tasks, which caused issues with some libraries. + In 3.10 we've changed this logic to only wait on request handlers. This means that it's + important for developers to correctly handle the lifecycle of background tasks using a + library such as ``aiojobs``. If an application is using ``handler_cancellation=True`` then + it is also a good idea to ensure that any :func:`asyncio.shield` calls are replaced with + :func:`aiojobs.aiohttp.shield`. + + Please read the updated documentation on these points: \ + https://docs.aiohttp.org/en/stable/web_advanced.html#graceful-shutdown \ + https://docs.aiohttp.org/en/stable/web_advanced.html#web-handler-cancellation + + -- by :user:`Dreamsorcerer` + + + *Related issues and pull requests on GitHub:* + :issue:`8495`. + + + + +Improved documentation +---------------------- + +- Added documentation for ``aiohttp.web.FileResponse``. + + + *Related issues and pull requests on GitHub:* + :issue:`3958`. + + + +- Improve the docs for the `ssl` params. + + + *Related issues and pull requests on GitHub:* + :issue:`8403`. + + + + +Contributor-facing changes +-------------------------- + +- Enabled HTTP parser tests originally intended for 3.9.2 release -- by :user:`pajod`. + + + *Related issues and pull requests on GitHub:* + :issue:`8088`. + + + + +Miscellaneous internal changes +------------------------------ + +- Improved URL handler resolution time by indexing resources in the UrlDispatcher. + For applications with a large number of handlers, this should increase performance significantly. + -- by :user:`bdraco` + + + *Related issues and pull requests on GitHub:* + :issue:`7829`. + + + +- Added `nacl_middleware `_ to the list of middlewares in the third party section of the documentation. + + + *Related issues and pull requests on GitHub:* + :issue:`8346`. + + + +- Minor improvements to static typing -- by :user:`Dreamsorcerer`. + + + *Related issues and pull requests on GitHub:* + :issue:`8364`. + + + +- Added a 3.11-specific overloads to ``ClientSession`` -- by :user:`max-muoto`. + + + *Related issues and pull requests on GitHub:* + :issue:`8463`. + + + +- Simplified path checks for ``UrlDispatcher.add_static()`` method -- by :user:`steverep`. + + + *Related issues and pull requests on GitHub:* + :issue:`8491`. + + + +- Avoided creating a future on every websocket receive -- by :user:`bdraco`. + + + *Related issues and pull requests on GitHub:* + :issue:`8498`. + + + +- Updated identity checks for all ``WSMsgType`` type compares -- by :user:`bdraco`. + + + *Related issues and pull requests on GitHub:* + :issue:`8501`. + + + +- When using Python 3.12 or later, the writer is no longer scheduled on the event loop if it can finish synchronously. Avoiding event loop scheduling reduces latency and improves performance. -- by :user:`bdraco`. + + + *Related issues and pull requests on GitHub:* + :issue:`8510`. + + + +- Restored :py:class:`~aiohttp.resolver.AsyncResolver` to be the default resolver. -- by :user:`bdraco`. + + :py:class:`~aiohttp.resolver.AsyncResolver` was disabled by default because + of IPv6 compatibility issues. These issues have been resolved and + :py:class:`~aiohttp.resolver.AsyncResolver` is again now the default resolver. + + + *Related issues and pull requests on GitHub:* + :issue:`8522`. + + + + +---- + + 3.9.5 (2024-04-16) ================== diff --git a/CHANGES/2492.feature b/CHANGES/2492.feature deleted file mode 100644 index 9b2244390a2..00000000000 --- a/CHANGES/2492.feature +++ /dev/null @@ -1 +0,0 @@ -Added a Request.wait_for_disconnection() method, as means of allowing request handlers to be notified of premature client disconnections. diff --git a/CHANGES/2507.feature.rst b/CHANGES/2507.feature.rst deleted file mode 120000 index f569cd92882..00000000000 --- a/CHANGES/2507.feature.rst +++ /dev/null @@ -1 +0,0 @@ -6722.feature \ No newline at end of file diff --git a/CHANGES/3315.feature.rst b/CHANGES/3315.feature.rst deleted file mode 120000 index f569cd92882..00000000000 --- a/CHANGES/3315.feature.rst +++ /dev/null @@ -1 +0,0 @@ -6722.feature \ No newline at end of file diff --git a/CHANGES/3958.doc b/CHANGES/3958.doc deleted file mode 100644 index 0fcb1dde698..00000000000 --- a/CHANGES/3958.doc +++ /dev/null @@ -1 +0,0 @@ -Added documentation for ``aiohttp.web.FileResponse``. diff --git a/CHANGES/4462.bugfix.rst b/CHANGES/4462.bugfix.rst deleted file mode 100644 index fe897a08b39..00000000000 --- a/CHANGES/4462.bugfix.rst +++ /dev/null @@ -1,7 +0,0 @@ -Fixed server response headers for ``Content-Type`` and ``Content-Encoding`` for -static compressed files -- by :user:`steverep`. - -Server will now respond with a ``Content-Type`` appropriate for the compressed -file (e.g. ``"application/gzip"``), and omit the ``Content-Encoding`` header. -Users should expect that most clients will no longer decompress such responses -by default. diff --git a/CHANGES/6722.feature b/CHANGES/6722.feature deleted file mode 100644 index 580efa5c5e2..00000000000 --- a/CHANGES/6722.feature +++ /dev/null @@ -1,12 +0,0 @@ -Added 5 new exceptions: :py:exc:`~aiohttp.InvalidUrlClientError`, :py:exc:`~aiohttp.RedirectClientError`, -:py:exc:`~aiohttp.NonHttpUrlClientError`, :py:exc:`~aiohttp.InvalidUrlRedirectClientError`, -:py:exc:`~aiohttp.NonHttpUrlRedirectClientError` - -:py:exc:`~aiohttp.InvalidUrlRedirectClientError`, :py:exc:`~aiohttp.NonHttpUrlRedirectClientError` -are raised instead of :py:exc:`ValueError` or :py:exc:`~aiohttp.InvalidURL` when the redirect URL is invalid. Classes -:py:exc:`~aiohttp.InvalidUrlClientError`, :py:exc:`~aiohttp.RedirectClientError`, -:py:exc:`~aiohttp.NonHttpUrlClientError` are base for them. - -The :py:exc:`~aiohttp.InvalidURL` now exposes a ``description`` property with the text explanation of the error details. - --- by :user:`setla`, :user:`AraHaan`, and :user:`bdraco` diff --git a/CHANGES/7297.feature b/CHANGES/7297.feature deleted file mode 100644 index 91d769a4b32..00000000000 --- a/CHANGES/7297.feature +++ /dev/null @@ -1 +0,0 @@ -Added a feature to retry closed connections automatically for idempotent methods. -- by :user:`Dreamsorcerer` diff --git a/CHANGES/7583.feature b/CHANGES/7583.feature deleted file mode 100644 index 7480f780d6f..00000000000 --- a/CHANGES/7583.feature +++ /dev/null @@ -1,14 +0,0 @@ -Implemented filter_cookies() with domain-matching and path-matching on the keys, instead of testing every single cookie. -This may break existing cookies that have been saved with `CookieJar.save()`. Cookies can be migrated with this script:: - - import pickle - with file_path.open("rb") as f: - cookies = pickle.load(f) - - morsels = [(name, m) for c in cookies.values() for name, m in c.items()] - cookies.clear() - for name, m in morsels: - cookies[(m["domain"], m["path"].rstrip("/"))][name] = m - - with file_path.open("wb") as f: - pickle.dump(cookies, f, pickle.HIGHEST_PROTOCOL) diff --git a/CHANGES/7784.bugfix b/CHANGES/7784.bugfix deleted file mode 100644 index 1f8ba8ddb44..00000000000 --- a/CHANGES/7784.bugfix +++ /dev/null @@ -1 +0,0 @@ -Fix duplicate cookie expiration calls in the CookieJar implementation diff --git a/CHANGES/7801.feature b/CHANGES/7801.feature deleted file mode 100644 index a6fb4d8a58e..00000000000 --- a/CHANGES/7801.feature +++ /dev/null @@ -1 +0,0 @@ -Separated connection and socket timeout errors, from ServerTimeoutError. diff --git a/CHANGES/7829.misc b/CHANGES/7829.misc deleted file mode 100644 index 9eb060f4713..00000000000 --- a/CHANGES/7829.misc +++ /dev/null @@ -1,3 +0,0 @@ -Improved URL handler resolution time by indexing resources in the UrlDispatcher. -For applications with a large number of handlers, this should increase performance significantly. --- by :user:`bdraco` diff --git a/CHANGES/7954.feature b/CHANGES/7954.feature deleted file mode 100644 index e536ee4b1c4..00000000000 --- a/CHANGES/7954.feature +++ /dev/null @@ -1 +0,0 @@ -Implement happy eyeballs diff --git a/CHANGES/8062.feature.rst b/CHANGES/8062.feature.rst deleted file mode 100644 index 6e9814f09a0..00000000000 --- a/CHANGES/8062.feature.rst +++ /dev/null @@ -1 +0,0 @@ -Added server capability to check for static files with Brotli compression via a ``.br`` extension -- by :user:`steverep`. diff --git a/CHANGES/8088.contrib.rst b/CHANGES/8088.contrib.rst deleted file mode 100644 index b3aec71bdf7..00000000000 --- a/CHANGES/8088.contrib.rst +++ /dev/null @@ -1 +0,0 @@ -Enabled HTTP parser tests originally intended for 3.9.2 release -- by :user:`pajod`. diff --git a/CHANGES/8182.bugfix.rst b/CHANGES/8182.bugfix.rst deleted file mode 100644 index c960597587c..00000000000 --- a/CHANGES/8182.bugfix.rst +++ /dev/null @@ -1,10 +0,0 @@ -Adjusted ``FileResponse`` to check file existence and access when preparing the response -- by :user:`steverep`. - -The :py:class:`~aiohttp.web.FileResponse` class was modified to respond with - 403 Forbidden or 404 Not Found as appropriate. Previously, it would cause a - server error if the path did not exist or could not be accessed. Checks for - existence, non-regular files, and permissions were expected to be done in the - route handler. For static routes, this now permits a compressed file to exist - without its uncompressed variant and still be served. In addition, this - changes the response status for files without read permission to 403, and for - non-regular files from 404 to 403 for consistency. diff --git a/CHANGES/8270.bugfix.rst b/CHANGES/8270.bugfix.rst deleted file mode 100644 index bda77223959..00000000000 --- a/CHANGES/8270.bugfix.rst +++ /dev/null @@ -1,9 +0,0 @@ -Fix ``AsyncResolver`` to match ``ThreadedResolver`` behavior --- by :user:`bdraco`. - -On system with IPv6 support, the :py:class:`~aiohttp.resolver.AsyncResolver` would not fallback -to providing A records when AAAA records were not available. -Additionally, unlike the :py:class:`~aiohttp.resolver.ThreadedResolver`, the :py:class:`~aiohttp.resolver.AsyncResolver` -did not handle link-local addresses correctly. - -This change makes the behavior consistent with the :py:class:`~aiohttp.resolver.ThreadedResolver`. diff --git a/CHANGES/8346.misc.rst b/CHANGES/8346.misc.rst deleted file mode 100644 index 89a8e933836..00000000000 --- a/CHANGES/8346.misc.rst +++ /dev/null @@ -1 +0,0 @@ -Added `nacl_middleware `_ to the list of middlewares in the third party section of the documentation. diff --git a/CHANGES/8364.misc.rst b/CHANGES/8364.misc.rst deleted file mode 100644 index 493916f0421..00000000000 --- a/CHANGES/8364.misc.rst +++ /dev/null @@ -1 +0,0 @@ -Minor improvements to static typing -- by :user:`Dreamsorcerer`. diff --git a/CHANGES/8403.doc.rst b/CHANGES/8403.doc.rst deleted file mode 100644 index 71618c3c99c..00000000000 --- a/CHANGES/8403.doc.rst +++ /dev/null @@ -1 +0,0 @@ -Improve the docs for the `ssl` params. diff --git a/CHANGES/8444.bugfix b/CHANGES/8444.bugfix deleted file mode 100644 index ed059f1890b..00000000000 --- a/CHANGES/8444.bugfix +++ /dev/null @@ -1,2 +0,0 @@ -Fixed ``ws_connect`` not respecting `receive_timeout`` on WS(S) connection. --- by :user:`arcivanov`. diff --git a/CHANGES/8463.misc.rst b/CHANGES/8463.misc.rst deleted file mode 100644 index 1d42136ebd7..00000000000 --- a/CHANGES/8463.misc.rst +++ /dev/null @@ -1 +0,0 @@ -Added a 3.11-specific overloads to ``ClientSession`` -- by :user:`max-muoto`. diff --git a/CHANGES/8481.feature.rst b/CHANGES/8481.feature.rst deleted file mode 120000 index f569cd92882..00000000000 --- a/CHANGES/8481.feature.rst +++ /dev/null @@ -1 +0,0 @@ -6722.feature \ No newline at end of file diff --git a/CHANGES/8482.feature.rst b/CHANGES/8482.feature.rst deleted file mode 120000 index f569cd92882..00000000000 --- a/CHANGES/8482.feature.rst +++ /dev/null @@ -1 +0,0 @@ -6722.feature \ No newline at end of file diff --git a/CHANGES/8491.misc.rst b/CHANGES/8491.misc.rst deleted file mode 100644 index 223c549b2e2..00000000000 --- a/CHANGES/8491.misc.rst +++ /dev/null @@ -1 +0,0 @@ -Simplified path checks for ``UrlDispatcher.add_static()`` method -- by :user:`steverep`. diff --git a/CHANGES/8495.breaking.rst b/CHANGES/8495.breaking.rst deleted file mode 100644 index cfa2b185645..00000000000 --- a/CHANGES/8495.breaking.rst +++ /dev/null @@ -1,12 +0,0 @@ -The shutdown logic in 3.9 waited on all tasks, which caused issues with some libraries. -In 3.10 we've changed this logic to only wait on request handlers. This means that it's -important for developers to correctly handle the lifecycle of background tasks using a -library such as ``aiojobs``. If an application is using ``handler_cancellation=True`` then -it is also a good idea to ensure that any :func:`asyncio.shield` calls are replaced with -:func:`aiojobs.aiohttp.shield`. - -Please read the updated documentation on these points: \ -https://docs.aiohttp.org/en/stable/web_advanced.html#graceful-shutdown \ -https://docs.aiohttp.org/en/stable/web_advanced.html#web-handler-cancellation - --- by :user:`Dreamsorcerer` diff --git a/CHANGES/8498.misc.rst b/CHANGES/8498.misc.rst deleted file mode 100644 index 2aa2aa4a42b..00000000000 --- a/CHANGES/8498.misc.rst +++ /dev/null @@ -1 +0,0 @@ -Avoided creating a future on every websocket receive -- by :user:`bdraco`. diff --git a/CHANGES/8501.misc.rst b/CHANGES/8501.misc.rst deleted file mode 100644 index 689c4f9edbf..00000000000 --- a/CHANGES/8501.misc.rst +++ /dev/null @@ -1 +0,0 @@ -Updated identity checks for all ``WSMsgType`` type compares -- by :user:`bdraco`. diff --git a/CHANGES/8507.bugfix.rst b/CHANGES/8507.bugfix.rst deleted file mode 100644 index 9739536202d..00000000000 --- a/CHANGES/8507.bugfix.rst +++ /dev/null @@ -1,8 +0,0 @@ -Removed blocking I/O in the event loop for static resources and refactored -exception handling -- by :user:`steverep`. - -File system calls when handling requests for static routes were moved to a -separate thread to potentially improve performance. Exception handling -was tightened in order to only return 403 Forbidden or 404 Not Found responses -for expected scenarios; 500 Internal Server Error would be returned for any -unknown errors. diff --git a/CHANGES/8510.misc.rst b/CHANGES/8510.misc.rst deleted file mode 100644 index d0a90c7388f..00000000000 --- a/CHANGES/8510.misc.rst +++ /dev/null @@ -1 +0,0 @@ -When using Python 3.12 or later, the writer is no longer scheduled on the event loop if it can finish synchronously. Avoiding event loop scheduling reduces latency and improves performance. -- by :user:`bdraco`. diff --git a/CHANGES/8522.misc.rst b/CHANGES/8522.misc.rst deleted file mode 100644 index 1fddc580c4c..00000000000 --- a/CHANGES/8522.misc.rst +++ /dev/null @@ -1,5 +0,0 @@ -Restored :py:class:`~aiohttp.resolver.AsyncResolver` to be the default resolver. -- by :user:`bdraco`. - -:py:class:`~aiohttp.resolver.AsyncResolver` was disabled by default because -of IPv6 compatibility issues. These issues have been resolved and -:py:class:`~aiohttp.resolver.AsyncResolver` is again now the default resolver. diff --git a/CHANGES/8535.feature b/CHANGES/8535.feature deleted file mode 120000 index 449a88eb908..00000000000 --- a/CHANGES/8535.feature +++ /dev/null @@ -1 +0,0 @@ -7583.feature \ No newline at end of file