
    VGhE>                       d dl mZ d dlZd dlZd dlZd dlZd dlZd dl	Zd dl
Zd dlZd dlZd dl
mZmZmZmZmZmZmZ ddlmZmZmZmZmZmZ ddlmZmZmZmZ ddl m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z' dd	l(m)Z) dd
l*m$Z+ ddl,m-Z- ddl.m/Z/m0Z0 ddgZ1ejd                  e3gZ4e)r,e1jk                  d       e4jk                  e)jd                         d Z6 G d dejn                  jp                        Z9d Z: G d dejn                  jv                        Z< G d dejn                  jz                        Z> G d dejn                  j~                        Z@ G d dejn                  j~                        ZAd#dZB G d de      ZCd$dZDd  ZEe G d! d"ee             ZFy)%    )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                Z     | |i |}t        |d      rt        |_        |	|df|_        |S )N_create_connectionr   )hasattrr   r&   source_address)
http_classr(   argskwargshcs        b/var/www/it7/html/youtubeDownloader/venv/lib/python3.12/site-packages/yt_dlp/networking/_urllib.py_create_http_connectionr.   5   s<    	T	$V	$Br'( 1!+Q/I    c                       e Zd ZdZd fd	Zed        Zd Zd Zed        Z	ed        Z
ed        Z fd	Zd
 ZeZeZ xZS )HTTPHandlera  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        |   |i | || _        || _        y N)super__init___source_address_context)selfcontextr(   r*   r+   	__class__s        r-   r5   zHTTPHandler.__init__P   s$    $)&)-r/   c                ^    | }|j                   j                  dd       }|rt        ||      }|S )NYtdl-socks-proxy)headerspopmake_socks_conn_class)basereq
conn_classsocks_proxys       r-   _make_conn_classzHTTPHandler._make_conn_classU   s1    
kkoo&8$?.z;GJr/   c                    | j                  t        j                  j                  |      }| j	                  t        j                  t        || j                        |      S r3   )	rD   httpclientHTTPConnectiondo_open	functoolspartialr.   r6   r8   rA   rB   s      r-   	http_openzHTTPHandler.http_open]   sO    **4;;+E+EsK
||I--#Z1E1EGHKM 	Mr/   c                    | j                  t        j                  j                  |      }| j	                  t        j                  t        || j                        || j                        S )N)r9   )
rD   rF   rG   HTTPSConnectionrI   rJ   rK   r.   r6   r7   rL   s      r-   
https_openzHTTPHandler.https_openb   sY    **4;;+F+FL
||'T5I5IK  ( 	(r/   c                    | s| S 	 t        j                  | t         j                         S # t         j                  $ r t        j                  |       cY S w xY wr3   )zlib
decompress	MAX_WBITSerrordatas    r-   r#   zHTTPHandler.deflatei   sH    K	)??4$..99zz 	)??4((	)s   $+ (AAc                4    | s| S t        j                  |       S r3   )r   rS   rV   s    r-   r   zHTTPHandler.brotlir   s    K  &&r/   c                Z    | s| S t        j                  | t         j                  dz        S )N   )wbits)rR   rS   rT   rV   s    r-   gzzHTTPHandler.gzx   s&     Kt4>>B+>??r/   c                |    |j                         }t        |      }||k7  rt        ||      }t        |   |      S )N)url)get_full_urlr    update_Requestr4   do_request_)r8   rA   r^   url_escapedr:   s       r-   http_requestzHTTPHandler.http_request   sC      #C( + +6Cw"3''r/   c                `   |}d }d t        |j                  j                  dd      j                  d            D        D ]  }|dk(  r$| j	                  |xs |j                               },|dk(  r$| j                  |xs |j                               }U|dk(  s[t        sb| j                  |xs |j                               } |dt        j                  j                  t        j                  |      |j                  |j                  |j                        }|j                  |_        d|j                  cxk  rd	k  rln |S |j                  j                  d
      }|rK|j!                  d      j#                         }t%        |      }||k7  r|j                  d
= ||j                  d
<   |S )Nc              3  <   K   | ]  }|j                           y wr3   )strip).0es     r-   	<genexpr>z,HTTPHandler.http_response.<locals>.<genexpr>   s     jqjs   zContent-encoding ,r"   r#   r$   i,  i  Locationz
iso-8859-1)reversedr=   getsplitr\   readr#   r   urllibrequest
addinfourlioBytesIOr^   codemsgencodedecoder    )r8   rA   respold_respdecoded_responseencodinglocationlocation_escapeds           r-   http_responsezHTTPHandler.http_response   s|   
  jHT\\5E5EFXZ\5]5c5cdg5h,ij 	PH6!#'77+;+Jtyy{#K Y&#'<<0@0ODIIK#P T!f#';;/?/N499;#O 	P '>>,,RZZ8H-I8K[K[]e]i]ikskxkxyD||DH $))!c!  ||''
3H#??<8??A#0#: //Z0/?DLL,r/   )NN)__name__
__module____qualname____doc__r5   staticmethodrD   rM   rP   r#   r   r\   rc   r   https_requesthttps_response__classcell__r:   s   @r-   r1   r1   A   s     
  M
( ) ) ' '
 @ @($> !M"Nr/   r1   c                    t        | t        j                  j                  t        j                  j                  f      sJ t        |       G fdd|       }|S )Nc                      e Zd ZeZ fdZy).make_socks_conn_class.<locals>.SocksConnectionc           
     z   t        d   d   f| j                  | j                  t        j                  t
        | j                  | j                  f            | _        t        | t        j                  j                        r7| j                  j                  | j                  | j                        | _        y y )Naddrport)timeoutr(   _create_socket_func)server_hostname)r   r   r(   rJ   rK   r   hostr   sock
isinstancerF   rG   rO   r7   wrap_socket)r8   
proxy_argss    r-   connectz6make_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/   N)r   r   r   r   r&   r   )r   s   r-   SocksConnectionr      s    .	\r/   r   )
issubclassrF   rG   rH   rO   r   )
base_classrC   r   r   s      @r-   r?   r?      s[    j""DKK$?$?#A B B B '{3J\* \ r/   c                  b    e Zd ZdZej
                  j                  j                  xZxZ	xZ
Zd Zy)RedirectHandlera  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                   |dvr-t         j                  j                  |j                  ||||      |j                  }dg}t        |j                         |      }	|	|j                         k7  rd }|j                  ddg       |j                  j                         D 
ci c]  \  }
}|
j                         |vs|
| }}
}t         j                  j                  |||j                  d|	|      S c c}}
w )N)i-  i.  i/  i3  i4  CookiezContent-LengthzContent-TypeT)r=   origin_req_hostunverifiablemethodrW   )rq   rU   r   full_urlrW   r   
get_methodextendr=   itemstitlerr   Requestr   )r8   rA   fprv   rw   r=   newurlnew_dataremove_headers
new_methodkvnew_headerss                r-   redirect_requestz RedirectHandler.redirect_request   s    00,,((tS'2NN88
 #()94@
))H!!#3^"DE(+(9(9(;_1qwwyP^?^q!t__~~%%K9L9Ljx & A 	A `s    C2;C2N)r   r   r   r   rq   rr   HTTPRedirectHandlerhttp_error_302http_error_301http_error_303http_error_307http_error_308r    r/   r-   r   r      s5    
 IOHjHjHyHyyNy^yn~Ar/   r   c                      e Zd ZdZddZd Zy)ProxyHandlerd   Nc                Z    || _         dD ]  }t        | | d| j                  fd       ! y )N)rF   httpsftp_openc                     ||       S r3   r   )rmeths     r-   <lambda>z'ProxyHandler.__init__.<locals>.<lambda>   s    DQRG r/   )proxiessetattr
proxy_open)r8   r   schemes      r-   r5   zProxyHandler.__init__   s4    . 	UFDVHE*4??,ST	Ur/   c                @   t        |j                         | j                        }|y t        j                  j                  |      j                  j                         dv r|j                  d|       y t        j                  j                  j                  | ||d       S )N)socks4socks4asocks5socks5hr<   )r!   r_   r   rq   parseurlparser   lower
add_headerrr   r   r   )r8   rA   proxys      r-   r   zProxyHandler.proxy_open   s    S--/>=<<  '..446:ddNN-u5~~**55#ud$ 	$r/   r3   )r   r   r   handler_orderr5   r   r   r/   r-   r   r      s    MU	$r/   r   c                      e Zd Zd Zy)
PUTRequestc                     y)NPUTr   r8   s    r-   r   zPUTRequest.get_method  s    r/   Nr   r   r   r   r   r/   r-   r   r     s    r/   r   c                      e Zd Zd Zy)HEADRequestc                     y)NHEADr   r   s    r-   r   zHEADRequest.get_method  s    r/   Nr   r   r/   r-   r   r     s    r/   r   c                   | j                   j                         }|j                  |xs i        ||n| j                  }t	        |xs | j                         |      }| j                         }|dk(  rt        }	n&|dk(  rt        }	nt        j                  j                  }	 |	|||| j                  | j                        }
t        | d      r| j                  |
_        |
S )Nr   r   )rW   r=   r   r   r   )r=   copyupdaterW   r   r_   r   r   r   rq   rr   r   r   r   r'   r   )rA   r^   rW   r=   queryreq_headersreq_datareq_urlreq_get_methodreq_typenew_reqs              r-   r`   r`     s    ++""$Kw}"%'tSXXHs8c&6&6&8%@G^^%N	5	 >>))h++#:J:JLG sI++Nr/   c                  ,     e Zd ZdZd fdZddZ xZS )UrllibResponseAdapterzX
    HTTP Response adapter class for urllib addinfourl and http.client.HTTPResponse
    c                    t         |   ||j                  |j                  t	        |dd       xs |j                         t	        |dd              y )Nstatusreason)r   r=   r^   r   r   )r4   r5   r=   r^   getattrgetcode)r8   resr:   s     r-   r5   zUrllibResponseAdapter.__init__*  sL    
 	CKKSWW3$/@3;;=QTV^`dIe 	 	gr/   c                v    	 | j                   j                  |      S # t        $ r}t        |       |d }~ww xY wr3   )r   rp   	Exceptionhandle_response_read_exceptions)r8   amtrh   s      r-   rp   zUrllibResponseAdapter.read3  s7    	77<<$$ 	+A.G	s    	838)r   z5http.client.HTTPResponse | urllib.response.addinfourlr3   )r   r   r   r   r5   rp   r   r   s   @r-   r   r   %  s    gr/   r   c                    t        | t        j                        sy t        | t        j                        rt	        |       | t        |       | )Ncause)r   sslr   SSLCertVerificationErrorr   rh   s    r-   handle_sslerrorr   ;  s=    a&!S112$1-14

"r/   c                v   t        | t        j                  j                        r,t        t	        | j
                        | | j                        | t        | t        j                        rt        |        y t        | t        t        t        j                  j                  gt              rt        |       | y )N)rK   r   expectedr   )r   rF   rG   r   lenrK   r   r   r   r   OSErrorEOFErrorHTTPExceptionCONTENT_DECODE_ERRORSr   r   s    r-   r   r   C  s~    !T[[//0S^1qzzRXYY	As||	$	A4;;+D+D]G\]	^1%1, 
_r/   c                       e Zd ZdZdZej                  ej                  fZdZ	ddd fdZ
 fdZddZd	 Zd
 Z xZS )UrllibRH)rF   r   rW   r   )rF   r   r   r   r   rq   F)enable_file_urlsc               x    t        |   di | || _        | j                  rg | j                  d| _        y y )Nfiler   )r4   r5   r  _SUPPORTED_URL_SCHEMES)r8   r  r+   r:   s      r-   r5   zUrllibRH.__init__T  sA    "6" 0  *PD,G,G*P*PD' !r/   c                    t         |   |       |j                  dd        |j                  dd        |j                  dd        y )N	cookiejarr   
legacy_ssl)r4   _check_extensionsr>   )r8   
extensionsr:   s     r-   r
  zUrllibRH._check_extensionsZ  s:    !*-{D)y$'|T*r/   c           
        t         j                  j                         }t        |      t	        t        t        | j                              | j                  |      | j                        t        |      t               t               t               t               t               t!               g	}| j"                  r|j%                  t'                      |D ]  }|j)                  |        g |_        |S )N)legacy_ssl_support)
debuglevelr9   r(   )rq   rr   OpenerDirectorr   r1   intboolverbose_make_sslcontextr(   r   r   r
   r   r   r	   r   r  appendr   add_handler
addheaders)r8   r   r  r  openerhandlershandlers          r-   _create_instancezUrllibRH._create_instance`  s    ..0!tDLL12--AS-T#224  	*M#%L 
   OOKM* 	(Gw'	( r/   c                $    t        |t               y r3   )r   SUPPORTED_ENCODINGS)r8   _r=   s      r-   _prepare_headerszUrllibRH._prepare_headers}  s    "7,?@r/   c                |   | j                  |      }t        j                  j                  |j                  |j
                  ||j                        }| j                  | j                  |      | j                  |      |j                  j                  d            }	 |j                  || j                  |            }t3        |      S # t        j                  j                  $ r}t!        |j"                  t$        j&                  j(                  t        j*                  j,                  f      r=d|j.                  _        t        t3        |j"                        dt5        |      v       | d }~wt        j                  j6                  $ ra}|j8                  }dt5        |      j;                         v st!        |t<              rt?        |	      |tA        |       tC        |	      |d }~wt$        j&                  jD                  tF        f$ r}tI        |	      |d }~wtJ        $ r}tA        |        d }~ww xY w)
N)r^   rW   r=   r   r	  )r   r  r  )r   Tzredirect error)redirect_loopztunnel connection failedr   )&_get_headersrq   rr   r   r^   rW   r   _get_instance_get_proxies_get_cookiejarr  rn   open_calculate_timeoutrU   r   r   r   rF   rG   HTTPResponseresponsers   _closerclose_calledr   strURLErrorr   r   SocksProxyErrorr   r   r   
InvalidURL
ValueErrorr   r   )r8   rr   r=   
urllib_reqr  r   rh   r   s           r-   _sendzUrllibRH._send  s   ##G,^^++>>	 , 

 ##%%g.))'2&1155lC $ 

	++j$2I2I'2R+SC4 %S))3 ||%% 	!$$!9!96??;U;U VW)-		& 5add ;K[_bcd_eKeflmm||$$ 	1HHE *SZ-=-=-??:eUdCe q)q0+E2 q)q0&&
3 	/
 Q'Q. 	+A.	s>   "C H;)BE// H;AG++&H;HH;*H66H;)r  r  r3   )r   r   r   r  _SUPPORTED_PROXY_SCHEMESr   NO_PROXY	ALL_PROXY_SUPPORTED_FEATURESRH_NAMEr5   r
  r  r  r1  r   r   s   @r-   r  r  M  sI    =Q#,,h.@.@AG38 Q+:A)*r/   r  )NNNN)rh   zssl.SSLError)G
__future__r   rJ   http.clientrF   rt   r   urllib.errorrq   urllib.parseurllib.requesturllib.responserR   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   socksr-  utilsr   utils.networkingr    r!   r  rU   r   r   r  r.   rr   AbstractHTTPHandlerr1   r?   r   r   BaseHandlerr   r   r   r   r`   r   r   r   r  r   r/   r-   <module>rF     sY   "   	 
         D C   " 1 $ :y) W- 	t$  .	q#&..44 q#h,$Afnn88 $AN$6>>-- $*'' 
&..(( 
(H ,#- [*~1 [* [*r/   