]> git.ipfire.org Git - thirdparty/starlette.git/commitdiff
Don't group duplicated headers on a single string on the `TestClient` (#2219)
authorooknimm <68068775+ooknimm@users.noreply.github.com>
Sun, 23 Jul 2023 06:07:24 +0000 (15:07 +0900)
committerGitHub <noreply@github.com>
Sun, 23 Jul 2023 06:07:24 +0000 (00:07 -0600)
Co-authored-by: Marcelo Trylesinski <marcelotryle@gmail.com>
starlette/testclient.py
tests/test_testclient.py

index 1b4f1303f96dd58a14b9dddeb39fdf76c048990b..a91ad7bfc8f242d16269ded6f575eec088008fdb 100644 (file)
@@ -225,7 +225,7 @@ class _TestClientTransport(httpx.BaseTransport):
         # Include other request headers.
         headers += [
             (key.lower().encode(), value.encode())
-            for key, value in request.headers.items()
+            for key, value in request.headers.multi_items()
         ]
 
         scope: typing.Dict[str, typing.Any]
index 0f36d4dcc958959f7c4dfce46d8142a1f3c5c9cd..03f27e28d7303ba16b53392f15922db03c500b5f 100644 (file)
@@ -2,6 +2,7 @@ import itertools
 import sys
 from asyncio import current_task as asyncio_current_task
 from contextlib import asynccontextmanager
+from typing import Callable
 
 import anyio
 import pytest
@@ -10,6 +11,7 @@ import trio.lowlevel
 
 from starlette.applications import Starlette
 from starlette.middleware import Middleware
+from starlette.requests import Request
 from starlette.responses import JSONResponse, RedirectResponse, Response
 from starlette.routing import Route
 from starlette.testclient import TestClient
@@ -342,3 +344,13 @@ def test_forward_nofollow_redirects(test_client_factory):
     client = test_client_factory(app, follow_redirects=False)
     response = client.get("/")
     assert response.status_code == 307
+
+
+def test_with_duplicate_headers(test_client_factory: Callable[[Starlette], TestClient]):
+    def homepage(request: Request) -> JSONResponse:
+        return JSONResponse({"x-token": request.headers.getlist("x-token")})
+
+    app = Starlette(routes=[Route("/", endpoint=homepage)])
+    client = test_client_factory(app)
+    response = client.get("/", headers=[("x-token", "foo"), ("x-token", "bar")])
+    assert response.json() == {"x-token": ["foo", "bar"]}