Bug fixes
-
Fixed server response headers for
Content-Type
andContent-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 theContent-Encoding
header.
Users should expect that most clients will no longer decompress such responses
by default.Related issues and pull requests on GitHub:
#4462. -
Fix duplicate cookie expiration calls in the CookieJar implementation
Related issues and pull requests on GitHub:
#7784. -
Fix
AsyncResolver
to matchThreadedResolver
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:
#8270. -
Fix
ws_connect
not respectingreceive_timeout`` on WS(S) connection. -- by :user:
arcivanov`.Related issues and pull requests on GitHub:
#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:
#8507.
Features
-
Add 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:
#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 adescription
property with the text explanation of the error details.-- by :user:
setla
, :user:AraHaan
, and :user:bdraco
Related issues and pull requests on GitHub:
#2507, #3315, #6722, #8481, #8482. -
Added a feature to retry closed connections automatically for idempotent methods. -- by :user:
Dreamsorcerer
Related issues and pull requests on GitHub:
#7297. -
Implement 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 withCookieJar.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:
#7583. -
Separated connection and socket timeout errors, from ServerTimeoutError.
Related issues and pull requests on GitHub:
#7801. -
Implement happy eyeballs
Related issues and pull requests on GitHub:
#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:
#8062.
Improved documentation
-
Add documentation for
aiohttp.web.FileResponse
.Related issues and pull requests on GitHub:
#3958. -
Improve the docs for the
ssl
params.Related issues and pull requests on GitHub:
#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:
#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:
#7829. -
Add
nacl_middleware <https://github.com/CosmicDNA/nacl_middleware>
_ to the list of middlewares in the third party section of the documentation.Related issues and pull requests on GitHub:
#8346. -
Minor improvements to static typing -- by :user:
Dreamsorcerer
.Related issues and pull requests on GitHub:
#8364. -
Added a 3.11-specific overloads to
ClientSession
-- by :user:max-muoto
.Related issues and pull requests on GitHub:
#8463. -
Simplified path checks for
UrlDispatcher.add_static()
method -- by :user:steverep
.Related issues and pull requests on GitHub:
#8491. -
Avoid creating a future on every websocket receive -- by :user:
bdraco
.Related issues and pull requests on GitHub:
#8498. -
Use identity checks for all
WSMsgType
type compares -- by :user:bdraco
.Related issues and pull requests on GitHub:
#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:
#8510. -
Restore :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:
#8522.