o
    i#'                     @  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 ddlmZ ddlmZmZ ejrMd dlmZ dd	lmZ d)d*ddZdd Zdd Zdd Z	
					
d+ddZG dd dZ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)Iterable)HTTPHeaderDictTcontextssl.SSLContextc                 C  sr   t r|r| jt  d d S z|   W d S  tjy8   tjdkr1ttdr1dD ]}t	| | q)| 
  Y d S w )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   M/home/ubuntu/.local/lib/python3.10/site-packages/yt_dlp/networking/_helper.pyssl_load_certs   s   r    c              	   C  st   zdd t |D }W n
 ty   Y d S w |D ]}tt j | j|d W d    n1 s2w   Y  qd S )Nc                 S  s4   g | ]\}}}|d kr|du st jjj|v 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}n1|j dkr tj}d}n$|j dkr-tj}d}n|j dkr:tj}d}n
t	d|j  dd	 }||j
|jpOd
|||j||jdS )Nsocks5Fsocks5hTsocks4socks4azUnknown SOCKS proxy version: c                 S  s   | s| S t j| S N)urllibparseunquote_plus)sr   r   r   unquote_if_non_emptyF   s   z3make_socks_proxy_opts.<locals>.unquote_if_non_emptyi8  )	proxytypeaddrportrdnsusernamepassword)r5   r6   urlparseschemelowerr   SOCKS5SOCKS4SOCKS4A
ValueErrorhostnamer<   r>   r?   )socks_proxyurl_components
socks_typer=   r9   r   r   r   make_socks_proxy_opts5   s,   rK   c                 C  s,   |dkr
| dkr
d} |dv r| dkrd} | S )z Unified redirect method handlingi/  HEADGET)i-  i.  POSTr   )methodstatusr   r   r   get_redirect_methodT   s
   rQ   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 d    n1 s6w   Y  | rBt|| |rQ| jdO  _|d nt jdkrft jdsf|d t jj|_|rz
|j|||d	 W n t jy~   td
w t|dd d urd|_|S )Nkeylog_filenameSSLKEYLOGFILEzhttp/1.1   DEFAULT)r   r   r   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getrR   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   )verifyclient_certificateclient_certificate_keyclient_certificate_passwordlegacy_supportr   r   r   r   r   make_ssl_contextd   s<   



rs   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di | d S Nr   )_InstanceStoreMixin__instancessuper__init__)selfkwargs	__class__r   r   rx      s   zInstanceStoreMixin.__init__c                  K  s   t r4   )rb   )rz   r   r   r   _create_instance   s   z#InstanceStoreMixin._create_instancec                 K  sD   | j D ]\}}||kr|  S q| jdi |}| j ||f |S ru   )rv   r}   append)ry   rz   keyinstancer   r   r   _get_instance   s   z InstanceStoreMixin._get_instancec                 C  s    t t|dd r|  d S d S )Nclose)callablerm   r   )ry   r   r   r   r   _close_instance   s   z"InstanceStoreMixin._close_instancec                 C  s(   | j D ]	\}}| | q| j   d S r4   )rv   r   clear)ry   _r   r   r   r   _clear_instances   s   z#InstanceStoreMixin._clear_instances)
__name__
__module____qualname__rx   staticmethodr}   r   r   r   __classcell__r   r   r{   r   rt      s    
	rt   headersr
   supported_encodingsIterable[str]c                 C  s"   d| vrd |p
d| d< d S d S )NzAccept-Encodingz, identity)join)r   r   r   r   r   add_accept_encoding_header   s   r   c                   s   t   fdd}|S )Nc              
     sD   z | g|R i |W S  t y! } z	|jd u r| |_ d }~ww r4   )r   handler)ry   argsrz   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  sh   | \}}}}}t  |||}z|t jur|| |r || || |W S  ty3   |   w r4   )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 |||}
z1| }||	d |	d d |
jdi | |tjur0|
| |r7|
| |
|  |
W S  t	yJ   |

   w )Nr   r   )r;   r<   r   )r   copyupdatesetproxyr   r   r   r   r   r   r   )	dest_addr
proxy_argsproxy_ip_addrr   r   r   r   r   r   r   r   connect_proxy_argsr   r   r   create_socks_proxy_socket   s    



r   )_create_socket_funcc                  s   | \}}t ||dt j}|std|d urBd|d vr t jnt j  fdd|D }|sBtd t jkr7dnd d	|d  d
d }|D ]#}z||||}	d }|	W   S  tyi }
 z|
}W Y d }
~
qFd }
~
ww z|d }w )Nr   z!getaddrinfo returns an empty list:c                   s   g | ]
}|d   kr|qS )r   r   )r%   r;   r   r   r   r)      s    z%create_connection.<locals>.<listcomp>zNo remote IPvrT      z- addresses available for connect. Can't use "z" as source address)r   getaddrinfoSOCK_STREAMr   AF_INETAF_INET6)addressr   r   r   hostr<   ip_addrserrr   r   r   r   r   r   create_connection   s4   

r   )T)r   r   )TNNNFT)r   r
   r   r   )$
__future__r   r,   r   r_   r   r   r   typingurllib.parser5   urllib.request
exceptionsr   dependenciesr   socksr   r   TYPE_CHECKINGcollections.abcr	   utils.networkingr
   r    r   rK   rQ   rs   rt   r   r   r   r   r   r   r   r   r   r   <module>   sJ    
9
