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 feeb3ad65c9..698ad3cad1b 100644 --- a/aiohttp/abc.py +++ b/aiohttp/abc.py @@ -171,6 +171,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