@@ -18,15 +18,24 @@ class ClientConfig:
1818 def __post_init__ (self ) -> None :
1919 if not isinstance (self .api_key , str ):
2020 raise HyperbrowserError ("api_key must be a string" )
21- if not isinstance (self .base_url , str ):
22- raise HyperbrowserError ("base_url must be a string" )
2321 self .api_key = self .api_key .strip ()
2422 if not self .api_key :
2523 raise HyperbrowserError ("api_key must not be empty" )
26- self .base_url = self .base_url .strip ().rstrip ("/" )
27- if not self .base_url :
24+ self .base_url = self .normalize_base_url (self .base_url )
25+ self .headers = normalize_headers (
26+ self .headers ,
27+ mapping_error_message = "headers must be a mapping of string pairs" ,
28+ )
29+
30+ @staticmethod
31+ def normalize_base_url (base_url : str ) -> str :
32+ if not isinstance (base_url , str ):
33+ raise HyperbrowserError ("base_url must be a string" )
34+ normalized_base_url = base_url .strip ().rstrip ("/" )
35+ if not normalized_base_url :
2836 raise HyperbrowserError ("base_url must not be empty" )
29- parsed_base_url = urlparse (self .base_url )
37+
38+ parsed_base_url = urlparse (normalized_base_url )
3039 if (
3140 parsed_base_url .scheme not in {"https" , "http" }
3241 or not parsed_base_url .netloc
@@ -38,10 +47,7 @@ def __post_init__(self) -> None:
3847 raise HyperbrowserError (
3948 "base_url must not include query parameters or fragments"
4049 )
41- self .headers = normalize_headers (
42- self .headers ,
43- mapping_error_message = "headers must be a mapping of string pairs" ,
44- )
50+ return normalized_base_url
4551
4652 @classmethod
4753 def from_env (cls ) -> "ClientConfig" :
@@ -67,4 +73,4 @@ def resolve_base_url_from_env(raw_base_url: Optional[str]) -> str:
6773 return "https://api.hyperbrowser.ai"
6874 if not raw_base_url .strip ():
6975 raise HyperbrowserError ("HYPERBROWSER_BASE_URL must not be empty when set" )
70- return raw_base_url
76+ return ClientConfig . normalize_base_url ( raw_base_url )
0 commit comments