diff --git a/CHANGELOG.md b/CHANGELOG.md index 71f5b02e34..d19b2ab8df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Fixed +* Return `500` error response instead of exceptions when `raise_app_exceptions=False` is set on `ASGITransport`. (#2669) * Ensure all WSGITransport environs have a SERVER_PROTOCOL. (#2708) ## 0.24.1 (17th May, 2023) diff --git a/httpx/_transports/asgi.py b/httpx/_transports/asgi.py index bdf7f7a145..f67f0fbd5b 100644 --- a/httpx/_transports/asgi.py +++ b/httpx/_transports/asgi.py @@ -161,9 +161,15 @@ async def send(message: typing.Dict[str, typing.Any]) -> None: try: await self.app(scope, receive, send) except Exception: # noqa: PIE-786 - if self.raise_app_exceptions or not response_complete.is_set(): + if self.raise_app_exceptions: raise + response_complete.set() + if status_code is None: + status_code = 500 + if response_headers is None: + response_headers = {} + assert response_complete.is_set() assert status_code is not None assert response_headers is not None diff --git a/tests/test_asgi.py b/tests/test_asgi.py index 17c8d5eb27..14d6df6ded 100644 --- a/tests/test_asgi.py +++ b/tests/test_asgi.py @@ -3,6 +3,7 @@ import pytest import httpx +from httpx import ASGITransport async def hello_world(scope, receive, send): @@ -191,3 +192,12 @@ async def read_body(scope, receive, send): assert response.status_code == 200 assert disconnect + + +@pytest.mark.anyio +async def test_asgi_exc_no_raise(): + transport = ASGITransport(app=raise_exc, raise_app_exceptions=False) + async with httpx.AsyncClient(transport=transport) as client: + response = await client.get("http://www.example.org/") + + assert response.status_code == 500