
                        L   % S r SSKJr  SSKrSSKrSSKrSSKrSSKrSSKrSSK	r	SSK
r
SSKrSSKJr  SSKJr  SSKJr  SSKJrJr  \	R*                  (       a  SSKJr  \" S	5      r\R2                  " \5      r\R8                  R;                  \R8                  R=                  \5      S
5      r \R8                  R;                  \ S5      \R8                  R;                  \ S5      \RB                  \R8                  R;                  \ S5      SS/S.r"S\#S'   \R8                  R;                  \ S5      r$\R8                  R;                  \ S5      r%SS jr&SS jr'\'" S5      r(\'" S5      r) " S S\5      r* " S S\RV                  5      r,          S    S!S jjr-S"S jr.S#S jr/g)$z%
Dummy server used for unit testing.
    )annotationsN)default_backend)serialization)HTTPWarning)resolve_cert_reqsresolve_ssl_version)	ParamSpecPcertsz
server.crtz
server.keyz
cacert.pemh2zhttp/1.1)certfilekeyfile	cert_reqsca_certsalpn_protocolszdict[str, typing.Any]DEFAULT_CERTSz
cacert.keyc                    Sn [         R                  " U S[         R                  5       H#  nUu  n      nU[         R                  :X  d  M!  SnM%     U$ ! [         R                   a     U$ f = f)zGReturns True if the system resolves host to an IPv6 address by default.FNT)socketgetaddrinfo	AF_UNSPECAF_INET6gaierror)hostresolves_to_ipv6resaf_s        ?platform/gsutil/third_party/urllib3/dummyserver/socketserver.py_resolves_to_ipv6r   ,   st    %%dD&2B2BCC NB1aV__$#'  D  ?? s   AA A A+*A+c                   SnSn[         R                  (       aC   [         R                   " [         R                  5      nUR                  U S45        [	        S5      nU(       a  UR                  5         U$ ! [
         a     N%f = f)z4Returns True if the system can bind an IPv6 address.NFr   	localhost)r   has_ipv6r   bindr   	Exceptionclose)r   sockr"   s      r   	_has_ipv6r'   :   sk    DH	==1DIItQi (5H 

O  		s   AA6 6
BBr!   z::1c                      \ rS rSrSrSrg)NoIPv6Warning\   zIPv6 is not available N)__name__
__module____qualname____firstlineno____doc____static_attributes__r+       r   r)   r)   \   s    r2   r)   c                  d   ^  \ rS rSrSr\r   S         SU 4S jjjrS	S jrS	S jr	Sr
U =r$ )
SocketServerThread`   z
:param socket_handler: Callable which receives a socket argument for one
    request.
:param ready_event: Event which gets set when the socket handler is
    ready to receive requests.
c                `   > [         TU ]  5         SU l        Xl        X l        X0l        X@l        g )NT)super__init__daemonsocket_handlerr   ready_event
quit_event)selfr:   r   r;   r<   	__class__s        r   r8   SocketServerThread.__init__j   s-     	,	&$r2   c                   U R                   (       a%  [        R                  " [        R                  5      nO?[        R                  " S[
        5        [        R                  " [        R                  5      n[        R                  S:w  a/  UR                  [        R                  [        R                  S5        U   UR                  U R                  S45        UR                  5       S   U l        UR!                  S5        U R"                  (       a  U R"                  R%                  5         U R'                  U5        S S S 5        g ! , (       d  f       g = f)Nz&No IPv6 support. Falling back to IPv4.win32   r   )USE_IPV6r   r   warningswarnr)   AF_INETsysplatform
setsockopt
SOL_SOCKETSO_REUSEADDRr#   r   getsocknameportlistenr;   setr:   )r=   r&   s     r   _start_server SocketServerThread._start_servery   s    ====1DMMBMR==0D<<7"OOF--v/B/BAFIItyy!n%((*1-DI KKN  $$&% TTs   ;BE
Ec                $    U R                  5         g )N)rP   )r=   s    r   runSocketServerThread.run   s    r2   )r9   r   rM   r<   r;   r:   )r!   NN)
r:   z&typing.Callable[[socket.socket], None]r   strr;   threading.Event | Noner<   rV   returnNone)rW   rX   )r,   r-   r.   r/   r0   HAS_IPV6_AND_DNSrC   r8   rP   rS   r1   __classcell__)r>   s   @r   r4   r4   `   sc      H
  .2-1%>% % ,	%
 +% 
% %&* r2   r4   c
                f   [        U5      n[        S5      n
Uc  U
nO[        U5      n[        R                  " U5      nUR	                  X5        X;l        UR
                  U
:w  a  UR                  US9  U	(       a%  [        US5      (       a   UR                  U	5        U$ U$ ! [         a     U$ f = f)z>Return an equivalent SSLContext based on ssl.wrap_socket args.	CERT_NONE)cafileset_alpn_protocols)
r   r   ssl
SSLContextload_cert_chainverify_modeload_verify_locationshasattrr^   NotImplementedError)r   r   server_sider   ssl_versionr   do_handshake_on_connectsuppress_ragged_eofsciphersr   	cert_nonectxs               r   ssl_options_to_contextrm      s     &k2K!+.I	%i0	
..
%C*O
)#!!!2'#';<<	"">2 J3J # 	J	s   B" "
B0/B0c                     g)N)zsomething.invalidi1  r+   r+   r2   r   get_unreachable_addressro      s    'r2   c                4   [         R                  " U R                  5       S [        5       S9nUR	                  [         R
                  R                  [         R                  R                  [         R                  " U5      5      n[        R                  " U5      $ )N)passwordbackend)r   load_pem_private_keybytesr   private_bytesEncodingPEMPrivateFormatTraditionalOpenSSLBestAvailableEncryptiontrustmeBlob)private_key_pemrq   private_keyencrypted_keys       r   encrypt_key_pemr      st    44$8IK  --""##66--h7M
 <<&&r2   )r   rU   rW   bool)
NNNNNNNNNN)rg   zstr | int | NonerW   zssl.SSLContext)rW   ztuple[str, int])r}   trustme.Blobrq   rt   rW   r   )0r0   
__future__r   loggingosr   r_   rG   	threadingtypingrD   r{   cryptography.hazmat.backendsr   cryptography.hazmat.primitivesr   urllib3.exceptionsr   urllib3.utilr   r   TYPE_CHECKINGtyping_extensionsr	   r
   	getLoggerr,   logpathjoindirname__file__
CERTS_PATHCERT_OPTIONALr   __annotations__
DEFAULT_CADEFAULT_CA_KEYr   r'   rY   HAS_IPV6r)   Threadr4   rm   ro   r   r+   r2   r   <module>r      s   #  	  
 
     8 8 * ?	+#A!WW\\"''//(3W=
Z6ww||J5""Z6Z(($  WW\\*l3
j,76 [) UK /)) /f $( 
 " B(
	'r2   