
    V|hE>                    *   S SK Jr  S SKrS SKrS SKrS SKrS SKrS SK	rS SK
rS SKrS SKrS SK
JrJrJrJrJrJrJr  SSKJrJrJrJrJrJr  SSKJrJrJrJr  SSK J!r!J"r"J#r#J$r$J%r%J&r&J'r'  SS	K(J)r)  SS
K*J$r+  SSK,J-r-  SSK.J/r/J0r0  SS/r1\Rd                  \3/r4\)(       a,  \1Rk                  S5        \4Rk                  \)Rd                  5        S r6 " S S\Rn                  Rp                  5      r9S r: " S S\Rn                  Rv                  5      r< " S S\Rn                  Rz                  5      r> " S S\Rn                  R~                  5      r@ " S S\Rn                  R~                  5      rAS#S jrB " S S\5      rCS$S jrDS  rE\ " S! S"\\5      5       rFg)%    )annotationsN)DataHandlerFileHandler
FTPHandlerHTTPCookieProcessorHTTPDefaultErrorHandlerHTTPErrorProcessorUnknownHandler   )InstanceStoreMixinadd_accept_encoding_headercreate_connectioncreate_socks_proxy_socketget_redirect_methodmake_socks_proxy_opts)FeaturesRequestHandlerResponseregister_rh)CertificateVerifyError	HTTPErrorIncompleteRead
ProxyErrorRequestErrorSSLErrorTransportError   )brotli)r   )update_url_query)normalize_urlselect_proxygzipdeflatebrc                f    U " U0 UD6n[        US5      (       a  [        Ul        Ub	  US4Ul        U$ )N_create_connectionr   )hasattrr   r&   source_address)
http_classr(   argskwargshcs        S/home/james-whalen/.local/lib/python3.13/site-packages/yt_dlp/networking/_urllib.py_create_http_connectionr.   5   s?    	T	$V	$Br'(( 1!+Q/I    c                     ^  \ rS rSrSrSU 4S jjr\S 5       rS rS r	\S 5       r
\S 5       r\S	 5       rU 4S
 jrS r\r\rSrU =r$ )HTTPHandlerA   a  Handler for HTTP requests and responses.

This class, when installed with an OpenerDirector, automatically adds
the standard headers to every HTTP request and handles gzipped, deflated and
brotli responses from web servers.

Part of this code was copied from:

http://techknack.net/python-urllib2-handlers/

Andrew Rowls, the author of that code, agreed to release it to the
public domain.
c                >   > [         TU ]  " U0 UD6  X l        Xl        g N)super__init___source_address_context)selfcontextr(   r*   r+   	__class__s        r-   r6   HTTPHandler.__init__P   s     $)&)-r/   c                f    U nUR                   R                  SS 5      nU(       a  [        X#5      nU$ )NYtdl-socks-proxy)headerspopmake_socks_conn_class)basereq
conn_classsocks_proxys       r-   _make_conn_classHTTPHandler._make_conn_classU   s/    
kkoo&8$?.zGJr/   c                    U R                  [        R                  R                  U5      nU R	                  [
        R                  " [        X R                  5      U5      $ r4   )	rF   httpclientHTTPConnectiondo_open	functoolspartialr.   r7   r9   rC   rD   s      r-   	http_openHTTPHandler.http_open]   sM    **4;;+E+EsK
||I--#Z1E1EGHKM 	Mr/   c                    U R                  [        R                  R                  U5      nU R	                  [
        R                  " [        X R                  5      XR                  S9$ )N)r:   )
rF   rI   rJ   HTTPSConnectionrL   rM   rN   r.   r7   r8   rO   s      r-   
https_openHTTPHandler.https_openb   sU    **4;;+F+FL
||'5I5IK  ( 	(r/   c                    U (       d  U $  [         R                  " U [         R                  * 5      $ ! [         R                   a    [         R                  " U 5      s $ f = fr4   )zlib
decompress	MAX_WBITSerrordatas    r-   r#   HTTPHandler.deflatei   sH    K	)??4$..99zz 	)??4((	)s   %1 *AAc                @    U (       d  U $ [         R                  " U 5      $ r4   )r   rX   r[   s    r-   r   HTTPHandler.brotlir   s    K  &&r/   c                `    U (       d  U $ [         R                  " U [         R                  S-  S9$ )N   )wbits)rW   rX   rY   r[   s    r-   gzHTTPHandler.gzx   s&     Kt4>>B+>??r/   c                t   > UR                  5       n[        U5      nX#:w  a	  [        XS9n[        TU ]  U5      $ )N)url)get_full_urlr    update_Requestr5   do_request_)r9   rC   rf   url_escapedr;   s       r-   http_requestHTTPHandler.http_request   s?      #C(  6Cw"3''r/   c                   UnS nS [        UR                  R                  SS5      R                  S5      5       5        H  nUS:X  a*  U R	                  U=(       d    UR                  5       5      nM3  US:X  a*  U R                  U=(       d    UR                  5       5      nMc  US:X  d  Mk  [        (       d  Mx  U R                  U=(       d    UR                  5       5      nM     Ube  [        R                  R                  [        R                  " U5      UR                  UR                  UR                  5      nUR                  Ul        SUR                  s=::  a  S	:  ap  O  U$ UR                  R                  S
5      nU(       aJ  UR!                  S5      R#                  5       n[%        U5      nXg:w  a  UR                  S
	 XrR                  S
'   U$ )Nc              3  @   #    U  H  oR                  5       v   M     g 7fr4   )strip).0es     r-   	<genexpr>,HTTPHandler.http_response.<locals>.<genexpr>   s     j,iq,is   zContent-encoding ,r"   r#   r$   i,  i  Locationz
iso-8859-1)reversedr?   getsplitrc   readr#   r   urllibrequest
addinfourlioBytesIOrf   codemsgencodedecoder    )r9   rC   respold_respdecoded_responseencodinglocationlocation_escapeds           r-   http_responseHTTPHandler.http_response   ss   
  jHT\\5E5EFXZ\5]5c5cdg5h,ijH6!#'77+;+Jtyy{#K Y&#'<<0@0ODIIK#P T!ff#';;/?/N499;#O  k '>>,,RZZ8H-I8K[K[]e]i]ikskxkxyD||DH $))!c!  ||''
3H#??<8??A#0#: /Z0/?LL,r/   )r8   r7   )NN)__name__
__module____qualname____firstlineno____doc__r6   staticmethodrF   rP   rT   r#   r   rc   rk   r   https_requesthttps_response__static_attributes____classcell__r;   s   @r-   r1   r1   A   s     
  M
( ) ) ' '
 @ @($> !M"Nr/   r1   c                   ^ [        U [        R                  R                  [        R                  R                  45      (       d   e[        U5      m " U4S jSU 5      nU$ )Nc                  &   > \ rS rSr\rU 4S jrSrg).make_socks_conn_class.<locals>.SocksConnection   c           
     z  > [        TS   TS   4U R                  U R                  [        R                  " [
        U R                  U R                  4T5      S9U l        [        U [        R                  R                  5      (       a4  U R                  R                  U R                  U R                  S9U l        g g )Naddrport)timeoutr(   _create_socket_func)server_hostname)r   r   r(   rM   rN   r   hostr   sock
isinstancerI   rJ   rS   r8   wrap_socket)r9   
proxy_argss    r-   connect6make_socks_conn_class.<locals>.SocksConnection.connect   s    )F#Z%78#22$-$5$5-		499/Ez%S	TDI $ ; ;<< MM55diiQUQZQZ5[	 =r/   )r   N)r   r   r   r   r   r&   r   r   )r   s   r-   SocksConnectionr      s    .	\ 	\r/   r   )
issubclassrI   rJ   rK   rS   r   )
base_classrE   r   r   s      @r-   rA   rA      sa    j""DKK$?$?#A B B B B '{3J\* \ r/   c                  j    \ rS rSrSr\R                  R                  R                  =r	=r
=rrS rSrg)RedirectHandler   a  YoutubeDL redirect handler

The code is based on HTTPRedirectHandler implementation from CPython [1].

This redirect handler fixes and improves the logic to better align with RFC7261
 and what browsers tend to do [2][3]

1. https://github.com/python/cpython/blob/master/Lib/urllib/request.py
2. https://datatracker.ietf.org/doc/html/rfc7231
3. https://github.com/python/cpython/issues/91306
c           	        US;  a+  [         R                  R                  UR                  X4XR5      eUR                  nS/n[        UR                  5       U5      n	XR                  5       :w  a  S nUR                  SS/5        UR                  R                  5        V
Vs0 s H  u  pU
R                  5       U;  d  M  X_M     nn
n[         R                  R                  XlUR                  SXS9$ s  snn
f )N)i-  i.  i/  i3  i4  CookiezContent-LengthzContent-TypeT)r?   origin_req_hostunverifiablemethodr\   )r{   rZ   r   full_urlr\   r   
get_methodextendr?   itemstitler|   Requestr   )r9   rC   fpr   r   r?   newurlnew_dataremove_headers
new_methodkvnew_headerss                r-   redirect_request RedirectHandler.redirect_request   s    00,,((t'NN88
 #()94@
))H!!#3^"DE(+(9(9(;_(;qwwyP^?^tqt(;_~~%%9L9Lj & A 	A `s    C1>C1 N)r   r   r   r   r   r{   r|   HTTPRedirectHandlerhttp_error_302http_error_301http_error_303http_error_307http_error_308r   r   r   r/   r-   r   r      s5    
 IOHjHjHyHyyNy^yn~Ar/   r   c                  (    \ rS rSrSrSS jrS rSrg)ProxyHandler   d   Nc                \    Xl         S H   n[        X S3U R                  4S j5        M"     g )N)rI   httpsftp_openc                    U" U 5      $ r4   r   )rmeths     r-   <lambda>'ProxyHandler.__init__.<locals>.<lambda>   s	    DQRGr/   )proxiessetattr
proxy_open)r9   r   schemes      r-   r6   ProxyHandler.__init__   s)    .FDHE*4??,ST /r/   c                D   [        UR                  5       U R                  5      nUc  g [        R                  R                  U5      R                  R                  5       S;   a  UR                  SU5        g [        R                  R                  R                  XUS 5      $ )N)socks4socks4asocks5socks5hr>   )r!   rg   r   r{   parseurlparser   lower
add_headerr|   r   r   )r9   rC   proxys      r-   r   ProxyHandler.proxy_open   s    S--/>=<<  '..446:ddNN-u5~~**55ud$ 	$r/   )r   r4   )r   r   r   r   handler_orderr6   r   r   r   r/   r-   r   r      s    MU	$r/   r   c                      \ rS rSrS rSrg)
PUTRequesti  c                    g)NPUTr   r9   s    r-   r   PUTRequest.get_method  s    r/   r   Nr   r   r   r   r   r   r   r/   r-   r   r     s    r/   r   c                      \ rS rSrS rSrg)HEADRequesti  c                    g)NHEADr   r   s    r-   r   HEADRequest.get_method  s    r/   r   Nr   r   r/   r-   r   r     s    r/   r   c                   U R                   R                  5       nUR                  U=(       d    0 5        Ub  UOU R                  n[	        U=(       d    U R                  5       U5      nU R                  5       nUS:X  a  [        n	O'US:X  a  [        n	O[        R                  R                  n	U	" XvUU R                  U R                  S9n
[        U S5      (       a  U R                  U
l        U
$ )Nr   r   )r\   r?   r   r   r   )r?   copyupdater\   r   rg   r   r   r   r{   r|   r   r   r   r'   r   )rC   rf   r\   r?   queryreq_headersreq_datareq_urlreq_get_methodreq_typenew_reqs              r-   rh   rh     s    ++""$Kw}"%'tSXXHs8c&6&6&8%@G^^%N	5	 >>))++#:J:JLG sI++Nr/   c                  :   ^  \ rS rSrSrSU 4S jjrSS jrSrU =r$ )UrllibResponseAdapteri%  zP
HTTP Response adapter class for urllib addinfourl and http.client.HTTPResponse
c                   > [         TU ]  XR                  UR                  [	        USS 5      =(       d    UR                  5       [	        USS 5      S9  g )Nstatusreason)r   r?   rf   r  r  )r5   r6   r?   rf   getattrgetcode)r9   resr;   s     r-   r6   UrllibResponseAdapter.__init__*  sJ    
 	KKSWW3$/@3;;=QTV^`dIe 	 	gr/   c                x     U R                   R                  U5      $ ! [         a  n[        U5        UeS nAff = fr4   )r   rz   	Exceptionhandle_response_read_exceptions)r9   amtrq   s      r-   rz   UrllibResponseAdapter.read3  s7    	77<<$$ 	+A.G	s    
949r   )r  z5http.client.HTTPResponse | urllib.response.addinfourlr4   )	r   r   r   r   r   r6   rz   r   r   r   s   @r-   r   r   %  s    g r/   r   c                    [        U [        R                  5      (       d  g [        U [        R                  5      (       a
  [	        U S9U e[        U S9U e)Ncause)r   sslr   SSLCertVerificationErrorr   rq   s    r-   handle_sslerrorr  ;  sC    a&&!S1122$1-14

"r/   c                   [        U [        R                  R                  5      (       a(  [        [	        U R
                  5      X R                  S9U e[        U [        R                  5      (       a  [        U 5        g [        U [        [        [        R                  R                  /[        Q75      (       a
  [        U S9U eg )N)rN   r  expectedr  )r   rI   rJ   r   lenrN   r  r  r   r  OSErrorEOFErrorHTTPExceptionCONTENT_DECODE_ERRORSr   r  s    r-   r	  r	  C  s    !T[[//00S^1zzRXYY	As||	$	$	A4;;+D+D]G\]	^	^1%1, 
_r/   c                     ^  \ rS rSrSrSr\R                  \R                  4r	Sr
SS.SU 4S jjjrU 4S jrSS	 jrS
 rS rSrU =r$ )UrllibRHiM  )rI   r   r\   r   )rI   r   r   r   r   r{   F)enable_file_urlsc                  > [         TU ]  " S0 UD6  Xl        U R                  (       a  / U R                  QSP7U l        g g )Nfiler   )r5   r6   r  _SUPPORTED_URL_SCHEMES)r9   r  r+   r;   s      r-   r6   UrllibRH.__init__T  s?    "6" 0  *PD,G,G*P*PD' !r/   c                   > [         TU ]  U5        UR                  SS 5        UR                  SS 5        UR                  SS 5        g )N	cookiejarr   
legacy_ssl)r5   _check_extensionsr@   )r9   
extensionsr;   s     r-   r$  UrllibRH._check_extensionsZ  s:    !*-{D)y$'|T*r/   c           
        [         R                  R                  5       n[        U5      [	        [        [        U R                  5      5      U R                  US9U R                  S9[        U5      [        5       [        5       [        5       [        5       [        5       [!        5       /	nU R"                  (       a  UR%                  ['        5       5        U H  nUR)                  U5        M     / Ul        U$ )N)legacy_ssl_support)
debuglevelr:   r(   )r{   r|   OpenerDirectorr   r1   intboolverbose_make_sslcontextr(   r   r   r
   r   r   r	   r   r  appendr   add_handler
addheaders)r9   r   r"  r(  openerhandlershandlers          r-   _create_instanceUrllibRH._create_instance`  s    ..0!tDLL12--AS-T#224  	*M#%L 
   OOKM*Gw'   r/   c                $    [        U[        5        g r4   )r   SUPPORTED_ENCODINGS)r9   _r?   s      r-   _prepare_headersUrllibRH._prepare_headers}  s    "7,?@r/   c                r   U R                  U5      n[        R                  R                  UR                  UR
                  UUR                  S9nU R                  U R                  U5      U R                  U5      UR                  R                  S5      S9n UR                  X0R                  U5      S9n[3        U5      $ ! [        R                  R                   a  n[!        UR"                  [$        R&                  R(                  [        R*                  R,                  45      (       a;  SUR.                  l        [        [3        UR"                  5      S[5        U5      ;   S9Uee S nAf[        R                  R6                   ab  nUR8                  nS[5        U5      R;                  5       ;   d  [!        U[<        5      (       a
  [?        US	9Ue[A        U5        [C        US	9UeS nAf[$        R&                  RD                  [F        4 a  n[I        US	9UeS nAf[J         a  n[A        U5        e S nAff = f)
N)rf   r\   r?   r   r#  )r   r"  r(  )r   Tzredirect error)redirect_loopztunnel connection failedr  )&_get_headersr{   r|   r   rf   r\   r   _get_instance_get_proxies_get_cookiejarr%  rx   open_calculate_timeoutrZ   r   r   r   rI   rJ   HTTPResponseresponser}   _closerclose_calledr   strURLErrorr  r   SocksProxyErrorr   r	  r   
InvalidURL
ValueErrorr   r  )r9   r|   r?   
urllib_reqr2  r  rq   r  s           r-   _sendUrllibRH._send  s   ##G,^^++>>	 , 

 ##%%g.))'2&1155lC $ 

	++j2I2I'2R+SC4 %S))3 ||%% 	!$$!9!96??;U;U VWW)-		& 5add ;K[_bcd_eKeflmm||$$ 	1HHE *SZ-=-=-??:eUdCeCe q)q0+E2 q)q0&&
3 	/
 Q'Q. 	+A.	s>   C H6 B	E))!H6
AG'''H6
HH6%H11H6)r  r  )r  r,  r4   )r   r   r   r   r  _SUPPORTED_PROXY_SCHEMESr   NO_PROXY	ALL_PROXY_SUPPORTED_FEATURESRH_NAMEr6   r$  r5  r:  rN  r   r   r   s   @r-   r  r  M  sT    =Q#,,h.@.@AG38 Q Q+:A)* )*r/   r  )NNNN)rq   zssl.SSLError)G
__future__r   rM   http.clientrI   r~   r  urllib.errorr{   urllib.parseurllib.requesturllib.responserW   r   r   r   r   r   r	   r
   _helperr   r   r   r   r   r   commonr   r   r   r   
exceptionsr   r   r   r   r   r   r   dependenciesr   socksrJ  utilsr   utils.networkingr    r!   r8  rZ   r  r  r/  r.   r|   AbstractHTTPHandlerr1   rA   r   r   BaseHandlerr   r   r   r   rh   r   r  r	  r  r   r/   r-   <module>rd     sY   "   	 
         D C   " 1 $ :y) W- 	t$  .	q#&..44 q#h,$Afnn88 $AN$6>>-- $*'' 
&..(( 
(H ,#- [*~1 [* [*r/   