Skip to content

Commit 1fda1f5

Browse files
Handle JSON decode failures in transport success responses
Co-authored-by: Shri Sukhani <shrisukhani@users.noreply.github.com>
1 parent 90f0ac5 commit 1fda1f5

3 files changed

Lines changed: 44 additions & 2 deletions

File tree

hyperbrowser/transport/async_transport.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import json
12
import httpx
23
from typing import Optional
34

@@ -37,7 +38,7 @@ async def _handle_response(self, response: httpx.Response) -> APIResponse:
3738
if not response.content:
3839
return APIResponse.from_status(response.status_code)
3940
return APIResponse(response.json())
40-
except httpx.DecodingError as e:
41+
except (httpx.DecodingError, json.JSONDecodeError, ValueError) as e:
4142
if response.status_code >= 400:
4243
raise HyperbrowserError(
4344
response.text or "Unknown error occurred",

hyperbrowser/transport/sync.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import json
12
import httpx
23
from typing import Optional
34

@@ -25,7 +26,7 @@ def _handle_response(self, response: httpx.Response) -> APIResponse:
2526
if not response.content:
2627
return APIResponse.from_status(response.status_code)
2728
return APIResponse(response.json())
28-
except httpx.DecodingError as e:
29+
except (httpx.DecodingError, json.JSONDecodeError, ValueError) as e:
2930
if response.status_code >= 400:
3031
raise HyperbrowserError(
3132
response.text or "Unknown error occurred",
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import asyncio
2+
3+
import httpx
4+
5+
from hyperbrowser.transport.async_transport import AsyncTransport
6+
from hyperbrowser.transport.sync import SyncTransport
7+
8+
9+
def _build_response(status_code: int, body: str) -> httpx.Response:
10+
request = httpx.Request("GET", "https://example.com/test")
11+
return httpx.Response(status_code, request=request, text=body)
12+
13+
14+
def test_sync_handle_response_with_non_json_success_body_returns_status_only():
15+
transport = SyncTransport(api_key="test-key")
16+
try:
17+
response = _build_response(200, "plain-text-response")
18+
19+
api_response = transport._handle_response(response)
20+
21+
assert api_response.status_code == 200
22+
assert api_response.data is None
23+
finally:
24+
transport.close()
25+
26+
27+
def test_async_handle_response_with_non_json_success_body_returns_status_only():
28+
async def run() -> None:
29+
transport = AsyncTransport(api_key="test-key")
30+
try:
31+
response = _build_response(200, "plain-text-response")
32+
33+
api_response = await transport._handle_response(response)
34+
35+
assert api_response.status_code == 200
36+
assert api_response.data is None
37+
finally:
38+
await transport.close()
39+
40+
asyncio.run(run())

0 commit comments

Comments
 (0)