Features
-
Added
max_headersparameter to limit the number of headers that should be read from a response -- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#11955. -
Added a
dns_cache_max_sizeparameter toTCPConnectorto limit the size of the cache -- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#12106.
Bug fixes
-
Fixed server hanging indefinitely when chunked transfer encoding chunk-size
does not match actual data length. The server now raises
TransferEncodingErrorinstead of waiting forever for data that will
never arrive -- by :user:Fridayai700.Related issues and pull requests on GitHub:
#10596. -
Fixed access log timestamps ignoring daylight saving time (DST) changes. The
previous implementation used :py:data:time.timezonewhich is a constant and
does not reflect DST transitions -- by :user:nightcityblade.Related issues and pull requests on GitHub:
#11283. -
Fixed
RuntimeError: An event loop is runningerror when usingaiohttp.GunicornWebWorker
oraiohttp.GunicornUVLoopWebWorkeron Python >=3.14.
-- by :user:Tasssadar.Related issues and pull requests on GitHub:
#11701. -
Fixed :exc:
ValueErrorwhen creating a TLS connection withClientTimeout(total=0)by converting0toNonebefore passing tossl_handshake_timeoutin :py:meth:asyncio.loop.start_tls-- by :user:veeceey.Related issues and pull requests on GitHub:
#11859. -
Restored :py:meth:
~aiohttp.BodyPartReader.decodeas a synchronous method
for backward compatibility. The method was inadvertently changed to async
in 3.13.3 as part of the decompression bomb security fix. A new
:py:meth:~aiohttp.BodyPartReader.decode_itermethod is now available
for non-blocking decompression of large payloads using an async generator.
Internal aiohttp code uses the async variant to maintain security protections.Changed multipart processing chunk sizes from 64 KiB to 256KiB, to better
match aiohttp internals
-- by :user:bdracoand :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#11898. -
Fixed false-positive :py:class:
DeprecationWarningfor passingenable_cleanup_closed=Trueto :py:class:~aiohttp.TCPConnectorspecifically on Python 3.12.7.
-- by :user:Robsdedude.Related issues and pull requests on GitHub:
#11972. -
Fixed _sendfile_fallback over-reading beyond requested count -- by :user:
bysiber.Related issues and pull requests on GitHub:
#12096. -
Fixed digest auth dropping challenge fields with empty string values -- by :user:
bysiber.Related issues and pull requests on GitHub:
#12097. -
ClientConnectorCertificateError.os_errorno longer raises :exc:AttributeError
-- by :user:themylogin.Related issues and pull requests on GitHub:
#12136. -
Adjusted pure-Python request header value validation to align with RFC 9110 control-character handling, while preserving lax response parser behavior, and added regression tests for Host/header control-character cases.
-- by :user:rodrigobnogueira.Related issues and pull requests on GitHub:
#12231. -
Rejected duplicate singleton headers (
Host,Content-Type,
Content-Length, etc.) in the C extension HTTP parser to match
the pure Python parser behaviour, preventing potential host-based
access control bypasses via parser differentials
-- by :user:rodrigobnogueira.Related issues and pull requests on GitHub:
#12240. -
Aligned the pure-Python HTTP request parser with the C parser by splitting
comma-separated and repeatedConnectionheader values for keep-alive,
close, and upgrade handling -- by :user:rodrigobnogueira.Related issues and pull requests on GitHub:
#12249.
Improved documentation
-
Documented :exc:
asyncio.TimeoutErrorforWebSocketResponse.receive()
and related methods -- by :user:veeceey.Related issues and pull requests on GitHub:
#12042.
Packaging updates and notes for downstreams
-
Upgraded llhttp to 3.9.1 -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#12069.
Contributor-facing changes
-
The benchmark CI job now runs only in the upstream repository -- by :user:
Cycloctane.It used to always fail in forks, which this change fixed.
Related issues and pull requests on GitHub:
#11737. -
Fixed flaky performance tests by using appropriate fixed thresholds that account for CI variability -- by :user:
rodrigobnogueira.Related issues and pull requests on GitHub:
#11992.
Miscellaneous internal changes
-
Fixed
test_invalid_idnato work withidna3.11 by using an invalid character (\u0080) that is rejected byyarlduring URL construction -- by :user:rodrigobnogueira.Related issues and pull requests on GitHub:
#12027. -
Fixed race condition in
test_data_fileon Python 3.14 free-threaded builds -- by :user:rodrigobnogueira.Related issues and pull requests on GitHub:
#12170.