File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -22,6 +22,13 @@ def _convert_to_bytes(value: str | bytes) -> bytes:
2222 return value .encode (encoding = "utf-8" , errors = "ignore" )
2323
2424
25+ def _stable_value_repr (value : Any ) -> str :
26+ try :
27+ return orjson .dumps (value , option = orjson .OPT_SORT_KEYS , default = repr ).decode ()
28+ except TypeError :
29+ return repr (value )
30+
31+
2532class Request :
2633 def __init__ (
2734 self ,
@@ -98,7 +105,7 @@ def update_fingerprint(
98105
99106 if include_kwargs :
100107 filtered_kwargs = {
101- key .lower (): str (value )
108+ key .lower (): _stable_value_repr (value )
102109 for key , value in self ._session_kwargs .items ()
103110 if key .lower () not in ("data" , "json" )
104111 }
Original file line number Diff line number Diff line change @@ -106,6 +106,24 @@ def test_fingerprint_include_kwargs_uses_kwarg_values(self):
106106
107107 assert r1 .update_fingerprint (include_kwargs = True ) != r2 .update_fingerprint (include_kwargs = True )
108108
109+ def test_fingerprint_include_kwargs_handles_non_primitive_values (self ):
110+ class _Opaque :
111+ def __repr__ (self ) -> str :
112+ return "_Opaque(stable)"
113+
114+ opaque = _Opaque ()
115+ r1 = Request ("https://example.com" , proxies = {"http" : "p1" }, custom = opaque )
116+ r2 = Request ("https://example.com" , proxies = {"http" : "p1" }, custom = opaque )
117+ r3 = Request ("https://example.com" , proxies = {"http" : "p2" }, custom = opaque )
118+
119+ fp1 = r1 .update_fingerprint (include_kwargs = True )
120+ r2 ._fp = None
121+ fp2 = r2 .update_fingerprint (include_kwargs = True )
122+ fp3 = r3 .update_fingerprint (include_kwargs = True )
123+
124+ assert fp1 == fp2
125+ assert fp1 != fp3
126+
109127 def test_fingerprint_include_headers_preserves_header_value_case (self ):
110128 """Test header values are fingerprinted without lowercasing."""
111129 r1 = Request ("https://example.com" , headers = {"X-Test" : "A" })
You can’t perform that action at this time.
0 commit comments