
    yf)                    N   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 ddlmZ ddlmZmZ ddlmZmZ ej.                  rd d	lmZ dd
lmZ dddZd Zd Zd Zd Z 	 	 	 	 	 	 ddZ! G d d      Z"ddZ#d Z$d Z%d Z&ejN                  dfe%ddZ(y)    )annotationsN   )RequestErrorUnsupportedRequest   )certifi)	ProxyTypesockssocket)format_fieldtraverse_obj)Iterable)HTTPHeaderDictc                >   t         r'|r%| j                  t        j                                y 	 | j                          y # t        j
                  $ rI t        j                  dk(  r#t        t        d      rdD ]  }t        | |        | j                          Y y w xY 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)contextuse_certifi	storenames      ;/usr/lib/python3/dist-packages/yt_dlp/networking/_helper.pyssl_load_certsr#      s    ;%%W]]_%=
	/&&( || 	/||w&738K+L!/ EI0)DE,,.	/s   A   ABBc                   	 t        j                  |      D cg c]7  \  }}}|dk(  r,|du s&t         j                  j                  j                  |v r|9 }}}}|D ]@  }t        j                  t         j                        5  | j                  |       d d d        B y c c}}}w # t
        $ r Y y w xY w# 1 sw Y   cxY w)Nx509_asnT)cadata)
r   r   PurposeSERVER_AUTHoidPermissionError
contextlibsuppressr   r   )ssl_contextr!   certencodingtrustcertss         r"   r   r   )   s    363H3H3S M M/$%
*d]ckk&=&=&A&AU&J  M M
  ;  . 	;--T-:	; 	;;M  	; 	;s.   B( <B!B( B7!B( (	B43B47C 	c                   t         j                  j                  |       }|j                  j	                         dk(  rt
        j                  }d}n|j                  j	                         dk(  rt
        j                  }d}n|j                  j	                         dk(  rt
        j                  }d}nV|j                  j	                         dk(  rt
        j                  }d}n&t        d|j                  j	                                d }||j                  |j                  xs d	| ||j                         ||j                        d
S )Nsocks5Fsocks5hTsocks4socks4azUnknown SOCKS proxy version: c                H    | s| S t         j                  j                  |       S N)urllibparseunquote_plus)ss    r"   unquote_if_non_emptyz3make_socks_proxy_opts.<locals>.unquote_if_non_emptyG   s    H||((++    i8  )	proxytypeaddrportrdnsusernamepassword)r9   r:   urlparseschemelowerr	   SOCKS5SOCKS4SOCKS4A
ValueErrorhostnamerA   rC   rD   )socks_proxyurl_components
socks_typerB   r=   s        r"   make_socks_proxy_optsrP   6   s   \\**;7N""$0%%
				$	$	&)	3%%
				$	$	&(	2%%
				$	$	&)	3&&
89N9N9T9T9V8WXYY,
  ''##+t()@)@A()@)@A r>   c                R   t         j                  j                  |       }d|v rj|j                  t	        |j
                  dd      z   }t         j                  j                  |d|d   i      ryt         j                  j                  |      ryt        ||j                  xs dd      S )z'Unified proxy selector for all backendsnoNz:%shttpall)r9   r:   rE   rL   r   rA   requestproxy_bypass_environmentproxy_bypassr   rF   )urlproxiesrN   hostports       r"   select_proxyr[   U   s    \\**3/Nw!**\.:M:MtUZ-[[>>228dGDM=RS^^((2!6!6!@&%HHr>   c                4    |dk(  r| dk7  rd} |dv r| dk(  rd} | S )z Unified redirect method handlingi/  HEADGET)i-  i.  POST )methodstatuss     r"   get_redirect_methodrc   b   s2    
 }6)
 & 0Mr>   c                \   t        j                  t         j                        }| |_        | rt         j                  nt         j
                  |_        t        |d      r(t        j                  j                  d      xs d |_        t        j                  t              5  |j                  dg       d d d        | rt!        ||       |r'|xj"                  dz  c_        |j%                  d       nbt         j&                  dk\  rOt         j(                  j+                  d      s0|j%                  d       t         j,                  j.                  |_        |r)	 |j3                  |||	       t9        |dd       d|_        |S # 1 sw Y   xY w# t         j4                  $ r t7        d
      w xY w)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)keyfilerD   z!Unable to load client certificatepost_handshake_authT)r   
SSLContextPROTOCOL_TLS_CLIENTcheck_hostnameCERT_REQUIRED	CERT_NONEverify_moder   osenvirongetre   r+   r,   NotImplementedErrorset_alpn_protocolsr#   optionsset_ciphersOPENSSL_VERSION_INFOOPENSSL_VERSION
startswith
TLSVersionTLSv1_2minimum_versionload_cert_chainr   r   getattrrk   )verifyclient_certificateclient_certificate_keyclient_certificate_passwordlegacy_supportr    r   s          r"   make_ssl_contextr   r   sl    nnS445G#G/5#++3==Gw)*"$**.."A"IT
 
		0	1 1""J<01w,1I&		!	!Y	.s7J7J7U7UV`7a 	f	h"%.."8"8	D##",B4 $ 6 7148D*.G'NI1 1> || 	DBCC	Ds   F F  F	F+c                  @     e Zd Z fdZed        Zd Zd Zd Z xZ	S )InstanceStoreMixinc                2    g | _         t        |   di | y Nr`   )_InstanceStoreMixin__instancessuper__init__)selfkwargs	__class__s     r"   r   zInstanceStoreMixin.__init__   s    "6"r>   c                     t         r8   )ru   )r   s    r"   _create_instancez#InstanceStoreMixin._create_instance   s    !!r>   c                    | j                   D ]  \  }}||k(  s|c S   | j                  di |}| j                   j                  ||f       |S r   )r   r   append)r   r   keyinstances       r"   _get_instancez InstanceStoreMixin._get_instance   s\    !-- 	 MCf}	  )4((262 23r>   c                R    t        t        |dd             r|j                          y y )Nclose)callabler   r   )r   r   s     r"   _close_instancez"InstanceStoreMixin._close_instance   s"    GHgt45NN 6r>   c                    | j                   D ]  \  }}| j                  |        | j                   j                          y r8   )r   r   clear)r   _r   s      r"   _clear_instancesz#InstanceStoreMixin._clear_instances   s;    ++ 	+KAx  *	+ r>   )
__name__
__module____qualname__r   staticmethodr   r   r   r   __classcell__)r   s   @r"   r   r      s+    # " "!r>   r   c                >    d| vrdj                  |      xs d| d<   y y )NzAccept-Encodingz, identity)join)headerssupported_encodingss     r"   add_accept_encoding_headerr      s)    '%)YY/B%C%Qz!" (r>   c                B     t        j                          fd       }|S )Nc                h    	  | g|i |S # t         $ r}|j                  | |_         d }~ww xY wr8   )r   handler)r   argsr   efuncs       r"   wrapperz$wrap_request_errors.<locals>.wrapper   sA    	.t.v..! 	yy  		s    	1,1)	functoolswraps)r   r   s   ` r"   wrap_request_errorsr      s%    __T  Nr>   c                   | \  }}}}}t        j                   |||      }	 |t         j                  ur|j                  |       |r|j                  |       |j	                  |       |S # t
        $ r |j                           w xY wr8   )socket_GLOBAL_DEFAULT_TIMEOUT
settimeoutbindconnectOSErrorr   )	ip_addrtimeoutsource_addressafsocktypeproto	canonnamesasocks	            r"   _socket_connectr      s~    )0&B%B==Xu-D	&888OOG$IIn%R 

s   AA* *Bc                t   |\  }}}}}	t        |||      }
	 |j                         }|j                  |	d   |	d   d        |
j                  di | |t        j
                  ur|
j                  |       |r|
j                  |       |
j                  |        |
S # t        $ r |
j                           w xY w)Nr   r   )r@   rA   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_argss               r"   create_socks_proxy_socketr      s    )6&B%Br8U+D'__.!!2a5"Q%"@A+*+&888OOG$IIn%Y 

s   BB B7)_create_socket_funcc                  | \  }}t        j                  ||dt         j                        }|st        d      |kd|d   vrt         j                  nt         j
                  }|D cg c]  }|d   |k(  s| }}|s*t        d|t         j                  k(  rdnd d|d    d      d }	|D ]  }
	  ||
||      }d }	|c S  	 |	c c}w # t        $ r}|}	Y d }~-d }~ww xY w# d }	w xY w)	Nr   z!getaddrinfo returns an empty list:zNo remote IPvrg      z- addresses available for connect. Can't use "z" as source address)r   getaddrinfoSOCK_STREAMr   AF_INETAF_INET6)addressr   r   r   hostrA   ip_addrsr   r@   errr   r   r   s                r"   create_connectionr      s    JD$!!$a1C1CDH9::!".*;;V^^%-?TaBD??R6>>%9qA B-a011DFG G C 	&wHD CK	% @  	C	 s0   &C4C.C C 	CCCC#)T)r   zssl.SSLContext)TNNNFT)r   r   r   zIterable[str]))
__future__r   r+   r   rr   r   r   r   typingurllib.parser9   urllib.request
exceptionsr   r   dependenciesr   socksr	   r
   utilsr   r   TYPE_CHECKINGcollections.abcr   utils.networkingr   r#   r   rP   r[   rc   r   r   r   r   r   r   r   r   r`   r>   r"   <module>r      s    "   	  
 
    8 " * .	(1/"
;>
I"  $6r! !8R
	( **&
 (&r>   