@@ -38,16 +38,37 @@ def __post_init__(self) -> None:
3838 def _decode_url_component_with_limit (value : str , * , component_label : str ) -> str :
3939 decoded_value = value
4040 for _ in range (10 ):
41- next_decoded_value = unquote (decoded_value )
41+ next_decoded_value = ClientConfig ._safe_unquote (
42+ decoded_value ,
43+ component_label = component_label ,
44+ )
4245 if next_decoded_value == decoded_value :
4346 return decoded_value
4447 decoded_value = next_decoded_value
45- if unquote (decoded_value ) == decoded_value :
48+ if (
49+ ClientConfig ._safe_unquote (
50+ decoded_value ,
51+ component_label = component_label ,
52+ )
53+ == decoded_value
54+ ):
4655 return decoded_value
4756 raise HyperbrowserError (
4857 f"{ component_label } contains excessively nested URL encoding"
4958 )
5059
60+ @staticmethod
61+ def _safe_unquote (value : str , * , component_label : str ) -> str :
62+ try :
63+ return unquote (value )
64+ except HyperbrowserError :
65+ raise
66+ except Exception as exc :
67+ raise HyperbrowserError (
68+ f"Failed to decode { component_label } " ,
69+ original_error = exc ,
70+ ) from exc
71+
5172 @staticmethod
5273 def normalize_base_url (base_url : str ) -> str :
5374 if not isinstance (base_url , str ):
@@ -136,7 +157,10 @@ def normalize_base_url(base_url: str) -> str:
136157 raise HyperbrowserError (
137158 "base_url host must not contain encoded delimiter characters"
138159 )
139- next_decoded_base_netloc = unquote (decoded_base_netloc )
160+ next_decoded_base_netloc = ClientConfig ._safe_unquote (
161+ decoded_base_netloc ,
162+ component_label = "base_url host" ,
163+ )
140164 if next_decoded_base_netloc == decoded_base_netloc :
141165 break
142166 decoded_base_netloc = next_decoded_base_netloc
@@ -145,7 +169,13 @@ def normalize_base_url(base_url: str) -> str:
145169 raise HyperbrowserError (
146170 "base_url host must not contain encoded delimiter characters"
147171 )
148- if unquote (decoded_base_netloc ) != decoded_base_netloc :
172+ if (
173+ ClientConfig ._safe_unquote (
174+ decoded_base_netloc ,
175+ component_label = "base_url host" ,
176+ )
177+ != decoded_base_netloc
178+ ):
149179 raise HyperbrowserError (
150180 "base_url host contains excessively nested URL encoding"
151181 )
0 commit comments