Skip to content

Commit 7d8a31f

Browse files
Validate direct transport header key/value types
Co-authored-by: Shri Sukhani <shrisukhani@users.noreply.github.com>
1 parent 1287a5e commit 7d8a31f

File tree

3 files changed

+20
-0
lines changed

3 files changed

+20
-0
lines changed

hyperbrowser/transport/async_transport.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ def __init__(self, api_key: str, headers: Optional[Mapping[str, str]] = None):
1616
"User-Agent": f"hyperbrowser-python-sdk/{__version__}",
1717
}
1818
if headers:
19+
if any(
20+
not isinstance(key, str) or not isinstance(value, str)
21+
for key, value in headers.items()
22+
):
23+
raise HyperbrowserError("headers must be a mapping of string pairs")
1924
merged_headers.update(headers)
2025
self.client = httpx.AsyncClient(headers=merged_headers)
2126
self._closed = False

hyperbrowser/transport/sync.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ def __init__(self, api_key: str, headers: Optional[Mapping[str, str]] = None):
1616
"User-Agent": f"hyperbrowser-python-sdk/{__version__}",
1717
}
1818
if headers:
19+
if any(
20+
not isinstance(key, str) or not isinstance(value, str)
21+
for key, value in headers.items()
22+
):
23+
raise HyperbrowserError("headers must be a mapping of string pairs")
1924
merged_headers.update(headers)
2025
self.client = httpx.Client(headers=merged_headers)
2126

tests/test_custom_headers.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ def test_sync_transport_accepts_custom_headers():
2323
transport.close()
2424

2525

26+
def test_sync_transport_rejects_non_string_header_pairs():
27+
with pytest.raises(HyperbrowserError, match="headers must be a mapping"):
28+
SyncTransport(api_key="test-key", headers={"X-Correlation-Id": 123}) # type: ignore[dict-item]
29+
30+
2631
def test_async_transport_accepts_custom_headers():
2732
async def run() -> None:
2833
transport = AsyncTransport(
@@ -39,6 +44,11 @@ async def run() -> None:
3944
asyncio.run(run())
4045

4146

47+
def test_async_transport_rejects_non_string_header_pairs():
48+
with pytest.raises(HyperbrowserError, match="headers must be a mapping"):
49+
AsyncTransport(api_key="test-key", headers={"X-Correlation-Id": 123}) # type: ignore[dict-item]
50+
51+
4252
def test_sync_client_config_headers_are_applied_to_transport():
4353
client = Hyperbrowser(
4454
config=ClientConfig(api_key="test-key", headers={"X-Team-Trace": "team-1"})

0 commit comments

Comments
 (0)