From: Marcelo Trylesinski Date: Sat, 20 Sep 2025 21:43:26 +0000 (+0200) Subject: Support multiple cookie headers in `Request.cookies` (#3029) X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7f78881448d06ac2b296fc3533abbb0148fb9402;p=thirdparty%2Fstarlette.git Support multiple cookie headers in `Request.cookies` (#3029) --- diff --git a/starlette/requests.py b/starlette/requests.py index 628358d1..99e8b9e1 100644 --- a/starlette/requests.py +++ b/starlette/requests.py @@ -140,10 +140,11 @@ class HTTPConnection(Mapping[str, Any]): def cookies(self) -> dict[str, str]: if not hasattr(self, "_cookies"): cookies: dict[str, str] = {} - cookie_header = self.headers.get("cookie") + cookie_headers = self.headers.getlist("cookie") + + for header in cookie_headers: + cookies.update(cookie_parser(header)) - if cookie_header: - cookies = cookie_parser(cookie_header) self._cookies = cookies return self._cookies diff --git a/tests/test_requests.py b/tests/test_requests.py index 7e2c608d..1799e89e 100644 --- a/tests/test_requests.py +++ b/tests/test_requests.py @@ -450,6 +450,19 @@ def test_cookies_invalid( assert result["cookies"] == expected +def test_multiple_cookie_headers(test_client_factory: TestClientFactory) -> None: + async def app(scope: Scope, receive: Receive, send: Send) -> None: + scope["headers"] = [(b"cookie", b"a=abc"), (b"cookie", b"b=def"), (b"cookie", b"c=ghi")] + request = Request(scope, receive) + response = JSONResponse({"cookies": request.cookies}) + await response(scope, receive, send) + + client = test_client_factory(app) + response = client.get("/") + result = response.json() + assert result["cookies"] == {"a": "abc", "b": "def", "c": "ghi"} + + def test_chunked_encoding(test_client_factory: TestClientFactory) -> None: async def app(scope: Scope, receive: Receive, send: Send) -> None: request = Request(scope, receive)