o
    iB                     @  s  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j2e3gZ4e)re15d e45e)j2 dd Z6G dd dej7j8Z9dd Z:G dd dej7j;Z<G dd dej7j=Z>G dd dej7j?Z@G dd dej7j?ZAd*ddZBG d d! d!eZCd+d$d%ZDd&d' ZEeG d(d) d)eeZFdS ),    )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                 O  s4   | |i |}t |drt|_|d ur|df|_|S )N_create_connectionr   )hasattrr   r$   source_address)
http_classr&   argskwargshc r+   M/home/ubuntu/.local/lib/python3.10/site-packages/yt_dlp/networking/_urllib.py_create_http_connection5   s   

r-   c                      s~   e Zd ZdZd fdd	Zedd Zdd Zd	d
 Zedd Z	edd Z
edd Z fddZdd ZeZeZ  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.
    Nc                   s"   t  j|i | || _|| _d S N)super__init___source_address_context)selfcontextr&   r(   r)   	__class__r+   r,   r1   P   s   
zHTTPHandler.__init__c                 C  s$   | }|j dd }|rt||}|S )NYtdl-socks-proxy)headerspopmake_socks_conn_class)basereq
conn_classsocks_proxyr+   r+   r,   _make_conn_classU   s
   
zHTTPHandler._make_conn_classc                 C  s(   |  tjj|}| tt|| j|S r/   )	r@   httpclientHTTPConnectiondo_open	functoolspartialr-   r2   r4   r=   r>   r+   r+   r,   	http_open]   s   zHTTPHandler.http_openc                 C  s.   |  tjj|}| jtt|| j|| j	dS )N)r5   )
r@   rA   rB   HTTPSConnectionrD   rE   rF   r-   r2   r3   rG   r+   r+   r,   
https_openb   s   zHTTPHandler.https_openc                 C  s:   | s| S z	t | t j W S  t jy   t |  Y S w r/   )zlib
decompress	MAX_WBITSerrordatar+   r+   r,   r"   i   s   zHTTPHandler.deflatec                 C  s   | s| S t | S r/   )r   rL   rO   r+   r+   r,   r   r   s   
zHTTPHandler.brotlic                 C  s   | s| S t j| t jdB dS )N   )wbits)rK   rL   rM   rO   r+   r+   r,   gzx   s   zHTTPHandler.gzc                   s0   |  }t|}||krt||d}t |S )N)url)get_full_urlr   update_Requestr0   do_request_)r4   r=   rT   url_escapedr6   r+   r,   http_request   s
   	zHTTPHandler.http_requestc                 C  s  |}d }dd t |jdddD D ]-}|dkr%| |p"| }q|dkr3| |p0| }q|dkrBtrB| |p@| }q|d urZtj	
t||j|j|j}|j|_d	|j  kred
k rn |S |jd}|r|d }t|}||kr|jd= ||jd< |S )Nc                 s  s    | ]}|  V  qd S r/   )strip).0er+   r+   r,   	<genexpr>   s    z,HTTPHandler.http_response.<locals>.<genexpr>zContent-encoding ,r!   r"   r#   i,  i  Locationz
iso-8859-1)reversedr9   getsplitrS   readr"   r   urllibrequest
addinfourlioBytesIOrT   codemsgencodedecoder   )r4   r=   respold_respdecoded_responseencodinglocationlocation_escapedr+   r+   r,   http_response   s.   &	
zHTTPHandler.http_response)NN)__name__
__module____qualname____doc__r1   staticmethodr@   rH   rJ   r"   r   rS   rY   rt   https_requesthttps_response__classcell__r+   r+   r6   r,   r.   A   s"    



r.   c                   s:   t | tjjtjjfsJ t| G  fddd| }|S )Nc                      s   e Zd ZeZ fddZdS )z.make_socks_conn_class.<locals>.SocksConnectionc              	     s`   t  d  d f| j| jtt| j| jf d| _t	| t
jjr.| jj| j| jd| _d S d S )Naddrport)timeoutr&   _create_socket_func)server_hostname)r   r   r&   rE   rF   r   hostr~   sock
isinstancerA   rB   rI   r3   wrap_socketr4   
proxy_argsr+   r,   connect   s   z6make_socks_conn_class.<locals>.SocksConnection.connectN)ru   rv   rw   r   r$   r   r+   r   r+   r,   SocksConnection   s    r   )
issubclassrA   rB   rC   rI   r   )
base_classr?   r   r+   r   r,   r;      s   
r;   c                   @  s.   e Zd ZdZejjj Z Z	 Z
Zdd ZdS )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           
        s   |dvrt j|j|||||j}dg t| |}|| kr+d } ddg  fdd|j	 D }	t j
j||	|jd||dS )	N)i-  i.  i/  i3  i4  CookiezContent-LengthzContent-Typec                   s"   i | ]\}}|   vr||qS r+   )title)r[   kvremove_headersr+   r,   
<dictcomp>   s   " z4RedirectHandler.redirect_request.<locals>.<dictcomp>T)r9   origin_req_hostunverifiablemethodrP   )re   rN   r   full_urlrP   r   
get_methodextendr9   itemsrf   Requestr   )
r4   r=   fprj   rk   r9   newurlnew_data
new_methodnew_headersr+   r   r,   redirect_request   s   z RedirectHandler.redirect_requestN)ru   rv   rw   rx   re   rf   HTTPRedirectHandlerhttp_error_302http_error_301http_error_303http_error_307http_error_308r   r+   r+   r+   r,   r      s    r   c                   @  s"   e Zd ZdZdddZdd ZdS )ProxyHandlerd   Nc                 C  s0   || _ dD ]}t| | d| jfdd qd S )N)rA   httpsftp_openc                 S  s   || S r/   r+   )rmethr+   r+   r,   <lambda>   s    z'ProxyHandler.__init__.<locals>.<lambda>)proxiessetattr
proxy_open)r4   r   schemer+   r+   r,   r1      s   zProxyHandler.__init__c                 C  sV   t | | j}|d u rd S tj|j dv r!|d| d S tj	j
| ||d S )N)socks4socks4asocks5socks5hr8   )r    rU   r   re   parseurlparser   lower
add_headerrf   r   r   )r4   r=   proxyr+   r+   r,   r      s   zProxyHandler.proxy_openr/   )ru   rv   rw   handler_orderr1   r   r+   r+   r+   r,   r      s    
r   c                   @     e Zd Zdd ZdS )
PUTRequestc                 C     dS )NPUTr+   r   r+   r+   r,   r        zPUTRequest.get_methodNru   rv   rw   r   r+   r+   r+   r,   r         r   c                   @  r   )HEADRequestc                 C  r   )NHEADr+   r   r+   r+   r,   r     r   zHEADRequest.get_methodNr   r+   r+   r+   r,   r     r   r   c                 C  s   | j  }||p
i  |d ur|n| j}t|p|  |}|  }|dkr)t}	n|dkr0t}	nt	j
j}	|	|||| j| jd}
t| drH| j|
_|
S )Nr   r   )rP   r9   r   r   r   )r9   copyupdaterP   r   rU   r   r   r   re   rf   r   r   r   r%   r   )r=   rT   rP   r9   queryreq_headersreq_datareq_urlreq_get_methodreq_typenew_reqr+   r+   r,   rV     s"   

rV   c                      s,   e Zd ZdZd	 fddZd
ddZ  ZS )UrllibResponseAdapterzX
    HTTP Response adapter class for urllib addinfourl and http.client.HTTPResponse
    res5http.client.HTTPResponse | urllib.response.addinfourlc              	     s6   t  j||j|jt|dd p| t|dd d d S )Nstatusreason)r   r9   rT   r   r   )r0   r1   r9   rT   getattrgetcode)r4   r   r6   r+   r,   r1   *  s   

zUrllibResponseAdapter.__init__Nc              
   C  s   | j rdS zb| j|}t| jdd }t| jtjjr&|d u r&|   |W S t| jt	j
jrZ|d urZt|tjrI| t| krF|   |W S t|tjrW|d u rW|   |W S |d ure|j re|   |W S  tyy } zt| |d }~ww )N    r   )closedr   rd   r   r   rA   rB   HTTPResponseclosere   responserg   rh   ri   telllen	getbufferBufferedReader	Exceptionhandle_response_read_exceptions)r4   amtrP   
underlyingr\   r+   r+   r,   rd   3  s0   zUrllibResponseAdapter.read)r   r   r/   )ru   rv   rw   rx   r1   rd   r|   r+   r+   r6   r,   r   %  s    	r   r\   ssl.SSLErrorc                 C  s4   t | tjsd S t | tjrt| d| t| d| )Ncause)r   sslr   SSLCertVerificationErrorr   r\   r+   r+   r,   handle_sslerrorO  s
   r   c                 C  sh   t | tjjrtt| j| | jd| t | tjrt	|  d S t | t
ttjjgtR r2t| d| d S )N)rF   r   expectedr   )r   rA   rB   r   r   rF   r   r   r   r   OSErrorEOFErrorHTTPExceptionCONTENT_DECODE_ERRORSr   r   r+   r+   r,   r   W  s   r   c                      sb   e Zd ZdZdZejejfZdZ	ddd fdd	Z
 fd
dZdddZdd Zdd Z  ZS )UrllibRH)rA   r   rP   r   )rA   r   r   r   r   re   F)enable_file_urlsr   boolc                  s8   t  jdi | || _| jrg | jdR | _d S d S )Nfiler+   )r0   r1   r   _SUPPORTED_URL_SCHEMES)r4   r   r)   r6   r+   r,   r1   h  s
   zUrllibRH.__init__c                   s4   t  | |dd  |dd  |dd  d S )N	cookiejarr   
legacy_ssl)r0   _check_extensionsr:   )r4   
extensionsr6   r+   r,   r   n  s   zUrllibRH._check_extensionsNc              	   C  s   t j }t|ttt| j| j|d| j	dt
|t t t t t t g	}| jr2|t  |D ]}|| q4g |_|S )N)legacy_ssl_support)
debuglevelr5   r&   )re   rf   OpenerDirectorr   r.   intr   verbose_make_sslcontextr&   r   r   r	   r   r   r   r   r   appendr   add_handler
addheaders)r4   r   r   r   openerhandlershandlerr+   r+   r,   _create_instancet  s*   

zUrllibRH._create_instancec                 C  s   t |t d S r/   )r   SUPPORTED_ENCODINGS)r4   _r9   r+   r+   r,   _prepare_headers  s   zUrllibRH._prepare_headersc              
   C  sf  |  |}tjj|j|j||jd}| j| || 	||j
dd}z|j|| |d}W t|S  tjjy` } zt|jtjjtjjfr[d|j_tt|jdt|v d| d }~w tjjy } z |j}dt| v syt|trt|d	|t | t!|d	|d }~w tjj"t#fy } zt$|d	|d }~w t%y } zt |  d }~ww )
N)rT   rP   r9   r   r   )r   r   r   )r   Tzredirect error)redirect_loopztunnel connection failedr   )&_get_headersre   rf   r   rT   rP   r   _get_instance_get_proxies_get_cookiejarr   rb   open_calculate_timeoutrN   r   r   r   rA   rB   r   r   rg   _closerclose_calledr   strURLErrorr   r   SocksProxyErrorr   r   r   
InvalidURL
ValueErrorr   r   )r4   rf   r9   
urllib_reqr  r   r\   r   r+   r+   r,   _send  sH   

zUrllibRH._send)r   r   r/   )ru   rv   rw   r   _SUPPORTED_PROXY_SCHEMESr   NO_PROXY	ALL_PROXY_SUPPORTED_FEATURESRH_NAMEr1   r   r  r	  r  r|   r+   r+   r6   r,   r   a  s    
r   )NNNN)r\   r   )G
__future__r   rE   http.clientrA   rh   r   urllib.errorre   urllib.parseurllib.requesturllib.responserK   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  rN   r   r   r   r-   rf   AbstractHTTPHandlerr.   r;   r   r   BaseHandlerr   r   r   r   rV   r   r   r   r   r+   r+   r+   r,   <module>   sH    $ 
$	

t'

*
