From 7b5d54a96c1dd1282e9a79f9fc8056c02ca91c6f Mon Sep 17 00:00:00 2001 From: Cycloctane Date: Wed, 18 Dec 2024 02:26:51 +0800 Subject: [PATCH] Use `quote_cookie` setting from ClientSession's cookiejar in `tmp_cookie_jar` (#10093) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Sam Bull --- CHANGES/10093.bugfix.rst | 2 ++ aiohttp/abc.py | 5 +++++ aiohttp/client.py | 4 +++- aiohttp/cookiejar.py | 8 ++++++++ tests/test_client_session.py | 1 - tests/test_cookiejar.py | 1 + 6 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 CHANGES/10093.bugfix.rst diff --git a/CHANGES/10093.bugfix.rst b/CHANGES/10093.bugfix.rst new file mode 100644 index 00000000000..4d7076115d9 --- /dev/null +++ b/CHANGES/10093.bugfix.rst @@ -0,0 +1,2 @@ +Update :py:meth:`~aiohttp.ClientSession.request` to reuse the ``quote_cookie`` setting from ``ClientSession._cookie_jar`` when processing cookies parameter. +-- by :user:`Cycloctane`. diff --git a/aiohttp/abc.py b/aiohttp/abc.py index 8032cf053e2..40f406faca1 100644 --- a/aiohttp/abc.py +++ b/aiohttp/abc.py @@ -172,6 +172,11 @@ async def close(self) -> None: class AbstractCookieJar(Sized, IterableBase): """Abstract Cookie Jar.""" + @property + @abstractmethod + def quote_cookie(self) -> bool: + """Return True if cookies should be quoted.""" + @abstractmethod def clear(self, predicate: Optional[ClearCookiePredicate] = None) -> None: """Clear all cookies if no predicate is passed.""" diff --git a/aiohttp/client.py b/aiohttp/client.py index bc6c0aaaa5d..eabebf469a5 100644 --- a/aiohttp/client.py +++ b/aiohttp/client.py @@ -599,7 +599,9 @@ async def _request( all_cookies = self._cookie_jar.filter_cookies(url) if cookies is not None: - tmp_cookie_jar = CookieJar() + tmp_cookie_jar = CookieJar( + quote_cookie=self._cookie_jar.quote_cookie + ) tmp_cookie_jar.update_cookies(cookies) req_cookies = tmp_cookie_jar.filter_cookies(url) if req_cookies: diff --git a/aiohttp/cookiejar.py b/aiohttp/cookiejar.py index 1523bed72ee..158d6d103ab 100644 --- a/aiohttp/cookiejar.py +++ b/aiohttp/cookiejar.py @@ -118,6 +118,10 @@ def __init__( self._expire_heap: List[Tuple[float, Tuple[str, str, str]]] = [] self._expirations: Dict[Tuple[str, str, str], float] = {} + @property + def quote_cookie(self) -> bool: + return self._quote_cookie + def save(self, file_path: PathLike) -> None: file_path = pathlib.Path(file_path) with file_path.open(mode="wb") as f: @@ -471,6 +475,10 @@ def __iter__(self) -> "Iterator[Morsel[str]]": def __len__(self) -> int: return 0 + @property + def quote_cookie(self) -> bool: + return True + def clear(self, predicate: Optional[ClearCookiePredicate] = None) -> None: pass diff --git a/tests/test_client_session.py b/tests/test_client_session.py index 1c40505e9e2..20f401020a4 100644 --- a/tests/test_client_session.py +++ b/tests/test_client_session.py @@ -696,7 +696,6 @@ async def handler(request: web.Request) -> web.Response: assert resp_cookies["response"].value == "resp_value" -@pytest.mark.xfail(reason="Reproducer for #9336") async def test_cookies_with_not_quoted_cookie_jar( aiohttp_server: AiohttpServer, ) -> None: diff --git a/tests/test_cookiejar.py b/tests/test_cookiejar.py index 0821bcc5fcb..8bf1ecde8cf 100644 --- a/tests/test_cookiejar.py +++ b/tests/test_cookiejar.py @@ -831,6 +831,7 @@ async def make_jar() -> CookieJar: async def test_dummy_cookie_jar() -> None: cookie = SimpleCookie("foo=bar; Domain=example.com;") dummy_jar = DummyCookieJar() + assert dummy_jar.quote_cookie is True assert len(dummy_jar) == 0 dummy_jar.update_cookies(cookie) assert len(dummy_jar) == 0