Skip to content

Commit 58ef1c2

Browse files
Explicitly reject string-subclass request context values
Co-authored-by: Shri Sukhani <shrisukhani@users.noreply.github.com>
1 parent 3bdf5e3 commit 58ef1c2

2 files changed

Lines changed: 54 additions & 2 deletions

File tree

hyperbrowser/transport/error_utils.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,10 @@ def _normalize_request_method(method: Any) -> str:
100100
raw_method = memoryview(raw_method).tobytes().decode("ascii")
101101
except (TypeError, ValueError, UnicodeDecodeError):
102102
return "UNKNOWN"
103-
elif not isinstance(raw_method, str):
103+
elif isinstance(raw_method, str):
104+
if type(raw_method) is not str:
105+
return "UNKNOWN"
106+
elif type(raw_method) is not str:
104107
try:
105108
raw_method = str(raw_method)
106109
except Exception:
@@ -145,7 +148,10 @@ def _normalize_request_url(url: Any) -> str:
145148
raw_url = memoryview(raw_url).tobytes().decode("utf-8")
146149
except (TypeError, ValueError, UnicodeDecodeError):
147150
return "unknown URL"
148-
elif not isinstance(raw_url, str):
151+
elif isinstance(raw_url, str):
152+
if type(raw_url) is not str:
153+
return "unknown URL"
154+
elif type(raw_url) is not str:
149155
try:
150156
raw_url = str(raw_url)
151157
except Exception:

tests/test_transport_error_utils.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,14 @@ def __str__(self) -> str:
5555
url = "https://example.com/method-like"
5656

5757

58+
class _StringSubclassMethodRequest:
59+
class _MethodSubclass(str):
60+
pass
61+
62+
method = _MethodSubclass("get")
63+
url = "https://example.com/subclass-method"
64+
65+
5866
class _WhitespaceInsideUrlRequest:
5967
method = "GET"
6068
url = "https://example.com/with space"
@@ -65,6 +73,14 @@ class _BytesUrlContextRequest:
6573
url = b"https://example.com/from-bytes"
6674

6775

76+
class _StringSubclassUrlRequest:
77+
class _UrlSubclass(str):
78+
pass
79+
80+
method = "GET"
81+
url = _UrlSubclass("https://example.com/subclass-url")
82+
83+
6884
class _InvalidBytesUrlContextRequest:
6985
method = "GET"
7086
url = b"\xff\xfe"
@@ -118,6 +134,12 @@ def request(self): # type: ignore[override]
118134
return _MethodLikeRequest()
119135

120136

137+
class _RequestErrorWithStringSubclassMethodContext(httpx.RequestError):
138+
@property
139+
def request(self): # type: ignore[override]
140+
return _StringSubclassMethodRequest()
141+
142+
121143
class _RequestErrorWithWhitespaceInsideUrl(httpx.RequestError):
122144
@property
123145
def request(self): # type: ignore[override]
@@ -130,6 +152,12 @@ def request(self): # type: ignore[override]
130152
return _BytesUrlContextRequest()
131153

132154

155+
class _RequestErrorWithStringSubclassUrlContext(httpx.RequestError):
156+
@property
157+
def request(self): # type: ignore[override]
158+
return _StringSubclassUrlRequest()
159+
160+
133161
class _RequestErrorWithInvalidBytesUrlContext(httpx.RequestError):
134162
@property
135163
def request(self): # type: ignore[override]
@@ -403,6 +431,15 @@ def test_extract_request_error_context_accepts_stringifiable_method_values():
403431
assert url == "https://example.com/method-like"
404432

405433

434+
def test_extract_request_error_context_rejects_string_subclass_method_values():
435+
method, url = extract_request_error_context(
436+
_RequestErrorWithStringSubclassMethodContext("network down")
437+
)
438+
439+
assert method == "UNKNOWN"
440+
assert url == "https://example.com/subclass-method"
441+
442+
406443
def test_extract_request_error_context_rejects_urls_with_whitespace():
407444
method, url = extract_request_error_context(
408445
_RequestErrorWithWhitespaceInsideUrl("network down")
@@ -421,6 +458,15 @@ def test_extract_request_error_context_supports_bytes_url_values():
421458
assert url == "https://example.com/from-bytes"
422459

423460

461+
def test_extract_request_error_context_rejects_string_subclass_url_values():
462+
method, url = extract_request_error_context(
463+
_RequestErrorWithStringSubclassUrlContext("network down")
464+
)
465+
466+
assert method == "GET"
467+
assert url == "unknown URL"
468+
469+
424470
def test_extract_request_error_context_rejects_invalid_bytes_url_values():
425471
method, url = extract_request_error_context(
426472
_RequestErrorWithInvalidBytesUrlContext("network down")

0 commit comments

Comments
 (0)