@@ -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+
5866class _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+
6884class _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+
121143class _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+
133161class _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+
406443def 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+
424470def test_extract_request_error_context_rejects_invalid_bytes_url_values ():
425471 method , url = extract_request_error_context (
426472 _RequestErrorWithInvalidBytesUrlContext ("network down" )
0 commit comments