
    ^hp                     (   S SK JrJr  S SKJrJrJrJrJrJ	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Jr  S SKJr  S SKJr  S S	KJrJr  S S
KJr  S SKJrJ r J!r!J"r"J#r#  S SK$J%r%  S SK&J'r'J(r(J)r)  S SK*J+r+J,r,  S SK-r-S SK.r.S SK/r/S SK0r0S SK1r1S SK2r2S SK3r3S SK4r4S SK5r5S SK6r6S SK7r7S SK8r9S SK:r:S SK;J<r<  S SK=r=\=R|                  (       a  S SK=J?r?J@r@  S rA " S S\5      rB " S S\(5      rC " S S\ 5      rD " S S\7R                  5      rF " S S\(5      rG " S S\5      rH " S S \(5      rI " S! S"\(5      rJ " S# S$\(5      rK " S% S&\K5      rL " S' S(\5      rM " S) S*\5      rN " S+ S,\B5      rO " S- S.\ \B5      rP " S/ S0\B5      rQ\% " S1 S2\!5      5       rR\7R                  " \T" \2S35      (       + =(       d    \4R                  S4:H  S55       " S6 S7\R5      5       rV\7R                  " \T" \2S35      =(       a    \4R                  R                  S85      (       + S95       " S: S;\R5      5       rX " S< S=\5      rY " S> S?\5      rZ " S@ SA\Z\5      r[ " SB SC\Z\5      r\ " SD SE\5      r] " SF SG\5      r^ " SH SI\5      r_ " SJ SK\5      r` " SL SM\5      ra " SN SO\5      rbg)P    )gennetutil)json_decodejson_encodeutf8_unicoderecursive_unicode
native_str)HTTP1Connection)	HTTPError)
HTTPServer)HTTPHeadersHTTPMessageDelegateHTTPServerConnectionDelegateResponseStartLine)IOStream)Event)gen_logapp_logSimpleAsyncHTTPClient)AsyncHTTPTestCaseAsyncHTTPSTestCaseAsyncTestCase	ExpectLoggen_test)abstract_base_test)ApplicationRequestHandlerstream_request_body)closingcontextmanagerN)BytesIO)DictListc                    ^^#    / m " UU4S jS[         5      n[        U S5      mU" 5       nTR                  U5      I Sh  vN   UR                  UR                  SR                  T5      4$  N,7f)z]Reads an HTTP response from `stream` and returns a tuple of its
start_line, headers and body.c                   4   > \ rS rSrS rU 4S jrU4S jrSrg)"read_stream_body.<locals>.Delegate<   c                     X l         Xl        g Nheaders
start_lineselfr.   r-   s      V/home/james-whalen/.local/lib/python3.13/site-packages/tornado/test/httpserver_test.pyheaders_received3read_stream_body.<locals>.Delegate.headers_received=   s    "L(O    c                 (   > TR                  U5        g r+   )append)r0   chunkchunkss     r1   data_received0read_stream_body.<locals>.Delegate.data_receivedA   s    MM% r4   c                 &   > TR                  5         g r+   )detachr0   conns    r1   finish)read_stream_body.<locals>.Delegate.finishD   s    KKMr4   r,   N)__name__
__module____qualname____firstlineno__r2   r9   r?   __static_attributes__)r8   r>   s   r1   Delegater(   <   s    	)	!	 	r4   rF   TNr4   )r   r   read_responser.   r-   join)streamrF   delegater8   r>   s      @@r1   read_stream_bodyrK   7   so      F	 	& 	 64(DzH


X
&&& 0 0#((62BBB 's   =A0A.-A0c                   $    \ rS rSrSrS rS rSrg)HandlerBaseTestCaseM   Nc                 F    [        SU R                  R                  4/5      $ N/)r   	__class__Handlerr0   s    r1   get_appHandlerBaseTestCase.get_appP   s    S$.."8"89:;;r4   c                 p    U R                   " U0 UD6nUR                  5         [        UR                  5      $ r+   )fetchrethrowr   body)r0   argskwargsresponses       r1   
fetch_jsonHandlerBaseTestCase.fetch_jsonS   s0    ::t.v.8==))r4    )rA   rB   rC   rD   rS   rU   r^   rE   r`   r4   r1   rM   rM   M   s    G<*r4   rM   c                   *    \ rS rSrSS jrS rS rSrg)HelloWorldRequestHandlerY   c                     Xl         g r+   expected_protocol)r0   protocols     r1   
initialize#HelloWorldRequestHandler.initializeZ   s    !)r4   c                     U R                   R                  U R                  :w  a  [        S5      eU R	                  S5        g )Nzunexpected protocolHello world)requestrg   rf   	Exceptionr?   rT   s    r1   getHelloWorldRequestHandler.get]   s2    <<  D$:$::122M"r4   c                 f    U R                  S[        U R                  R                  5      -  5        g )NzGot %d bytes in POST)r?   lenrl   rZ   rT   s    r1   postHelloWorldRequestHandler.postb   s#    *S1B1B-CCDr4   re   N)http)rA   rB   rC   rD   rh   rn   rr   rE   r`   r4   r1   rb   rb   Y   s    *#
Er4   rb   c                   8    \ rS rSrS rS rS rS rS rS r	Sr
g	)
SSLTestf   c                 6    [        S[        [        SS94/5      $ )NrQ   httpsrg   )r   rb   dictrT   s    r1   rU   SSLTest.get_appg   s    S":D'<RSTUUr4   c                 ^    [        SS[        R                  0[        R                  " 5       D6$ )Nssl_versionr`   )r{   sslPROTOCOL_TLS_SERVERr   default_ssl_optionsrT   s    r1   get_ssl_optionsSSLTest.get_ssl_optionsj   s.     
//
 446
 	
r4   c                 ^    U R                  S5      nU R                  UR                  S5        g )NrQ      Hello worldrX   assertEqualrZ   r0   r]   s     r1   test_sslSSLTest.test_sslp   s#    ::c?7r4   c                 d    U R                  SSSS-  S9nU R                  UR                  S5        g )NrQ   POSTAi  methodrZ   s   Got 5000 bytes in POSTr   r   s     r1   test_large_postSSLTest.test_large_postt   s/    ::c&sTz:B(ABr4   c           
      v   [        [        S5         [        [        SSS9   U R                  [        [        45         U R                  U R                  S5      R                  SS5      SSS	S
9  S S S 5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       N(= f! , (       d  f       g = f)Nz(SSL Error|uncaught exception)Uncaught exceptionFrequiredrQ   https:http:  T)request_timeoutconnect_timeoutraise_error)r   r   assertRaisesIOErrorr   rX   get_urlreplacerT   s    r1   test_non_ssl_requestSSLTest.test_non_ssl_requestx   s     w @A7$85I&&';<JJS)11(GD(,(,$(	   = J BA<< JI BAs9   B*B2B/B7B*
BB
B'	#B**
B8c                 V   [        [        S5       nU R                  [        [        45         U R                  U R                  S5      R                  SS5      SS9  S S S 5        S S S 5        U R                  WR                  5        g ! , (       d  f       N2= f! , (       d  f       N;= f)Nz	SSL ErrorrQ   r   r   T)r   )
r   r   r   r   r   rX   r   r   assertFalselogged_stack)r0   
expect_logs     r1   test_error_loggingSSLTest.test_error_logging   s    w,
""GY#78

LL%--h@d   9 -
 	001	 98 -,s"   B0B	B	
B	B
B(r`   N)rA   rB   rC   rD   rU   r   r   r   r   r   rE   r`   r4   r1   rv   rv   f   s"    V
8C2r4   rv   c                        \ rS rSrS rS rSrg)BadSSLOptionsTest   c                 P    [        5       nU R                  [        [        USS0S9  g )Nkeyfilez/__missing__.crtssl_options)r   r   KeyErrorr   )r0   applications     r1   test_missing_arguments(BadSSLOptionsTest.test_missing_arguments   s.    !m"$67	 	 	
r4   c                    [        5       n[        R                  R                  [        5      n[        R                  R                  US5      n[        R                  R                  US5      nU R                  [        [        4[        USS0S9  U R                  [        [        4[        UUSS.S9  [        UX4S.S9  g)	z6A missing SSL key should cause an immediate exception.ztest.crtztest.keycertfilez/__mising__.crtr   z/__missing__.key)r   r   N)
r   ospathdirname__file__rH   r   
ValueErrorr   r   )r0   r   
module_direxisting_certificateexisting_keys        r1   test_missing_key"BadSSLOptionsTest.test_missing_key   s     "mWW__X.
!ww||J
Cww||J
;!#%67	 	 	
 	!0-	 	 	
 	%9S	
r4   r`   N)rA   rB   rC   rD   r   r   rE   r`   r4   r1   r   r      s    

r4   r   c                       \ rS rSrS rSrg)MultipartTestHandler   c           	         U R                  U R                  R                  S   U R                  S5      U R                  R                  S   S   R
                  [        U R                  R                  S   S   S   5      S.5        g )NzX-Header-Encoding-Testargumentfilesr   rZ   )headerr   filenamefilebody)r?   rl   r-   get_argumentr   r   r   rT   s    r1   rr   MultipartTestHandler.post   sr    ,,../GH --j9 LL..w7:CC$T\\%7%7%@%CF%KL		
r4   r`   NrA   rB   rC   rD   rr   rE   r`   r4   r1   r   r      s    
r4   r   c                   F    \ rS rSrS rS rS
S jrS rS r\	S 5       r
Srg	)HTTPConnectionTest   c                 "    S[         4S[        4/$ )Nz
/multipart/hello)r   rb   rT   s    r1   get_handlersHTTPConnectionTest.get_handlers   s    /0/0
 	
r4   c                 4    [        U R                  5       5      $ r+   )r   r   rT   s    r1   rU   HTTPConnectionTest.get_app   s    4,,.//r4   c                   ^ ^ [        [        [        R                  " 5       5      5       mT R                  R	                  U U4S j5        TR                  UR                  U[        S[        U5      -  5      /-   5      U-   U-   U-   5        T R                  R	                  U4S j5      u  pAnUsS S S 5        $ ! , (       d  f       g = f)Nc                  F   > TR                  ST R                  5       45      $ N	127.0.0.1)connectget_http_portr0   rI   s   r1   <lambda>.HTTPConnectionTest.raw_fetch.<locals>.<lambda>   s    T5G5G5I'JKr4   zContent-Length: %dc                     > [        T 5      $ r+   )rK   rI   s   r1   r   r      s    (0r4   )	r!   r   socketio_looprun_syncwriterH   r   rq   )r0   r-   rZ   newliner.   rI   s   `    @r1   	raw_fetchHTTPConnectionTest.raw_fetch   s    Xfmmo./6LL!!K LLW-ACI-M(N'OOP  )-(=(=0)%J  0//s   BB::
Cc                 n   U R                  / SQSR                  SSSR                  5       SSR                  5       SSR                  5       S	S/	5      5      n[        U5      nU R	                  S
US   5        U R	                  SUS   5        U R	                  SUS   5        U R	                  SUS   5        g )N)s   POST /multipart HTTP/1.0s6   Content-Type: multipart/form-data; boundary=1234567890s   X-Header-encoding-test:    
s-   Content-Disposition: form-data; name=argumentr4      ás   --1234567890u;   Content-Disposition: form-data; name="files"; filename="ó"   ús   --1234567890--   ér   r      ór   r   )r   rH   encoder   r   r0   r]   datas      r1   test_multipart_form&HTTPConnectionTest.test_multipart_form   s     >>
 LLDOO%#U\\^OO%%

( 8$4>24
#344
#344
#34r4   c                 ^    S H'  nU R                  S/SUS9nU R                  US5        M)     g )N)r      
s   GET /hello HTTP/1.0r4   )r   r   )r   r   )r0   r   r]   s      r1   test_newlines HTTPConnectionTest.test_newlines   s4    'G~~'=&>W~UHX~6 (r4   c              #     #    [        [        R                  " 5       5      nUR                  SU R                  5       45      v   UR	                  SR                  / SQ5      5      v   UR                  S5      v nU R                  UR                  S5      U5        UR	                  S5        UR                  S5      v nU R                  UR                  S5      U5        UR                  S5      v n[        R                  " [        UR                  S5      5      5      nUR                  [        US	   5      5      v nU R                  US
5        UR!                  5         g 7f)Nr   r   )s   POST /hello HTTP/1.1s   Host: 127.0.0.1s   Content-Length: 1024s   Expect: 100-continues   Connection: closer      

s   HTTP/1.1 100 s   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa   HTTP/1.1 200latin1Content-Lengths   Got 1024 bytes in POST)r   r   r   r   r   rH   
read_until
assertTrue
startswithr   parser
   decode
read_bytesintr   close)r0   rI   r   
first_lineheader_datar-   rZ   s          r1   test_100_continue$HTTPConnectionTest.test_100_continue  s&    
 &--/*nnk4+=+=+?@AAllLL	
 	
 &&{33(894@[!!,,W55

--o>
K"--k::##J{/A/A(/K$LM&&s73C+D'EFF89s   E"E$r`   N)r   )rA   rB   rC   rD   r   rU   r   r   r   r   r  rE   r`   r4   r1   r   r      s/    
0 5:7  r4   r   c                        \ rS rSrS rS rSrg)EchoHandleri"  c                 `    U R                  [        U R                  R                  5      5        g r+   r   r	   rl   	argumentsrT   s    r1   rn   EchoHandler.get#      

$T\\%;%;<=r4   c                 `    U R                  [        U R                  R                  5      5        g r+   r	  rT   s    r1   rr   EchoHandler.post&  r  r4   r`   NrA   rB   rC   rD   rn   rr   rE   r`   r4   r1   r  r  "  s    >>r4   r  c                   ,    \ rS rSrS rS rS rS rSrg)TypeCheckHandleri*  c           	      @   0 U l         S[        4S[        4S[        4S[        4S[        4S[        4S[        4S[        4/nU H,  u  p#U R                  U[        U R                  U5      U5        M.     U R                  S	[        U R                  R                  R                  5       5      S
   [        5        U R                  S[        U R                  R                  R                  5       5      S
   [        5        U R                  S[        U R                  R                  R                  5       5      S
   [        5        U R                  S[        U R                  R                  R                  5       5      S
   R                  [        5        U R                  S[        U R                  R                  R                  5       5      S
   [        5        U R                  S[        U R                  R                  R                  5       5      S
   S
   [        5        g )Nr   uriversion	remote_iprg   hostr   query
header_keyr   header_value
cookie_keycookie_valuearg_key	arg_value)errorsstr
check_typegetattrrl   listr-   keysvaluescookiesvaluer
  bytes)r0   fieldsfieldexpected_types       r1   prepareTypeCheckHandler.prepare+  s   sOCL#SMSMcN	
 %+ EOOE74<<#?O %+ 	d4<<+?+?+D+D+F&G&JCPT\\-A-A-H-H-J(KA(NPSTd4<<+?+?+D+D+F&G&JCPD!5!5!<!<!>?BHH#	

 		4(>(>(C(C(E#Fq#I3OT$,,*@*@*G*G*I%J1%Ma%PRWXr4   c                     U R                  SU R                  R                  [        5        U R	                  U R
                  5        g )NrZ   )r   rl   rZ   r'  r   r  rT   s    r1   rr   TypeCheckHandler.postF  s,     1 159

4;;r4   c                 :    U R                  U R                  5        g r+   )r   r  rT   s    r1   rn   TypeCheckHandler.getJ  s    

4;;r4   c                 P    [        U5      nX4:w  a  SU SU 3U R                  U'   g g )Nz	expected z, got )typer  )r0   nameobjr*  actual_types        r1   r   TypeCheckHandler.check_typeM  s1    3i'"+M?& NDKK (r4   )r  N)	rA   rB   rC   rD   r+  rr   rn   r   rE   r`   r4   r1   r  r  *  s    Y6  Or4   r  c                       \ rS rSrS rSrg)PostEchoHandleriS  c                 R    U R                  [        U R                  S5      S95        g )Nr   )echo)r   r{   r   )r0   	path_argss     r1   rr   PostEchoHandler.postT  s    

4T..v678r4   r`   Nr   r`   r4   r1   r8  r8  S  s    9r4   r8  c                       \ rS rSrSS jrSrg)PostEchoGBKHandleriX  Nc                 `     UR                  S5      $ ! [         a    [        SSU-  5      ef = f)Ngbk  zinvalid gbk bytes: %r)r   rm   r   )r0   r&  r3  s      r1   decode_argument"PostEchoGBKHandler.decode_argumentY  s;    	B<<&& 	BC!85!@AA	Bs    -r`   r+   )rA   rB   rC   rD   rB  rE   r`   r4   r1   r>  r>  X  s    Br4   r>  c                   >    \ rS rSrS rS rS rS rS rS r	S r
S	rg
)HTTPServerTesti`  c                 ^    [        S[        4S[        4S[        4S[        4S[        4/5      $ )N/echo
/typecheck//doubleslashz
/post_utf8z	/post_gbk)r   r  r  r8  r>  rT   s    r1   rU   HTTPServerTest.get_appa  s>    +&/0 +./01
 	
r4   c                 z    U R                  S5      n[        UR                  5      nU R                  USS/05        g )Nz/echo?foo=%C3%A9foor   rX   r   rZ   r   r   s      r1   test_query_string_encoding)HTTPServerTest.test_query_string_encodingl  s6    ::018==)z23r4   c                 |    U R                  S5      n[        UR                  5      nU R                  USSS/05        g )Nz/echo?foo=&foo=rL   rM  r   s      r1   test_empty_query_string&HTTPServerTest.test_empty_query_stringq  s8    ::/08==)Bx01r4   c                 ~    U R                  SSSS9n[        UR                  5      nU R                  US/S/S.5        g )NrG  r   z	foo=&bar=r   rQ  )rL  barrM  r   s      r1   test_empty_post_parameters)HTTPServerTest.test_empty_post_parametersv  s=    ::gf;:G8==)tRD9:r4   c                     SS0nU R                  SUS9n[        UR                  5      nU R                  U0 5        U R                  SSSUS9n[        UR                  5      nU R                  U0 5        g )NCookiefoo=barz/typecheck?foo=barr-   rH  r   r   rZ   r-   rM  )r0   r-   r]   r   s       r1   
test_typesHTTPServerTest.test_types{  sy    Y'::2G:D8==)r"::i  
 8==)r"r4   c                     U R                  S5      nU R                  SUR                  5        U R                  [        UR                  5      0 5        g )NrI     )rX   r   coder   rZ   r   s     r1   test_double_slash HTTPServerTest.test_double_slash  s?     ::o.hmm,X]]3R8r4   c           
         SS0nSnS H  nS H  nU R                  X4S9   UR                  U5      nU(       a.  [        R                  R	                  U5      R                  S5      nU R                  SU-   S	US
U-   S9nU R                  [        UR                  5      SU05        S S S 5        M     M     g ! , (       d  f       M  = f)NzContent-Typez!application/x-www-form-urlencodedu   chinese: 张三)r   r@  )TF)encquoteasciiz/post_r   s   data=)r   r-   rZ   r:  )	subTestr   urllibr   rf  rX   r   r   rZ   )r0   r-   uni_textre  rf  bin_textr]   s          r1   test_post_encodings"HTTPServerTest.test_post_encodings  s    !#FG*"C&\\c\7's3H#)<<#5#5h#?#F#Fw#O#zz 3% '&1	  *  H $$[%?&(AST 87 ' #77s   BB77
Cr`   N)rA   rB   rC   rD   rU   rN  rR  rV  r]  rb  rl  rE   r`   r4   r1   rE  rE  `  s&    	
4
2
;

#9Ur4   rE  c                      ^  \ rS rSrS rU 4S jrU 4S jrS rS rS r	S r
S	 rS
 rS rS rS rS rS r\S 5       r\S 5       rSrU =r$ )HTTPServerRawTesti  c                 &    [        S[        4/5      $ )NrG  r   r  rT   s    r1   rU   HTTPServerRawTest.get_app  s    Wk2344r4   c                    >^  [         TT ]  5         [        [        R                  " 5       5      T l        T R
                  R                  U 4S j5        g )Nc                  Z   > T R                   R                  ST R                  5       45      $ r   )rI   r   r   rT   s   r1   r   )HTTPServerRawTest.setUp.<locals>.<lambda>  s"    DKK''d6H6H6J(KLr4   )supersetUpr   r   rI   r   r   r0   rR   s   `r1   rw  HTTPServerRawTest.setUp  s3    v}}/L	
r4   c                 V   > U R                   R                  5         [        TU ]  5         g r+   )rI   r  rv  tearDownrx  s    r1   r{  HTTPServerRawTest.tearDown  s    r4   c                     U R                   R                  5         U R                  R                  [        R
                  " SS9U R                  5        U R                  5         g )NMbP?seconds)rI   r  r   add_timeoutdatetime	timedeltastopwaitrT   s    r1   test_empty_request$HTTPServerRawTest.test_empty_request  s>      !3!3E!BDIIN		r4   c                   ^  [        [        S[        R                  S9   T R                  R                  S5        T R                  R                  U 4S j5      u  pnT R                  SUR                  5        T R                  SUR                  5        T R                  SUR                  5        S S S 5        g ! , (       d  f       g = f)N.*Malformed HTTP request linelevel   asdf

c                  .   > [        T R                  5      $ r+   rK   rI   rT   s   r1   r   FHTTPServerRawTest.test_malformed_first_line_response.<locals>.<lambda>      (5r4   HTTP/1.1rA  Bad Requestr   r   loggingINFOrI   r   r   r   r   r  ra  reasonr0   r.   r-   r]   s   `   r1   "test_malformed_first_line_response4HTTPServerRawTest.test_malformed_first_line_response  s    w ?w||TKKo.,0LL,A,A5-)J Z););<S*//2]J,=,=> UTT   BB::
Cc                 8   [        [        S[        R                  S9   U R                  R                  S5        U R                  R                  [        R                  " SS9U R                  5        U R                  5         S S S 5        g ! , (       d  f       g = f)Nr  r  r  皙?r  r   r   r  r  rI   r   r   r  r  r  r  r  rT   s    r1   test_malformed_first_line_log/HTTPServerRawTest.test_malformed_first_line_log  s`    w ?w||TKKo. LL$$X%7%7%EtyyQIIK UTT   A$B
Bc                 8   [        [        S[        R                  S9   U R                  R                  S5        U R                  R                  [        R                  " SS9U R                  5        U R                  5         S S S 5        g ! , (       d  f       g = f)Nz1.*Malformed HTTP message.*no colon in header liner  s   GET / HTTP/1.0
asdf

r  r  r  rT   s    r1   test_malformed_headers(HTTPServerRawTest.test_malformed_headers  sh    ?,,

 KK?@LL$$X%7%7%EtyyQIIK
 
 
r  c                   ^  [        [        S[        R                  S9   T R                  R                  S5        T R                  R                  U 4S j5      u  pnT R                  SUR                  5        T R                  SUR                  5        T R                  SUR                  5        S S S 5        g ! , (       d  f       g = f)Nz-.*Malformed HTTP message.*Invalid Host headerr  s!   GET / HTTP/1.0
Host: foo bar

c                  .   > [        T R                  5      $ r+   r  rT   s   r1   r   LHTTPServerRawTest.test_invalid_host_header_with_whitespace.<locals>.<lambda>  r  r4   r  rA  r  r  r  s   `   r1   (test_invalid_host_header_with_whitespace:HTTPServerRawTest.test_invalid_host_header_with_whitespace  s    DGLL
 KKHI,0LL,A,A5-)J Z););<S*//2]J,=,=>
 
 
r  c                    ^  T R                   R                  SR                  SS5      5        T R                  R	                  U 4S j5      u  pnT R                  [        U5      SS/05        g )Ns   POST /echo HTTP/1.1
Host: 127.0.0.1
Transfer-Encoding: chunked
Content-Type: application/x-www-form-urlencoded

4
foo=
3
bar
0

r   r   c                  .   > [        T R                  5      $ r+   r  rT   s   r1   r   =HTTPServerRawTest.test_chunked_request_body.<locals>.<lambda>      $T[[1r4   rL  rU  rI   r   r   r   r   r   r   r  s   `   r1   test_chunked_request_body+HTTPServerRawTest.test_chunked_request_body  i     	 Gw	
" )-(=(=1)
%
X 	X.0@Ar4   c                    ^  T R                   R                  SR                  SS5      5        T R                  R	                  U 4S j5      u  pnT R                  [        U5      SS/05        g )Ns   POST /echo HTTP/1.1
Host: 127.0.0.1
Transfer-Encoding: Chunked
Content-Type: application/x-www-form-urlencoded

4
foo=
3
bar
0

r   r   c                  .   > [        T R                  5      $ r+   r  rT   s   r1   r   BHTTPServerRawTest.test_chunked_request_uppercase.<locals>.<lambda>  r  r4   rL  rU  r  r  s   `   r1   test_chunked_request_uppercase0HTTPServerRawTest.test_chunked_request_uppercase  r  r4   c                 F  ^  T R                   R                  SR                  SS5      5        [        [        S[
        R                  S9   T R                  R                  U 4S j5      u  pnS S S 5        T R                  SWR                  5        g ! , (       d  f       N+= f)Nsb   POST /echo HTTP/1.1
Host: 127.0.0.1
Transfer-Encoding: chunked

1_a
1234567890abcdef1234567890
0

r   r   z.*invalid chunk sizer  c                  .   > [        T R                  5      $ r+   r  rT   s   r1   r   JHTTPServerRawTest.test_chunked_request_body_invalid_size.<locals>.<lambda>"  r  r4   rA  )rI   r   r   r   r   r  r  r   r   r   ra  r  s   `   r1   &test_chunked_request_body_invalid_size8HTTPServerRawTest.test_chunked_request_body_invalid_size  s     		 Gw	
 w 6gllK,0LL,A,A5-)J L 	joo.	 LKs   
#B
B c                 &  ^  T R                   R                  S5        [        [        S[        R
                  S9   T R                  R                  U 4S j5      u  pnS S S 5        T R                  SWR                  5        g ! , (       d  f       N+= f)Nsc   POST /echo HTTP/1.1
Host: 127.0.0.1
Transfer-Encoding: chunked
Transfer-encoding: chunked

2
ok
0

z/.*Unsupported Transfer-Encoding chunked,chunkedr  c                  .   > [        T R                  5      $ r+   r  rT   s   r1   r   NHTTPServerRawTest.test_chunked_request_body_duplicate_header.<locals>.<lambda><  r  r4   rA  
rI   r   r   r   r  r  r   r   r   ra  r  s   `   r1   *test_chunked_request_body_duplicate_header<HTTPServerRawTest.test_chunked_request_body_duplicate_header&  sw     	
	
 =,,

 -1LL,A,A5-)J
 	joo.
 
   #B
Bc                 &  ^  T R                   R                  S5        [        [        S[        R
                  S9   T R                  R                  U 4S j5      u  pnS S S 5        T R                  SWR                  5        g ! , (       d  f       N+= f)NsN   POST /echo HTTP/1.1
Host: 127.0.0.1
Transfer-Encoding: gzip, chunked

2
ok
0

z-.*Unsupported Transfer-Encoding gzip, chunkedr  c                  .   > [        T R                  5      $ r+   r  rT   s   r1   r   [HTTPServerRawTest.test_chunked_request_body_unsupported_transfer_encoding.<locals>.<lambda>R  r  r4   rA  r  r  s   `   r1   7test_chunked_request_body_unsupported_transfer_encodingIHTTPServerRawTest.test_chunked_request_body_unsupported_transfer_encoding@  st    		
 DGLL
 -1LL,A,A5-)J
 	joo.
 
r  c                 &  ^  T R                   R                  S5        [        [        S[        R
                  S9   T R                  R                  U 4S j5      u  pnS S S 5        T R                  SWR                  5        g ! , (       d  f       N+= f)NsZ   POST /echo HTTP/1.1
Host: 127.0.0.1
Transfer-Encoding: chunked
Content-Length: 2

2
ok
0

z8.*Message with both Transfer-Encoding and Content-Lengthr  c                  .   > [        T R                  5      $ r+   r  rT   s   r1   r   bHTTPServerRawTest.test_chunked_request_body_transfer_encoding_and_content_length.<locals>.<lambda>k  r  r4   rA  r  r  s   `   r1   >test_chunked_request_body_transfer_encoding_and_content_lengthPHTTPServerRawTest.test_chunked_request_body_transfer_encoding_and_content_lengthV  su    
	
 F,,

 -1LL,A,A5-)J
 	joo.
 
r  c              #   ^  #    / SQnU H  u  p#U R                  US9   [        [        [        R                  " 5       5      5       n[	        [
        S[        R                  S9   UR                  SU R                  5       45      v   UR                  [        [        R                  " SU S35      R                  SS	5      5      5        UR                  5       v   S S S 5        S S S 5        S S S 5        M     g ! , (       d  f       N#= f! , (       d  f       N,= f! , (       d  f       GM!  = f7f)
N))
alphabeticrL  )leading plus+10)zinternal underscore1_0)r3  z(.*Only integer Content-Length is allowedr  r   z                            POST /echo HTTP/1.1
                            Host: 127.0.0.1
                            Content-Length: zs
                            Connection: close

                            1234567890
                            
z
)rh  r!   r   r   r   r   r  r  r   r   r   r   textwrapdedentr   read_until_close)r0   
test_casesr3  r&  rI   s        r1   test_invalid_content_length-HTTPServerRawTest.test_invalid_content_lengtho  s     



 &KD4('(6==?2K*LPV>!,,
 !..+t7I7I7K)LMMLL$OO%- .3G 4! 	 &gdF3 !1133) +M(( &  +M*L((sM   D-(DD	#A8C8	D	#D+D-8
DD		
DD
D*	$	D-c              #     #    SS/nU GH  u  p#nUb  [        [        U[        R                  S9nO[        S 5       nU" 5       nU R                  US9   [        [        [        R                  " 5       5      5       nU   UR                  SU R                  5       45      v   UR                  [        U S35      5        UR                  S5      v nU R                  UR                  S	U-  5      S
U SU< 35        S S S 5        S S S 5        S S S 5        GM     g ! , (       d  f       N$= f! , (       d  f       N-= f! , (       d  f       GMD  = f7f)N)FOOi  N)zFOO,BARrA  r  r  c               3      #    S v   g 7fr+   r`   r`   r4   r1   noop_context<HTTPServerRawTest.test_invalid_methods.<locals>.noop_context  s     s   )r   r   z# /echo HTTP/1.1
Host:127.0.0.1

r   s   HTTP/1.1 %dzexpected status code z in )r   r   r  r  r"   rh  r!   r   r   r   r   r   r   r   r   r   )	r0   r  r   ra  log_msgr   r  rI   resps	            r1   test_invalid_methods&HTTPServerRawTest.test_invalid_methods  s!     =

 &0!F'"&ww||L
     *^
F+12fnnk43E3E3G%HIITVH,U"VWX#..{;;OONT$9:+D6dX>  3 ,+ &0 
 32 ,+sO   AE(D=;D,>A?D	=D,D=E
D)%D,,
D:6D==
E		Er   )rA   rB   rC   rD   rU   rw  r{  r  r  r  r  r  r  r  r  r  r  r  r   r  r  rE   __classcell__rR   s   @r1   ro  ro    st    5

?
?B2B2/./4/,/2 4 4B  r4   ro  c                   B    \ rS rSr " S S\5      rS rS rS rS r	Sr
g	)
XHeaderTesti  c                       \ rS rSrS rSrg)XHeaderTest.Handleri  c                     U R                  SU R                  R                  5        U R                  [	        U R                  R
                  U R                  R                  S95        g )Nrequest-version)r  remote_protocol)
set_headerrl   r  r   r{   r  rg   rT   s    r1   rn   XHeaderTest.Handler.get  sI    OO-t||/C/CDJJ"ll44$(LL$9$9r4   r`   NrA   rB   rC   rD   rn   rE   r`   r4   r1   rS   r    s    	r4   rS   c                     [        SS/S9$ )NTz5.5.5.5)xheaderstrusted_downstreamr{   rT   s    r1   get_httpserver_options"XHeaderTest.get_httpserver_options  s    TykBBr4   c                 n   U R                  U R                  S5      S   S5        SS0nU R                  U R                  SUS9S   S5        SS0nU R                  U R                  SUS9S   S5        SS	0nU R                  U R                  SUS9S   S	5        SS
0nU R                  U R                  SUS9S   S	5        SS0nU R                  U R                  SUS9S   S5        SS0nU R                  U R                  SUS9S   S5        SS0nU R                  U R                  SUS9S   S5        g )NrQ   r  r   z	X-Real-IP4.4.4.4r[  X-Forwarded-Forz127.0.0.1, 4.4.4.4z2620:0:1cfe:face:b00c::3z::1, 2620:0:1cfe:face:b00c::3z4.4.4.4<script>z4.4.4.4, 5.5.5.5<script>zwww.google.comr   r^   )r0   
valid_ipv4valid_ipv4_list
valid_ipv6valid_ipv6_listinvalid_charsinvalid_chars_listinvalid_hosts           r1   test_ip_headersXHeaderTest.test_ip_headers  s   -k:KH!9-
OOCO4[A9	
 -.BCOOCO9+F		
 "#=>
OOCO4[A&	

 -.MNOOCO9+F&	

 %&78OOCO7Dk	
 01KLOOC);O<[I;	
 $%56OOCO6{C[	
r4   c                     SS0nU R                  SUS9nUR                  S   R                  S5      (       a  U R                  S5        [	        UR
                  5      nU R                  US   S	5        g )
Nr  z127.0.0.1, 4.4.4.4, 5.5.5.5rQ   r[  r  zHTTP/2requires HTTP/1.xr  r  )rX   r-   r   skipTestr   rZ   r   )r0   r  r  results       r1   test_trusted_downstream#XHeaderTest.test_trusted_downstream  sl    ,.KLzz#z7<<)*55h?? MM-.TYY',i8r4   c                    U R                  U R                  S5      S   S5        SS0nU R                  U R                  SUS9S   S5        SS0nU R                  U R                  SUS9S   S5        SS0nU R                  U R                  SUS9S   S5        SS	0nU R                  U R                  SUS9S   S5        SS
0nU R                  U R                  SUS9S   S5        g )NrQ   r  rt   X-Schemery   r[  zX-Forwarded-Protozhttps , httpz
http,httpsunknownr  )r0   https_schemehttps_forwardedhttps_multi_forwardedhttp_multi_forwardedbad_forwardeds         r1   test_scheme_headersXHeaderTest.test_scheme_headers  s   -.?@&I"G,OOCO67HI7	
 /8OOCO9:KLg	
 "5n EOOC)>O?@QR	

 !4\BOOC)=O>?PQ	

 -i8OOCO78IJF	
r4   r`   N)rA   rB   rC   rD   r   rS   r  r  r  r  rE   r`   r4   r1   r  r    s$    . C&
P9
r4   r  c                   4   ^  \ rS rSrS rU 4S jrS rSrU =r$ )SSLXHeaderTesti  c                 :    [        S[        R                  4/5      $ rP   )r   r  rS   rT   s    r1   rU   SSLXHeaderTest.get_app  s    S+"5"56788r4   c                 .   > [         TU ]  5       nSUS'   U$ )NTr  )rv  r  )r0   outputrR   s     r1   r  %SSLXHeaderTest.get_httpserver_options  s    /1!zr4   c                     U R                  U R                  S5      S   S5        SS0nU R                  U R                  SUS9S   S5        SS0nU R                  U R                  SUS9S   S5        g )NrQ   r  ry   r  rt   r[  r  r  )r0   http_scheme
bad_schemes      r1   test_request_without_xprotocol-SSLXHeaderTest.test_request_without_xprotocol  s    -.?@'J!6*OOCO56GH&	
 !),
OOCO45FG	
r4   r`   )	rA   rB   rC   rD   rU   r  r  rE   r  r  s   @r1   r  r    s    9

 
r4   r  c                   6    \ rS rSr " S S\5      rS rS rSrg)ManualProtocolTesti(  c                       \ rS rSrS rSrg)ManualProtocolTest.Handleri)  c                 \    U R                  [        U R                  R                  S95        g )Nrz   )r   r{   rl   rg   rT   s    r1   rn   ManualProtocolTest.Handler.get*  s    JJtT\\%:%:;<r4   r`   Nr  r`   r4   r1   rS   r  )  s    	=r4   rS   c                     [        SS9$ )Nry   rz   r  rT   s    r1   r  )ManualProtocolTest.get_httpserver_options-  s    W%%r4   c                 L    U R                  U R                  S5      S   S5        g )NrQ   rg   ry   r  rT   s    r1   test_manual_protocol'ManualProtocolTest.test_manual_protocol0  s     -j97Cr4   r`   N)	rA   rB   rC   rD   r   rS   r  r%  rE   r`   r4   r1   r  r  (  s    =. =&Dr4   r  c                   \   ^  \ rS rSrSrSrU 4S jrU 4S jr\S 5       r	\S 5       r
SrU =r$ )	UnixSocketTesti4  am  HTTPServers can listen on Unix sockets too.

Why would you want to do this?  Nginx can proxy to backends listening
on unix sockets, for one thing (and managing a namespace for unix
sockets can be easier than managing a bunch of TCP port numbers).

Unfortunately, there's no way to specify a unix socket in a url for
an HTTP client, so we have to test this by hand.
rQ  c                    > [         TU ]  5         [        S[        4/5      n[	        U5      U l        U R
                  R                  [        R                  " U R                  5      5        g )Nr   )
rv  rw  r   rb   r   server
add_socketr   bind_unix_socketaddress)r0   apprR   s     r1   rw  UnixSocketTest.setUpB  sK    H&>?@A ow77EFr4   c                    > U R                   R                  U R                  R                  5        U R                  R	                  5         [
        TU ]  5         g r+   )r   r   r*  close_all_connectionsr  rv  r{  rx  s    r1   r{  UnixSocketTest.tearDownH  s:    dkk??@r4   c              #      #    [        [        [        R                  " [        R                  5      5      5       nUR	                  U R
                  5        UR                  S5        UR                  S5      v nU R                  US5        UR                  S5      v n[        R                  " UR                  S5      5      nUR                  [        US   5      5      v nU R                  US5        S S S 5        g ! , (       d  f       g = f7f)Ns   GET /hello HTTP/1.0

r   s   HTTP/1.1 200 OK
r   r   r   r   )r!   r   r   AF_UNIXr   r-  r   r   r   r   r   r   r   r   )r0   rI   r]   r  r-   rZ   s         r1   test_unix_socketUnixSocketTest.test_unix_socketM  s     XfmmFNN;<=NN4<<(LL78#..w77HX'=> & 1 1+ >>K!''(:(:8(DEG**3w7G/H+IJJDT>2 >==s   7DB;C=4	D=
DDc              #     #    [        [        S[        R                  S9   [	        [        [        R                  " [        R                  5      5      5       nUR                  U R                  5        UR                  S5        UR                  5       v nS S S 5        S S S 5        U R                  WS5        g ! , (       d  f       N)= f! , (       d  f       N2= f7f)NzMalformed HTTP message fromr  s   garbage

   HTTP/1.1 400 Bad Request

)r   r   r  r  r!   r   r   r4  r   r-  r   r  r   r0   rI   r]   s      r1   test_unix_socket_bad_request+UnixSocketTest.test_unix_socket_bad_requestY  s      w =W\\R&--"?@AVt||,/0!'!8!8!:: B S
 	#FG	 BA SRs4   C7C
?B9C
C9
C	C


CC)r*  )rA   rB   rC   rD   __doc__r-  rw  r{  r   r5  r:  rE   r  r  s   @r1   r(  r(  4  sD     GG
 	3 	3 H Hr4   r(  r4  cygwinz+unix sockets not supported on this platformc                   4   ^  \ rS rSrU 4S jrU 4S jrSrU =r$ )UnixSocketTestFileie  c                    > [         R                  " 5       U l        [        R                  R                  U R                  S5      U l        [        TU ]!  5         g )Nz	test.sock)	tempfilemkdtemptmpdirr   r   rH   r-  rv  rw  rx  s    r1   rw  UnixSocketTestFile.setUpj  s6    &&(ww||DKK=r4   c                 b   > [         TU ]  5         [        R                  " U R                  5        g r+   )rv  r{  shutilrmtreerC  rx  s    r1   r{  UnixSocketTestFile.tearDowno  s    dkk"r4   )r-  rC  )rA   rB   rC   rD   rw  r{  rE   r  r  s   @r1   r?  r?  e  s    

# #r4   r?  linuxz>abstract namespace unix sockets not supported on this platformc                   (   ^  \ rS rSrU 4S jrSrU =r$ )UnixSocketTestAbstractit  c                 p   > S[         R                  " 5       R                  -   U l        [        TU ]  5         g )N )uuiduuid4hexr-  rv  rw  rx  s    r1   rw  UnixSocketTestAbstract.setUpy  s$    djjl...r4   )r-  )rA   rB   rC   rD   rw  rE   r  r  s   @r1   rK  rK  t  s    
 r4   rK  c                   `  ^  \ rS rSrSrS rU 4S jrU 4S jr\R                  S 5       r
\R                  S 5       r\R                  S 5       rS	 r\S
 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       rSrU =r$ )KeepAliveTesti~  zTests various scenarios for HTTP 1.1 keep-alive support.

These tests don't use AsyncHTTPClient because we want to control
connection reuse and closing.
c                      " S S[         5      n " S S[         5      n " S S[         5      n " S S[         5      n[        5       U l        [        S	U4S
U4SU4SU[	        U R                  S94/5      $ )Nc                        \ rS rSrS rS rSrg)+KeepAliveTest.get_app.<locals>.HelloHandleri  c                 &    U R                  S5        g Nrk   r?   rT   s    r1   rn   /KeepAliveTest.get_app.<locals>.HelloHandler.get      M*r4   c                 &    U R                  S5        g rX  rY  rT   s    r1   rr   0KeepAliveTest.get_app.<locals>.HelloHandler.post  r[  r4   r`   Nr  r`   r4   r1   HelloHandlerrV    s    ++r4   r^  c                       \ rS rSrS rSrg)+KeepAliveTest.get_app.<locals>.LargeHandleri  c                 d    U R                  SR                  S [        S5       5       5      5        g )NrQ  c              3   D   #    U  H  n[        US -  5      S-  v   M     g7f)      N)chr).0is     r1   	<genexpr>BKeepAliveTest.get_app.<locals>.LargeHandler.get.<locals>.<genexpr>  s     "K
13q3w<$#6
s    i   )r   rH   rangerT   s    r1   rn   /KeepAliveTest.get_app.<locals>.LargeHandler.get  s#     

277"Kc
"KKLr4   r`   Nr  r`   r4   r1   LargeHandlerr`    s    Mr4   rl  c                   8    \ rS rSr\R
                  S 5       rSrg)=KeepAliveTest.get_app.<locals>.TransferEncodingChunkedHandleri  c              3   R   #    U R                  S5        U R                  5       v   g 7frX  )r   flushrT   s    r1   headBKeepAliveTest.get_app.<locals>.TransferEncodingChunkedHandler.head  s     

=)jjl"s   %'r`   N)rA   rB   rC   rD   r   	coroutinerq  rE   r`   r4   r1   TransferEncodingChunkedHandlerrn    s    ]]# #r4   rt  c                   D    \ rS rSrS r\R                  S 5       rS rSr	g)3KeepAliveTest.get_app.<locals>.FinishOnCloseHandleri  c                     Xl         g r+   cleanup_event)r0   ry  s     r1   rh   >KeepAliveTest.get_app.<locals>.FinishOnCloseHandler.initialize  s    %2"r4   c              3   d   #    U R                  5         U R                  R                  5       v   g 7fr+   )rp  ry  r  rT   s    r1   rn   7KeepAliveTest.get_app.<locals>.FinishOnCloseHandler.get  s#     

((--//s   .0c                 &    U R                  S5        g )NclosedrY  rT   s    r1   on_connection_closeGKeepAliveTest.get_app.<locals>.FinishOnCloseHandler.on_connection_close  s     H%r4   rx  N)
rA   rB   rC   rD   rh   r   rs  rn   r  rE   r`   r4   r1   FinishOnCloseHandlerrv    s$    3 ]]0 0&r4   r  rQ   z/largez/chunkedz/finish_on_closerx  )r   r   ry  r   r{   )r0   r^  rl  rt  r  s        r1   rU   KeepAliveTest.get_app  s    	+> 	+	M> 	M	#^ 	#	&> 	& #Wl#<(;<&(t'9'9:		
 	
r4   c                 0   > [         TU ]  5         SU l        g )Ns   HTTP/1.1)rv  rw  http_versionrx  s    r1   rw  KeepAliveTest.setUp  s    'r4   c                   > U R                   R                  [        R                  " SS9U R                  5        U R                  5         [        U S5      (       a  U R                  R                  5         [        TU ])  5         g )Nr~  r  rI   )r   r  r  r  r  r  hasattrrI   r  rv  r{  rx  s    r1   r{  KeepAliveTest.tearDown  sY     	  !3!3E!BDIIN		4""KKr4   c              #      #    [        [        R                  " 5       5      U l        U R                  R                  SU R	                  5       45      v   g 7fr   )r   r   rI   r   r   rT   s    r1   r   KeepAliveTest.connect  s:     v}}/kk!!;0B0B0D"EFFs   AAc              #   6  #    U R                   R                  S5      v nU R                  UR                  S5      U5        U R                   R                  S5      v n[        R
                  " UR                  S5      5      n[        R                  " U5      e7f)Nr   r   r   r   )	rI   r   r   r   r   r   r   r   Return)r0   r  header_bytesr-   s       r1   read_headersKeepAliveTest.read_headers  sv     ;;11'::

--o>
K![[33K@@##L$7$7$ABjj!!s   BBc              #      #    U R                  5       v U l        U R                  R                  [	        U R                  S   5      5      v nU R                  SU5        g 7f)Nr   r   )r  r-   rI   r   r   r   )r0   rZ   s     r1   rG   KeepAliveTest.read_response  sN     !..00[[++C=M0N,OPP.s   AA c                 <    U R                   R                  5         U ? g r+   )rI   r  rT   s    r1   r  KeepAliveTest.close  s    Kr4   c              #     #    U R                  5       v   U R                  R                  S5        U R                  5       v   U R                  R                  S5        U R                  5       v   U R	                  5         g 7f)Ns"   GET / HTTP/1.1
Host:127.0.0.1

r   rI   r   rG   r  rT   s    r1   test_two_requestsKeepAliveTest.test_two_requests  s^     llnEF  ""EF  ""

   A>B c              #   L  #    U R                  5       v   U R                  R                  S5        U R                  5       v   U R                  R	                  5       v nU R                  U(       + 5        U R                  U R                  S   S5        U R                  5         g 7f)Ns5   GET / HTTP/1.1
Host:127.0.0.1
Connection: close


Connectionr  )	r   rI   r   rG   r  r   r   r-   r  r0   r   s     r1   test_request_close KeepAliveTest.test_request_close  s|     llnL	
   ""[[1133D!l3W=

s   B"B$c              #   J  #    SU l         U R                  5       v   U R                  R                  S5        U R	                  5       v   U R                  R                  5       v nU R                  U5        U R                  SU R                  5        U R                  5         g 7f)N   HTTP/1.0s   GET / HTTP/1.0

r  )
r  r   rI   r   rG   r  r   assertNotInr-   r  r  s     r1   test_http10KeepAliveTest.test_http10  s{     'lln34  ""[[1133t||4

s   B!B#c              #     #    SU l         U R                  5       v   U R                  R                  S5        U R	                  5       v   U R                  U R                  S   S5        U R                  R                  S5        U R	                  5       v   U R                  U R                  S   S5        U R                  5         g 7f)Nr  *   GET / HTTP/1.0
Connection: keep-alive

r  
Keep-Aliver  r   rI   r   rG   r   r-   r  rT   s    r1   test_http10_keepalive#KeepAliveTest.test_http10_keepalive  s     'llnMN  ""l3\BMN  ""l3\B

   CCc              #     #    SU l         U R                  5       v   U R                  R                  S5        U R	                  5       v   U R                  U R                  S   S5        U R                  R                  S5        U R	                  5       v   U R                  U R                  S   S5        U R                  5         g 7f)Nr  s,   GET / HTTP/1.0
Connection: keep-alive


r  r  r  r  rT   s    r1    test_http10_keepalive_extra_crlf.KeepAliveTest.test_http10_keepalive_extra_crlf	  s     'llnQR  ""l3\BMN  ""l3\B

r  c              #      #    U R                  5       v   U R                  R                  S5        U R                  5       v   U R                  5       v   U R	                  5         g 7fNsD   GET / HTTP/1.1
Host:127.0.0.1

GET / HTTP/1.1
Host:127.0.0.1

r  rT   s    r1   test_pipelined_requests%KeepAliveTest.test_pipelined_requests  sO     lln_	
   ""  ""

s   A#A%c              #      #    U R                  5       v   U R                  R                  S5        U R                  5       v   U R	                  5         g 7fr  r  rT   s    r1   test_pipelined_cancel#KeepAliveTest.test_pipelined_cancel  s@     lln_	
   ""

s   AAc              #      #    U R                  5       v   U R                  R                  S5        U R                  5       v   U R                  R	                  S5      v   U R                  5         g 7f)Ns'   GET /large HTTP/1.1
Host:127.0.0.1

rd  )r   rI   r   r  r   r  rT   s    r1   test_cancel_during_download)KeepAliveTest.test_cancel_during_download)  sQ     llnJK!!kk$$T**

s   A.A0c              #      #    U R                  5       v   U R                  R                  S5        U R                  5       v   U R	                  5         U R
                  R                  5         g 7f)Ns1   GET /finish_on_close HTTP/1.1
Host:127.0.0.1

)r   rI   r   r  r  ry  setrT   s    r1   test_finish_while_closed&KeepAliveTest.test_finish_while_closed1  sN     llnTU!!

 s   A+A-c              #     #    SU l         U R                  5       v   U R                  R                  S5        U R	                  5       v   U R                  U R                  S   S5        U R                  R                  S5        U R	                  5       v   U R                  U R                  S   S5        U R                  5         g 7f)Nr  sL   POST / HTTP/1.0
Connection: keep-alive
Transfer-Encoding: chunked

0

r  r  r  r  rT   s    r1   test_keepalive_chunked$KeepAliveTest.test_keepalive_chunked:  s     'lln	
   ""l3\BMN  ""l3\B

r  c              #     #    U R                  5       v   U R                  R                  S5        U R                  5       v   U R                  R                  S5        U R                  5       v   U R	                  5         g 7f)Ns*   HEAD /chunked HTTP/1.1
Host:127.0.0.1

)r   rI   r   r  r  rT   s    r1   #test_keepalive_chunked_head_no_body1KeepAliveTest.test_keepalive_chunked_head_no_bodyM  s^     llnMN!!MN!!

r  )ry  r-   r  rI   )rA   rB   rC   rD   r<  rU   rw  r{  r   rs  r   r  rG   r  r   r  r  r  r  r  r  r  r  r  r  r  rE   r  r  s   @r1   rS  rS  ~  sC   /
b( 	]]G G 	]]" " 	]]/ /
   	 	   	 	 	 	       ! !  $  r4   rS  c                   &    \ rS rSrS rS rS rSrg)GzipBaseTestiX  c                 &    [        S[        4/5      $ rP   rq  rT   s    r1   rU   GzipBaseTest.get_appY  s    S+./00r4   c                     [        5       n[        R                  " SUS9nUR                  [	        U5      5        UR                  5         UR                  5       nU R                  SSUSS0S9$ )NwmodefileobjrQ   r   Content-Encodinggzipr\  )r#   r  GzipFiler   r   r  getvaluerX   )r0   rZ   bytesio	gzip_filecompressed_bodys        r1   	post_gzipGzipBaseTest.post_gzip\  sh    )MMsG<	T
#!**,zz '0	  
 	
r4   c                 v    U R                  SSSS9nU R                  [        UR                  5      SS/05        g )NrQ   r   rZ  r   rL  rU  )rX   r   r   rZ   r   s     r1   test_uncompressedGzipBaseTest.test_uncompressedi  s6    ::c&y:AX]]3eeW5EFr4   r`   N)rA   rB   rC   rD   rU   r  r  rE   r`   r4   r1   r  r  X  s    1
Gr4   r  c                   &    \ rS rSrS rS rS rSrg)GzipTestin  c                     [        SS9$ )NT)decompress_requestr  rT   s    r1   r  GzipTest.get_httpserver_optionso  s    t,,r4   c                 v    U R                  S5      nU R                  [        UR                  5      SS/05        g )NrZ  rL  rU  )r  r   r   rZ   r   s     r1   	test_gzipGzipTest.test_gzipr  s0    >>),X]]3eeW5EFr4   c                 .   [        5       n[        R                  " SUS9nUR                  [	        S5      5        UR                  5         UR                  5       nU R                  SSUSS0S9nU R                  [        UR                  5      S	S
/05        g )Nr  r  rZ  rQ   r   r  GZIPr\  rL  rU  )r#   r  r  r   r   r  r  rX   r   r   rZ   )r0   r  r  r  r]   s        r1   test_gzip_case_insensitive#GzipTest.test_gzip_case_insensitivev  s    )MMsG<	Y(!**,:: '0	  
 	X]]3eeW5EFr4   r`   N)rA   rB   rC   rD   r  r  r  rE   r`   r4   r1   r  r  n  s    -GGr4   r  c                       \ rS rSrS rSrg)GzipUnsupportedTesti  c                     [        [        S5         U R                  S5      nS S S 5        U R                  WR                  S5        g ! , (       d  f       N+= f)Nz.*Unsupported Content-EncodingrZ  rA  )r   r   r  r   ra  r   s     r1   test_gzip_unsupported)GzipUnsupportedTest.test_gzip_unsupported  sA     w @A~~i0H B, BAs   A
Ar`   N)rA   rB   rC   rD   r  rE   r`   r4   r1   r  r    s    -r4   r  c                   h    \ rS rSrSrSrS rS r " S S\5      r	S r
S	 rS
 rS rS rS rS rSrg)StreamingChunkSizeTesti  s2   01234567890123456789012345678901234567890123456789   c                     [        5       $ r+   r   rT   s    r1   get_http_client&StreamingChunkSizeTest.get_http_client       %&&r4   c                 *    [        U R                  SS9$ )NT)
chunk_sizer  )r{   
CHUNK_SIZErT   s    r1   r  -StreamingChunkSizeTest.get_httpserver_options  s    t4HHr4   c                   ,    \ rS rSrS rS rS rS rSrg)&StreamingChunkSizeTest.MessageDelegatei  c                     Xl         g r+   
connectionr0   r  s     r1   __init__/StreamingChunkSizeTest.MessageDelegate.__init__      (Or4   c                     / U l         g r+   )chunk_lengthsr/   s      r1   r2   7StreamingChunkSizeTest.MessageDelegate.headers_received  s
    !#Dr4   c                 L    U R                   R                  [        U5      5        g r+   )r  r6   rq   )r0   r7   s     r1   r9   4StreamingChunkSizeTest.MessageDelegate.data_received  s    %%c%j1r4   c                 2   [        [        U R                  5      5      nU R                  R	                  [        SSS5      [        S[        [        U5      5      05      5        U R                  R                  U5        U R                  R                  5         g )Nr  r`  OKr   )r   r   r  r  write_headersr   r   r  rq   r   r?   )r0   response_bodys     r1   r?   -StreamingChunkSizeTest.MessageDelegate.finish  sq     T-?-?!@AMOO))!*c48-s3}3E/FGH OO!!-0OO""$r4   )r  r  N)	rA   rB   rC   rD   r  r2   r9   r?   rE   r`   r4   r1   MessageDelegater    s    	)	$	2	%r4   r  c                 .     " S S[         5      nU" 5       $ )Nc                       \ rS rSrS rSrg)+StreamingChunkSizeTest.get_app.<locals>.Appi  c                 ,    [         R                  U5      $ r+   )r  r  r0   server_connrequest_conns      r1   start_request9StreamingChunkSizeTest.get_app.<locals>.App.start_request  s    -==lKKr4   r`   NrA   rB   rC   rD   r  rE   r`   r4   r1   Appr    s    Lr4   r  r   r0   r  s     r1   rU   StreamingChunkSizeTest.get_app  s    	L. 	L ur4   c           	      t   U R                   " SSS0UD6nUR                  5         [        UR                  5      nU R	                  [        U R                  5      [        U5      5        U HJ  nU R                  X@R                  S[        U5      -   5        U R                  USS[        U5      -   5        ML     U$ )Nr   r   zoversized chunk: r   zempty chunk: )rQ   )rX   rY   r   rZ   r   rq   BODYsumassertLessEqualr  r  assertGreater)r0   r\   r]   r8   r  s        r1   fetch_chunk_sizes(StreamingChunkSizeTest.fetch_chunk_sizes  s    ::;&;F;X]]+TYYV5 J  OO-@3v;-N z1oF.KL	 !
 r4   c                     [        5       n[        R                  " SUS9nUR                  U5        UR	                  5         UR                  5       n[        U5      [        U5      :  a  [        S5      eU$ )Nr  r  z#body did not shrink when compressed)r#   r  r  r   r  r  rq   rm   )r0   rZ   r  gzfile
compresseds        r1   compressStreamingChunkSizeTest.compress  s^    )C9T%%'
z?c$i'ABBr4   c                 ^    U R                  U R                  S9nU R                  / SQU5        g )N)rZ   )r  r  r     )r  r  r   )r0   r8   s     r1   test_regular_body(StreamingChunkSizeTest.test_regular_body  s)    ''TYY'7&1r4   c                 Z    U R                  U R                  U R                  5      SS0S9  g )Nr  r  )rZ   r-   )r  r  r  rT   s    r1   test_compressed_body+StreamingChunkSizeTest.test_compressed_body  s-    tyy)4F3O 	 	
r4   c                 X   ^  U 4S jnT R                  US9nT R                  / SQU5        g )Nc                 Z   > U " TR                   S S 5        U " TR                   SS  5        g N   )r  )r   r0   s    r1   body_producer?StreamingChunkSizeTest.test_chunked_body.<locals>.body_producer  s'    $))CR.!$))BC.!r4   )r+  )r     r     )r  r   )r0   r+  r8   s   `  r1   test_chunked_body(StreamingChunkSizeTest.test_chunked_body  s-    	" ''m'D&1r4   c                    ^ U R                  U R                  5      mU R                  [        T5      S5        U4S jnU R	                  USS0S9  g )Nr*  c                 2   > U " TS S 5        U " TSS  5        g r)  r`   )r   r  s    r1   r+  EStreamingChunkSizeTest.test_chunked_compressed.<locals>.body_producer  s    *Sb/"*RS/"r4   r  r  )r+  r-   )r  r  r  rq   r  )r0   r+  r  s     @r1   test_chunked_compressed.StreamingChunkSizeTest.test_chunked_compressed  sN    ]]499-
3z?B/	# 	'2Df1M 	 	
r4   r`   N)rA   rB   rC   rD   r  r  r  r  r   r  rU   r  r  r"  r%  r/  r4  rE   r`   r4   r1   r  r    sG    @DJ'
I%- %&
2

2

r4   r  c                   6    \ rS rSr " S S\5      rS rS rSrg)InvalidOutputContentLengthTesti  c                        \ rS rSrS rS rSrg).InvalidOutputContentLengthTest.MessageDelegatei  c                     Xl         g r+   r  r  s     r1   r  7InvalidOutputContentLengthTest.MessageDelegate.__init__  r  r4   c           	          SSSSS.nU R                   R                  [        SSS5      [        S	X2S
      05      5        U R                   R	                  S5        U R                   R                  5         g )N10rL  r  r  )normalr  r  
underscorer  r`  r  r   x-test
   1234567890)r  r  r   r   r   r?   )r0   r.   r-   content_lengthss       r1   r2   ?InvalidOutputContentLengthTest.MessageDelegate.headers_received  so    # %#	O OO))!*c48-x?P/QRS OO!!-0OO""$r4   r  N)rA   rB   rC   rD   r  r2   rE   r`   r4   r1   r  r9    s    	)	%r4   r  c                 .     " S S[         5      nU" 5       $ )Nc                       \ rS rSrS rSrg)3InvalidOutputContentLengthTest.get_app.<locals>.Appi  c                 ,    [         R                  U5      $ r+   )r7  r  r
  s      r1   r  AInvalidOutputContentLengthTest.get_app.<locals>.App.start_request  s    5EElSSr4   r`   Nr  r`   r4   r1   r  rF    s    Tr4   r  r  r  s     r1   rU   &InvalidOutputContentLengthTest.get_app  s    	T. 	T ur4   c           
         U R                  S5         U R                  SSSS0S9nUR                  5         U R                  UR                  S5        S S S 5        S Hg  nU R                  U5         [        [        S5         U R                  [        5         U R                  SSSU0S9  S S S 5        S S S 5        S S S 5        Mi     g ! , (       d  f       N|= f! , (       d  f       N4= f! , (       d  f       N== f! , (       d  f       M  = f)	Nr>  rQ   GETr@  )r   r-   rA  )r  r  r?  r   )	rh  rX   rY   r   rZ   r   r   r   r   )r0   r]   tests      r1   "test_invalid_output_content_lengthAInvalidOutputContentLengthTest.test_invalid_output_content_length	  s    \\(#zz#eh=QzRHX]]M: $ ADd# w(<=**95

3ux>N
O 6 > $# A	 $# 65 >= $#sH   A C0C;C*C	+C*3C;
C
C'#C**
C84C;;
D
	r`   N)	rA   rB   rC   rD   r   r  rU   rM  rE   r`   r4   r1   r7  r7    s    %- %$Pr4   r7  c                   ,    \ rS rSrS rS rS rS rSrg)MaxHeaderSizeTesti  c                 &    [        S[        4/5      $ rP   r   rb   rT   s    r1   rU   MaxHeaderSizeTest.get_app      S":;<==r4   c                     [        SS9$ )Nrd  )max_header_sizer  rT   s    r1   r  (MaxHeaderSizeTest.get_httpserver_options  s    D))r4   c                     U R                  SSS0S9nUR                  5         U R                  UR                  S5        g )NrQ   X-Fillerdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar[  r   )rX   rY   r   rZ   r   s     r1   test_small_headers$MaxHeaderSizeTest.test_small_headers  s9    ::cJ	+B:C7r4   c                 4   [        [        SSS9    U R                  SSS0SS9  U R                  S	5        S S S 5        g ! [         a=  nUR
                  b&  U R                  UR
                  R                  S
5         S nANKS nAff = f! , (       d  f       g = f)NzUnsatisfiable readFr   rQ   rY    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaT)r-   r   z did not raise expected exception)i  iW  )r   r   rX   failr   r]   assertInra  )r0   es     r1   test_large_headers$MaxHeaderSizeTest.test_large_headers#  s    w 4uE?

3Z(@d
S		<= FE  ? ::)MM!**//:>?	 FEs,   B	$?
B	3B<B	BB		
Br`   N)	rA   rB   rC   rD   rU   r  r[  rb  rE   r`   r4   r1   rP  rP    s    >*8

?r4   rP  c                      ^  \ rS rSrS rS rU 4S jrU 4S jr\R                  S 5       r
\S 5       r\S 5       rS	rU =r$ )
IdleTimeoutTesti0  c                 &    [        S[        4/5      $ rP   rR  rT   s    r1   rU   IdleTimeoutTest.get_app1  rT  r4   c                     [        SS9$ )Ng?)idle_connection_timeoutr  rT   s    r1   r  &IdleTimeoutTest.get_httpserver_options4  s    C00r4   c                 0   > [         TU ]  5         / U l        g r+   )rv  rw  streamsrx  s    r1   rw  IdleTimeoutTest.setUp7  s    r4   c                 h   > [         TU ]  5         U R                   H  nUR                  5         M     g r+   )rv  r{  rl  r  )r0   rI   rR   s     r1   r{  IdleTimeoutTest.tearDown;  s%    llFLLN #r4   c              #      #    [        [        R                  " 5       5      nUR                  SU R                  5       45      v   U R                  R                  U5        [        R                  " U5      e7fr   )r   r   r   r   rl  r6   r   r  r   s     r1   r   IdleTimeoutTest.connect@  sS     &--/*nnk4+=+=+?@AAF#jj  s   A3A5c              #      #    U R                  5       v n[        5       nUR                  UR                  5        UR	                  5       v   g 7fr+   )r   r   set_close_callbackr  r  )r0   rI   events      r1   test_unused_connection&IdleTimeoutTest.test_unused_connectionG  s8     ||~%!!%)),jjls   AAc              #   T  #    U R                  5       v n[        5       nUR                  UR                  5        [	        S5       HL  nUR                  S5        UR                  S5      v   UR                  S5      v nU R                  US5        MN     UR                  5       v   g 7f)Nr!  s#   GET / HTTP/1.1
Host: 127.0.0.1

r      r   )
r   r   rs  r  rj  r   r   r   r   r  )r0   rI   rt  rg  r   s        r1   test_idle_after_use#IdleTimeoutTest.test_idle_after_useN  s     ||~%!!%)), qALLEF##K00**2..DT>2	  jjls   B&B()rl  )rA   rB   rC   rD   rU   r  rw  r{  r   rs  r   r   ru  ry  rE   r  r  s   @r1   re  re  0  sW    >1
 	]]! !    r4   re  c                       \ rS rSrS rS rS rS rS r\	R                  " \R                  S:H  S5      S	 5       rS
 r\	R                  " \R                  S:H  S5      S 5       rS rS r\S 5       r\S 5       rSrg)BodyLimitsTesti_  c                 r     " S S[         5      n[         " S S[         5      5       n[        SU4SU4/5      $ )Nc                       \ rS rSrS rSrg)/BodyLimitsTest.get_app.<locals>.BufferedHandleria  c                 r    U R                  [        [        U R                  R                  5      5      5        g r+   )r   r  rq   rl   rZ   rT   s    r1   put3BodyLimitsTest.get_app.<locals>.BufferedHandler.putb  s"    

3s4<<#4#4567r4   r`   N)rA   rB   rC   rD   r  rE   r`   r4   r1   BufferedHandlerr  a  s    8r4   r  c                   ,    \ rS rSrS rS rS rS rSrg)0BodyLimitsTest.get_app.<locals>.StreamingHandlerie  c                     SU l         g )Nr   
bytes_readrT   s    r1   rh   ;BodyLimitsTest.get_app.<locals>.StreamingHandler.initializeg  s	    "#r4   c                 p   [         R                  " [        U R                  R                  5      nSU R                  R
                  ;   a)  UR                  [        U R                  S5      5      5        SU R                  R
                  ;   a*  UR                  [        U R                  S5      5      5        g g )Nexpected_sizebody_timeout)typingcastr   rl   r  r
  set_max_body_sizer   r   set_body_timeoutfloatr=   s     r1   r+  8BodyLimitsTest.get_app.<locals>.StreamingHandler.preparej  s    {{?DLL4K4KL"dll&<&<<**3t/@/@/Q+RS!T\\%;%;;))%0A0A.0Q*RS <r4   c                 @    U =R                   [        U5      -  sl         g r+   )r  rq   r  s     r1   r9   >BodyLimitsTest.get_app.<locals>.StreamingHandler.data_receivedq  s    3t9,r4   c                 L    U R                  [        U R                  5      5        g r+   )r   r  r  rT   s    r1   r  4BodyLimitsTest.get_app.<locals>.StreamingHandler.putt  s    

3t/0r4   r  N)	rA   rB   rC   rD   rh   r+  r9   r  rE   r`   r4   r1   StreamingHandlerr  e  s    $T-1r4   r  	/buffered
/streaming)r   r    r   )r0   r  r  s      r1   rU   BodyLimitsTest.get_app`  sK    	8n 	8 
	1~ 	1 
	1" ?+l<L-MN
 	
r4   c                     [        SSS9$ )Nr   i   )r  max_body_sizer  rT   s    r1   r  %BodyLimitsTest.get_httpserver_options{  s    T::r4   c                     [        5       $ r+   r   rT   s    r1   r  BodyLimitsTest.get_http_client~  r  r4   c                     U R                  SSSS9nU R                  UR                  S5        U R                  SSSS9nU R                  UR                  S5        g )Nr  PUTs   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar   s   4096r  r   r   s     r1   test_small_bodyBodyLimitsTest.test_small_body  sR    ::k%k:J0::l5{:K0r4   c                     [        [        S[        R                  S9   U R	                  SSSS-  S9nS S S 5        U R                  WR                  S5        g ! , (       d  f       N+= f)	N.*Content-Length too longr  r  r     a (  r   rA  r   r   r  r  rX   r   ra  r   s     r1   test_large_body_buffered'BodyLimitsTest.test_large_body_buffered  sO    w ;7<<Pzz+e$,zOH Q, QP   A
A&ntzflaky on windowsc                     [        [        S[        R                  S9   U R	                  SSS S9nS S S 5        U R                  WR                  S5        g ! , (       d  f       N+= f)N.*chunked body too larger  r  r  c                     U " SS-  5      $ Nr  r  r`   r   s    r1   r   ABodyLimitsTest.test_large_body_buffered_chunked.<locals>.<lambda>      E$,,?r4   r   r+  rA  r  r   s     r1    test_large_body_buffered_chunked/BodyLimitsTest.test_large_body_buffered_chunked  sW     w :',,Ozz? " H P 	, PO   A
A$c                     [        [        S[        R                  S9   U R	                  SSSS-  S9nS S S 5        U R                  WR                  S5        g ! , (       d  f       N+= f)	Nr  r  r  r  r  r  r   rA  r  r   s     r1   test_large_body_streaming(BodyLimitsTest.test_large_body_streaming  sO    w ;7<<Pzz,u4%<zPH Q, QPr  c                     [        [        S[        R                  S9   U R	                  SSS S9nS S S 5        U R                  WR                  S5        g ! , (       d  f       N+= f)Nr  r  r  r  c                     U " SS-  5      $ r  r`   r  s    r1   r   BBodyLimitsTest.test_large_body_streaming_chunked.<locals>.<lambda>  r  r4   r  rA  r  r   s     r1   !test_large_body_streaming_chunked0BodyLimitsTest.test_large_body_streaming_chunked  sU    w :',,Ozz? " H P 	, POr  c                 d    U R                  SSSS-  S9nU R                  UR                  S5        g )N/streaming?expected_size=10240r  r  r  r      10240r   r   s     r1   "test_large_body_streaming_override1BodyLimitsTest.test_large_body_streaming_override  s6    ::,U  
 	1r4   c                 `    U R                  SSS S9nU R                  UR                  S5        g )Nr  r  c                     U " SS-  5      $ r  r`   r  s    r1   r   KBodyLimitsTest.test_large_body_streaming_chunked_override.<locals>.<lambda>  s    dUl(;r4   r  r  r   r   s     r1   *test_large_body_streaming_chunked_override9BodyLimitsTest.test_large_body_streaming_chunked_override  s4    ::,;  

 	1r4   c              #     #    [        [        R                  " 5       5      n UR                  SU R                  5       45      v   UR	                  S5        [        [        S[        R                  S9   UR                  5       v nS S S 5        U R                  WS5        UR                  5         g ! , (       d  f       N1= f! UR                  5         f = f7f)Nr   s@   PUT /streaming?body_timeout=0.1 HTTP/1.0
Content-Length: 42

zTimeout reading bodyr  r4   )r   r   r   r   r   r   r   r  r  r  r   r  r9  s      r1   test_timeoutBodyLimitsTest.test_timeout  s     &--/*	..+t/A/A/C!DEE LL. 7$:',,O!'!8!8!:: PXs+LLN	 PO LLNs5   CAC 3B1C  C1
B?;C CCc              #   @  #    [        [        R                  " 5       5      n UR                  SU R                  5       45      v   UR	                  S5        UR	                  SS-  5        [        U5      v u  p#nU R                  US5        UR	                  S5        [        [        S[        R                  S9   UR                  5       v nS S S 5        U R                  WS	5        UR                  5         g ! , (       d  f       N1= f! UR                  5         f = f7f)
Nr   sW   PUT /streaming?expected_size=10240 HTTP/1.1
Host: 127.0.0.1
Content-Length: 10240

r  r  r  sC   PUT /streaming HTTP/1.1
Host: 127.0.0.1
Content-Length: 10240

r  r  r8  )r   r   r   r   r   rK   r   r   r   r  r  r  r  )r0   rI   r.   r-   r]   r   s         r1   test_body_size_override_reset,BodyLimitsTest.test_body_size_override_reset  s      &--/*	..+t/A/A/C!DEELL1
 LL&2B62J,J)JXx0LL1
 7$?w||T#4466 UT#FGLLN	 UT LLNs5   DBD	 :C8D	 'D8
DD	 	DDr`   N)rA   rB   rC   rD   rU   r  r  r  r  unittestskipIfr   r3  r  r  r  r  r  r   r  r  rE   r`   r4   r1   r|  r|  _  s    
6;'
1-
 __RWW_&89- :--
 __RWW_&89- :-22     r4   r|  c                        \ rS rSrS rS rSrg)LegacyInterfaceTesti  c                    ^  U 4S jnU$ )Nc                   > U R                   R                  S5      Tl        TR                  (       dJ  U R                  R	                  [        SSS5      [        5       5        U R                  R                  5         g SnU R                  R                  [        S[        U5      -  5      5        U R                  R                  U5        U R                  R                  5         g )NzHTTP/1.rQ  r`  r  r   z'HTTP/1.1 200 OK
Content-Length: %d

)r  r   http1r  r  r   r   r?   r   r   rq   )rl   messager0   s     r1   handle_request3LegacyInterfaceTest.get_app.<locals>.handle_request  s     33I>DJ:: ""00%b#t4km ""))+$G$$G#g,VW $$W-%%'r4   r`   )r0   r  s   ` r1   rU   LegacyInterfaceTest.get_app  s    	(" r4   c                     U R                  S5      nU R                  (       d  U R                  S5        U R                  UR                  S5        g )NrQ   r  r   )rX   r  r  r   rZ   r   s     r1   test_legacy_interface)LegacyInterfaceTest.test_legacy_interface  s7    ::c?zzMM-.7r4   )r  N)rA   rB   rC   rD   rU   r  rE   r`   r4   r1   r  r    s    .8r4   r  )ctornador   r   tornado.escaper   r   r   r   r	   r
   tornado.http1connectionr   tornado.httpclientr   tornado.httpserverr   tornado.httputilr   r   r   r   tornado.iostreamr   tornado.locksr   tornado.logr   r   tornado.simple_httpclientr   tornado.testingr   r   r   r   r   tornado.test.utilr   tornado.webr   r   r    
contextlibr!   r"   r  r  r  r   rF  r   r   sysrA  r  r  urllib.parseri  rN  ior#   r  TYPE_CHECKINGr$   r%   rK   rM   rb   rv   TestCaser   r   r   r  r  r8  r>  rE  ro  r  r  r  r(  r  r  platformr?  r   rK  rS  r  r  r  r  r7  rP  re  r|  r  r`   r4   r1   <module>r     s      4 ( )  &  ( ;  1 H H .    	   
 
       	!C,	*+ 	*
E~ 
E'2  '2T&
)) &
R	
> 	
Y* Yx>. >&O~ &OR9n 9
B B>U& >UBN) Nb\
% \
~
')< 
.	D, 	D -H] -H -H` 
	"">cllh&>1# #	# 
		#	H(?(?(HID^ 	W% WtG$ G,G|. G0-,(9 -\
. \
~%P%6 %PP?) ?2,' ,^A& AH8+ 8r4   