Skip to content

Commit 0e211cc

Browse files
Wrap broken header tuple item operations
Co-authored-by: Shri Sukhani <shrisukhani@users.noreply.github.com>
1 parent f203bfb commit 0e211cc

2 files changed

Lines changed: 53 additions & 3 deletions

File tree

hyperbrowser/header_utils.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,16 @@ def _read_header_items(
1919
raise HyperbrowserError(mapping_error_message, original_error=exc) from exc
2020
normalized_items: list[tuple[object, object]] = []
2121
for item in raw_items:
22-
if not isinstance(item, tuple) or len(item) != 2:
23-
raise HyperbrowserError(mapping_error_message)
24-
normalized_items.append((item[0], item[1]))
22+
try:
23+
if not isinstance(item, tuple):
24+
raise HyperbrowserError(mapping_error_message)
25+
if len(item) != 2:
26+
raise HyperbrowserError(mapping_error_message)
27+
normalized_items.append((item[0], item[1]))
28+
except HyperbrowserError:
29+
raise
30+
except Exception as exc:
31+
raise HyperbrowserError(mapping_error_message, original_error=exc) from exc
2532
return normalized_items
2633

2734

tests/test_header_utils.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,24 @@ def items(self):
1818
return [("X-Trace-Id", "trace-1", "extra-item")]
1919

2020

21+
class _BrokenLenTuple(tuple):
22+
def __len__(self):
23+
raise RuntimeError("broken tuple length")
24+
25+
26+
class _BrokenIndexTuple(tuple):
27+
def __getitem__(self, index):
28+
raise RuntimeError("broken tuple indexing")
29+
30+
31+
class _BrokenTupleItemMapping(dict):
32+
def __init__(self, broken_item):
33+
self._broken_item = broken_item
34+
35+
def items(self):
36+
return [self._broken_item]
37+
38+
2139
def test_normalize_headers_trims_header_names():
2240
headers = normalize_headers(
2341
{" X-Correlation-Id ": "abc123"},
@@ -231,3 +249,28 @@ def test_merge_headers_rejects_malformed_override_mapping_items():
231249
_MalformedHeaderItemsMapping(),
232250
mapping_error_message="headers must be a mapping of string pairs",
233251
)
252+
253+
254+
def test_normalize_headers_wraps_broken_tuple_length_errors():
255+
with pytest.raises(
256+
HyperbrowserError, match="headers must be a mapping of string pairs"
257+
) as exc_info:
258+
normalize_headers(
259+
_BrokenTupleItemMapping(_BrokenLenTuple(("X-Trace-Id", "trace-1"))),
260+
mapping_error_message="headers must be a mapping of string pairs",
261+
)
262+
263+
assert exc_info.value.original_error is not None
264+
265+
266+
def test_merge_headers_wraps_broken_tuple_index_errors():
267+
with pytest.raises(
268+
HyperbrowserError, match="headers must be a mapping of string pairs"
269+
) as exc_info:
270+
merge_headers(
271+
{"X-Trace-Id": "trace-1"},
272+
_BrokenTupleItemMapping(_BrokenIndexTuple(("X-Trace-Id", "trace-2"))),
273+
mapping_error_message="headers must be a mapping of string pairs",
274+
)
275+
276+
assert exc_info.value.original_error is not None

0 commit comments

Comments
 (0)