]> git.ipfire.org Git - thirdparty/starlette.git/commitdiff
Support multiple cookie headers in `Request.cookies` (#3029)
authorMarcelo Trylesinski <marcelotryle@gmail.com>
Sat, 20 Sep 2025 21:43:26 +0000 (23:43 +0200)
committerGitHub <noreply@github.com>
Sat, 20 Sep 2025 21:43:26 +0000 (23:43 +0200)
starlette/requests.py
tests/test_requests.py

index 628358d15feb8cd83900f846b1656ea7998ff6a6..99e8b9e193df5f6b7de2d4cb9bbf627ab4c6ecc9 100644 (file)
@@ -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
 
index 7e2c608dc4c9e41bc655473754ac35c4da88e843..1799e89e050da1c3c9dfe939fe829d1c70193e43 100644 (file)
@@ -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)