Skip to content

Commit 013933a

Browse files
Truncate oversized transport error messages
Co-authored-by: Shri Sukhani <shrisukhani@users.noreply.github.com>
1 parent 6539e67 commit 013933a

2 files changed

Lines changed: 34 additions & 3 deletions

File tree

hyperbrowser/transport/error_utils.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import httpx
66

77
_HTTP_METHOD_TOKEN_PATTERN = re.compile(r"^[!#$%&'*+\-.^_`|~0-9A-Z]+$")
8+
_MAX_ERROR_MESSAGE_LENGTH = 2000
89

910

1011
def _normalize_request_method(method: Any) -> str:
@@ -31,6 +32,12 @@ def _normalize_request_url(url: Any) -> str:
3132
return normalized_url
3233

3334

35+
def _truncate_error_message(message: str) -> str:
36+
if len(message) <= _MAX_ERROR_MESSAGE_LENGTH:
37+
return message
38+
return f"{message[:_MAX_ERROR_MESSAGE_LENGTH]}... (truncated)"
39+
40+
3441
def _stringify_error_value(value: Any, *, _depth: int = 0) -> str:
3542
if _depth > 10:
3643
return str(value)
@@ -71,8 +78,8 @@ def extract_error_message(response: httpx.Response, fallback_error: Exception) -
7178
def _fallback_message() -> str:
7279
response_text = response.text
7380
if isinstance(response_text, str) and response_text.strip():
74-
return response_text
75-
return str(fallback_error)
81+
return _truncate_error_message(response_text)
82+
return _truncate_error_message(str(fallback_error))
7683

7784
try:
7885
error_data: Any = response.json()
@@ -95,7 +102,9 @@ def _fallback_message() -> str:
95102
else:
96103
extracted_message = _stringify_error_value(error_data)
97104

98-
return extracted_message if extracted_message.strip() else _fallback_message()
105+
if not extracted_message.strip():
106+
return _fallback_message()
107+
return _truncate_error_message(extracted_message)
99108

100109

101110
def extract_request_error_context(error: httpx.RequestError) -> tuple[str, str]:

tests/test_transport_error_utils.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,3 +281,25 @@ def test_extract_error_message_skips_blank_message_and_uses_detail():
281281
)
282282

283283
assert message == "useful detail"
284+
285+
286+
def test_extract_error_message_truncates_extracted_messages():
287+
large_message = "x" * 2100
288+
message = extract_error_message(
289+
_DummyResponse({"message": large_message}),
290+
RuntimeError("fallback detail"),
291+
)
292+
293+
assert message.endswith("... (truncated)")
294+
assert len(message) < len(large_message)
295+
296+
297+
def test_extract_error_message_truncates_fallback_response_text():
298+
large_response_text = "y" * 2100
299+
message = extract_error_message(
300+
_DummyResponse(" ", text=large_response_text),
301+
RuntimeError("fallback detail"),
302+
)
303+
304+
assert message.endswith("... (truncated)")
305+
assert len(message) < len(large_response_text)

0 commit comments

Comments
 (0)