From e160a17c0897f359552ede70e827cc3fefaf1b22 Mon Sep 17 00:00:00 2001 From: ooknimm <68068775+ooknimm@users.noreply.github.com> Date: Sun, 23 Jul 2023 15:07:24 +0900 Subject: [PATCH] Don't group duplicated headers on a single string on the `TestClient` (#2219) Co-authored-by: Marcelo Trylesinski --- starlette/testclient.py | 2 +- tests/test_testclient.py | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/starlette/testclient.py b/starlette/testclient.py index 1b4f1303..a91ad7bf 100644 --- a/starlette/testclient.py +++ b/starlette/testclient.py @@ -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] diff --git a/tests/test_testclient.py b/tests/test_testclient.py index 0f36d4dc..03f27e28 100644 --- a/tests/test_testclient.py +++ b/tests/test_testclient.py @@ -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"]} -- 2.47.3