88from typing import (Any , Callable , Literal , Mapping , Optional , Sequence ,
99 TypeVar , Union )
1010
11- from .exceptions import RemoteProtocolError , TooManyRedirects
11+ from .exceptions import ProxyError , RemoteProtocolError , TooManyRedirects
1212from .models import (URL , Auth , BasicAuth , Cookies , Headers , Proxy , Request ,
1313 Response , StatusCodes , TLSClient , TLSConfig , URLParams )
1414from .settings import (DEFAULT_FOLLOW_REDIRECTS , DEFAULT_HEADERS ,
@@ -105,7 +105,7 @@ def __init__(
105105 self ._headers = Headers (headers )
106106 self ._hooks = hooks if isinstance (hooks , dict ) else {}
107107 self .auth = auth
108- self .proxy = Proxy ( url = proxy ) if isinstance ( proxy , ( str , URL )) else proxy
108+ self .proxy = self . prepare_proxy ( proxy )
109109 self .timeout = timeout
110110 self .follow_redirects = follow_redirects
111111 self .max_redirects = max_redirects
@@ -194,27 +194,23 @@ def prepare_params(self, params: URLParamTypes = None) -> URLParams:
194194 merged_params = self .params .copy ()
195195 return merged_params .update (params )
196196
197+ def prepare_proxy (self , proxy : ProxyTypes = None ) -> Optional [Proxy ]:
198+ if proxy is not None :
199+ if isinstance (proxy , (bytes , str , URL , Proxy )):
200+ return Proxy (proxy )
201+
202+ raise ProxyError ("Invalid proxy." )
203+
197204 def prepare_config (self , request : Request ):
198205 """Prepare TLS Config"""
199206
200- proxy = None
201- if self .proxy and isinstance (self .proxy , Proxy ):
202- proxy = self .proxy .url
203- if self .proxy .auth :
204- proxy = "%s://%s@%s:%s" % (
205- self .proxy .url .scheme ,
206- ":" .join (self .proxy .auth ),
207- self .proxy .url .host ,
208- self .proxy .url .port ,
209- )
210-
211207 config = self .config .copy_with (
212208 method = request .method ,
213- url = str ( request .url ) ,
209+ url = request .url ,
214210 body = request .read (),
215211 headers = dict (request .headers ),
216212 cookies = [dict (name = k , value = v ) for k , v in request .cookies .items ()],
217- proxy = proxy ,
213+ proxy = request . proxy . url if request . proxy else None ,
218214 timeout = request .timeout ,
219215 http2 = True if self .http2 in ["auto" , "http2" , True , None ] else False ,
220216 verify = self .verify ,
@@ -249,6 +245,7 @@ def build_request(
249245 params = self .prepare_params (params ),
250246 headers = self .prepare_headers (headers ),
251247 cookies = self .prepare_cookies (cookies ),
248+ proxy = self .proxy ,
252249 timeout = timeout or self .timeout ,
253250 )
254251
@@ -313,15 +310,14 @@ def _rebuild_redirect_url(self, request: Request, response: Response) -> URL:
313310 except KeyError :
314311 raise RemoteProtocolError ("Invalid URL in Location headers: %s" % e )
315312
316- for missing_field in ["scheme" , "host" , "port" , "fragment" ]:
317- private_field = "_%s" % missing_field
318- if not getattr (url , private_field , None ):
319- setattr (url , private_field , getattr (request .url , private_field , "" ))
313+ if not url .netloc :
314+ for missing_field in ["scheme" , "host" , "port" ]:
315+ setattr (url , missing_field , getattr (request .url , missing_field , "" ))
320316
321317 # TLS error transport between HTTP/1.x -> HTTP/2
322318 if url .scheme != request .url .scheme :
323319 if request .url .scheme == "http" :
324- url ._scheme = request .url .scheme
320+ url .scheme = request .url .scheme
325321 else :
326322 if self .http2 in ["auto" , None ]:
327323 self .session .destroy_session (self .config .sessionId )
@@ -331,6 +327,7 @@ def _rebuild_redirect_url(self, request: Request, response: Response) -> URL:
331327 "Switching remote scheme from HTTP/2 to HTTP/1 is not supported. Please initialize Client with parameter `http2` to `auto`."
332328 )
333329
330+ setattr (url , "_url" , None ) # reset url
334331 if not url .url :
335332 raise RemoteProtocolError ("Invalid URL in Location headers: %s" % e )
336333
0 commit comments