
    >0                    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m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 d dlmZ d d	lmZ d d
lmZ ddlmZ d.dZ	 	 	 	 	 	 d/dZ G d dej>                        Z 	 d0	 	 	 	 	 	 	 d1dZ!ejD                  	 	 	 	 	 	 	 	 	 	 	 	 d2d       Z#ejD                  	 	 	 	 	 	 	 	 	 	 	 	 	 	 d3d       Z$ e	jJ                  g d      d4d       Z& e	jJ                         	 	 	 	 	 	 d5d       Z' e	jJ                         	 	 	 	 	 	 d5d       Z( e	jJ                         	 	 	 	 d6d       Z)e	jJ                  	 	 	 	 	 	 d7d       Z*e	jJ                  	 	 	 	 d8d       Z+e	jJ                  	 	 	 	 d6d       Z,e	jJ                  	 	 	 	 d8d       Z-e	jJ                  	 	 	 	 d8d       Z.e	jJ                  	 	 	 	 d6d       Z/e	jJ                  	 	 	 	 d6d        Z0e	jJ                  	 	 	 	 d6d!       Z1e	jJ                  d9d"       Z2 e	jJ                  d#$      d:d%       Z3 e	jJ                  d&$      d;d'       Z4 e	jJ                  d&$      d;d(       Z5 e	jJ                  d&$      d;d)       Z6 e	jJ                  d&$      d;d*       Z7 e	jJ                  d+d,g      d<d-       Z8y)=    )annotationsN)Path)hypercorn_app)ProxyApp)run_hypercorn_in_thread)HAS_IPV6)!HTTPSHypercornDummyServerTestCase)ssl_)	parse_url   )stub_timezone_ctxc                .    | j                  dddd       y )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                P   t        | j                  d            }t        j                  j	                  d      }t        j                  j	                  d      }|D ]G  }d|j
                  v r|s|j                  |       %|s(d|j
                  vs7|j                  |       I y )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                  H    e Zd ZU ded<   ded<   ded<   ded<   ed	d       Zy)
ServerConfigstrschemehostintportca_certsc                j    | j                   }d|v rd| d}| j                   d| d| j                   S )N:[]z://)r.   r-   r0   )selfr.   s     r   base_urlzServerConfig.base_url9   s>    yy$;tfA;D++c$q44r   N)returnr,   )__name__
__module____qualname____annotations__propertyr7    r   r   r+   r+   3   s(    K
I
IM5 5r   r+   c                    t        |d|z  z        }t        |d|z  z        }| j                  j                  |       | j                  d   j                  |       ||d}|S )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_dirrK   A   sh     Fh456I6X345H&&x0)))4 i8ELr   c              #    K   t        |dz        }|j                  j                  |       t        ||      }t	        j
                         }|d   |_        |d   |_        | dg|_        t        |t              5  t        j                  t        t        |j                  d         j                        }t!        | |||       d d d        y # 1 sw Y   y xY ww)Nca.pemrA   r@   :0r   )r,   cert_pemrC   rK   	hypercornConfigrA   r@   bindr   r   typingcastr/   r   r0   r+   )	r-   r.   rF   caserver_certca_cert_pathserver_certsr#   r0   s	            r   run_server_in_threadrY   L   s      v()LKKl+%k6:LF":.FO!),FNV2;-FK	 	7{{3	&++a. 9 > >?64|<< 
8	7	7s   A9C;AC	CCCc              #  P  K   t        |dz        }|j                  j                  |       t        ||      }t        ||d      }t	        j
                         5 }	t        j                         }
|d   |
_        |d   |
_	        dg|
_
        |	j                  t        |
t                     t        j                  t         t#        |
j                  d         j$                        }t        j                         }|d   |_        |d   |_	        | dg|_
        |	j                  t        |t'                            t        j                  t         t#        |j                  d         j$                        }t)        | |||      t)        dd	||      f d d d        y # 1 sw Y   y xY ww)
NrM   proxyrA   r@   zlocalhost:0r   rN   https	localhost)r,   rO   rC   rK   
contextlib	ExitStackrP   rQ   rA   r@   rR   enter_contextr   r   rS   rT   r/   r   r0   r   r+   )proxy_scheme
proxy_hostrF   rU   
proxy_certrV   rW   rX   proxy_certsstackserver_configr0   proxy_config
proxy_ports                 r   run_server_and_proxy_in_threadri   ]   sj     v()LKKl+%k6: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
 z:|L+t\B
 	
 
 		s   AF&D8F	F&F#F&)r]   	127.0.0.1::1)paramsc              #  l   K   | j                   }|dk(  rt        st        j                  d       | y w)Nrk   zTest requires IPv6 on loopback)paramr   r   r    )requestr.   s     r   loopback_hostrp      s*     ==Du}X45
Js   24c              #     K   |j                  d      }t        j                         }|j                  |       }t	        d| |||      5 }| d d d        y # 1 sw Y   y xY ww)NrJ   r\   mktemptrustmeCA
issue_certrY   rp   tmp_path_factoryrF   rU   rV   cfgs         r   
san_serverrz      sU      $$W-F	B--.K	g}fb+	NRU	 
O	N	N   AA"A	A"AA"c              #     K   |j                  d      }t        j                         }|j                  |       }t	        d| |||      5 }| d d d        y # 1 sw Y   y xY ww)NrJ   common_namer\   rr   rw   s         r   no_san_serverr      sW      $$W-F	B--M-:K	g}fb+	NRU	 
O	N	N   AA#	A	A#A A#c              #     K   | j                  d      }t        j                         }|j                  d      }t	        dd|||      5 }| d d d        y # 1 sw Y   y xY ww)NrJ   example.comr}   r\   r]   rr   rx   rF   rU   rV   ry   s        r   )no_san_server_with_different_commmon_namer      sW      $$W-F	B--M-:K	g{FB	LPS	 
M	L	Lr   c              #     K   |j                  d      }t        j                         }|j                  |       }|j                  d      }t	        d| ||||      5 }| d d d        y # 1 sw Y   y xY ww)NrJ   r]   r\   rs   rt   ru   rv   ri   )rp   rx   rF   rU   rc   rV   ry   s          r   san_proxy_with_serverr      sk      $$W-F	B}-J--,K	'J
		
 
 
   AA4A(	A4(A1-A4c              #     K   | j                  d      }t        j                         }|j                  d      }|j                  d      }t	        dd||||      5 }| d d d        y # 1 sw Y   y xY ww)NrJ   r]   r}   r\   r   rx   rF   rU   rc   rV   ry   s         r   no_san_proxy_with_serverr      sm      $$W-F	B;7J--,K	'fb*k
		
 
 
s   AA5A) 	A5)A2.A5c              #     K   | j                  d      }t        j                         }|j                  d      }t	        dd|||      5 }| d d d        y # 1 sw Y   y xY ww)NrJ   r   r\   r]   rr   r   s        r   no_localhost_san_serverr      sU      $$W-F	B--.K	g{FB	LPS	 
M	L	Lr{   c              #     K   | j                  d      }t        j                         }|j                  d      }|j                  d      }t	        dd||||      5 }| d d d        y # 1 sw Y   y xY ww)NrJ   rj   r]   r\   r   r   s         r   ipv4_san_proxy_with_serverr      sk      $$W-F	B{+J--,K	'fb*k
		
 
 
r   c              #     K   | j                  d      }t        j                         }|j                  d      }|j                  d      }t	        dd||||      5 }| d d d        y # 1 sw Y   y xY ww)NrJ   rk   r]   r\   r   r   s         r   ipv6_san_proxy_with_serverr      sk      $$W-F	Bu%J--,K	'J
		
 
 
r   c              #     K   | j                  d      }t        j                         }|j                  d      }t	        dd|||      5 }| d d d        y # 1 sw Y   y xY ww)NrJ   rj   r\   rr   r   s        r   ipv4_san_serverr      sU      $$W-F	B--,K	g{FB	LPS	 
M	L	Lr{   c              #     K   t         st        j                  d       | j                  d      }t	        j
                         }|j                  d      }t        dd|||      5 }| d d d        y # 1 sw Y   y xY ww)NOnly runs on IPv6 systemsrJ   rk   r\   r   r   r    rs   rt   ru   rv   rY   r   s        r   ipv6_san_serverr   	  sd      /0$$W-F	B--&K	gufb+	F#	 
G	F	Fs   A!A=#A1(	A=1A:6A=c              #     K   t         st        j                  d       | j                  d      }t	        j
                         }|j                  d      }t        dd|||      5 }| d d d        y # 1 sw Y   y xY ww)Nr   rJ   rk   r}   r\   r   r   s        r   ipv6_no_san_serverr     sf      /0$$W-F	B--E-2K	gufb+	F#	 
G	F	Fs   A"A>$A2)	A>2A;7A>c              #  h   K   t        | j                        5  d ddd       y# 1 sw Y   yxY ww)zC
    A pytest fixture that runs the test with a stub timezone.
    N)r   rn   ro   s    r   stub_timezoner   )  s"     
 
7==	) 
*	)	)s   2&	2/2session)scopec            	        t               } t        }|j                          dt        j                  j
                  fdt        j                  j                  fdt        j                  j                  fdfD ]  \  }}t        t        |d      }|dk(  rt        j                  |j                  |j                  f      }	 t        j                  |t        j                  t        j                   ||            }| j#                  |j%                                |j)                           |j+                          | S # t        j&                  $ r Y 9w xY w)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.   r0   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   >;D<<EEfunctionc                X    t        t        d      rd| vrt        j                  d       yy)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                X    t        t        d      rd| vrt        j                  d       yy)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                X    t        t        d      rd| vrt        j                  d       yy)zTest requires TLSv1.2 availabler   zTLSv1.2zTest requires TLSv1.2Nr   r   s    r   requires_tlsv1_2r   f  r   r   c                Z    t        t        dd      rd| vrt        j                  d       yy)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              #     K   | j                   dk(  rt        j                  j                          | j                    | j                   dk(  rt        j                  j	                          y y w)Nr   )rn   urllib3http2inject_into_urllib3extract_from_urllib3r   s    r   http_versionr   w  sM     }}))+
--}}**, s   A+A-)r   zpytest.Parserr8   None)r#   zpytest.Configr$   zlist[pytest.Item]r8   r   )server)rE   trustme.LeafCertrF   r   rG   r,   r8   zdict[str, str])r-   r,   r.   r,   rF   r   rU   
trustme.CArV   r   r8   *typing.Generator[ServerConfig, None, None])ra   r,   rb   r,   rF   r   rU   r   rc   r   rV   r   r8   ?typing.Generator[tuple[ServerConfig, ServerConfig], None, None])ro   z
typing.Anyr8   !typing.Generator[str, None, None])rp   r,   rx   pytest.TempPathFactoryr8   r   )rx   r   r8   r   )rp   r,   rx   r   r8   r   )rx   r   r8   r   )ro   pytest.FixtureRequestr8   z"typing.Generator[None, None, None])r8   ztyping.AbstractSet[str | None])r   ztyping.AbstractSet[str]r8   r   )ro   r   r8   r   )9
__future__r   r^   r   r   rS   pathlibr   rP   r   rt   urllib3.http2r   dummyserver.appr   dummyserver.asgi_proxyr   dummyserver.hypercornserverr   dummyserver.socketserverr   dummyserver.testcaser	   urllib3.utilr
   urllib3.util.urlr   tz_stubr   r   r)   
NamedTupler+   rK   contextmanagerrY   ri   fixturerp   rz   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   