Skip to content

Commit f1fb508

Browse files
Preserve HTTP success status codes in transport JSON responses
Co-authored-by: Shri Sukhani <shrisukhani@users.noreply.github.com>
1 parent 8ce82ec commit f1fb508

3 files changed

Lines changed: 43 additions & 2 deletions

File tree

hyperbrowser/transport/async_transport.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ async def _handle_response(self, response: httpx.Response) -> APIResponse:
7070
try:
7171
if not response.content:
7272
return APIResponse.from_status(normalized_status_code)
73-
return APIResponse(response.json())
73+
return APIResponse(response.json(), status_code=normalized_status_code)
7474
except Exception as e:
7575
if normalized_status_code >= 400:
7676
try:

hyperbrowser/transport/sync.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ def _handle_response(self, response: httpx.Response) -> APIResponse:
5858
try:
5959
if not response.content:
6060
return APIResponse.from_status(normalized_status_code)
61-
return APIResponse(response.json())
61+
return APIResponse(response.json(), status_code=normalized_status_code)
6262
except Exception as e:
6363
if normalized_status_code >= 400:
6464
try:

tests/test_transport_response_handling.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,18 @@ def json(self):
3737
raise RuntimeError("broken json")
3838

3939

40+
class _JsonCreatedResponse:
41+
status_code = 201
42+
content = b'{"created": true}'
43+
text = '{"created": true}'
44+
45+
def raise_for_status(self) -> None:
46+
return None
47+
48+
def json(self):
49+
return {"created": True}
50+
51+
4052
class _BrokenJsonErrorResponse:
4153
status_code = 500
4254
content = b"{broken-json}"
@@ -151,6 +163,19 @@ def test_sync_handle_response_with_non_json_success_body_returns_status_only():
151163
transport.close()
152164

153165

166+
def test_sync_handle_response_preserves_non_200_success_status_codes():
167+
transport = SyncTransport(api_key="test-key")
168+
try:
169+
api_response = transport._handle_response(
170+
_JsonCreatedResponse() # type: ignore[arg-type]
171+
)
172+
173+
assert api_response.status_code == 201
174+
assert api_response.data == {"created": True}
175+
finally:
176+
transport.close()
177+
178+
154179
def test_sync_handle_response_with_broken_json_success_payload_returns_status_only():
155180
transport = SyncTransport(api_key="test-key")
156181
try:
@@ -332,6 +357,22 @@ async def run() -> None:
332357
asyncio.run(run())
333358

334359

360+
def test_async_handle_response_preserves_non_200_success_status_codes():
361+
async def run() -> None:
362+
transport = AsyncTransport(api_key="test-key")
363+
try:
364+
api_response = await transport._handle_response(
365+
_JsonCreatedResponse() # type: ignore[arg-type]
366+
)
367+
368+
assert api_response.status_code == 201
369+
assert api_response.data == {"created": True}
370+
finally:
371+
await transport.close()
372+
373+
asyncio.run(run())
374+
375+
335376
def test_async_handle_response_with_broken_json_success_payload_returns_status_only():
336377
async def run() -> None:
337378
transport = AsyncTransport(api_key="test-key")

0 commit comments

Comments
 (0)