Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
13fa805
Bump version (#12773)
Dreamsorcerer Jun 2, 2026
9df2b30
[PR #12774/c66e5cb4 backport][3.15] Point Dependabot to 3.15 branch (…
patchback[bot] Jun 2, 2026
3e25bb6
Bump click from 8.3.1 to 8.4.1 (#12779)
dependabot[bot] Jun 2, 2026
d15bcd2
Bump virtualenv from 21.4.1 to 21.4.2 (#12777)
dependabot[bot] Jun 2, 2026
67f8adf
Bump distlib from 0.4.0 to 0.4.1 (#12780)
dependabot[bot] Jun 2, 2026
80f8590
Bump idna from 3.17 to 3.18 (#12782)
dependabot[bot] Jun 2, 2026
6acc463
Bump virtualenv from 21.4.1 to 21.4.2 (#12763)
dependabot[bot] Jun 2, 2026
421b791
Bump click from 8.3.1 to 8.4.1 (#12771)
dependabot[bot] Jun 2, 2026
5a5df7b
[PR #12790/4ef04d66 backport][3.15] Readd codecov/project status chec…
patchback[bot] Jun 2, 2026
c97baa3
[PR #12787/4eb35886 backport][3.15] fix(connector): resolve race cond…
patchback[bot] Jun 3, 2026
70fe11c
[PR #12787/4eb35886 backport][3.14] fix(connector): resolve race cond…
patchback[bot] Jun 3, 2026
f5e823b
[PR #12796/a927da16 backport][3.15] Fix pipelined request after webso…
patchback[bot] Jun 3, 2026
8943d34
[PR #12796/a927da16 backport][3.14] Fix pipelined request after webso…
patchback[bot] Jun 3, 2026
4cc390a
Bump astral-sh/setup-uv from 8.1.0 to 8.2.0 (#12802)
dependabot[bot] Jun 4, 2026
5079abc
Bump snowballstemmer from 3.1.0 to 3.1.1 (#12805)
dependabot[bot] Jun 4, 2026
b927ece
[PR #12809/5771a85f backport][3.15] Revert "Move pip-tools into pypro…
patchback[bot] Jun 4, 2026
b1458fe
Close transport on BaseException in ResponseHandler.data_received (#1…
Dreamsorcerer Jun 4, 2026
377cdb1
Close transport on BaseException in ResponseHandler.data_received (#1…
Dreamsorcerer Jun 4, 2026
451a8de
[PR #12809/5771a85f backport][3.14] Revert "Move pip-tools into pypro…
patchback[bot] Jun 5, 2026
f09ae93
[PR #12817/69344c6e backport][3.15] Improve websocket checks (#12819)
patchback[bot] Jun 5, 2026
14b6ee8
[PR #12817/69344c6e backport][3.14] Improve websocket checks (#12818)
patchback[bot] Jun 5, 2026
0d17491
[PR #12832/5e898429 backport][3.15] Enforce max_line_size on complete…
patchback[bot] Jun 7, 2026
b411319
[PR #12835/1e94b3e8 backport][3.15] Tls server hostname pool key (#12…
bdraco Jun 7, 2026
758bacc
[PR #12832/5e898429 backport][3.14] Enforce max_line_size on complete…
patchback[bot] Jun 7, 2026
bb248eb
[PR #12827/ccf218ab backport][3.15] Numeric ipv4 resolver bypass (#12…
bdraco Jun 7, 2026
7763306
[PR #12825/cb1d6a53 backport][3.15] Scope DigestAuthMiddleware creden…
patchback[bot] Jun 7, 2026
0ca2b6c
[PR #12835/1e94b3e8 backport][3.14] Tls server hostname pool key (#12…
bdraco Jun 7, 2026
38d1606
[PR #12825/cb1d6a53 backport][3.14] Scope DigestAuthMiddleware creden…
patchback[bot] Jun 7, 2026
90ea552
[PR #12831/1ac92dae backport][3.15] Payload close on disconnect (#12844)
patchback[bot] Jun 7, 2026
2475b63
[PR #12828/13b635d7 backport][3.15] Bounded unread compressed drain (…
bdraco Jun 7, 2026
3912667
[3.14] Add test that env proxy auth is scoped to the redirect-selecte…
bdraco Jun 7, 2026
58fc08e
[3.15] Add test that env proxy auth is scoped to the redirect-selecte…
bdraco Jun 7, 2026
b40867f
[PR #12826/36df6c13 backport][3.15] Enforce max_line_size on fragment…
bdraco Jun 7, 2026
5ab61bb
[PR #12826/36df6c13 backport][3.14] Enforce max_line_size on fragment…
bdraco Jun 7, 2026
95eb19f
[PR #12824/60b85e98 backport][3.15] Preserve host-only cookie scope a…
bdraco Jun 7, 2026
4f7480e
[PR #12828/13b635d7 backport][3.14] Bounded unread compressed drain (…
bdraco Jun 7, 2026
a329a7a
[PR #12824/60b85e98 backport][3.14] Preserve host-only cookie scope a…
bdraco Jun 7, 2026
a762eda
[PR #12831/1ac92dae backport][3.14] Payload close on disconnect (#12843)
patchback[bot] Jun 7, 2026
0e9cedd
[PR #12827/ccf218ab backport][3.14] Numeric ipv4 resolver bypass (#12…
bdraco Jun 7, 2026
d8db2e7
[PR #12830/93a2b1c3 backport][3.15] Bound pipelined request queue per…
bdraco Jun 7, 2026
dfdfa9d
[PR #12830/93a2b1c3 backport][3.14] Bound pipelined request queue per…
bdraco Jun 7, 2026
71f16a2
Bump filelock from 3.29.0 to 3.29.1 (#12806)
dependabot[bot] Jun 7, 2026
d797777
[PR #12857/69dff14d backport][3.15] Drop list compression (#12859)
patchback[bot] Jun 7, 2026
8f31009
[PR #12857/69dff14d backport][3.14] Drop list compression (#12858)
patchback[bot] Jun 7, 2026
d9f3ec7
Remove coverage ignore (#12860)
Dreamsorcerer Jun 7, 2026
59684b5
Revert "Drop list compression (#12857)" (#12861)
Dreamsorcerer Jun 7, 2026
82465ef
[PR #12861/59684b5c backport][3.15] Revert "Drop list compression (#1…
patchback[bot] Jun 7, 2026
38b956c
[PR #12861/59684b5c backport][3.14] Revert "Drop list compression (#1…
patchback[bot] Jun 7, 2026
9c35d03
Release v3.14.1 (#12864)
Dreamsorcerer Jun 7, 2026
958d949
Merge branch '3.14' into 3.15
Dreamsorcerer Jun 7, 2026
d559f11
Merge branch '3.15'
Dreamsorcerer Jun 7, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
106 changes: 106 additions & 0 deletions CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,112 @@

.. towncrier release notes start

3.14.1 (2026-06-07)
===================

Bug fixes
---------

- Fixed a race condition in :py:class:`~aiohttp.TCPConnector` where closing the connector while a DNS resolution was in-flight could raise :py:exc:`AttributeError` instead of :py:exc:`~aiohttp.ClientConnectionError` -- by :user:`goingforstudying-ctrl`.


*Related issues and pull requests on GitHub:*
:issue:`12497`.



- Fixed ``CancelledError`` not closing a connection -- by :user:`aiolibsbot`.


*Related issues and pull requests on GitHub:*
:issue:`12795`.



- Tightened up some websocket parser checks -- by :user:`Dreamsorcerer`.


*Related issues and pull requests on GitHub:*
:issue:`12817`.



- Fixed :class:`~aiohttp.CookieJar` dropping the host-only flag of cookies when persisted with :meth:`~aiohttp.CookieJar.save` and reloaded with :meth:`~aiohttp.CookieJar.load`, so a cookie set without a ``Domain`` attribute 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.load` now 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 without ``unsafe=True`` -- by :user:`bdraco`.


*Related issues and pull requests on GitHub:*
:issue:`12824`.



- Scoped :class:`~aiohttp.DigestAuthMiddleware` credentials 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 7616 ``domain`` directive -- by :user:`bdraco`.


*Related issues and pull requests on GitHub:*
:issue:`12825`.



- Fixed the C HTTP parser not enforcing ``max_line_size`` on 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 raising ``LineTooLong``. The accumulated length is now checked, matching the pure-Python parser -- by :user:`bdraco`.


*Related issues and pull requests on GitHub:*
:issue:`12826`.



- Changed :class:`~aiohttp.TCPConnector` to reject legacy non-canonical numeric IPv4 host forms such as ``2130706433``, ``017700000001`` and ``127.1`` with :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:*
:issue:`12827`.



- Fixed :meth:`~aiohttp.StreamReader.readany` and :meth:`~aiohttp.StreamReader.read_nowait` joining 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:*
:issue:`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:*
:issue:`12830`.



- Fixed :meth:`aiohttp.web.Response.write_eof` skipping ``Payload.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 a ``finally`` so a :class:`~aiohttp.payload.Payload` body always releases its resources -- by :user:`bdraco`.


*Related issues and pull requests on GitHub:*
:issue:`12831`.



- Fixed the pure-Python HTTP parser not enforcing ``max_line_size`` on 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:*
:issue:`12832`.



- Included the per-request ``server_hostname`` override in the :class:`~aiohttp.TCPConnector` connection pool key, so a pooled TLS connection is no longer reused for a request that sets ``server_hostname`` to a different value -- by :user:`bdraco`.


*Related issues and pull requests on GitHub:*
:issue:`12835`.




----


3.14.0 (2026-06-01)
===================

Expand Down
1 change: 0 additions & 1 deletion CHANGES/12497.bugfix.rst

This file was deleted.

1 change: 0 additions & 1 deletion CHANGES/12795.bugfix.rst

This file was deleted.

1 change: 0 additions & 1 deletion CHANGES/12817.bugfix.rst

This file was deleted.

1 change: 0 additions & 1 deletion CHANGES/12824.bugfix.rst

This file was deleted.

1 change: 0 additions & 1 deletion CHANGES/12825.bugfix.rst

This file was deleted.

1 change: 0 additions & 1 deletion CHANGES/12826.bugfix.rst

This file was deleted.

1 change: 0 additions & 1 deletion CHANGES/12827.bugfix.rst

This file was deleted.

1 change: 0 additions & 1 deletion CHANGES/12828.bugfix.rst

This file was deleted.

1 change: 0 additions & 1 deletion CHANGES/12830.bugfix.rst

This file was deleted.

1 change: 0 additions & 1 deletion CHANGES/12831.bugfix.rst

This file was deleted.

1 change: 0 additions & 1 deletion CHANGES/12832.bugfix.rst

This file was deleted.

1 change: 0 additions & 1 deletion CHANGES/12835.bugfix.rst

This file was deleted.

2 changes: 1 addition & 1 deletion aiohttp/streams.py
Original file line number Diff line number Diff line change
Expand Up @@ -549,7 +549,7 @@ def _read_nowait(self, n: int) -> bytes:
count = len(self._buffer)
if count == 1:
return self._read_nowait_chunk(-1)
return b"".join(self._read_nowait_chunk(-1) for _ in range(count))
return b"".join([self._read_nowait_chunk(-1) for _ in range(count)])

chunks: list[bytes] = []
while self._buffer:
Expand Down
2 changes: 1 addition & 1 deletion aiohttp/web_protocol.py
Original file line number Diff line number Diff line change
Expand Up @@ -664,7 +664,7 @@ async def start(self) -> None:
# pipelining keeps flowing while this request is handled.
# no branch: _parser is only None after connection_lost, whose path
# exits this loop, so the None case is not reachably exercisable.
if self._parser is not None: # pragma: no branch
if self._parser is not None:
self._parser.message_consumed()
if (
self._msg_queue_paused
Expand Down
Loading