Skip to content

Commit 8e01054

Browse files
Sanitize control characters in extracted transport messages
Co-authored-by: Shri Sukhani <shrisukhani@users.noreply.github.com>
1 parent 0d9c3e8 commit 8e01054

File tree

2 files changed

+29
-3
lines changed

2 files changed

+29
-3
lines changed

hyperbrowser/transport/error_utils.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,13 @@ def _safe_to_string(value: Any) -> str:
6060
return f"<{type(value).__name__}>"
6161

6262

63+
def _sanitize_error_message_text(message: str) -> str:
64+
return "".join(
65+
"?" if ord(character) < 32 or ord(character) == 127 else character
66+
for character in message
67+
)
68+
69+
6370
def _normalize_request_method(method: Any) -> str:
6471
raw_method = method
6572
if isinstance(raw_method, bool):
@@ -129,9 +136,10 @@ def _normalize_request_url(url: Any) -> str:
129136

130137

131138
def _truncate_error_message(message: str) -> str:
132-
if len(message) <= _MAX_ERROR_MESSAGE_LENGTH:
133-
return message
134-
return f"{message[:_MAX_ERROR_MESSAGE_LENGTH]}... (truncated)"
139+
sanitized_message = _sanitize_error_message_text(message)
140+
if len(sanitized_message) <= _MAX_ERROR_MESSAGE_LENGTH:
141+
return sanitized_message
142+
return f"{sanitized_message[:_MAX_ERROR_MESSAGE_LENGTH]}... (truncated)"
135143

136144

137145
def _stringify_error_value(value: Any, *, _depth: int = 0) -> str:

tests/test_transport_error_utils.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -765,6 +765,24 @@ def test_extract_error_message_sanitizes_control_characters_in_fallback_error_te
765765
assert message == "bad?fallback?text"
766766

767767

768+
def test_extract_error_message_sanitizes_control_characters_in_json_message():
769+
message = extract_error_message(
770+
_DummyResponse({"message": "bad\tjson\nmessage"}),
771+
RuntimeError("fallback detail"),
772+
)
773+
774+
assert message == "bad?json?message"
775+
776+
777+
def test_extract_error_message_sanitizes_control_characters_in_response_text_fallback():
778+
message = extract_error_message(
779+
_DummyResponse(" ", text="bad\tresponse\ntext"),
780+
RuntimeError("fallback detail"),
781+
)
782+
783+
assert message == "bad?response?text"
784+
785+
768786
def test_extract_error_message_extracts_errors_list_messages():
769787
message = extract_error_message(
770788
_DummyResponse({"errors": [{"msg": "first issue"}, {"msg": "second issue"}]}),

0 commit comments

Comments
 (0)