U
    gZ)                     @  s4  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 ddlmZ ddlmZmZ ddlmZmZ ejrd d	lmZ dd
lmZ d+ddddZdd Zdd Zdd Zdd Zd,ddZ G dd dZ!dddd d!Z"d"d# Z#d$d% Z$d&d' Z%ej&dfe$d(d)d*Z'dS )-    )annotationsN   )RequestError   )certifi)	ProxyTypesockssocket)format_fieldtraverse_obj)Iterable)HTTPHeaderDictTzssl.SSLContext)contextc                 C  sr   t r|r| jt  d nTz|   W nF tjk
rl   tjdkr`ttdr`dD ]}t	| | qP| 
  Y nX d S )N)cafilewin32enum_certificates)CAROOT)r   load_verify_locationswhereload_default_certssslSSLErrorsysplatformhasattrssl_load_windows_store_certsset_default_verify_paths)r   use_certifi	storename r   =/tmp/pip-unpacked-wheel-q5ljy6pj/yt_dlp/networking/_helper.pyssl_load_certs   s    r!   c              
   C  sb   zdd t |D }W n tk
r.   Y d S X |D ](}tt j | j|d W 5 Q R X q4d S )Nc                 S  s4   g | ],\}}}|d kr|dks,t jjj|kr|qS )x509_asnT)r   PurposeSERVER_AUTHoid).0certencodingtrustr   r   r    
<listcomp>,   s
     z0ssl_load_windows_store_certs.<locals>.<listcomp>)cadata)r   r   PermissionError
contextlibsuppressr   r   )ssl_contextr   certsr'   r   r   r    r   )   s    r   c                 C  s   t j| }|j dkr&tj}d}nb|j dkr@tj}d}nH|j dkrZtj}d}n.|j dkrttj}d}nt	d|j  dd	 }||j
|jpd
|||j||jdS )NZsocks5FZsocks5hTZsocks4Zsocks4azUnknown SOCKS proxy version: c                 S  s   | s| S t j| S N)urllibparseunquote_plus)sr   r   r    unquote_if_non_emptyG   s    z3make_socks_proxy_opts.<locals>.unquote_if_non_emptyi8  )Z	proxytypeaddrportrdnsusernamepassword)r2   r3   urlparseschemelowerr   ZSOCKS5ZSOCKS4ZSOCKS4A
ValueErrorhostnamer8   r:   r;   )Zsocks_proxyurl_componentsZ
socks_typer9   r6   r   r   r    make_socks_proxy_opts6   s,    rB   c                 C  sd   t j| }d|krR|jt|jdd }t j|d|d irBdS t j|rRdS t	||j
p^ddS )z'Unified proxy selector for all backendsnoNz:%shttpall)r2   r3   r<   r@   r	   r8   requestproxy_bypass_environmentproxy_bypassr
   r=   )urlproxiesrA   hostportr   r   r    select_proxyU   s    rL   c                 C  s,   |dkr| dkrd} |dkr(| dkr(d} | S )z Unified redirect method handlingi/  HEADGET)i-  i.  POSTr   )methodstatusr   r   r    get_redirect_methodb   s
    rR   Fc              	   C  s  t t j}| |_| rt jnt j|_t|dr@tj	
dp<d |_tt |dg W 5 Q R X | rpt|| |r| jdO  _|d n*t jdkrt jds|d t jj|_|r
z|j|||d	 W n t jk
r   td
Y nX t|dd d k	r
d|_|S )Nkeylog_filenameSSLKEYLOGFILEzhttp/1.1   DEFAULT)r   r   r   ZLibreSSLzX@SECLEVEL=2:ECDH+AESGCM:ECDH+CHACHA20:ECDH+AES:DHE+AES:!aNULL:!eNULL:!aDSS:!SHA1:!AESCCM)keyfiler;   z!Unable to load client certificatepost_handshake_authT)r   
SSLContextPROTOCOL_TLS_CLIENTcheck_hostnameCERT_REQUIRED	CERT_NONEverify_moder   osenvirongetrS   r-   r.   NotImplementedErrorset_alpn_protocolsr!   optionsset_ciphersOPENSSL_VERSION_INFOOPENSSL_VERSION
startswith
TLSVersionTLSv1_2minimum_versionload_cert_chainr   r   getattrrX   )verifyZclient_certificateZclient_certificate_keyZclient_certificate_passwordZlegacy_supportr   r   r   r   r    make_ssl_contextr   s:    


 
ro   c                      s@   e Zd Z fddZedd Zdd Zdd Zd	d
 Z  Z	S )InstanceStoreMixinc                   s   g | _ t jf | d S r1   )_InstanceStoreMixin__instancessuper__init__)selfkwargs	__class__r   r    rs      s    zInstanceStoreMixin.__init__c                  K  s   t d S r1   )rb   )ru   r   r   r    _create_instance   s    z#InstanceStoreMixin._create_instancec                 K  s@   | j D ]\}}||kr|  S q| jf |}| j ||f |S r1   )rq   rx   append)rt   ru   keyinstancer   r   r    _get_instance   s    
z InstanceStoreMixin._get_instancec                 C  s   t t|dd r|  d S )Nclose)callablerm   r}   )rt   r{   r   r   r    _close_instance   s    z"InstanceStoreMixin._close_instancec                 C  s(   | j D ]\}}| | q| j   d S r1   )rq   r   clear)rt   _r{   r   r   r    _clear_instances   s    z#InstanceStoreMixin._clear_instances)
__name__
__module____qualname__rs   staticmethodrx   r|   r   r   __classcell__r   r   rv   r    rp      s   
	rp   r   zIterable[str]headersZsupported_encodingsc                 C  s   d| krd |pd| d< d S )NzAccept-Encodingz, identity)joinr   r   r   r    add_accept_encoding_header   s    r   c                   s   t   fdd}|S )Nc              
     sL   z | f||W S  t k
rF } z|jd kr4| |_ W 5 d }~X Y nX d S r1   )r   handler)rt   argsru   efuncr   r    wrapper   s    
z$wrap_request_errors.<locals>.wrapper)	functoolswraps)r   r   r   r   r    wrap_request_errors   s    r   c           	      C  sr   | \}}}}}t  |||}z2|t jk	r2|| |r@|| || |W S  tk
rl   |   Y nX d S r1   )socket_GLOBAL_DEFAULT_TIMEOUT
settimeoutbindconnectOSErrorr}   )	ip_addrtimeoutsource_addressafsocktypeproto	canonnamesasockr   r   r    _socket_connect   s    



r   c                 C  s   |\}}}}}	t |||}
z^| }||	d |	d d |
jf | |tjk	r\|
| |rj|
| |
|  |
W S  t	k
r   |

   Y nX d S )Nr   r   )r7   r8   )r   copyupdateZsetproxyr   r   r   r   r   r   r}   )Z	dest_addrZ
proxy_argsZproxy_ip_addrr   r   r   r   r   r   r   r   Zconnect_proxy_argsr   r   r    create_socks_proxy_socket   s    



r   )_create_socket_funcc                  s   | \}}t ||dt j}|s&td|d k	rd|d kr@t jnt j  fdd|D }|std t jkrndnd d	|d  d
d }|D ]F}z||||}	d }|	W   S  tk
r }
 z|
}W 5 d }
~
X Y qX qz|W 5 d }X d S )Nr   z!getaddrinfo returns an empty list:c                   s   g | ]}|d   kr|qS )r   r   )r&   r7   r   r   r    r*   	  s      z%create_connection.<locals>.<listcomp>zNo remote IPvrU      z- addresses available for connect. Can't use "z" as source address)r   getaddrinfoSOCK_STREAMr   AF_INETAF_INET6)addressr   r   r   hostr8   Zip_addrserrr   r   r   r   r   r    create_connection   s,    
"
r   )T)TNNNFT)(
__future__r   r-   r   r_   r   r   r   typingurllib.parser2   urllib.request
exceptionsr   Zdependenciesr   socksr   r   utilsr	   r
   TYPE_CHECKINGcollections.abcr   Zutils.networkingr   r!   r   rB   rL   rR   ro   rp   r   r   r   r   r   r   r   r   r   r    <module>   sL         
9