
    >0                    b   S SK J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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  S SKJr  S S	KJr  S S
KJr  SSKJr  S.S jr      S/S jr " S S\R>                  5      r  S0       S1S jjr!\RD                              S2S j5       r#\RD                                S3S j5       r$\	RJ                  " / SQS9S4S j5       r&\	RJ                  " 5             S5S j5       r'\	RJ                  " 5             S5S j5       r(\	RJ                  " 5           S6S j5       r)\	RJ                        S7S j5       r*\	RJ                      S8S j5       r+\	RJ                      S6S j5       r,\	RJ                      S8S j5       r-\	RJ                      S8S j5       r.\	RJ                      S6S j5       r/\	RJ                      S6S  j5       r0\	RJ                      S6S! j5       r1\	RJ                  S9S" j5       r2\	RJ                  " S#S$9S:S% j5       r3\	RJ                  " S&S$9S;S' j5       r4\	RJ                  " S&S$9S;S( j5       r5\	RJ                  " S&S$9S;S) j5       r6\	RJ                  " S&S$9S;S* j5       r7\	RJ                  " S+S,/S9S<S- j5       r8g)=    )annotationsN)Path)hypercorn_app)ProxyApp)run_hypercorn_in_thread)HAS_IPV6)!HTTPSHypercornDummyServerTestCase)ssl_)	parse_url   )stub_timezone_ctxc                (    U R                  SSSSS9  g )N--integration
store_trueFzrun integration tests only)actiondefaulthelp)	addoption)parsers    4platform/gsutil/third_party/urllib3/test/conftest.pypytest_addoptionr      s!    
)	      c                j   [        U R                  S5      5      n[        R                  R	                  SS9n[        R                  R	                  SS9nU HY  nSUR
                  ;   a  U(       d  UR                  U5        M-  U(       d  M6  SUR
                  ;  d  MH  UR                  U5        M[     g )Nr   z*skipping, need --integration option to run)reasonz4skipping non integration tests in --integration modeintegration)bool	getoptionpytestmarkskipkeywords
add_marker)configitemsintegration_modeskip_integrationskip_normalitems         r   pytest_collection_modifyitemsr)   "   s     F,,_=>{{''; (  ++""E # K DMM)2BOO,--t}}"DOOK(	 r   c                  R    \ rS rSr% S\S'   S\S'   S\S'   S\S'   \SS j5       rS	rg
)ServerConfig3   strschemehostintportca_certsc                n    U R                   nSU;   a  SU S3nU R                   SU SU R                   3$ )N:[]z://)r/   r.   r1   )selfr/   s     r   base_urlServerConfig.base_url9   s>    yy$;tfA;D++c$q44r    N)returnr-   )__name__
__module____qualname____firstlineno____annotations__propertyr8   __static_attributes__r:   r   r   r+   r+   3   s(    K
I
IM5 5r   r+   c                    [        USU-  -  5      n[        USU-  -  5      nU R                  R                  U5        U R                  S   R                  U5        XCS.nU$ )Nz%s.pemz%s.keyr   )keyfilecertfile)r-   private_key_pemwrite_to_pathcert_chain_pems)certtmpdirfile_prefix	cert_pathkey_pathcertss         r   _write_cert_to_dirrO   A   sf     Fh456I6X345H&&x0)))4 8ELr   c              #    #    [        US-  5      nUR                  R                  U5        [        XB5      n[        R
                  " 5       nUS   Ul        US   Ul        U S3/Ul        [        U[        5         [        R                  " [        [        UR                  S   5      R                  5      n[!        XX5      v   S S S 5        g ! , (       d  f       g = f7f)Nca.pemrE   rD   :0r   )r-   cert_pemrG   rO   	hypercornConfigrE   rD   bindr   r   typingcastr0   r   r1   r+   )	r.   r/   rJ   caserver_certca_cert_pathserver_certsr#   r1   s	            r   run_server_in_threadr]   L   s      v()LKKl+%k:LF":.FO!),FNV2;-FK	 	7{{3	&++a. 9 > >?6<< 
8	7	7s   A9C;A
C	C
CCc              #  Z  #    [        US-  5      nUR                  R                  U5        [        XR5      n[        XBS5      n[        R
                  " 5        n	[        R                  " 5       n
US   U
l        US   U
l	        S/U
l
        U	R                  [        U
[        5      5        [        R                  " [         [#        U
R                  S   5      R$                  5      n[        R                  " 5       nUS   Ul        US   Ul	        U S3/Ul
        U	R                  [        U['        5       5      5        [        R                  " [         [#        UR                  S   5      R$                  5      n[)        XX5      [)        SS	X5      4v   S S S 5        g ! , (       d  f       g = f7f)
NrQ   proxyrE   rD   zlocalhost:0r   rR   https	localhost)r-   rS   rG   rO   
contextlib	ExitStackrT   rU   rE   rD   rV   enter_contextr   r   rW   rX   r0   r   r1   r   r+   )proxy_scheme
proxy_hostrJ   rY   
proxy_certrZ   r[   r\   proxy_certsstackserver_configr1   proxy_config
proxy_ports                 r   run_server_and_proxy_in_threadrm   ]   s_     v()LKKl+%k:L$ZAK				5!((*!-j!9 ,Y 7+_3M=QR{{3	-*<*<Q*? @ E EF '') +J 7*95 *|2./3L(*MN[[i0A0A!0D&E&J&JK
 :L+tB
 	
 
 		s   AF+D9F	F+
F($F+)ra   	127.0.0.1::1)paramsc              #  z   #    U R                   nUS:X  a!  [        (       d  [        R                  " S5        Uv   g 7f)Nro   zTest requires IPv6 on loopback)paramr   r   r    )requestr/   s     r   loopback_hostrt      s+     ==Du}XX45
Js   9;c              #     #    UR                  S5      n[        R                  " 5       nUR                  U 5      n[	        SXX45       nUv   S S S 5        g ! , (       d  f       g = f7f)NrN   r`   mktemptrustmeCA
issue_certr]   rt   tmp_path_factoryrJ   rY   rZ   cfgs         r   
san_serverr~      sP      $$W-F	B--.K	g}b	NRU	 
O	N	Ns   AA&A	A&
A#A&c              #     #    UR                  S5      n[        R                  " 5       nUR                  U S9n[	        SXX45       nUv   S S S 5        g ! , (       d  f       g = f7f)NrN   common_namer`   rv   r{   s         r   no_san_serverr      sR      $$W-F	B--M-:K	g}b	NRU	 
O	N	Ns   AA$A
	A$
A!A$c              #     #    U R                  S5      n[        R                  " 5       nUR                  SS9n[	        SSXU5       nUv   S S S 5        g ! , (       d  f       g = f7f)NrN   example.comr   r`   ra   rv   r|   rJ   rY   rZ   r}   s        r   )no_san_server_with_different_commmon_namer      sT      $$W-F	B--M-:K	g{F	LPS	 
M	L	Ls   AA%A	A%
A"A%c              #     #    UR                  S5      n[        R                  " 5       nUR                  U 5      nUR                  S5      n[	        SXX4U5       nUv   S S S 5        g ! , (       d  f       g = f7f)NrN   ra   r`   rw   rx   ry   rz   rm   )rt   r|   rJ   rY   rg   rZ   r}   s          r   san_proxy_with_serverr      sf      $$W-F	B}-J--,K	'
		
 
 
   AA8A'	A8'
A51A8c              #     #    U R                  S5      n[        R                  " 5       nUR                  SS9nUR                  S5      n[	        SSXX45       nUv   S S S 5        g ! , (       d  f       g = f7f)NrN   ra   r   r`   r   r|   rJ   rY   rg   rZ   r}   s         r   no_san_proxy_with_serverr      sh      $$W-F	B;7J--,K	'f*
		
 
 
s   AA6A%	A6%
A3/A6c              #     #    U R                  S5      n[        R                  " 5       nUR                  S5      n[	        SSXU5       nUv   S S S 5        g ! , (       d  f       g = f7f)NrN   r   r`   ra   rv   r   s        r   no_localhost_san_serverr      sR      $$W-F	B--.K	g{F	LPS	 
M	L	L   AA'A	A'
A$ A'c              #     #    U R                  S5      n[        R                  " 5       nUR                  S5      nUR                  S5      n[	        SSXX45       nUv   S S S 5        g ! , (       d  f       g = f7f)NrN   rn   ra   r`   r   r   s         r   ipv4_san_proxy_with_serverr      sf      $$W-F	B{+J--,K	'f*
		
 
 
r   c              #     #    U R                  S5      n[        R                  " 5       nUR                  S5      nUR                  S5      n[	        SSXX45       nUv   S S S 5        g ! , (       d  f       g = f7f)NrN   ro   ra   r`   r   r   s         r   ipv6_san_proxy_with_serverr      sf      $$W-F	Bu%J--,K	'J
		
 
 
r   c              #     #    U R                  S5      n[        R                  " 5       nUR                  S5      n[	        SSXU5       nUv   S S S 5        g ! , (       d  f       g = f7f)NrN   rn   r`   rv   r   s        r   ipv4_san_serverr      sR      $$W-F	B--,K	g{F	LPS	 
M	L	Lr   c              #    #    [         (       d  [        R                  " S5        U R                  S5      n[        R
                  " 5       nUR                  S5      n[        SSXU5       nUv   S S S 5        g ! , (       d  f       g = f7f)NOnly runs on IPv6 systemsrN   ro   r`   r   r   r    rw   rx   ry   rz   r]   r   s        r   ipv6_san_serverr   	  sc      8/0$$W-F	B--&K	guf+	F#	 
G	F	Fs   A'B)A7.	B7
BBc              #    #    [         (       d  [        R                  " S5        U R                  S5      n[        R
                  " 5       nUR                  SS9n[        SSXU5       nUv   S S S 5        g ! , (       d  f       g = f7f)Nr   rN   ro   r   r`   r   r   s        r   ipv6_no_san_serverr     se      8/0$$W-F	B--E-2K	guf+	F#	 
G	F	Fs   A%B'A5,	B5
B?Bc              #  r   #    [        U R                  5         Sv   SSS5        g! , (       d  f       g= f7f)z;
A pytest fixture that runs the test with a stub timezone.
N)r   rr   rs   s    r   stub_timezoner   )  s!     
 
7==	) 
*	)	)s   7&	7
47session)scopec            
        [        5       n [        nUR                  5         S[        R                  R
                  4S[        R                  R                  4S[        R                  R                  4S4 H  u  p#[        [        US5      nUS:X  a  M  [        R                  " UR                  UR                  45      n [        R                  " U[        R                  " [        R                   UUS9S9nU R#                  UR%                  5       5        UR)                  5         M     UR+                  5         U $ ! [        R&                   a     N<f = f)NPROTOCOL_TLSv1PROTOCOL_TLSv1_1PROTOCOL_TLSv1_2)PROTOCOL_TLSNr   )	cert_reqsssl_minimum_versionssl_maximum_version)ssl_context)setr	   setup_classssl
TLSVersionTLSv1TLSv1_1TLSv1_2getattrsocketcreate_connectionr/   r1   r
   ssl_wrap_socketcreate_urllib3_context	CERT_NONEaddversionSSLErrorcloseteardown_class)tls_versions_server_ssl_version_namemin_max_version_ssl_version_socks         r   supported_tls_versionsr   2  s    5L/G	3>>//0	S^^334	S^^334	/* s$5q91((',,)EF	.(( 77!mm(7(7E U]]_-//0  || 		s    7D<<EEfunctionc                h    [        [        S5      (       a  SU ;  a  [        R                  " S5        gg)zTest requires TLSv1 availabler   r   zTest requires TLSv1Nhasattrr   r   r    r   s    r   requires_tlsv1r   X  s-     3())W<R-R)* .Sr   c                h    [        [        S5      (       a  SU ;  a  [        R                  " S5        gg)zTest requires TLSv1.1 availabler   zTLSv1.1zTest requires TLSv1.1Nr   r   s    r   requires_tlsv1_1r   _  -     3*++y@V/V+, 0Wr   c                h    [        [        S5      (       a  SU ;  a  [        R                  " S5        gg)zTest requires TLSv1.2 availabler   zTLSv1.2zTest requires TLSv1.2Nr   r   s    r   requires_tlsv1_2r   f  r   r   c                j    [        [        SS5      (       a  SU ;  a  [        R                  " S5        gg)zTest requires TLSv1.3 availableHAS_TLSv1_3FzTLSv1.3zTest requires TLSv1.3N)r   r   r   r    r   s    r   requires_tlsv1_3r   m  s.     C..22+, 3r   h11h2c              #     #    U R                   S:X  a  [        R                  R                  5         U R                   v   U R                   S:X  a  [        R                  R	                  5         g g 7f)Nr   )rr   urllib3http2inject_into_urllib3extract_from_urllib3r   s    r   http_versionr   w  sL     }}))+
--}}**, s   A-A/)r   zpytest.Parserr;   None)r#   zpytest.Configr$   zlist[pytest.Item]r;   r   )server)rI   trustme.LeafCertrJ   r   rK   r-   r;   zdict[str, str])r.   r-   r/   r-   rJ   r   rY   
trustme.CArZ   r   r;   *typing.Generator[ServerConfig, None, None])re   r-   rf   r-   rJ   r   rY   r   rg   r   rZ   r   r;   ?typing.Generator[tuple[ServerConfig, ServerConfig], None, None])rs   z
typing.Anyr;   !typing.Generator[str, None, None])rt   r-   r|   pytest.TempPathFactoryr;   r   )r|   r   r;   r   )rt   r-   r|   r   r;   r   )r|   r   r;   r   )rs   pytest.FixtureRequestr;   z"typing.Generator[None, None, None])r;   ztyping.AbstractSet[str | None])r   ztyping.AbstractSet[str]r;   r   )rs   r   r;   r   )9
__future__r   rb   r   r   rW   pathlibr   rT   r   rx   urllib3.http2r   dummyserver.appr   dummyserver.asgi_proxyr   dummyserver.hypercornserverr   dummyserver.socketserverr   dummyserver.testcaser	   urllib3.utilr
   urllib3.util.urlr   tz_stubr   r   r)   
NamedTupler+   rO   contextmanagerr]   rm   fixturert   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r:   r   r   <module>r      s   "   
       ) + ? - B  & &))"3)	)"56$$ 5 >F
$(7: ===$(=.8=GW=/= =   
 
 
  
 		 

 ! 
 " 
 E 
  
F 89 : 		*@	/	 	 *@/  ,/  *@D  ,D  	,	/	 	 ,D   ,D   	,	/	 	 ,/  ,/    i " !"J j!+ "+ j!- "- j!- "- j!- "- t}%- &-r   