From: Nik Date: Sun, 21 May 2023 00:17:23 +0000 (+0200) Subject: Fix exception suppression in asgi transport (#2669) X-Git-Tag: 0.25.0~39 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a682f6f1c7f1c5e10c66ae5bef139aea37ef0c4e;p=thirdparty%2Fhttpx.git Fix exception suppression in asgi transport (#2669) --- diff --git a/CHANGELOG.md b/CHANGELOG.md index 71f5b02e..d19b2ab8 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 bdf7f7a1..f67f0fbd 100644 --- a/httpx/_transports/asgi.py +++ b/httpx/_transports/asgi.py @@ -161,9 +161,15 @@ class ASGITransport(AsyncBaseTransport): 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 17c8d5eb..14d6df6d 100644 --- a/tests/test_asgi.py +++ b/tests/test_asgi.py @@ -3,6 +3,7 @@ import json import pytest import httpx +from httpx import ASGITransport async def hello_world(scope, receive, send): @@ -191,3 +192,12 @@ async def test_asgi_disconnect_after_response_complete(): 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