Skip to content

Commit 8c96a62

Browse files
bdracoDreamsorcererCycloctane
authored
[PR #10093/7b5d54a backport][3.11] Use quote_cookie setting from ClientSession's cookiejar in tmp_cookie_jar (#10175)
Co-authored-by: pre-commit-ci[bot] Co-authored-by: Sam Bull <[email protected]> Co-authored-by: Cycloctane <[email protected]>
1 parent c80be67 commit 8c96a62

File tree

6 files changed

+39
-4
lines changed

6 files changed

+39
-4
lines changed

CHANGES/10093.bugfix.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Update :py:meth:`~aiohttp.ClientSession.request` to reuse the ``quote_cookie`` setting from ``ClientSession._cookie_jar`` when processing cookies parameter.
2+
-- by :user:`Cycloctane`.

aiohttp/abc.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,11 @@ class AbstractCookieJar(Sized, IterableBase):
176176
def __init__(self, *, loop: Optional[asyncio.AbstractEventLoop] = None) -> None:
177177
self._loop = loop or asyncio.get_running_loop()
178178

179+
@property
180+
@abstractmethod
181+
def quote_cookie(self) -> bool:
182+
"""Return True if cookies should be quoted."""
183+
179184
@abstractmethod
180185
def clear(self, predicate: Optional[ClearCookiePredicate] = None) -> None:
181186
"""Clear all cookies if no predicate is passed."""

aiohttp/client.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -658,7 +658,9 @@ async def _request(
658658
all_cookies = self._cookie_jar.filter_cookies(url)
659659

660660
if cookies is not None:
661-
tmp_cookie_jar = CookieJar()
661+
tmp_cookie_jar = CookieJar(
662+
quote_cookie=self._cookie_jar.quote_cookie
663+
)
662664
tmp_cookie_jar.update_cookies(cookies)
663665
req_cookies = tmp_cookie_jar.filter_cookies(url)
664666
if req_cookies:

aiohttp/cookiejar.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,10 @@ def __init__(
117117
self._expire_heap: List[Tuple[float, Tuple[str, str, str]]] = []
118118
self._expirations: Dict[Tuple[str, str, str], float] = {}
119119

120+
@property
121+
def quote_cookie(self) -> bool:
122+
return self._quote_cookie
123+
120124
def save(self, file_path: PathLike) -> None:
121125
file_path = pathlib.Path(file_path)
122126
with file_path.open(mode="wb") as f:
@@ -474,6 +478,10 @@ def __iter__(self) -> "Iterator[Morsel[str]]":
474478
def __len__(self) -> int:
475479
return 0
476480

481+
@property
482+
def quote_cookie(self) -> bool:
483+
return True
484+
477485
def clear(self, predicate: Optional[ClearCookiePredicate] = None) -> None:
478486
pass
479487

tests/test_client_session.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,14 @@
1515
from yarl import URL
1616

1717
import aiohttp
18-
from aiohttp import client, hdrs, web
18+
from aiohttp import CookieJar, client, hdrs, web
1919
from aiohttp.client import ClientSession
2020
from aiohttp.client_proto import ResponseHandler
2121
from aiohttp.client_reqrep import ClientRequest
2222
from aiohttp.connector import BaseConnector, Connection, TCPConnector, UnixConnector
2323
from aiohttp.helpers import DEBUG
2424
from aiohttp.http import RawResponseMessage
25+
from aiohttp.pytest_plugin import AiohttpServer
2526
from aiohttp.test_utils import make_mocked_coro
2627
from aiohttp.tracing import Trace
2728

@@ -634,8 +635,24 @@ async def handler(request):
634635
assert resp_cookies["response"].value == "resp_value"
635636

636637

637-
async def test_session_default_version(loop) -> None:
638-
session = aiohttp.ClientSession(loop=loop)
638+
async def test_cookies_with_not_quoted_cookie_jar(
639+
aiohttp_server: AiohttpServer,
640+
) -> None:
641+
async def handler(_: web.Request) -> web.Response:
642+
return web.Response()
643+
644+
app = web.Application()
645+
app.router.add_route("GET", "/", handler)
646+
server = await aiohttp_server(app)
647+
jar = CookieJar(quote_cookie=False)
648+
cookies = {"name": "val=foobar"}
649+
async with aiohttp.ClientSession(cookie_jar=jar) as sess:
650+
resp = await sess.request("GET", server.make_url("/"), cookies=cookies)
651+
assert resp.request_info.headers.get("Cookie", "") == "name=val=foobar"
652+
653+
654+
async def test_session_default_version(loop: asyncio.AbstractEventLoop) -> None:
655+
session = aiohttp.ClientSession()
639656
assert session.version == aiohttp.HttpVersion11
640657
await session.close()
641658

tests/test_cookiejar.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -807,6 +807,7 @@ async def make_jar():
807807
async def test_dummy_cookie_jar() -> None:
808808
cookie = SimpleCookie("foo=bar; Domain=example.com;")
809809
dummy_jar = DummyCookieJar()
810+
assert dummy_jar.quote_cookie is True
810811
assert len(dummy_jar) == 0
811812
dummy_jar.update_cookies(cookie)
812813
assert len(dummy_jar) == 0

0 commit comments

Comments
 (0)