From 6493d0222f8d7e9ed241cb6b1fa01aa839594b8b Mon Sep 17 00:00:00 2001 From: Olivier Mehani Date: Tue, 25 Aug 2026 15:51:44 +1000 Subject: [PATCH 1/2] RequestsHTTPTransport: copy transport headers to session fixes: #613 --- gql/transport/requests.py | 3 +++ tests/test_aiohttp.py | 10 ++++++++++ tests/test_requests.py | 9 +++++++++ 3 files changed, 22 insertions(+) diff --git a/gql/transport/requests.py b/gql/transport/requests.py index 4e4e6ffb..7c7ee7f3 100644 --- a/gql/transport/requests.py +++ b/gql/transport/requests.py @@ -123,6 +123,9 @@ def connect(self): # Creating a session that can later be re-use to configure custom mechanisms self.session = requests.Session() + if self.headers: + self.session.headers = CaseInsensitiveDict(self.headers) + # If we specified some retries, we provide a predefined retry-logic if self.retries > 0: adapter = HTTPAdapter( diff --git a/tests/test_aiohttp.py b/tests/test_aiohttp.py index 00bd8a0f..dafcc222 100644 --- a/tests/test_aiohttp.py +++ b/tests/test_aiohttp.py @@ -87,6 +87,16 @@ async def handler(request): assert transport.response_headers["dummy"] == "test1234" +@pytest.mark.asyncio +async def test_aio_http_transport_session(): + from gql.transport.aiohttp import AIOHTTPTransport + + transport = AIOHTTPTransport("url", headers={"test": "header"}) + await transport.connect() + assert transport.session + assert transport.headers == transport.session.headers + + @pytest.mark.asyncio async def test_aiohttp_request_extensions(aiohttp_server): from aiohttp import web diff --git a/tests/test_requests.py b/tests/test_requests.py index 7de4a12a..d5cc1ceb 100644 --- a/tests/test_requests.py +++ b/tests/test_requests.py @@ -41,6 +41,15 @@ ) +def test_requests_http_transport_session(): + from gql.transport.requests import RequestsHTTPTransport + + transport = RequestsHTTPTransport("url", headers={"test": "header"}) + transport.connect() + assert transport.session + assert transport.headers == transport.session.headers + + @pytest.mark.aiohttp @pytest.mark.asyncio async def test_requests_query(aiohttp_server, run_sync_test): From f369ad19012d603989ac3ffc9b4c85bf93073ea7 Mon Sep 17 00:00:00 2001 From: Leszek Hanusz Date: Wed, 26 Aug 2026 01:10:55 +0200 Subject: [PATCH 2/2] Update session headers instead of overwriting --- gql/transport/requests.py | 2 +- tests/test_aiohttp.py | 32 ++++++++++++++++++++++---------- tests/test_requests.py | 30 +++++++++++++++++++++--------- 3 files changed, 44 insertions(+), 20 deletions(-) diff --git a/gql/transport/requests.py b/gql/transport/requests.py index 7c7ee7f3..996e6909 100644 --- a/gql/transport/requests.py +++ b/gql/transport/requests.py @@ -124,7 +124,7 @@ def connect(self): self.session = requests.Session() if self.headers: - self.session.headers = CaseInsensitiveDict(self.headers) + self.session.headers.update(self.headers) # If we specified some retries, we provide a predefined retry-logic if self.retries > 0: diff --git a/tests/test_aiohttp.py b/tests/test_aiohttp.py index dafcc222..7ba9b3ec 100644 --- a/tests/test_aiohttp.py +++ b/tests/test_aiohttp.py @@ -87,16 +87,6 @@ async def handler(request): assert transport.response_headers["dummy"] == "test1234" -@pytest.mark.asyncio -async def test_aio_http_transport_session(): - from gql.transport.aiohttp import AIOHTTPTransport - - transport = AIOHTTPTransport("url", headers={"test": "header"}) - await transport.connect() - assert transport.session - assert transport.headers == transport.session.headers - - @pytest.mark.asyncio async def test_aiohttp_request_extensions(aiohttp_server): from aiohttp import web @@ -1928,3 +1918,25 @@ async def handler(request): await session.execute("qmlsdkfj") assert "request should be a GraphQLRequest object" in str(exc_info.value) + + +@pytest.mark.asyncio +async def test_aiohttp_save_headers_in_session(): + """Regression test for issue #613""" + from gql.transport.aiohttp import AIOHTTPTransport + + transport = AIOHTTPTransport("url", headers={"test": "header"}) + await transport.connect() + assert transport.session + assert transport.session.headers["test"] == "header" + + transport2 = AIOHTTPTransport("url") + await transport2.connect() + assert transport2.session + + del transport.session.headers["test"] + + assert transport.session.headers == transport2.session.headers + + await transport.close() + await transport2.close() diff --git a/tests/test_requests.py b/tests/test_requests.py index d5cc1ceb..4cb8fb10 100644 --- a/tests/test_requests.py +++ b/tests/test_requests.py @@ -41,15 +41,6 @@ ) -def test_requests_http_transport_session(): - from gql.transport.requests import RequestsHTTPTransport - - transport = RequestsHTTPTransport("url", headers={"test": "header"}) - transport.connect() - assert transport.session - assert transport.headers == transport.session.headers - - @pytest.mark.aiohttp @pytest.mark.asyncio async def test_requests_query(aiohttp_server, run_sync_test): @@ -1281,3 +1272,24 @@ def test_code(): assert pi == Decimal("3.141592653589793238462643383279502884197") await run_sync_test(server, test_code) + + +def test_requests_save_headers_in_session(): + """Regression test for issue #613""" + from gql.transport.requests import RequestsHTTPTransport + + transport = RequestsHTTPTransport("url", headers={"test": "header"}) + transport.connect() + assert transport.session + assert transport.session.headers["test"] == "header" + + transport2 = RequestsHTTPTransport("url") + transport2.connect() + assert transport2.session + + del transport.session.headers["test"] + + assert transport.session.headers == transport2.session.headers + + transport.close() + transport2.close()