From c95998e2641009fab2426b7b7596b07f271435a4 Mon Sep 17 00:00:00 2001 From: "patchback[bot]" <45432694+patchback[bot]@users.noreply.github.com> Date: Tue, 1 Oct 2024 18:55:03 +0000 Subject: [PATCH] [PR #9368/02d8dba9 backport][3.11] Avoid using the proxy headers in the ConnectionKey if no proxy is in use (#9379) Co-authored-by: J. Nick Koston --- CHANGES/9368.bugfix.rst | 3 +++ aiohttp/client_reqrep.py | 8 +++++++- tests/test_client_request.py | 27 +++++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 CHANGES/9368.bugfix.rst diff --git a/CHANGES/9368.bugfix.rst b/CHANGES/9368.bugfix.rst new file mode 100644 index 00000000000..fb2f90c1d4d --- /dev/null +++ b/CHANGES/9368.bugfix.rst @@ -0,0 +1,3 @@ +Fixed proxy headers being used in the ``ConnectionKey`` hash when proxy was being used -- by :user:`bdraco`. + +If default headers are used, they are also used for proxy headers. This could have led to creating connections that were not needed when one was already available. diff --git a/aiohttp/client_reqrep.py b/aiohttp/client_reqrep.py index 293c745b349..d1c83c151ce 100644 --- a/aiohttp/client_reqrep.py +++ b/aiohttp/client_reqrep.py @@ -594,10 +594,16 @@ def update_proxy( proxy_auth: Optional[BasicAuth], proxy_headers: Optional[LooseHeaders], ) -> None: + self.proxy = proxy + if proxy is None: + self.proxy_auth = None + self.proxy_headers = None + return + if proxy_auth and not isinstance(proxy_auth, helpers.BasicAuth): raise ValueError("proxy_auth must be None or BasicAuth() tuple") - self.proxy = proxy self.proxy_auth = proxy_auth + if proxy_headers is not None and not isinstance( proxy_headers, (MultiDict, MultiDictProxy) ): diff --git a/tests/test_client_request.py b/tests/test_client_request.py index f2eff019504..d6e8b823bb6 100644 --- a/tests/test_client_request.py +++ b/tests/test_client_request.py @@ -1460,3 +1460,30 @@ def test_basicauth_from_empty_netrc( """Test that no Authorization header is sent when netrc is empty""" req = make_request("get", "http://example.com", trust_env=True) assert hdrs.AUTHORIZATION not in req.headers + + +async def test_connection_key_with_proxy() -> None: + """Verify the proxy headers are included in the ConnectionKey when a proxy is used.""" + proxy = URL("http://proxy.example.com") + req = ClientRequest( + "GET", + URL("http://example.com"), + proxy=proxy, + proxy_headers={"X-Proxy": "true"}, + loop=asyncio.get_running_loop(), + ) + assert req.connection_key.proxy_headers_hash is not None + await req.close() + + +async def test_connection_key_without_proxy() -> None: + """Verify the proxy headers are not included in the ConnectionKey when a proxy is used.""" + # If proxy is unspecified, proxy_headers should be ignored + req = ClientRequest( + "GET", + URL("http://example.com"), + proxy_headers={"X-Proxy": "true"}, + loop=asyncio.get_running_loop(), + ) + assert req.connection_key.proxy_headers_hash is None + await req.close()