Force lowercase ASGI headers (#1351)

Co-authored-by: Florimond Manca <florimond.manca@gmail.com>
This commit is contained in:
Tom Christie 2020-10-08 12:04:10 +01:00 committed by GitHub
parent 7fda99fcef
commit 0123bca335
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 29 additions and 1 deletions

View File

@ -87,7 +87,7 @@ class ASGITransport(httpcore.AsyncHTTPTransport):
"asgi": {"version": "3.0"},
"http_version": "1.1",
"method": method.decode(),
"headers": headers,
"headers": [(k.lower(), v) for (k, v) in headers],
"scheme": scheme.decode("ascii"),
"path": unquote(path.decode("ascii")),
"query_string": query,

View File

@ -36,6 +36,17 @@ async def echo_body(scope, receive, send):
await send({"type": "http.response.body", "body": body, "more_body": more_body})
async def echo_headers(scope, receive, send):
status = 200
output = json.dumps(
{"headers": [[k.decode(), v.decode()] for k, v in scope["headers"]]}
).encode("utf-8")
headers = [(b"content-type", "text/plain"), (b"content-length", str(len(output)))]
await send({"type": "http.response.start", "status": status, "headers": headers})
await send({"type": "http.response.body", "body": output})
async def raise_exc(scope, receive, send):
raise RuntimeError()
@ -78,6 +89,23 @@ async def test_asgi_upload():
assert response.text == "example"
@pytest.mark.usefixtures("async_environment")
async def test_asgi_headers():
async with httpx.AsyncClient(app=echo_headers) as client:
response = await client.get("http://www.example.org/")
assert response.status_code == 200
assert response.json() == {
"headers": [
["host", "www.example.org"],
["accept", "*/*"],
["accept-encoding", "gzip, deflate, br"],
["connection", "keep-alive"],
["user-agent", f"python-httpx/{httpx.__version__}"],
]
}
@pytest.mark.usefixtures("async_environment")
async def test_asgi_exc():
async with httpx.AsyncClient(app=raise_exc) as client: