Releases: aio-libs/aiohttp
3.14.1
Bug fixes
-
Fixed a race condition in :py:class:
~aiohttp.TCPConnectorwhere closing the connector while a DNS resolution was in-flight could raise :py:exc:AttributeErrorinstead of :py:exc:~aiohttp.ClientConnectionError-- by :user:goingforstudying-ctrl.Related issues and pull requests on GitHub:
#12497. -
Fixed
CancelledErrornot closing a connection -- by :user:aiolibsbot.Related issues and pull requests on GitHub:
#12795. -
Tightened up some websocket parser checks -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#12817. -
Fixed :class:
~aiohttp.CookieJardropping the host-only flag of cookies when persisted with :meth:~aiohttp.CookieJar.saveand reloaded with :meth:~aiohttp.CookieJar.load, so a cookie set without aDomainattribute is again scoped to the exact host that set it after a reload; the absolute expiration deadline is now persisted as well, so a reloaded cookie keeps its original lifetime instead of being rescheduled from the load time. :meth:~aiohttp.CookieJar.loadnow replaces the jar contents rather than merging onto prior state, and loaded cookies pass through the same acceptance rules as :meth:~aiohttp.CookieJar.update_cookies, so a cookie for an IP-address host is dropped when loaded into a jar created withoutunsafe=True-- by :user:bdraco.Related issues and pull requests on GitHub:
#12824. -
Scoped :class:
~aiohttp.DigestAuthMiddlewarecredentials to the origin of the first request it handles, so a redirect to a different origin no longer triggers a digest response computed from the configured credentials; a challenge from another origin is only answered when that origin falls within a protection space advertised by the anchor origin through the RFC 7616domaindirective -- by :user:bdraco.Related issues and pull requests on GitHub:
#12825. -
Fixed the C HTTP parser not enforcing
max_line_sizeon a request target or response reason phrase that is split across multiple reads; each fragment was checked on its own, so an accumulated line could exceed the limit without raisingLineTooLong. The accumulated length is now checked, matching the pure-Python parser -- by :user:bdraco.Related issues and pull requests on GitHub:
#12826. -
Changed :class:
~aiohttp.TCPConnectorto reject legacy non-canonical numeric IPv4 host forms such as2130706433,017700000001and127.1with :exc:~aiohttp.InvalidUrlClientError; only canonical dotted-quad IPv4 literals are now treated as IP address literals, while every other host is sent through the configured resolver -- by :user:bdraco.Related issues and pull requests on GitHub:
#12827. -
Fixed :meth:
~aiohttp.StreamReader.readanyand :meth:~aiohttp.StreamReader.read_nowaitjoining data fed back into the buffer during the call (when draining below the low water mark resumes reading) into a single unbounded :class:bytes; a call now returns only the chunks that were buffered when it started, keeping the drain of an unread auto-decompressed request body bounded by the read buffer -- by :user:bdraco.Related issues and pull requests on GitHub:
#12828. -
Bounded the number of parsed-but-unhandled pipelined HTTP/1 requests buffered per connection on the server; once the queue reaches an internal limit the parser stops emitting and the transport is paused, resuming as the request handler drains the queue, so a client keeping one handler busy can no longer accumulate an unbounded backlog of pipelined requests -- by :user:
bdraco.Related issues and pull requests on GitHub:
#12830. -
Fixed :meth:
aiohttp.web.Response.write_eofskippingPayload.close()when the body write was interrupted by an error or cancellation, for example when a client disconnects mid-response; the payload close hook now runs in afinallyso a :class:~aiohttp.payload.Payloadbody always releases its resources -- by :user:bdraco.Related issues and pull requests on GitHub:
#12831. -
Fixed the pure-Python HTTP parser not enforcing
max_line_sizeon a chunk-size line when the whole line arrived in a single read; the limit was only applied to chunk-size metadata split across reads. The complete-line case is now checked too, matching the split-line behavior -- by :user:bdraco.Related issues and pull requests on GitHub:
#12832. -
Included the per-request
server_hostnameoverride in the :class:~aiohttp.TCPConnectorconnection pool key, so a pooled TLS connection is no longer reused for a request that setsserver_hostnameto a different value -- by :user:bdraco.Related issues and pull requests on GitHub:
#12835.
3.14.0
We have a new website! https://aio-libs.org
Subscribe to the news feed to find out more about what we're working on in future.
Features
-
Added
RequestKeyandResponseKeyclasses,
which enable static type checking for request & response
context storages in the same way thatAppKeydoes forApplication
-- by :user:gsoldatov.Related issues and pull requests on GitHub:
#11766. -
Added :func:
~aiohttp.encode_basic_authfor encoding HTTP Basic
Authentication credentials. Replaces the now-deprecated
:class:~aiohttp.BasicAuth-- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#12499. -
Started accepting :term:
asynchronous context managers <asynchronous context manager>for cleanup contexts.
Legacy single-yield :term:asynchronous generatorcleanup contexts continue to be
supported; async context managers are adapted internally so they are
entered at startup and exited during cleanup.-- by :user:
MannXo.Related issues and pull requests on GitHub:
#11681. -
Added :py:attr:
~aiohttp.CookieJar.cookiesand :py:attr:~aiohttp.CookieJar.host_only_cookiesread-only properties to :py:class:~aiohttp.CookieJarexposing the stored cookies with their full attributes -- by :user:Br1an67.Related issues and pull requests on GitHub:
#3951. -
Added :py:attr:
~aiohttp.web.TCPSite.portaccessor for dynamic port allocations in :class:~aiohttp.web.TCPSite-- by :user:twhittock-disguiseand :user:rodrigobnogueira.Related issues and pull requests on GitHub:
#10665. -
Added
decode_textparameter to :meth:~aiohttp.ClientSession.ws_connectand :class:~aiohttp.web.WebSocketResponseto receive WebSocket TEXT messages as raw bytes instead of decoded strings, enabling direct use with high-performance JSON parsers likeorjson-- by :user:bdraco. -
Large overhaul of parser/decompression code.
The zip bomb security fix in 3.13 stopped highly compressed payloads
from being decompressed, regardless of validity. Now aiohttp will
decompress such payloads in chunks of 256+ KiB, allowing safe decompression
of such payloads.-- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#11966. -
Added explicit APIs for bytes-returning JSON serializer:
JSONBytesEncodertype,JsonBytesPayload,
:func:~aiohttp.web.json_bytes_response,
:meth:~aiohttp.web.WebSocketResponse.send_json_bytesand
:meth:~aiohttp.ClientWebSocketResponse.send_json_bytesmethods, and
json_serialize_bytesparameter for :class:~aiohttp.ClientSession
-- by :user:kevinpark1217.Related issues and pull requests on GitHub:
#11989. -
Added :attr:
~aiohttp.ClientResponse.output_sizeand
:attr:~aiohttp.ClientResponse.upload_complete-- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#12452.
Bug fixes
-
Fixed
ZLibDecompressorsilently dropping data past the first
member when decompressing concatenated gzip/deflate streams. Each subsequent
member is now handed to a fresh decompressor, matching the behaviour already
implemented for ZSTD multi-frame streams.-- by :user:
Ashutosh-177Related issues and pull requests on GitHub:
#7157. -
Improved the parser error message shown when TLS handshake bytes are received on an HTTP port -- by :user:
puneetdixit200.Related issues and pull requests on GitHub:
#10142. -
Fixed the C parser failing to reject a response with a body when none was expected -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#10587. -
Fixed http parser not rejecting HTTP/1.1 requests that do not have valid Host header.
-- by :user:Cycloctane.Related issues and pull requests on GitHub:
#10600. -
Fixed misleading TLS-in-TLS warning being emitted when sending HTTPS requests through an HTTP proxy. The warning now only fires when the proxy itself uses HTTPS, which is the only case where TLS-in-TLS actually applies -- by :user:
wavebyrd.Related issues and pull requests on GitHub:
#10683. -
Fixed
AssertionErrorwhen the transport isNoneduring WebSocket
preparation or file response sending (e.g. when a client disconnects
immediately after connecting). AConnectionResetErroris now raised
instead -- by :user:agners.Related issues and pull requests on GitHub:
#11761. -
Fixed ad-hoc cookies passed to individual requests not being sent when the session's cookie jar has
unsafe=Trueand the target URL uses an IP address, by copying theunsafesetting from the session's cookie jar to the temporary cookie jar -- by :user:Krishnachaitanyakc.Related issues and pull requests on GitHub:
#12011. -
Reset the WebSocket heartbeat timer on inbound data to avoid false ping/pong timeouts while receiving large frames
-- by :user:hoffmang9.Related issues and pull requests on GitHub:
#12030. -
Switched :py:meth:
~aiohttp.CookieJar.saveto use JSON format and
:py:meth:~aiohttp.CookieJar.loadto try JSON first with a fallback to
a restricted pickle unpickler -- by :user:YuvalElbar6.Related issues and pull requests on GitHub:
#12091. -
Fixed redirects with consumed non-rewindable request bodies to raise
:class:aiohttp.ClientPayloadErrorinstead of silently sending an empty body.Related issues and pull requests on GitHub:
#12195. -
Fixed zstd decompression failing with
ClientPayloadErrorwhen the server
sends a response as multiple zstd frames -- by :user:josu-moreno.Related issues and pull requests on GitHub:
#12234. -
Fixed spurious
Future exception was never retrievedwarning on disconnect during back-pressure -- by :user:availov.Related issues and pull requests on GitHub:
#12281. -
Cookiejar.save()now uses0x600permissions to better protect them from being read by other users -- by :user:digiscrypt.Related issues and pull requests on GitHub:
#12312. -
Fixed a crash (:external+python:exc:
~http.cookies.CookieError) in the cookie parser when receiving cookies
containing ASCII control characters on CPython builds with the :cve:2026-3644
patch. The parser now gracefully skips cookies whose value contains control
characters instead of letting the exception propagate -- by :user:rodrigobnogueira.Related issues and pull requests on GitHub:
#12395. -
Fixed digest authentication failing for requests whose path or query string contains percent-encoded reserved characters; the digest signature now uses the encoded request-target that is sent on the wire instead of the decoded form -- by :user:
bdraco.Related issues and pull requests on GitHub:
#12436. -
Fixed :func:
aiohttp.web.run_applosing inner traceback frames when an
exception is raised during application startup (e.g. inside
cleanup_ctxoron_startup). Regression since 3.10.6.Related issues and pull requests on GitHub:
#12493. -
Fixed per-request
cookiesnot being dropped on cross-origin redirects -- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#12550. -
Fixed invalid bytes being allowed in multipart/payload headers -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#12719. -
Fixed :py:meth:
~aiohttp.FormData.add_fieldaccepting invalid bytes innameandfilename-- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#12721. -
Fixed websocket upgrade occurring when header contained a value like
notupgrade-- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#12723.
Deprecations (removal in next major release)
-
Deprecated :class:
~aiohttp.BasicAuthand theauth/proxy_auth
parameters. They will be removed in aiohttp 4.0. Use the new
:func:~aiohttp.encode_basic_authhelper together with
headers={"Authorization": ...}(or
proxy_headers={"Proxy-Authorization": ...}for proxies) instead.
Note thatencode_basic_auth()defaults toutf-8, notlatin1
-- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#12499. -
Added deprecation warning to
aiohttp.pytest_plugin, please switch topytest-aiohttp-- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#10785.
Removals and backward incompatible breaking changes
-
Stopped calling :func:
socket.getfqdnas the fallback for
:attr:aiohttp.web.BaseRequest.host. :func:socket.getfqdn
performs blocking reverse DNS resolution on the event loop
thread and can stall a worker for many seconds when the system
resolver is slow, and could be triggered remotely by an HTTP/1.0
request that omits theHostheader. The fallback when no
Hostheader is present is now the local socket address the
request arrived on (transportsockname), or an empty string
if no transport information is available. Code that relied on
the FQDN being returned must now read it from
:func:socket.getfqdndirectly, off the event loop
-- by :user:bdraco. -
Dropped support for Python 3.9 -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#11601. -
Tightened outbound header serialization to reject all ASCII control
characters forbidden by :rfc:9110#section-5.5and :rfc:9112#section-4
(0x00-0x08,0x0A-0x1F,0x7F) in status lines,
header field-names, and field-values. Previously only CR, LF and NUL were
rejected. HTAB (0x09) remains permitted in field values. Applications
...
3.13.5
3.13.4
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.
3.13.3
This release contains fixes for several vulnerabilities. It is advised to
upgrade as soon as possible.
Bug fixes
-
Fixed proxy authorization headers not being passed when reusing a connection, which caused 407 (Proxy authentication required) errors
-- by :user:GLeurquin.Related issues and pull requests on GitHub:
#2596. -
Fixed multipart reading failing when encountering an empty body part -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#11857. -
Fixed a case where the parser wasn't raising an exception for a websocket continuation frame when there was no initial frame in context.
Related issues and pull requests on GitHub:
#11862.
Removals and backward incompatible breaking changes
-
Brotliandbrotlicffiminimum version is now 1.2.
Decompression now has a default maximum output size of 32MiB per decompress call -- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#11898.
Packaging updates and notes for downstreams
-
Moved dependency metadata from :file:
setup.cfgto :file:pyproject.tomlper :pep:621
-- by :user:cdce8p.Related issues and pull requests on GitHub:
#11643.
Contributor-facing changes
-
Removed unused
update-pre-commitgithub action workflow -- by :user:Cycloctane.Related issues and pull requests on GitHub:
#11689.
Miscellaneous internal changes
-
Optimized web server performance when access logging is disabled by reducing time syscalls -- by :user:
bdraco.Related issues and pull requests on GitHub:
#10713. -
Added regression test for cached logging status -- by :user:
meehand.Related issues and pull requests on GitHub:
#11778.
3.13.2
Bug fixes
-
Fixed cookie parser to continue parsing subsequent cookies when encountering a malformed cookie that fails regex validation, such as Google's
g_statecookie with unescaped quotes -- by :user:bdraco.Related issues and pull requests on GitHub:
#11632. -
Fixed loading netrc credentials from the default :file:
~/.netrc(:file:~/_netrcon Windows) location when the :envvar:NETRCenvironment variable is not set -- by :user:bdraco. -
Fixed WebSocket compressed sends to be cancellation safe. Tasks are now shielded during compression to prevent compressor state corruption. This ensures that the stateful compressor remains consistent even when send operations are cancelled -- by :user:
bdraco.Related issues and pull requests on GitHub:
#11725.
3.13.1
Features
-
Make configuration options in
AppRunneralso available inrun_app()
-- by :user:Cycloctane.Related issues and pull requests on GitHub:
#11633.
Bug fixes
-
Switched to
backports.zstdfor Python <3.14 and fixed zstd decompression for chunked zstd streams -- by :user:ZhaoMJ.Note: Users who installed
zstandardfor support on Python <3.14 will now need to install
backports.zstdinstead (installingaiohttp[speedups]will do this automatically).Related issues and pull requests on GitHub:
#11623. -
Updated
Content-Typeheader parsing to returnapplication/octet-streamwhen header contains invalid syntax.
See :rfc:9110#section-8.3-5.-- by :user:
sgaist.Related issues and pull requests on GitHub:
#10889. -
Fixed Python 3.14 support when built without
zstdsupport -- by :user:JacobHenner.Related issues and pull requests on GitHub:
#11603. -
Fixed blocking I/O in the event loop when using netrc authentication by moving netrc file lookup to an executor -- by :user:
bdraco.Related issues and pull requests on GitHub:
#11634. -
Fixed routing to a sub-application added via
.add_domain()not working
if the same path exists on the parent app. -- by :user:Dreamsorcerer.Related issues and pull requests on GitHub:
#11673.
Packaging updates and notes for downstreams
-
Moved core packaging metadata from :file:
setup.cfgto :file:pyproject.tomlper :pep:621
-- by :user:cdce8p.Related issues and pull requests on GitHub:
#9951.
3.13.0
Features
-
Added support for Python 3.14.
-
Added support for free-threading in Python 3.14+ -- by :user:
kumaraditya303. -
Added support for Zstandard (aka Zstd) compression
-- by :user:KGuillaume-chaps.Related issues and pull requests on GitHub:
#11161. -
Added
StreamReader.total_raw_bytesto check the number of bytes downloaded
-- by :user:robpats.Related issues and pull requests on GitHub:
#11483.
Bug fixes
-
Fixed pytest plugin to not use deprecated :py:mod:
asynciopolicy APIs.Related issues and pull requests on GitHub:
#10851. -
Updated
Content-Dispositionheader parsing to handle trailing semicolons and empty parts
-- by :user:PLPeeters.Related issues and pull requests on GitHub:
#11243. -
Fixed saved
CookieJarfailing to be loaded if cookies havepartitionedflag when
http.cookiedoes not have partitioned cookies supports. -- by :user:Cycloctane.Related issues and pull requests on GitHub:
#11523.
Improved documentation
-
Added
Wireupto third-party libraries -- by :user:maldoinc.Related issues and pull requests on GitHub:
#11233.
Packaging updates and notes for downstreams
-
The
blockbustertest dependency is now optional; the corresponding test fixture is disabled when it is unavailable
-- by :user:musicinybrain.Related issues and pull requests on GitHub:
#11363. -
Added
riscv64build to releases -- by :user:eshattow.Related issues and pull requests on GitHub:
#11425.
Contributor-facing changes
-
Fixed
test_send_compress_textfailing when alternative zlib implementation
is used. (zlib-ngin python 3.14 windows build) -- by :user:Cycloctane.Related issues and pull requests on GitHub:
#11546.
3.12.15
Bug fixes
-
Fixed :class:
~aiohttp.DigestAuthMiddlewareto preserve the algorithm case from the server's challenge in the authorization response. This improves compatibility with servers that perform case-sensitive algorithm matching (e.g., servers expectingalgorithm=MD5-sessinstead ofalgorithm=MD5-SESS)
-- by :user:bdraco.Related issues and pull requests on GitHub:
#11352.
Improved documentation
-
Remove outdated contents of
aiohttp-devtoolsandaiohttp-swagger
from Web_advanced docs.
-- by :user:CycloctaneRelated issues and pull requests on GitHub:
#11347.
Packaging updates and notes for downstreams
-
Started including the
llhttp:file:LICENSEfile in wheels by addingvendor/llhttp/LICENSEtolicense-filesin :file:setup.cfg-- by :user:threexc.Related issues and pull requests on GitHub:
#11226.
Contributor-facing changes
-
Updated a regex in
test_aiohttp_request_coroutinefor Python 3.14.Related issues and pull requests on GitHub:
#11271.
3.12.14
Bug fixes
-
Fixed file uploads failing with HTTP 422 errors when encountering 307/308 redirects, and 301/302 redirects for non-POST methods, by preserving the request body when appropriate per :rfc:
9110#section-15.4.3-3.1-- by :user:bdraco.Related issues and pull requests on GitHub:
#11270. -
Fixed :py:meth:
ClientSession.close() <aiohttp.ClientSession.close>hanging indefinitely when using HTTPS requests through HTTP proxies -- by :user:bdraco.Related issues and pull requests on GitHub:
#11273. -
Bumped minimum version of aiosignal to 1.4+ to resolve typing issues -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#11280.
Features
-
Added initial trailer parsing logic to Python HTTP parser -- by :user:
Dreamsorcerer.Related issues and pull requests on GitHub:
#11269.
Improved documentation
-
Clarified exceptions raised by
WebSocketResponse.send_frameet al.
-- by :user:DoctorJohn.Related issues and pull requests on GitHub:
#11234.