
    3                        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J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Jr  S SKJr  S S	KJr  S S
KJr    S       SS jjr " S S5      r " S S\5      r " S S5      r " S S\5      r " S S5      r \
RB                  RE                  \(       + SS9 " S S\5      5       r#\
RB                  RE                  \(       + SS9 " S S\ 5      5       r$ " S S5      r%g)     )annotationsN)LONG_TIMEOUT)hypercorn_app)ProxyApp)run_hypercorn_in_thread)DEFAULT_CERTSHAS_IPV6SocketServerThread)HTTPConnection)SSLTransport)	parse_urlc                R   [        5       nU R                  [        5         U(       a  UR                  5       (       a   U$  U R	                  U5      n[        U[        5      (       d   eX4-  nUR                  S5      (       a   U$ Mg  ! [
        [        R                  4 a     M  f = f)Ns   

)	bytearray
settimeoutr   is_setrecvTimeoutErrorsockettimeout
isinstancebytesendswith)sockchunks
quit_eventconsumedbs        ;platform/gsutil/third_party/urllib3/dummyserver/testcase.pyconsume_socketr      s    
 {HOOL!
*++-- O			&!A !U####::k""O 
 fnn- 		s   B B&%B&c                  R   \ rS rSr% SrSrSrS\S'   S\S'   S	\S
'   S	\S'   S	\S'   S	\S'   S	\S'   S	\S'   S\S'   S\S'   S\S'   \ S     SS jj5       r	\  S        S!S jj5       r
\ S      S"S jj5       r\S#S j5       r\S$S j5       rS$S jr S       S%S jjrSrg)&SocketDummyServerTestCase+   z^
A simple socket-based server is created for this class that is good for
exactly one request.
http	localhostz#typing.ClassVar[SocketServerThread]server_threadtyping.ClassVar[int]porttyping.ClassVar[str]tmpdirca_pathcert_combined_path	cert_pathkey_pathpassword_key_pathztyping.ClassVar[ssl.SSLContext]server_contextclient_contextz*typing.ClassVar[SocketDummyServerTestCase]proxy_serverNc                0   [         R                  " 5       n[        UUU R                  US9U l        U R                  R                  5         UR                  S5        UR                  5       (       d  [        S5      eU R                  R                  U l	        g )Nsocket_handlerready_eventhostr      "most likely failed to start server)
	threadingEventr
   r6   r%   startwaitr   	Exceptionr'   clsr4   r   r5   s       r   _start_server'SocketDummyServerTestCase._start_serverC   s}      oo'.)#!	
 	!!!##@AA$$))    c                   ^^^^^ [         R                  " 5       m[         R                  " 5       mSUUUUU4S jjnU R                  UTS9  T$ )Nc                  > [        T5       GH  nTR                  5         U R                  [        5         TR	                  5       (       a    g  U R                  5       S   n [        UTS9  TR	                  5       (       a  UR                  5           g T(       am  TR                  [        5      (       dC  TR	                  5       (       a  UR                  5           g TR                  [        5      (       d  MC  TR                  5         UR                  T5        UR                  5         GM     g ! [        [        R                  4 a     GM  f = f)Nr   r   )rangesetr   r   r   acceptr   r   r   r   closer<   clearsend)listener_r   
block_sendnumr   r5   responses      r   r4   HSocketDummyServerTestCase.start_response_handler.<locals>.socket_handler`   s    3Z!##L1!((**!'03 t
;$$&&JJL(ool;;%,,.. JJL" )ool;; $$&		(#

/   )&..9 ! !s   D//EErE   )rL   socket.socketreturnNone)r9   r:   r@   )r?   rP   rO   rN   r4   r   r5   s    ``` @@r   start_response_handler0SocketDummyServerTestCase.start_response_handlerV   sB      oo'__&
	 	4 	.Z@rB   c                (    U R                  SUU5      $ )Ns&   HTTP/1.1 200 OK
Content-Length: 0

)rU   )r?   rO   rN   s      r   start_basic_handler-SocketDummyServerTestCase.start_basic_handler}   s      ));
 	
rB   c                    U R                   (       a  U R                   R                  5         U R                  [        S-  S-   5        U R	                  5       (       a  [        S5      eg )N   g      @zserver_thread did not exit)r   rG   joinr   is_aliver=   )r%   s    r   quit_server_thread,SocketDummyServerTestCase.quit_server_thread   sW    ##$$((* 	<!+c12!!##899 $rB   c                ^    [        U S5      (       a  U R                  U R                  5        g g Nr%   hasattrr^   r%   r?   s    r   teardown_class(SocketDummyServerTestCase.teardown_class   s(    3((""3#4#45 )rB   c                ^    [        U S5      (       a  U R                  U R                  5        g g ra   rb   )selfs    r   teardown_method)SocketDummyServerTestCase.teardown_method   s(    4))##D$6$67 *rB   c                    UR                  S5      nUc  S nOUR                  S5      n/ nU H:  nUR                  S5      u  pUR                  U5        X:X  d  M.  Uc  M3  X:X  a  M:   e   XF;   d   eg )Nasciis   : )encodesplitappend)
rh   received_headersheader_nameexpected_valueheader_name_bytesexpected_value_bytesheader_titlesheaderkeyvalues
             r   assert_header_received0SocketDummyServerTestCase.assert_header_received   s     (..w7!#' #1#8#8#A &Fe,JC  %',@,L444	 '
 !111rB    Nr4   z&typing.Callable[[socket.socket], None]r   threading.Event | NonerS   rT   )   N)rP   r   rO   intrN   r~   rS   threading.Event)rO   r   rN   r~   rS   r   )r%   r
   rS   rT   rS   rT   )rp   ztyping.Iterable[bytes]rq   strrr   z
str | NonerS   rT   )__name__
__module____qualname____firstlineno____doc__schemer6   __annotations__classmethodr@   rU   rX   staticmethodr^   re   ri   ry   __static_attributes__r{   rB   r   r!   r!   +   s\   
 FD66
  !!,,##""++3333<< .2*>* +* 
	* *$  -1	$$ $ +	$
 
$ $L @D

'=
	
 
 : : 6 68 &*	202 2 #	2
 
2 2rB   r!   c                  8    \ rS rSr\ S     SS jj5       rSrg)IPV4SocketDummyServerTestCase   Nc                R   [         R                  " 5       n[        UUU R                  US9U l        SU R                  l        U R                  R                  5         UR                  S5        UR                  5       (       d  [        S5      eU R                  R                  U l
        g )Nr3   Fr7   r8   )r9   r:   r
   r6   r%   USE_IPV6r;   r<   r   r=   r'   r>   s       r   r@   +IPV4SocketDummyServerTestCase._start_server   s      oo'.)#!	
 &+"!!!##@AA$$))rB   r{   r|   r}   )r   r   r   r   r   r@   r   r{   rB   r   r   r      s5     .2*>* +* 
	* *rB   r   c                  |    \ rS rSr% SrSrS\S'   S\S'   S\S'   0 rS	\S
'   S\S'   \SS j5       r	\SS j5       r
Srg)HypercornDummyServerTestCase   r$   	127.0.0.1r&   r'   r(   base_urlbase_url_alt&typing.ClassVar[dict[str, typing.Any]]certs%typing.ClassVar[contextlib.ExitStack]_stackc                   [         R                  " 5        n[        R                  " 5       nU R                  (       ad  U R                  S   Ul        U R                  S   Ul        U R                  S   Ul        U R                  S   Ul        U R                  S   Ul	        U R                   S3/Ul        UR                  [        U[        5      5        UR                  5       U l        ["        R$                  " [&        [)        UR                  S   5      R*                  5      U l        S S S 5        g ! , (       d  f       g = f)Ncertfilekeyfile	cert_reqsca_certsalpn_protocols:0r   )
contextlib	ExitStack	hypercornConfigr   r   r   verify_moder   r   r6   bindenter_contextr   r   pop_allr   typingcastr   r   r'   )r?   stackconfigs      r   setup_class(HypercornDummyServerTestCase.setup_class   s    !!#u%%'Fyy"%))J"7!$9!5%(YY{%;""%))J"7(+		2B(C%!hhZr?+FK 7 NOCJ{{3	&++a.(A(F(FGCH $##s   DD33
Ec                8    U R                   R                  5         g r|   r   rI   rd   s    r   re   +HypercornDummyServerTestCase.teardown_class       

rB   r{   Nr   )r   r   r   r   r6   host_altr   r   r   r   re   r   r{   rB   r   r   r      sW    DH
""&&46E1611H H  rB   r   c                  (    \ rS rSrSrSr\rSrSr	Sr
g)!HTTPSHypercornDummyServerTestCase   httpsr$    r{   N)r   r   r   r   r   r6   r   r   	certs_dirbad_ca_pathr   r{   rB   r   r   r      s    FDEIKrB   r   c                  >   \ rS rSr% SrS\S'   SrS\S'   S\S'   S\S	'   S\S
'   SrS\S'   SrS\S'   \	r
S\S'   S\S'   S\S'   S\S'   S\S'   SrS\S'   SrS\S'   S\S'   S\S'   S\S'   S\S'   SrS\S'   SrS\S'   S\S'   S\S'   \S$S  j5       r\S$S! j5       rS"rg#)%HypercornDummyProxyTestCase   r$   r(   	http_hostr   http_host_altr&   	http_porthttp_urlhttp_url_alt
https_hosthttps_host_altr   https_certs
https_port	https_urlhttps_url_althttps_url_fqdn
proxy_hostproxy_host_alt
proxy_port	proxy_urlhttps_proxy_porthttps_proxy_urlr   r   r   z!typing.ClassVar[threading.Thread]r%   r   r   c           	        [         R                  " 5        n[        R                  " 5       nU R                   S3/Ul        UR                  [        U[        5      5        [        R                  " [        [        UR
                  S   5      R                  5      U l        [        R                  " 5       nU R                  S   Ul        U R                  S   Ul        U R                  S   Ul        U R                  S   Ul        U R                  S   Ul        U R*                   S3/Ul        UR                  [        U[        5      5        [        R                  " [        [        UR
                  S   5      R                  5      U l        [        R                  " 5       nU R.                   S3/Ul        UR                  [        U[1        5       5      5        [        R                  " [        [        UR
                  S   5      R                  5      U l        [        R                  " 5       nU R                  S   Ul        U R                  S   Ul        U R                  S   Ul        U R                  S   Ul        U R                  S   Ul        U R.                   S3/Ul        U R                  R5                  S5      nUR                  [        U[1        U5      5      5        [        R                  " [        [        UR
                  S   5      R                  5      U l        UR9                  5       U l        S S S 5        g ! , (       d  f       g = f)Nr   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r'   r   r   r   r   r   r   r   r   r   r   r   r   getr   r   r   )r?   r   http_server_confighttps_server_confighttp_proxy_confighttps_proxy_configupstream_ca_certss          r   r   'HypercornDummyProxyTestCase.setup_class  s   !!#u!*!1!1!3*---';&<#'(:MJ #KKY7I7N7Nq7Q-R-W-WXCM"+"2"2"4+.??:+F(*-//)*D'.1ook.J++.??:+F(14AQ1R.+.>>*:"(='>$'(;]K $[[Y277:;@@CN !* 0 0 2),(8&;%<" 78I8: VW#[[i8I8N8Nq8Q.R.W.WXCN!*!1!1!3*-//**E'),)C&-0__[-I**-//**E'03@P0Q-*-..)9'<&=# # 3 3J ?'(:HEV<WX $*;;Y166q9:??$C  CJU $##s   L&M
Mc                8    U R                   R                  5         g r|   r   rd   s    r   re   *HypercornDummyProxyTestCase.teardown_class5  r   rB   r{   Nr   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   re   r   r{   rB   r   r   r      s    &1I#1*5M'5##""&&'2J$2+6N(6:GK7G$$##''(('2J$2+6N(6$$##**))&(I#((*K%*4411+) +)Z  rB   r   zIPv6 not available)reasonc                      \ rS rSrSrSrg) IPv6HypercornDummyServerTestCasei:  ::1r{   N)r   r   r   r   r6   r   r{   rB   r   r   r   :  s    DrB   r   c                  0    \ rS rSrSrSrSrSr\r	Sr
SrSrg)IPv6HypercornDummyProxyTestCasei?  r$   r   r   r{   N)r   r   r   r   r   r   r   r   r   r   r   r   r   r{   rB   r   r   r   ?  s%    IMJ NKJ NrB   r   c                      \ rS rSrSrSr\\R                      S	S j5       5       r	\S
SS jj5       r
\SS j5       rSrg)ConnectionMarkeriL  z
Marks an HTTP(S)Connection's socket after a request was made.

Helps a test server understand when a client finished a request,
without implementing a complete HTTP server.
s   $#MARK%04x*!c              #     ^ #    [         R                  n    SU 4S jjnUR                  5        nUR                  [         SU" U5      5        Sv   SSS5        g! , (       d  f       g= f7f)z)
Mark connections under in that context.
c                ,   >^          SUU 4S jjnU$ )Nc                   > T" U /UQ70 UD6  U R                   R                  TR                  U R                   S5      5        g )NF)r   sendall_get_socket_mark)rh   argskwargsr?   targets      r   part:ConnectionMarker.mark.<locals>.call_and_mark.<locals>.partd  s:     t-d-f-		!!#"6"6tyy%"HIrB   )rh   r   r   
typing.Anyr   r   rS   rT   r{   )r   r   r?   s   ` r   call_and_mark,ConnectionMarker.mark.<locals>.call_and_marka  s:    J$J-7JCMJJ J KrB   requestN)r   typing.Callable[..., None]rS   r   )r   r   contextsetattr)r?   monkeypatchorig_requestr   ms   `    r   markConnectionMarker.markV  s[      &--		.		'		   "aIIni|1LM #""s   -A,"A	A,
A)%A,c                    [        5       nU R                  US5      n UR                  U5      nU(       d   U$ X5-  nUR                  U5      (       a   U$ M:  )z8
Consume a socket until after the HTTP request is sent.
T)r   r   r   r   )r?   r   r   r   r   r   s         r   consume_request ConnectionMarker.consume_requestp  sb    
 ;##D$/		&!A  MH  && rB   c                ~    U(       a  UR                  5       S   nOUR                  5       S   nU R                  U4-  $ )Nr   )getpeernamegetsocknameMARK_FORMAT)r?   r   serverr'   s       r   r   !ConnectionMarker._get_socket_mark  s<    ##%a(D##%a(D$((rB   r{   N)r   zpytest.MonkeyPatchrS   z"typing.Generator[None, None, None])   )r   rR   r   r   rS   r   )r   rR   r  boolrS   r   )r   r   r   r   r   r  r   r   contextmanagerr   r   r   r   r{   rB   r   r   r   L  sf     "K,	+  0   ) )rB   r   )r  N)r   zSSLTransport | socket.socketr   r   r   r~   rS   r   )&
__future__r   r   r   sslr9   r   testr   r   pytestdummyserver.appr   dummyserver.asgi_proxyr   dummyserver.hypercornserverr   dummyserver.socketserverr   r	   r
   urllib3.connectionr   urllib3.util.ssltransportr   urllib3.util.urlr   r   r!   r   r   r   r   r   skipifr   r   r   r{   rB   r   <module>r     s   "   
      ) + ? P P - 2 &
 )-
& ' 	*A2 A2H*$= *, <(D L L^ L)=>'C  ? L)=>	!&A 	! ?	!:) :)rB   