Releases: aio-libs/aiohttp
3.10.7
Bug fixes
-
Fixed assembling the :class:
~yarl.URLfor web requests when the host contains a non-default port or IPv6 address -- by :user:bdraco.Related issues and pull requests on GitHub:
#9309.
Miscellaneous internal changes
-
Improved performance of determining if a URL is absolute -- by :user:
bdraco.The property :attr:
~yarl.URL.absoluteis more performant than the methodURL.is_absolute()and preferred when newer versions of yarl are used.Related issues and pull requests on GitHub:
#9171. -
Replaced code that can now be handled by
yarl-- by :user:bdraco.Related issues and pull requests on GitHub:
#9301.
3.10.6
Bug fixes
-
Added :exc:
aiohttp.ClientConnectionResetError. Client code that previously threw :exc:ConnectionResetError
will now throw this -- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#9137. -
Fixed an unclosed transport
ResourceWarningon web handlers -- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#8875. -
Fixed resolve_host() 'Task was destroyed but is pending' errors -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#8967. -
Fixed handling of some file-like objects (e.g.
tarfile.extractfile()) which raiseAttributeErrorinstead ofOSErrorwhenfilenofails for streaming payload data -- by :user:ReallyReivax.Related issues and pull requests on GitHub:
#6732. -
Fixed web router not matching pre-encoded URLs (requires yarl 1.9.6+) -- by :user:
Dreamsorcerer. -
Fixed an error when trying to add a route for multiple methods with a path containing a regex pattern -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#8998. -
Fixed
Response.textwhen body is aPayload-- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#6485. -
Fixed compressed requests failing when no body was provided -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#9108. -
Fixed client incorrectly reusing a connection when the previous message had not been fully sent -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#8992. -
Fixed race condition that could cause server to close connection incorrectly at keepalive timeout -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#9140. -
Fixed Python parser chunked handling with multiple Transfer-Encoding values -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#8823. -
Fixed error handling after 100-continue so server sends 500 response instead of disconnecting -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#8876. -
Stopped adding a default Content-Type header when response has no content -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#8858. -
Added support for URL credentials with empty (zero-length) username, e.g.
https://:password@host-- by :user:shuckcRelated issues and pull requests on GitHub:
#6494. -
Stopped logging exceptions from
web.run_app()that would be raised regardless -- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#6807. -
Implemented binding to IPv6 addresses in the pytest server fixture.
Related issues and pull requests on GitHub:
#4650. -
Fixed the incorrect use of flags for
getnameinfo()in the Resolver --by :user:GitNMLeeLink-Local IPv6 addresses can now be handled by the Resolver correctly.
Related issues and pull requests on GitHub:
#9032. -
Fixed StreamResponse.prepared to return True after EOF is sent -- by :user:
arthurdarcet.Related issues and pull requests on GitHub:
#5343. -
Changed
make_mocked_request()to use empty payload by default -- by :user:rahulnht.Related issues and pull requests on GitHub:
#7167. -
Used more precise type for
ClientResponseError.headers, fixing some type errors when using them -- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#8768. -
Changed behavior when returning an invalid response to send a 500 response -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#8845. -
Fixed response reading from closed session to throw an error immediately instead of timing out -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#8878. -
Fixed
CancelledErrorfrom one cleanup context stopping other contexts from completing -- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#8908. -
Fixed changing scheme/host in
Response.clone()for absolute URLs -- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#8990. -
Fixed
Site.namewhen host is an empty string -- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#8929. -
Updated Python parser to reject messages after a close message, matching C parser behaviour -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#9018. -
Fixed creation of
SSLContextinside of :py:class:aiohttp.TCPConnectorwith multiple event loops in different threads -- by :user:bdraco.Related issues and pull requests on GitHub:
#9029. -
Fixed (on Python 3.11+) some edge cases where a task cancellation may get incorrectly suppressed -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#9030. -
Fixed exception information getting lost on
HttpProcessingError-- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#9052. -
Fixed
If-None-Matchnot using weak comparison -- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#9063. -
Fixed badly encoded charset crashing when getting response text instead of falling back to charset detector.
Related issues and pull requests on GitHub:
#9160. -
Rejected
\ninreasonvalues to avoid sending broken HTTP messages -- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#9167. -
Changed :py:meth:
ClientResponse.raise_for_status() <aiohttp.ClientResponse.raise_for_status>to only release the connection when invoked outside anasync withcontext -- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#9239.
Features
-
Improved type on
paramsto match the underlying type allowed byyarl-- by :user:lpetre.Related issues and pull requests on GitHub:
#8564. -
Declared Python 3.13 supported -- by :user:
bdraco.Related issues and pull requests on GitHub:
#8748.
Removals and backward incompatible breaking changes
-
Improved middleware performance -- by :user:
bdraco.The
set_current_appmethod was removed fromUrlMappingMatchInfobecause it is no longer used, and it was unlikely external caller would ever use it.Related issues and pull requests on GitHub:
#9200. -
Increased minimum yarl version to 1.12.0 -- by :user:
bdraco.Related issues and pull requests on GitHub:
#9267.
Improved documentation
-
Clarified that
GracefulExitneeds to be handled inAppRunnerandServerRunnerwhen usinghandle_signals=True. -- by :user:Daste745Related issues and pull requests on GitHub:
#4414. -
Clarified that auth parameter in ClientSession will persist and be included with any request to any origin, even during redirects to different origins. -- by :user:
MaximZemskov.Related issues and pull requests on GitHub:
#6764. -
Clarified which timeout exceptions happen on which timeouts -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#8968. -
Updated
ClientSessionparameters to match current code -- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#8991.
Packaging updates and notes for downstreams
-
Fixed
test_client_session_timeout_zeroto not require internet access -- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#9004.
Miscellaneous internal changes
-
Improved performance of making requests when there are no auto headers to skip -- by :user:
bdraco.Related issues and pull requests on GitHub:
#8847. -
Exported
aiohttp.TraceRequestHeadersSentParams-- by :user:Hadock-is-ok.Related issues and pull requests on GitHub:
#8947. -
Avoided tracing overhead in the http writer when there are no active traces -- by user:
bdraco.Related issues and pull requests on GitHub:
#9031. -
Improved performance of reify Cython implementation -- by :user:
bdraco.Related issues and pull requests on GitHub:
#9054. -
Use :meth:
URL.extend_query() <yarl.URL.extend_query>to extend query params (requires yarl 1.11.0+) -- by :user:bdraco.If yarl is older than 1.11.0, the previous slower hand rolled version will be used.
Related issues and pull requests on GitHub:
#9068. -
Improved performance of checking if a host is an IP Address -- by :user:
bdraco.Related issues and pull requests on GitHub:
#9095. -
Significantly improved performance of middlewares -- by :user:
bdraco.The construction of the middleware wrappers is now cached and is built once per handler instead of on every request.
-
Improved performance of web requests -- by :user:
bdraco.Related issues and pull requests on GitHub:
#9168, #9169, #9172, #9174, #9175, #9241. -
Improved performance of starting web requests when there is no response prepare hook -- by :user:
bdraco.Related issues and pull requests on GitHub:
#9173. -
Significantly improved performance of expiring cookies -- by :user:
bdraco.Expiring cookies has been redesigned to use :mod:
heapqinstead of a linear search, to better scale.Related issues and pull requests on GitHub:
#9203. -
Significantly sped up filtering cookies -- by :user:
bdraco.Related issues and pull requests on GitHub:
#9204.
3.10.6rc2
No significant changes.
3.10.6rc1
3.10.6rc0
Bug fixes
-
Implemented binding to IPv6 addresses in the pytest server fixture.
Related issues and pull requests on GitHub:
#4650. -
Fixed StreamResponse.prepared to return True after EOF is sent -- by :user:
arthurdarcet.Related issues and pull requests on GitHub:
#5343. -
Fixed
Response.textwhen body is aPayload-- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#6485. -
Added support for URL credentials with empty (zero-length) username, e.g.
https://:password@host-- by :user:shuckcRelated issues and pull requests on GitHub:
#6494. -
Fixed handling of some file-like objects (e.g.
tarfile.extractfile()) which raiseAttributeErrorinstead ofOSErrorwhenfilenofails for streaming payload data -- by :user:ReallyReivax.Related issues and pull requests on GitHub:
#6732. -
Stopped logging exceptions from
web.run_app()that would be raised regardless -- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#6807. -
Changed
make_mocked_request()to use empty payload by default -- by :user:rahulnht.Related issues and pull requests on GitHub:
#7167. -
Used more precise type for
ClientResponseError.headers, fixing some type errors when using them -- by :user:Dreamorcerer.Related issues and pull requests on GitHub:
#8768. -
Fixed Python parser chunked handling with multiple Transfer-Encoding values -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#8823. -
Changed behavior when returning an invalid response to send a 500 response -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#8845. -
Stopped adding a default Content-Type header when response has no content -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#8858. -
Fixed an unclosed transport
ResourceWarningon web handlers -- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#8875. -
Fixed error handling after 100-continue so server sends 500 response instead of disconnecting -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#8876. -
Fixed response reading from closed session to throw an error immediately instead of timing out -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#8878. -
Fixed web router not matching pre-encoded URLs (requires yarl 1.9.6+) -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#8898. -
Fixed
CancelledErrorfrom one cleanup context stopping other contexts from completing -- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#8908. -
Fixed
Site.namewhen host is an empty string -- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#8929. -
Fixed resolve_host() 'Task was destroyed but is pending' errors -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#8967. -
Fixed changing scheme/host in
Response.clone()for absolute URLs -- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#8990. -
Fixed client incorrectly reusing a connection when the previous message had not been fully sent -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#8992. -
Fixed an error when trying to add a route for multiple methods with a path containing a regex pattern -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#8998. -
Updated Python parser to reject messages after a close message, matching C parser behaviour -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#9018. -
Fixed creation of
SSLContextinside of :py:class:aiohttp.TCPConnectorwith multiple event loops in different threads -- by :user:bdraco.Related issues and pull requests on GitHub:
#9029. -
Fixed (on Python 3.11+) some edge cases where a task cancellation may get incorrectly suppressed -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#9030. -
Fixed the incorrect use of flags for
getnameinfo()in the Resolver --by :user:GitNMLeeLink-Local IPv6 addresses can now be handled by the Resolver correctly.
Related issues and pull requests on GitHub:
#9032. -
Fixed exception information getting lost on
HttpProcessingError-- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#9052. -
Fixed
If-None-Matchnot using weak comparison -- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#9063. -
Fixed compressed requests failing when no body was provided -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#9108. -
Added :exc:
aiohttp.ClientConnectionResetError. Client code that previously threw :exc:ConnectionResetError
will now throw this -- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#9137. -
Fixed race condition that could cause server to close connection incorrectly at keepalive timeout -- by :user:
Dreamosorcerer.Related issues and pull requests on GitHub:
#9140. -
Fixed badly encoded charset crashing when getting response text instead of falling back to charset detector.
Related issues and pull requests on GitHub:
#9160. -
Rejected
\ninreasonvalues to avoid sending broken HTTP messages -- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#9167. -
Changed :py:meth:
ClientResponse.raise_for_status() <aiohttp.ClientResponse.raise_for_status>to only release the connection when invoked outside anasync withcontext -- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#9239.
Features
-
Improved type on
paramsto match the underlying type allowed byyarl-- by :user:lpetre.Related issues and pull requests on GitHub:
#8564.
Removals and backward incompatible breaking changes
-
Improved middleware performance -- by :user:
bdraco.The
set_current_appmethod was removed fromUrlMappingMatchInfobecause it is no longer used, and it was unlikely external caller would ever use it.Related issues and pull requests on GitHub:
#9200.
Improved documentation
-
Clarified that
GracefulExitneeds to be handled inAppRunnerandServerRunnerwhen usinghandle_signals=True. -- by :user:Daste745Related issues and pull requests on GitHub:
#4414. -
Clarified that auth parameter in ClientSession will persist and be included with any request to any origin, even during redirects to different origins. -- by :user:
MaximZemskov.Related issues and pull requests on GitHub:
#6764. -
Clarified which timeout exceptions happen on which timeouts -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#8968. -
Updated
ClientSessionparameters to match current code -- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#8991.
Packaging updates and notes for downstreams
-
Fixed
test_client_session_timeout_zeroto not require internet access -- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#9004.
Miscellaneous internal changes
-
Improved performance of making requests when there are no auto headers to skip -- by :user:
bdraco.Related issues and pull requests on GitHub:
#8847. -
Exported
aiohttp.TraceRequestHeadersSentParams-- by :user:Hadock-is-ok.Related issues and pull requests on GitHub:
#8947. -
Avoided tracing overhead in the http writer when there are no active traces -- by user:
bdraco.Related issues and pull requests on GitHub:
#9031. -
Improved performance of reify Cython implementation -- by :user:
bdraco.Related issues and pull requests on GitHub:
#9054. -
Use :meth:
URL.extend_query() <yarl.URL.extend_query>to extend query params (requires yarl 1.11.0+) -- by :user:bdraco.If yarl is older than 1.11.0, the previous slower hand rolled version will be used.
Related issues and pull requests on GitHub:
#9068. -
Improved performance of checking if a host is an IP Address -- by :user:
bdraco.Related issues and pull requests on GitHub:
#9095. -
Significantly improved performance of middlewares -- by :user:
bdraco.The construction of the middleware wrappers is now cached and is built once per handler instead of on every request.
-
Improved performance of web requests -- by :user:
bdraco.Related issues and pull requests on GitHub:
#9168, #9169, #9172, #9174, #9175, #9241. -
Improved performance of starting web requests when there is no response prepare hook -- by :user:
bdraco.Related issues and pull requests on GitHub:
#9173. -
Significantly improved performance of expiring cookies -- by :user:
bdraco.Expiring cookies has been redesigned to use :mod:
heapqinstead of a linear search, to better scale.Related issues and pull requests on GitHub:
#9203. -
Significantly sped up filtering cookies -- by :user:
bdraco.Related issues and pull requests on GitHub:
#9204.
3.10.5
Bug fixes
-
Fixed :meth:
aiohttp.ClientResponse.json()not settingstatuswhen :exc:aiohttp.ContentTypeErroris raised -- by :user:bdraco.Related issues and pull requests on GitHub:
#8742.
Miscellaneous internal changes
-
Improved performance of the WebSocket reader -- by :user:
bdraco.
3.10.4
Bug fixes
-
Fixed decoding base64 chunk in BodyPartReader -- by :user:
hyzyla.Related issues and pull requests on GitHub:
#3867. -
Fixed a race closing the server-side WebSocket where the close code would not reach the client -- by :user:
bdraco.Related issues and pull requests on GitHub:
#8680. -
Fixed unconsumed exceptions raised by the WebSocket heartbeat -- by :user:
bdraco.If the heartbeat ping raised an exception, it would not be consumed and would be logged as an warning.
Related issues and pull requests on GitHub:
#8685. -
Fixed an edge case in the Python parser when chunk separators happen to align with network chunks -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#8720.
Improved documentation
-
Added
aiohttp-apischemato supported libraries -- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#8700.
Miscellaneous internal changes
-
Improved performance of starting request handlers with Python 3.12+ -- by :user:
bdraco.This change is a followup to #8661 to make the same optimization for Python 3.12+ where the request is connected.
Related issues and pull requests on GitHub:
#8681.
3.10.3
Bug fixes
-
Fixed multipart reading when stream buffer splits the boundary over several read() calls -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#8653. -
Fixed :py:class:
aiohttp.TCPConnectordoing blocking I/O in the event loop to create theSSLContext-- by :user:bdraco.The blocking I/O would only happen once per verify mode. However, it could cause the event loop to block for a long time if the
SSLContextcreation is slow, which is more likely during startup when the disk cache is not yet present.Related issues and pull requests on GitHub:
#8672.
Miscellaneous internal changes
-
Improved performance of :py:meth:
~aiohttp.ClientWebSocketResponse.receiveand :py:meth:~aiohttp.web.WebSocketResponse.receivewhen there is no timeout. -- by :user:bdraco.The timeout context manager is now avoided when there is no timeout as it accounted for up to 50% of the time spent in the :py:meth:
~aiohttp.ClientWebSocketResponse.receiveand :py:meth:~aiohttp.web.WebSocketResponse.receivemethods.Related issues and pull requests on GitHub:
#8660. -
Improved performance of starting request handlers with Python 3.12+ -- by :user:
bdraco.Related issues and pull requests on GitHub:
#8661. -
Improved performance of HTTP keep-alive checks -- by :user:
bdraco.Previously, when processing a request for a keep-alive connection, the keep-alive check would happen every second; the check is now rescheduled if it fires too early instead.
Related issues and pull requests on GitHub:
#8662. -
Improved performance of generating random WebSocket mask -- by :user:
bdraco.Related issues and pull requests on GitHub:
#8667.
3.10.2
Bug fixes
-
Fixed server checks for circular symbolic links to be compatible with Python 3.13 -- by :user:
steverep.Related issues and pull requests on GitHub:
#8565. -
Fixed request body not being read when ignoring an Upgrade request -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#8597. -
Fixed an edge case where shutdown would wait for timeout when the handler was already completed -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#8611. -
Fixed connecting to
npipe://,tcp://, andunix://urls -- by :user:bdraco.Related issues and pull requests on GitHub:
#8632. -
Fixed WebSocket ping tasks being prematurely garbage collected -- by :user:
bdraco.There was a small risk that WebSocket ping tasks would be prematurely garbage collected because the event loop only holds a weak reference to the task. The garbage collection risk has been fixed by holding a strong reference to the task. Additionally, the task is now scheduled eagerly with Python 3.12+ to increase the chance it can be completed immediately and avoid having to hold any references to the task.
Related issues and pull requests on GitHub:
#8641. -
Fixed incorrectly following symlinks for compressed file variants -- by :user:
steverep.Related issues and pull requests on GitHub:
#8652.
Removals and backward incompatible breaking changes
-
Removed
Request.wait_for_disconnection(), which was mistakenly added briefly in 3.10.0 -- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#8636.
Contributor-facing changes
-
Fixed monkey patches for
Path.stat()andPath.is_dir()for Python 3.13 compatibility -- by :user:steverep.Related issues and pull requests on GitHub:
#8551.
Miscellaneous internal changes
-
Improved WebSocket performance when messages are sent or received frequently -- by :user:
bdraco.The WebSocket heartbeat scheduling algorithm was improved to reduce the
asyncioscheduling overhead by decreasing the number ofasyncio.TimerHandlecreations and cancellations.Related issues and pull requests on GitHub:
#8608. -
Minor improvements to various type annotations -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#8634.
3.10.1
Bug fixes
-
Fixed WebSocket server heartbeat timeout logic to terminate :py:meth:
~aiohttp.ClientWebSocketResponse.receiveand return :py:class:~aiohttp.ServerTimeoutError-- by :user:arcivanov.When a WebSocket pong message was not received, the :py:meth:
~aiohttp.ClientWebSocketResponse.receiveoperation did not terminate. This change causes_pong_not_receivedto feed thereaderan error message, causing pending :py:meth:~aiohttp.ClientWebSocketResponse.receiveto terminate and return the error message. The error message contains the exception :py:class:~aiohttp.ServerTimeoutError.Related issues and pull requests on GitHub:
#8540. -
Fixed url dispatcher index not matching when a variable is preceded by a fixed string after a slash -- by :user:
bdraco.Related issues and pull requests on GitHub:
#8566.
Removals and backward incompatible breaking changes
-
Creating :py:class:
aiohttp.TCPConnector, :py:class:aiohttp.ClientSession, :py:class:~aiohttp.resolver.ThreadedResolver:py:class:aiohttp.web.Server, or :py:class:aiohttp.CookieJarinstances without a running event loop now raises a :exc:RuntimeError-- by :user:asvetlov.Creating these objects without a running event loop was deprecated in #3372 which was released in version 3.5.0.
This change first appeared in version 3.10.0 as #6378.