
                        6   U d Z 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 ddlmZmZ e	j*                  rddlmZ  ed	      Z ej2                  e      Zej8                  j;                  ej8                  j=                  e      d
      Z ej8                  j;                  e d      ej8                  j;                  e d      ejB                  ej8                  j;                  e d      ddgdZ"de#d<   ej8                  j;                  e d      Z$ej8                  j;                  e d      Z%ddZ&ddZ' e'd      Z( e'd      Z) G d de      Z* G d dejV                        Z,	 	 	 	 	 	 	 	 	 	 d 	 	 	 d!dZ-d"dZ.d#dZ/y)$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                    d}	 t        j                  | dt         j                        D ]   }|\  }}}}}|t         j                  k(  sd}" 	 |S # t         j                  $ r Y |S w xY w)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                    d}d}t         j                  rB	 t        j                   t         j                        }|j                  | df       t	        d      }|r|j                          |S # t
        $ r Y w xY w)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A+ +	A76A7r!   z::1c                      e Zd ZdZy)NoIPv6WarningzIPv6 is not availableN)__name__
__module____qualname____doc__     r   r)   r)   \   s    r/   r)   c                  R     e Zd ZdZeZ	 	 	 d	 	 	 	 	 	 	 	 	 d fdZddZddZ xZ	S )SocketServerThreadz
    :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                h    t         |           d| _        || _        || _        || _        || _        y )NT)super__init__daemonsocket_handlerr   ready_event
quit_event)selfr6   r   r7   r8   	__class__s        r   r4   zSocketServerThread.__init__j   s5     	,	&$r/   c                   | j                   r$t        j                  t        j                        }n=t        j                  dt
               t        j                  t        j                        }t        j                  dk7  r/|j                  t        j                  t        j                  d       |5  |j                  | j                  df       |j                         d   | _        |j!                  d       | j"                  r| j"                  j%                          | j'                  |       d d d        y # 1 sw Y   y xY w)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listenr7   setr6   )r9   r&   s     r   _start_serverz SocketServerThread._start_servery   s    ====1DMMBMR==0D<<7"OOF--v/B/BAFIItyy!n%((*1-DI KKN  $$&% TTs   2A>D99Ec                $    | j                          y )N)rK   )r9   s    r   runzSocketServerThread.run   s    r/   )r!   NN)
r6   z&typing.Callable[[socket.socket], None]r   strr7   threading.Event | Noner8   rO   returnNone)rP   rQ   )
r*   r+   r,   r-   HAS_IPV6_AND_DNSr>   r4   rK   rM   __classcell__)r:   s   @r   r1   r1   `   sY      H
  .2-1%>% % ,	%
 +% 
%&*r/   r1   c
                T   t        |      }t        d      }
||
}nt        |      }t        j                  |      }|j	                  ||        ||_        |j
                  |
k7  r|j                  |       |	r t        |d      r	 |j                  |	       |S |S # t        $ r Y |S w xY w)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hasattrrW   NotImplementedError)r   r   server_sider   ssl_versionr   do_handshake_on_connectsuppress_ragged_eofsciphersr   	cert_nonectxs               r   ssl_options_to_contextrf      s     &k2K!+.I	%i0	
..
%C'*CO
)#!!!2'#';<	"">2 J3J # 	J	s   B 	B'&B'c                      y)N)zsomething.invalidi1  r.   r.   r/   r   get_unreachable_addressrh      s    'r/   c                4   t        j                  | j                         d t                     }|j	                  t         j
                  j                  t         j                  j                  t        j                  |            }t        j                  |      S )N)passwordbackend)r   load_pem_private_keybytesr   private_bytesEncodingPEMPrivateFormatTraditionalOpenSSLBestAvailableEncryptiontrustmeBlob)private_key_pemrj   private_keyencrypted_keys       r   encrypt_key_pemry      st    44$8IK  --""##66--h7M
 <<&&r/   )r   rN   rP   bool)
NNNNNNNNNN)r`   zstr | int | NonerP   zssl.SSLContext)rP   ztuple[str, int])rv   trustme.Blobrj   rm   rP   r{   )0r-   
__future__r   loggingosr   rX   rB   	threadingtypingr?   rt   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'   rR   HAS_IPV6r)   Threadr1   rf   rh   ry   r.   r/   r   <module>r      s   #  	  
 
     8 8 * ?	+#Ag!WW\\"''//(3W=
Z6ww||J5""Z6Z(($  WW\\*l3
j,76 [) UK /)) /f $( 
 " B(
	'r/   