
    g                        d dl mZmZ d dlmZmZmZmZmZm	Z	 d dl
mZ d dlmZ d dlmZ d dlmZmZmZmZ d dlmZ d dlmZ d d	lmZmZ d d
lmZ d dlmZ d dl m!Z!m"Z"m#Z#m$Z$m%Z% d dl&m'Z' d dl(m)Z)m*Z*m+Z+ d dl,m-Z- d dl.Z.d dl/Z/d dl0Z0d dl1Z1d dl2Z2d dl3Z3d dl4Z4d dl5Z5d dl6Z6d dl7Z7d dl8Z8d dl9Z:d dl;m<Z< d dl=Z=e=j|                  rd dl=m?Z?m@Z@ d ZA G d de!      ZB G d de*      ZC e8j                   eEe4dd      dk  d      ZF G d de"      ZG G d deH      ZI G d  d!eGeI      ZJeF G d" d#eGeI             ZKeF G d$ d%eGeI             ZL G d& d'eGeI      ZM G d( d)e8j                        ZO G d* d+e*      ZP G d, d-e!      ZQ G d. d/e*      ZR G d0 d1e*      ZS G d2 d3e*      ZT G d4 d5eT      ZU G d6 d7e!      ZV G d8 d9e!      ZW G d: d;eB      ZX G d< d=e"eB      ZY G d> d?eB      ZZ e8j                   e[e3d@       xs e5j                  dAk(  dB       G dC dDe#             Z] G dE dFe!      Z^ G dG dHe!      Z_ G dI dJe_e!      Z` G dK dLe_e!      Za G dM dNe!      Zb G dO dPe!      Zc G dQ dRe!      Zde' G dS dTe!             Ze G dU dVe!      Zf G dW dXe!      Zgy)Y    )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)ssl_options_to_contextSimpleAsyncHTTPClient)AsyncHTTPTestCaseAsyncHTTPSTestCaseAsyncTestCase	ExpectLoggen_test)skipOnTravis)ApplicationRequestHandlerstream_request_body)closingN)BytesIO)DictListc                    K   g  G fddt               }t        | d       |       }j                  |       d{    |j                  |j                  dj                        fS 7 ,w)zaReads an HTTP response from `stream` and returns a tuple of its
    start_line, headers and body.c                   (    e Zd Zd Z fdZfdZy)"read_stream_body.<locals>.Delegatec                      || _         || _        y N)headers
start_lineselfr,   r+   s      Q/var/www/openai/venv/lib/python3.12/site-packages/tornado/test/httpserver_test.pyheaders_receivedz3read_stream_body.<locals>.Delegate.headers_received=   s    "DL(DO    c                 (    j                  |       y r*   )append)r.   chunkchunkss     r/   data_receivedz0read_stream_body.<locals>.Delegate.data_receivedA   s    MM% r1   c                 &    j                          y r*   )detachr.   conns    r/   finishz)read_stream_body.<locals>.Delegate.finishD   s    KKMr1   N)__name__
__module____qualname__r0   r6   r;   )r5   r:   s   r/   Delegater(   <   s    	)	!	r1   r?   TNr1   )r   r   read_responser,   r+   join)streamr?   delegater5   r:   s      @@r/   read_stream_bodyrD   7   sk      F	& 	 64(DzH


X
&&& 0 0#((62BBB 's   <A/ A--A/c                       e Zd ZdZd Zd Zy)HandlerBaseTestCaseNc                 F    t        d| j                  j                  fg      S N/)r   	__class__Handlerr.   s    r/   get_appzHandlerBaseTestCase.get_appP   s    S$.."8"89:;;r1   c                 p     | j                   |i |}|j                          t        |j                        S r*   )fetchrethrowr   body)r.   argskwargsresponses       r/   
fetch_jsonzHandlerBaseTestCase.fetch_jsonS   s2    4::t.v.8==))r1   )r<   r=   r>   rK   rM   rU    r1   r/   rF   rF   M   s    G<*r1   rF   c                        e Zd ZddZd Zd Zy)HelloWorldRequestHandlerc                     || _         y r*   )expected_protocol)r.   protocols     r/   
initializez#HelloWorldRequestHandler.initializeZ   s
    !)r1   c                     | j                   j                  | j                  k7  rt        d      | j	                  d       y )Nzunexpected protocolHello world)requestr[   rZ   	Exceptionr;   rL   s    r/   getzHelloWorldRequestHandler.get]   s2    <<  D$:$::122M"r1   c                 f    | j                  dt        | j                  j                        z         y )NzGot %d bytes in POST)r;   lenr_   rQ   rL   s    r/   postzHelloWorldRequestHandler.postb   s#    *S1B1B-CCDr1   N)http)r<   r=   r>   r\   ra   rd   rV   r1   r/   rX   rX   Y   s    *#
Er1   rX   OPENSSL_VERSION_INFO)r   r   )   r   z(old version of ssl module and/or opensslc                       e Zd Zd Zy)BaseSSLTestc                 <    t        dt        t        d      fg      S )NrI   httpsr[   )r   rX   dictrL   s    r/   rM   zBaseSSLTest.get_appr   s    S":D'<RSTUUr1   N)r<   r=   r>   rM   rV   r1   r/   ri   ri   q   s    Vr1   ri   c                       e Zd Zd Zd Zdej                  fdZdej                  fdZdej                  fdZ	dej                  fdZ
y)	SSLTestMixinc                 \    t        dd| j                         it        j                         S )Nssl_versionrV   )rm   get_ssl_versionr   default_ssl_optionsrL   s    r/   get_ssl_optionszSSLTestMixin.get_ssl_optionsw   s1     
,,.
 446
 	
r1   c                     t               r*   )NotImplementedErrorrL   s    r/   rr   zSSLTestMixin.get_ssl_version}   s    !##r1   r.   c                 ^    | j                  d      }| j                  |j                  d       y )NrI      Hello worldrO   assertEqualrQ   r.   rT   s     r/   test_sslzSSLTestMixin.test_ssl   s#    ::c?7r1   c                 j    | j                  ddddz        }| j                  |j                  d       y )NrI   POSTAi  methodrQ   s   Got 5000 bytes in POSTry   r{   s     r/   test_large_postzSSLTestMixin.test_large_post   s/    ::c&sTz:B(ABr1   c           	      d   t        t        d      5  t        t        dd      5  | j                  t        t        f      5  | j                  | j                  d      j                  dd      ddd	
       d d d        d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)Nz(SSL Error|uncaught exception)Uncaught exceptionFrequiredrI   https:http:  T)request_timeoutconnect_timeoutraise_error)r   r   assertRaisesIOErrorr   rO   get_urlreplacerL   s    r/   test_non_ssl_requestz!SSLTestMixin.test_non_ssl_request   s     w @A7$85I&&';<JJS)11(GD(,(,$(	   = J BA<< JI BAs:   B&B 5B5B=B&BBB#	B&&B/c                 H   t        t        d      5 }| j                  t        t        f      5  | j                  | j                  d      j                  dd      d       d d d        d d d        | j                  j                         y # 1 sw Y   -xY w# 1 sw Y   1xY w)Nz	SSL ErrorrI   r   r   T)r   )
r   r   r   r   r   rO   r   r   assertFalselogged_stack)r.   
expect_logs     r/   test_error_loggingzSSLTestMixin.test_error_logging   s    w,
""GY#78

LL%--h@d   9 -
 	001	 98 -,s"   B3B BB	BB!N)r<   r=   r>   rt   rr   typingAnyr|   r   r   r   rV   r1   r/   ro   ro   v   sN    
$8vzz 8Cfjj C6:: 2 2r1   ro   c                       e Zd Zd Zy)
SSLv23Testc                 "    t         j                  S r*   )sslPROTOCOL_SSLv23rL   s    r/   rr   zSSLv23Test.get_ssl_version   s    """r1   Nr<   r=   r>   rr   rV   r1   r/   r   r      s    #r1   r   c                       e Zd Zd Zy)	SSLv3Testc                 "    t         j                  S r*   )r   PROTOCOL_SSLv3rL   s    r/   rr   zSSLv3Test.get_ssl_version       !!!r1   Nr   rV   r1   r/   r   r          "r1   r   c                       e Zd Zd Zy)	TLSv1Testc                 "    t         j                  S r*   )r   PROTOCOL_TLSv1rL   s    r/   rr   zTLSv1Test.get_ssl_version   r   r1   Nr   rV   r1   r/   r   r      r   r1   r   c                       e Zd Zd Zy)SSLContextTestc                 ~    t        t        j                  |       d      }t        |t        j
                        sJ |S )NT)server_side)r   r   rt   
isinstancer   
SSLContext)r.   contexts     r/   rt   zSSLContextTest.get_ssl_options   s7    (..t4$
 '3>>222r1   N)r<   r=   r>   rt   rV   r1   r/   r   r      s    r1   r   c                       e Zd Zd Zd Zy)BadSSLOptionsTestc                 V    t               }| j                  t        t        |ddi       y )Nkeyfilez/__missing__.crtssl_options)r   r   KeyErrorr   )r.   applications     r/   test_missing_argumentsz(BadSSLOptionsTest.test_missing_arguments   s.    !m"$67	 	 	
r1   c                    t               }t        j                  j                  t              }t        j                  j                  |d      }t        j                  j                  |d      }| j                  t        t        ft        |ddi       | j                  t        t        ft        ||dd       t        |||d       y)	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__rA   r   
ValueErrorr   r   )r.   r   
module_direxisting_certificateexisting_keys        r/   test_missing_keyz"BadSSLOptionsTest.test_missing_key   s     "mWW__X.
!ww||J
Cww||J
;!#%67	 	 	
 	!0-	 	 	
 	%9lS	
r1   N)r<   r=   r>   r   r   rV   r1   r/   r   r      s    

r1   r   c                       e Zd Zd Zy)MultipartTestHandlerc           	         | j                  | j                  j                  d   | j                  d      | j                  j                  d   d   j
                  t        | j                  j                  d   d   d         d       y )NzX-Header-Encoding-Testargumentfilesr   rQ   )headerr   filenamefilebody)r;   r_   r+   get_argumentr   r   r   rL   s    r/   rd   zMultipartTestHandler.post   sr    ,,../GH --j9 LL..w7:CC$T\\%7%7%@%CF%KL		
r1   Nr<   r=   r>   rd   rV   r1   r/   r   r      s    
r1   r   c                   <    e Zd Zd Zd ZddZd Zd Zed        Z	y)	HTTPConnectionTestc                 "    dt         fdt        fgS )Nz
/multipart/hello)r   rX   rL   s    r/   get_handlerszHTTPConnectionTest.get_handlers   s    /0/0
 	
r1   c                 4    t        | j                               S r*   )r   r   rL   s    r/   rM   zHTTPConnectionTest.get_app   s    4,,.//r1   c                     t        t        t        j                                     5  j                  j	                   fd       j                  |j                  |t        dt        |      z        gz         |z   |z   |z           j                  j	                  fd      \  }}}|cd d d        S # 1 sw Y   y xY w)Nc                  F    j                  d j                         f      S N	127.0.0.1)connectget_http_portr.   rB   s   r/   <lambda>z.HTTPConnectionTest.raw_fetch.<locals>.<lambda>  s    T5G5G5I'JKr1   zContent-Length: %dc                      t               S r*   )rD   )rB   s   r/   r   z.HTTPConnectionTest.raw_fetch.<locals>.<lambda>  s    (0r1   )	r"   r   socketio_looprun_syncwriterA   r   rc   )r.   r+   rQ   newliner,   rB   s   `    @r/   	raw_fetchzHTTPConnectionTest.raw_fetch   s    Xfmmo./6LL!!K LLW-ACI-M(N'OOP  )-(=(=0)%J  0//s   BB88Cc                 t   | j                  g ddj                  dddj                  d      ddj                  d	      dd
j                  d      ddg	            }t        |      }| j	                  d|d          | j	                  d|d          | j	                  d|d          | j	                  d
|d          y )N)s   POST /multipart HTTP/1.0s6   Content-Type: multipart/form-data; boundary=1234567890s   X-Header-encoding-test:    
s-   Content-Disposition: form-data; name=argumentr1      ázutf-8s   --1234567890u;   Content-Disposition: form-data; name="files"; filename="ó"r      ús   --1234567890--   ér   r      ór   r   )r   rA   encoder   rz   r.   rT   datas      r/   test_multipart_formz&HTTPConnectionTest.test_multipart_form  s     >>
 LLDOOG,#U\\ OOG,%
, 8$4>24
#344
#344
#34r1   c                 `    dD ])  }| j                  dgd|      }| j                  |d       + y )N)r      
s   GET /hello HTTP/1.0r1   )r   rx   )r   rz   )r.   r   rT   s      r/   test_newlinesz HTTPConnectionTest.test_newlines/  s4    'G~~'=&>W~UHX~6 (r1   c              #     K   t        t        j                               }|j                  d| j                         f       |j	                  dj                  g d             |j                  d      }| j                  |j                  d      |       |j	                  d       |j                  d      }| j                  |j                  d      |       |j                  d      }t        j                  t        |j                  d                  }|j                  t        |d	               }| j                  |d
       |j!                          y w)Nr   r   )s   POST /hello HTTP/1.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   rA   
read_until
assertTrue
startswithr   parser
   decode
read_bytesintrz   close)r.   rB   r   
first_lineheader_datar+   rQ   s          r/   test_100_continuez$HTTPConnectionTest.test_100_continue5  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"N)r   )
r<   r=   r>   r   rM   r   r   r   r   r   rV   r1   r/   r   r      s/    
0 5>7  r1   r   c                       e Zd Zd Zd Zy)EchoHandlerc                 `    | j                  t        | j                  j                               y r*   r   r	   r_   	argumentsrL   s    r/   ra   zEchoHandler.getT      

$T\\%;%;<=r1   c                 `    | j                  t        | j                  j                               y r*   r  rL   s    r/   rd   zEchoHandler.postW  r  r1   Nr<   r=   r>   ra   rd   rV   r1   r/   r  r  S  s    >>r1   r  c                   $    e Zd Zd Zd Zd Zd Zy)TypeCheckHandlerc           	      >   i | _         dt        fdt        fdt        fdt        fdt        fdt        fdt        fdt        fg}|D ],  \  }}| j                  |t        | j                  |      |       . | j                  d	t        | j                  j                  j                               d
   t               | j                  dt        | j                  j                  j                               d
   t               | j                  dt        | j                  j                  j                               d
   t               | j                  dt        | j                  j                  j                               d
   j                  t               | j                  dt        | j                  j                  j                               d
   t               | j                  dt        | j                  j                  j                               d
   d
   t               y )Nr   uriversion	remote_ipr[   hostr   query
header_keyr   header_value
cookie_keycookie_valuearg_key	arg_value)errorsstr
check_typegetattrr_   listr+   keysvaluescookiesvaluer  bytes)r.   fieldsfieldexpected_types       r/   preparez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Xr1   c                     | j                  d| j                  j                  t               | j	                  | j
                         y )NrQ   )r  r_   rQ   r  r   r  rL   s    r/   rd   zTypeCheckHandler.postw  s,     1 159

4;;r1   c                 :    | j                  | j                         y r*   )r   r  rL   s    r/   ra   zTypeCheckHandler.get{  s    

4;;r1   c                 P    t        |      }||k7  rd|d|| j                  |<   y y )Nz	expected z, got )typer  )r.   nameobjr"  actual_types        r/   r  zTypeCheckHandler.check_type~  s+    3iK'9F TDKK (r1   N)r<   r=   r>   r#  rd   ra   r  rV   r1   r/   r	  r	  [  s    Y6  Ur1   r	  c                       e Zd Zd Zy)PostEchoHandlerc                 X    | j                  t        | j                  d                   y )Nr   )echo)r   rm   r   )r.   	path_argss     r/   rd   zPostEchoHandler.post  s    

4T..v678r1   Nr   rV   r1   r/   r,  r,    s    9r1   r,  c                       e Zd ZddZy)PostEchoGBKHandlerNc                 ^    	 |j                  d      S # t        $ r t        dd|z        w xY w)Ngbk  zinvalid gbk bytes: %r)r   r`   r   )r.   r  r(  s      r/   decode_argumentz"PostEchoGBKHandler.decode_argument  s;    	B<<&& 	BC!85!@AA	Bs    ,r*   )r<   r=   r>   r5  rV   r1   r/   r1  r1    s    Br1   r1  c                   6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)	HTTPServerTestc                 ^    t        dt        fdt        fdt        fdt        fdt        fg      S )N/echo
/typecheck//doubleslashz
/post_utf8z	/post_gbk)r   r  r	  r,  r1  rL   s    r/   rM   zHTTPServerTest.get_app  s>    +&/0 +./01
 	
r1   c                 z    | j                  d      }t        |j                        }| j                  |ddgi       y )Nz/echo?foo=%C3%A9foor   rO   r   rQ   rz   r   s      r/   test_query_string_encodingz)HTTPServerTest.test_query_string_encoding  s6    ::018==)z23r1   c                 |    | j                  d      }t        |j                        }| j                  |dddgi       y )Nz/echo?foo=&foo=r=   r>  r   s      r/   test_empty_query_stringz&HTTPServerTest.test_empty_query_string  s8    ::/08==)Bx01r1   c                     | j                  ddd      }t        |j                        }| j                  |dgdgd       y )Nr9  r~   z	foo=&bar=r   rA  )r=  barr>  r   s      r/   test_empty_post_parametersz)HTTPServerTest.test_empty_post_parameters  s=    ::gf;:G8==)tRD9:r1   c                     ddi}| j                  d|      }t        |j                        }| j                  |i        | j                  ddd|      }t        |j                        }| j                  |i        y )NCookiefoo=barz/typecheck?foo=barr+   r:  r~   r   rQ   r+   r>  )r.   r+   rT   r   s       r/   
test_typeszHTTPServerTest.test_types  sy    Y'::2G:D8==)r"::i  
 8==)r"r1   c                     | j                  d      }| j                  d|j                         | j                  t        |j                        i        y )Nr;     )rO   rz   coder   rQ   r{   s     r/   test_double_slashz HTTPServerTest.test_double_slash  s?     ::o.hmm,X]]3R8r1   c           
         ddi}d}dD ]  }dD ]  }| j                  ||      5  |j                  |      }|r.t        j                  j	                  |      j                  d      }| j                  d|z   d	|d
|z         }| j                  t        |j                        d|i       d d d          y # 1 sw Y   xY w)NzContent-Typez!application/x-www-form-urlencodedu   chinese: 张三)r   r3  )TF)encquoteasciiz/post_r~   s   data=)r   r+   rQ   r.  )	subTestr   urllibr   rR  rO   rz   r   rQ   )r.   r+   uni_textrQ  rR  bin_textrT   s          r/   test_post_encodingsz"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B55B>N)
r<   r=   r>   rM   r?  rB  rE  rK  rO  rX  rV   r1   r/   r7  r7    s&    	
4
2
;

#9Ur1   r7  c                   z     e Zd Zd Z fdZ fdZd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zed        Z xZS )HTTPServerRawTestc                 &    t        dt        fg      S )Nr9  r   r  rL   s    r/   rM   zHTTPServerRawTest.get_app  s    Wk2344r1   c                      t                    t        t        j                                _         j
                  j                   fd       y )Nc                  Z     j                   j                  d j                         f      S r   )rB   r   r   rL   s   r/   r   z)HTTPServerRawTest.setUp.<locals>.<lambda>  s"    DKK''d6H6H6J(KLr1   )supersetUpr   r   rB   r   r   r.   rJ   s   `r/   r`  zHTTPServerRawTest.setUp  s3    v}}/L	
r1   c                 V    | j                   j                          t        |           y r*   )rB   r   r_  tearDownra  s    r/   rc  zHTTPServerRawTest.tearDown  s    r1   c                     | j                   j                          | j                  j                  t	        j
                  d      | j                         | j                          y )NMbP?seconds)rB   r   r   add_timeoutdatetime	timedeltastopwaitrL   s    r/   test_empty_requestz$HTTPServerRawTest.test_empty_request  s>      !3!3E!BDIIN		r1   c                     t        t        dt        j                        5   j                  j                  d        j                  j                   fd      \  }}} j                  d|j                          j                  d|j                          j                  d|j                         d d d        y # 1 sw Y   y xY w)N.*Malformed HTTP request linelevel   asdf

c                  .    t         j                        S r*   rD   rB   rL   s   r/   r   zFHTTPServerRawTest.test_malformed_first_line_response.<locals>.<lambda>      (5r1   HTTP/1.1r4  zBad Request)r   r   loggingINFOrB   r   r   r   rz   r  rN  reasonr.   r,   r+   rT   s   `   r/   "test_malformed_first_line_responsez4HTTPServerRawTest.test_malformed_first_line_response  s    w ?w||TKKo.,0LL,A,A5-)J Z););<S*//2]J,=,=> UTTs   BB==Cc                 8   t        t        dt        j                        5  | j                  j                  d       | j                  j                  t        j                  d      | j                         | j                          d d d        y # 1 sw Y   y xY w)Nro  rp  rr  皙?rf  r   r   rw  rx  rB   r   r   rh  ri  rj  rk  rl  rL   s    r/   test_malformed_first_line_logz/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   t        t        dt        j                        5  | j                  j                  d       | j                  j                  t        j                  d      | j                         | j                          d d d        y # 1 sw Y   y xY w)Nz1.*Malformed HTTP message.*no colon in header linerp  s   GET / HTTP/1.0
asdf

r}  rf  r~  rL   s    r/   test_malformed_headersz(HTTPServerRawTest.test_malformed_headers  sh    ?,,

 KK?@LL$$X%7%7%EtyyQIIK
 
 
r  c                       j                   j                  dj                  dd              j                  j	                   fd      \  }}} j                  t        |      ddgi       y )Nsp   POST /echo HTTP/1.1
Transfer-Encoding: chunked
Content-Type: application/x-www-form-urlencoded

4
foo=
3
bar
0

r   r   c                  .    t         j                        S r*   rt  rL   s   r/   r   z=HTTPServerRawTest.test_chunked_request_body.<locals>.<lambda>      $T[[1r1   r=  rD  rB   r   r   r   r   rz   r   rz  s   `   r/   test_chunked_request_bodyz+HTTPServerRawTest.test_chunked_request_body  k     	 Gw	
  )-(=(=1)
%
GX 	X.0@Ar1   c                       j                   j                  dj                  dd              j                  j	                   fd      \  }}} j                  t        |      ddgi       y )Nsp   POST /echo HTTP/1.1
Transfer-Encoding: Chunked
Content-Type: application/x-www-form-urlencoded

4
foo=
3
bar
0

r   r   c                  .    t         j                        S r*   rt  rL   s   r/   r   zBHTTPServerRawTest.test_chunked_request_uppercase.<locals>.<lambda>.  r  r1   r=  rD  r  rz  s   `   r/   test_chunked_request_uppercasez0HTTPServerRawTest.test_chunked_request_uppercase  r  r1   c                 B     j                   j                  dj                  dd             t        t        dt
        j                        5   j                  j                   fd      \  }}}d d d         j                  dj                         y # 1 sw Y   &xY w)NsR   POST /echo HTTP/1.1
Transfer-Encoding: chunked

1_a
1234567890abcdef1234567890
0

r   r   z.*invalid chunk sizerp  c                  .    t         j                        S r*   rt  rL   s   r/   r   zJHTTPServerRawTest.test_chunked_request_body_invalid_size.<locals>.<lambda>D  ru  r1   r4  )rB   r   r   r   r   rw  rx  r   r   rz   rN  rz  s   `   r/   &test_chunked_request_body_invalid_sizez8HTTPServerRawTest.test_chunked_request_body_invalid_size2  s     	 Gw	
 w 6gllK,0LL,A,A5-)J L 	joo.	 LKs   #BBc                 "     j                   j                  d       t        t        dt        j
                        5   j                  j                   fd      \  }}}d d d         j                  dj                         y # 1 sw Y   &xY w)NsS   POST /echo HTTP/1.1
Transfer-Encoding: chunked
Transfer-encoding: chunked

2
ok
0

z/.*Unsupported Transfer-Encoding chunked,chunkedrp  c                  .    t         j                        S r*   rt  rL   s   r/   r   zNHTTPServerRawTest.test_chunked_request_body_duplicate_header.<locals>.<lambda>]  ru  r1   r4  
rB   r   r   r   rw  rx  r   r   rz   rN  rz  s   `   r/   *test_chunked_request_body_duplicate_headerz<HTTPServerRawTest.test_chunked_request_body_duplicate_headerH  sy     			
 =,,

 -1LL,A,A5-)J
 	joo.
 
   #BBc                 "     j                   j                  d       t        t        dt        j
                        5   j                  j                   fd      \  }}}d d d         j                  dj                         y # 1 sw Y   &xY w)Ns>   POST /echo HTTP/1.1
Transfer-Encoding: gzip, chunked

2
ok
0

z-.*Unsupported Transfer-Encoding gzip, chunkedrp  c                  .    t         j                        S r*   rt  rL   s   r/   r   z[HTTPServerRawTest.test_chunked_request_body_unsupported_transfer_encoding.<locals>.<lambda>r  ru  r1   r4  r  rz  s   `   r/   7test_chunked_request_body_unsupported_transfer_encodingzIHTTPServerRawTest.test_chunked_request_body_unsupported_transfer_encodinga  sv    
	
 DGLL
 -1LL,A,A5-)J
 	joo.
 
r  c                 "     j                   j                  d       t        t        dt        j
                        5   j                  j                   fd      \  }}}d d d         j                  dj                         y # 1 sw Y   &xY w)NsJ   POST /echo HTTP/1.1
Transfer-Encoding: chunked
Content-Length: 2

2
ok
0

z8.*Message with both Transfer-Encoding and Content-Lengthrp  c                  .    t         j                        S r*   rt  rL   s   r/   r   zbHTTPServerRawTest.test_chunked_request_body_transfer_encoding_and_content_length.<locals>.<lambda>  ru  r1   r4  r  rz  s   `   r/   >test_chunked_request_body_transfer_encoding_and_content_lengthzPHTTPServerRawTest.test_chunked_request_body_transfer_encoding_and_content_lengthv  sw    		
 F,,

 -1LL,A,A5-)J
 	joo.
 
r  c              #   D  K   g d}|D ]  \  }}| j                  |      5  t        t        t        j                                     5 }t	        t
        dt        j                        5  |j                  d| j                         f       |j                  t        t        j                  d| d      j                  dd	                   |j                          d d d        d d d        d d d         y # 1 sw Y   xY w# 1 sw Y    xY w# 1 sw Y   xY ww)
N))
alphabeticr=  )leading plus+10)zinternal underscore1_0)r(  z(.*Only integer Content-Length is allowedrp  r   z\                            POST /echo HTTP/1.1
                            Content-Length: zs
                            Connection: close

                            1234567890
                            
z
)rT  r"   r   r   r   r   rw  rx  r   r   r   r   textwrapdedentr   read_until_close)r.   
test_casesr(  r  rB   s        r/   test_invalid_content_lengthz-HTTPServerRawTest.test_invalid_content_length  s     



 &KD%4('(6==?2K*LPV>!,,
 !..+t7I7I7K)LMMLL$OO%--2G 4!  &gdF3
 !1133' +M(( &  +M*L((sM   D 'D!D)A7C;	 D(D0D ;D DDDD	D )r<   r=   r>   rM   r`  rc  rm  r{  r  r  r  r  r  r  r  r  r   r  __classcell__rJ   s   @r/   rZ  rZ    sZ    5

?B0B0/,/2/*/0 4 4r1   rZ  c                   :    e Zd Z G d de      Zd Zd Zd Zd Zy)XHeaderTestc                       e Zd Zd Zy)XHeaderTest.Handlerc                     | j                  d| j                  j                         | j                  t	        | j                  j
                  | j                  j                               y )Nrequest-version)r  remote_protocol)
set_headerr_   r  r   rm   r  r[   rL   s    r/   ra   zXHeaderTest.Handler.get  sI    OO-t||/C/CDJJ"ll44$(LL$9$9r1   Nr<   r=   r>   ra   rV   r1   r/   rK   r    s    	r1   rK   c                     t        ddg      S )NTz5.5.5.5)xheaderstrusted_downstreamrm   rL   s    r/   get_httpserver_optionsz"XHeaderTest.get_httpserver_options  s    TykBBr1   c                    | j                  | j                  d      d   d       ddi}| j                  | j                  d|      d   d       ddi}| j                  | j                  d|      d   d       dd	i}| j                  | j                  d|      d   d	       dd
i}| j                  | j                  d|      d   d	       ddi}| j                  | j                  d|      d   d       ddi}| j                  | j                  d|      d   d       ddi}| j                  | j                  d|      d   d       y )NrI   r  r   z	X-Real-IP4.4.4.4rI  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rz   rU   )r.   
valid_ipv4valid_ipv4_list
valid_ipv6valid_ipv6_listinvalid_charsinvalid_chars_listinvalid_hosts           r/   test_ip_headersz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[	
r1   c                     ddi}| j                  d|      }|j                  d   j                  d      r| j                  d       t	        |j
                        }| j                  |d   d	       y )
Nr  z127.0.0.1, 4.4.4.4, 5.5.5.5rI   rI  r  zHTTP/2requires HTTP/1.xr  r  )rO   r+   r   skipTestr   rQ   rz   )r.   r  respresults       r/   test_trusted_downstreamz#XHeaderTest.test_trusted_downstream  si    ,.KLzz#z7<<)*55h? MM-.TYY',i8r1   c                    | j                  | j                  d      d   d       ddi}| j                  | j                  d|      d   d       ddi}| j                  | j                  d|      d   d       ddi}| j                  | j                  d|      d   d       dd	i}| j                  | j                  d|      d   d       dd
i}| j                  | j                  d|      d   d       y )NrI   r  re   X-Schemerk   rI  zX-Forwarded-Protozhttps , httpz
http,httpsunknownr  )r.   https_schemehttps_forwardedhttps_multi_forwardedhttp_multi_forwardedbad_forwardeds         r/   test_scheme_headersz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	
r1   N)	r<   r=   r>   r    rK   r  r  r  r  rV   r1   r/   r  r    s$    . C&
P9
r1   r  c                   *     e Zd Zd Z fdZd Z xZS )SSLXHeaderTestc                 :    t        dt        j                  fg      S rH   )r   r  rK   rL   s    r/   rM   zSSLXHeaderTest.get_app  s    S+"5"56788r1   c                 .    t         |          }d|d<   |S )NTr  )r_  r  )r.   outputrJ   s     r/   r  z%SSLXHeaderTest.get_httpserver_options  s    /1!zr1   c                     | j                  | j                  d      d   d       ddi}| j                  | j                  d|      d   d       ddi}| j                  | j                  d|      d   d       y )NrI   r  rk   r  re   rI  r  r  )r.   http_scheme
bad_schemes      r/   test_request_without_xprotocolz-SSLXHeaderTest.test_request_without_xprotocol  s    -.?@'J!6*OOCO56GH&	
 !),
OOCO45FG	
r1   )r<   r=   r>   rM   r  r  r  r  s   @r/   r  r    s    9

r1   r  c                   .    e Zd Z G d de      Zd Zd Zy)ManualProtocolTestc                       e Zd Zd Zy)ManualProtocolTest.Handlerc                 b    | j                  t        | j                  j                               y )Nrl   )r   rm   r_   r[   rL   s    r/   ra   zManualProtocolTest.Handler.get(  s    JJtT\\%:%:;<r1   Nr  rV   r1   r/   rK   r  '  s    	=r1   rK   c                     t        d      S )Nrk   rl   r  rL   s    r/   r  z)ManualProtocolTest.get_httpserver_options+  s    W%%r1   c                 L    | j                  | j                  d      d   d       y )NrI   r[   rk   r  rL   s    r/   test_manual_protocolz'ManualProtocolTest.test_manual_protocol.  s     -j97Cr1   N)r<   r=   r>   r    rK   r  r  rV   r1   r/   r  r  &  s    =. =&Dr1   r  AF_UNIXcygwinz+unix sockets not supported on this platformc                   L     e Zd ZdZ fdZ fdZed        Zed        Z xZ	S )UnixSocketTesta  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.
    c                 
    t                    t        j                          _        t
        j                  j                   j                  d       _        t        j                   j                        }t        dt        fg      }t        |       _         j                  j                  |       t!        t#        j"                  t"        j$                               _         j(                  j+                   fd       y )Nz	test.sockr   c                  N     j                   j                   j                        S r*   )rB   r   sockfilerL   s   r/   r   z&UnixSocketTest.setUp.<locals>.<lambda>J  s    dkk&9&9$--&Hr1   )r_  r`  tempfilemkdtemptmpdirr   r   rA   r  r   bind_unix_socketr   rX   r   server
add_socketr   r   r  rB   r   r   )r.   sockapprJ   s   `  r/   r`  zUnixSocketTest.setUpA  s    &&(T[[+>''6H&>?@A ot$v}}V^^<=HIr1   c                 &   | j                   j                          | j                  j                  | j                  j
                         | j                  j                          t        j                  | j                         t        | -          y r*   )rB   r   r   r   r  close_all_connectionsrk  shutilrmtreer  r_  rc  ra  s    r/   rc  zUnixSocketTest.tearDownL  sZ    dkk??@dkk"r1   c              #     K   | j                   j                  d       | j                   j                  d      }| j                  |d       | j                   j                  d      }t	        j
                  |j                  d            }| j                   j                  t        |d               }| j                  |d       y w)Ns   GET /hello HTTP/1.0

r   s   HTTP/1.1 200 OK
r   r   r   rx   )	rB   r   r   rz   r   r   r   r   r   )r.   rT   r   r+   rQ   s        r/   test_unix_socketzUnixSocketTest.test_unix_socketS  s     89//88#9: KK22;??##K$6$6x$@A[[++C8H0I,JKK~.s   CC
c              #     K   t        t        dt        j                        5  | j                  j                  d       | j                  j                         }d d d        | j                  d       y # 1 sw Y   xY ww)NzMalformed HTTP message fromrp  s   garbage

   HTTP/1.1 400 Bad Request

)r   r   rw  rx  rB   r   r  rz   r{   s     r/   test_unix_socket_bad_requestz+UnixSocketTest.test_unix_socket_bad_request]  sc      w =W\\RKK01![[99;;H S 	#FG SRs   !B8A6B6A?;B)
r<   r=   r>   __doc__r`  rc  r   r  r  r  r  s   @r/   r  r  2  s=    
	J / / H Hr1   r  c                   T    e Zd ZdZd Z fdZ fdZej                  d        Z	ej                  d        Z
ej                  d        Zd Zed	        Zed
        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Z xZS )KeepAliveTestzTests 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           
           G d dt               } G d dt               } G d dt               } G d dt               }t               | _        t        d	|fd
|fd|fd|t	        | j                        fg      S )Nc                       e Zd Zd Zd Zy)+KeepAliveTest.get_app.<locals>.HelloHandlerc                 &    | j                  d       y Nr^   r;   rL   s    r/   ra   z/KeepAliveTest.get_app.<locals>.HelloHandler.getp      M*r1   c                 &    | j                  d       y r   r  rL   s    r/   rd   z0KeepAliveTest.get_app.<locals>.HelloHandler.posts  r  r1   Nr  rV   r1   r/   HelloHandlerr  o  s    ++r1   r  c                       e Zd Zd Zy)+KeepAliveTest.get_app.<locals>.LargeHandlerc                 d    | j                  dj                  d t        d      D                     y )NrA  c              3   >   K   | ]  }t        |d z        dz    yw)      N)chr).0is     r/   	<genexpr>zBKeepAliveTest.get_app.<locals>.LargeHandler.get.<locals>.<genexpr>z  s     "K
13q3w<$#6
s   i   )r   rA   rangerL   s    r/   ra   z/KeepAliveTest.get_app.<locals>.LargeHandler.getw  s#     

277"Kc
"KKLr1   Nr  rV   r1   r/   LargeHandlerr  v  s    Mr1   r  c                   0    e Zd Zej                  d        Zy)=KeepAliveTest.get_app.<locals>.TransferEncodingChunkedHandlerc              3   R   K   | j                  d       | j                          y wr   )r   flushrL   s    r/   headzBKeepAliveTest.get_app.<locals>.TransferEncodingChunkedHandler.head}  s     

=)jjl"s   %'N)r<   r=   r>   r   	coroutiner  rV   r1   r/   TransferEncodingChunkedHandlerr  |  s    ]]# #r1   r  c                   <    e Zd Zd Zej
                  d        Zd Zy)3KeepAliveTest.get_app.<locals>.FinishOnCloseHandlerc                     || _         y r*   cleanup_event)r.   r  s     r/   r\   z>KeepAliveTest.get_app.<locals>.FinishOnCloseHandler.initialize  s
    %2"r1   c              3   d   K   | j                          | j                  j                          y wr*   )r  r  rl  rL   s    r/   ra   z7KeepAliveTest.get_app.<locals>.FinishOnCloseHandler.get  s$     

((--//s   .0c                 &    | j                  d       y )Nclosedr  rL   s    r/   on_connection_closezGKeepAliveTest.get_app.<locals>.FinishOnCloseHandler.on_connection_close  s     H%r1   N)r<   r=   r>   r\   r   r  ra   r   rV   r1   r/   FinishOnCloseHandlerr    s$    3 ]]0 0&r1   r!  rI   z/largez/chunkedz/finish_on_closer  )r    r   r  r   rm   )r.   r  r  r  r!  s        r/   rM   zKeepAliveTest.get_appn  s    	+> 	+	M> 	M	#^ 	#	&> 	& #Wl#<(;<&(t'9'9:		
 	
r1   c                 0    t         |           d| _        y )Ns   HTTP/1.1)r_  r`  http_versionra  s    r/   r`  zKeepAliveTest.setUp  s    'r1   c                    | j                   j                  t        j                  d      | j                         | j                          t        | d      r| j                  j                          t        | )          y )Nre  rf  rB   )r   rh  ri  rj  rk  rl  hasattrrB   r   r_  rc  ra  s    r/   rc  zKeepAliveTest.tearDown  sV     	  !3!3E!BDIIN		4"KKr1   c              #      K   t        t        j                               | _        | j                  j                  d| j	                         f       y wr   )r   r   rB   r   r   rL   s    r/   r   zKeepAliveTest.connect  s;     v}}/kk!!;0B0B0D"EFF   AAc              #   2  K   | j                   j                  d      }| j                  |j                  d      |       | j                   j                  d      }t	        j
                  |j                  d            }t        j                  |      w)Nr   r   r   r   )	rB   r   r   r   r   r   r   r   Return)r.   r   header_bytesr+   s       r/   read_headerszKeepAliveTest.read_headers  sw     ;;11'::

--o>
K![[33K@@##L$7$7$ABjj!!s   BBc              #      K   | j                         | _        | j                  j                  t	        | j                  d               }| j                  d|       y w)Nr   rx   )r+  r+   rB   r   r   rz   )r.   rQ   s     r/   r@   zKeepAliveTest.read_response  sO     !..00[[++C=M0N,OPP.s   AA c                 <    | j                   j                          | ` y r*   )rB   r   rL   s    r/   r   zKeepAliveTest.close  s    Kr1   c              #     K   | j                          | j                  j                  d       | j                          | j                  j                  d       | j                          | j	                          y w)N   GET / HTTP/1.1

r   rB   r   r@   r   rL   s    r/   test_two_requestszKeepAliveTest.test_two_requests  s_     lln34  ""34  ""

   A>B c              #   D  K   | j                          | j                  j                  d       | j                          | j                  j	                         }| j                  |        | j                  | j                  d   d       | j                          y w)Ns%   GET / HTTP/1.1
Connection: close


Connectionr   )	r   rB   r   r@   r  r   rz   r+   r   r.   r   s     r/   test_request_closez KeepAliveTest.test_request_close  sy     llnHI  ""[[1133D!l3W=

s   BB c              #   N  K   d| _         | j                          | j                  j                  d       | j	                          | j                  j                         }| j                  |        | j                  d| j                  v       | j                          y w)N   HTTP/1.0s   GET / HTTP/1.0

r4  )	r#  r   rB   r   r@   r  r   r+   r   r5  s     r/   test_http10zKeepAliveTest.test_http10  s}     'lln34  ""[[1133D!DLL89

s   B#B%c              #     K   d| _         | j                          | j                  j                  d       | j	                          | j                  | j                  d   d       | j                  j                  d       | j	                          | j                  | j                  d   d       | j                          y w)Nr8  *   GET / HTTP/1.0
Connection: keep-alive

r4  
Keep-Aliver#  r   rB   r   r@   rz   r+   r   rL   s    r/   test_http10_keepalivez#KeepAliveTest.test_http10_keepalive  s     'llnMN  ""l3\BMN  ""l3\B

   CCc              #     K   d| _         | j                          | j                  j                  d       | j	                          | j                  | j                  d   d       | j                  j                  d       | j	                          | j                  | j                  d   d       | j                          y w)Nr8  s,   GET / HTTP/1.0
Connection: keep-alive


r4  r<  r;  r=  rL   s    r/    test_http10_keepalive_extra_crlfz.KeepAliveTest.test_http10_keepalive_extra_crlf  s     'llnQR  ""l3\BMN  ""l3\B

r?  c              #      K   | j                          | j                  j                  d       | j                          | j                          | j	                          y wNs$   GET / HTTP/1.1

GET / HTTP/1.1

r0  rL   s    r/   test_pipelined_requestsz%KeepAliveTest.test_pipelined_requests  sL     llnIJ  ""  ""

s   A#A%c              #      K   | j                          | j                  j                  d       | j                          | j	                          y wrC  r0  rL   s    r/   test_pipelined_cancelz#KeepAliveTest.test_pipelined_cancel  s=     llnIJ  ""

r'  c              #      K   | j                          | j                  j                  d       | j                          | j                  j	                  d       | j                          y w)Ns   GET /large HTTP/1.1

r
  )r   rB   r   r+  r   r   rL   s    r/   test_cancel_during_downloadz)KeepAliveTest.test_cancel_during_download  sR     lln89!!kk$$T**

s   A.A0c              #      K   | j                          | j                  j                  d       | j                          | j	                          | j
                  j                          y w)Ns!   GET /finish_on_close HTTP/1.1

)r   rB   r   r+  r   r  setrL   s    r/   test_finish_while_closedz&KeepAliveTest.test_finish_while_closed  sO     llnBC!!

 s   A+A-c              #     K   d| _         | j                          | j                  j                  d       | j	                          | j                  | j                  d   d       | j                  j                  d       | j	                          | j                  | j                  d   d       | j                          y w)Nr8  sL   POST / HTTP/1.0
Connection: keep-alive
Transfer-Encoding: chunked

0

r4  r<  r;  r=  rL   s    r/   test_keepalive_chunkedz$KeepAliveTest.test_keepalive_chunked  s     'lln	
   ""l3\BMN  ""l3\B

r?  c              #     K   | j                          | j                  j                  d       | j                          | j                  j                  d       | j                          | j	                          y w)Ns   HEAD /chunked HTTP/1.1

)r   rB   r   r+  r   rL   s    r/   #test_keepalive_chunked_head_no_bodyz1KeepAliveTest.test_keepalive_chunked_head_no_body0  s_     lln;<!!;<!!

r2  )r<   r=   r>   r  rM   r`  rc  r   r  r   r+  r@   r   r   r1  r6  r9  r>  rA  rD  rF  rH  rK  rM  rO  r  r  s   @r/   r  r  g  sC   /
b( 	]]G G 	]]" " 	]]/ /
       	 	 	 	       ! !  $  r1   r  c                       e Zd Zd Zd Zd Zy)GzipBaseTestc                 &    t        dt        fg      S rH   r\  rL   s    r/   rM   zGzipBaseTest.get_app<  s    S+./00r1   c                     t               }t        j                  d|      }|j                  t	        |             |j                          |j                         }| j                  dd|ddi      S )NwmodefileobjrI   r~   Content-EncodinggziprJ  )r#   rY  GzipFiler   r   r   getvaluerO   )r.   rQ   bytesio	gzip_filecompressed_bodys        r/   	post_gzipzGzipBaseTest.post_gzip?  sh    )MMsG<	T
#!**,zz '0	  
 	
r1   c                 |    | j                  ddd      }| j                  t        |j                        ddgi       y )NrI   r~   rH  r   r=  rD  )rO   rz   r   rQ   r{   s     r/   test_uncompressedzGzipBaseTest.test_uncompressedL  s6    ::c&y:AX]]3eeW5EFr1   N)r<   r=   r>   rM   r_  ra  rV   r1   r/   rQ  rQ  ;  s    1
Gr1   rQ  c                       e Zd Zd Zd Zd Zy)GzipTestc                     t        d      S )NT)decompress_requestr  rL   s    r/   r  zGzipTest.get_httpserver_optionsR  s    t,,r1   c                 v    | j                  d      }| j                  t        |j                        ddgi       y )NrH  r=  rD  )r_  rz   r   rQ   r{   s     r/   	test_gzipzGzipTest.test_gzipU  s0    >>),X]]3eeW5EFr1   c                 8   t               }t        j                  d|      }|j                  t	        d             |j                          |j                         }| j                  dd|ddi      }| j                  t        |j                        d	d
gi       y )NrT  rU  rH  rI   r~   rX  GZIPrJ  r=  rD  )r#   rY  rZ  r   r   r   r[  rO   rz   r   rQ   )r.   r\  r]  r^  rT   s        r/   test_gzip_case_insensitivez#GzipTest.test_gzip_case_insensitiveY  s    )MMsG<	Y(!**,:: '0	  
 	X]]3eeW5EFr1   N)r<   r=   r>   r  rg  rj  rV   r1   r/   rc  rc  Q  s    -GGr1   rc  c                       e Zd Zd Zy)GzipUnsupportedTestc                     t        t        d      5  | j                  d      }d d d        | j                  t	        j
                        i        y # 1 sw Y   /xY w)NzUnsupported Content-EncodingrH  )r   r   r_  rz   r   rQ   r{   s     r/   test_gzip_unsupportedz)GzipUnsupportedTest.test_gzip_unsupportedj  sF     w >?~~i0H @X]]3R8 @?s   AAN)r<   r=   r>   rn  rV   r1   r/   rl  rl  i  s    9r1   rl  c                   `    e Zd ZdZdZd Zd Z G d de      Zd Z	d Z
d	 Zd
 Zd Zd Zd Zy)StreamingChunkSizeTests2   01234567890123456789012345678901234567890123456789   c                     t               S r*   r   rL   s    r/   get_http_clientz&StreamingChunkSizeTest.get_http_clientx       %&&r1   c                 0    t        | j                  d      S )NT)
chunk_sizere  )rm   
CHUNK_SIZErL   s    r/   r  z-StreamingChunkSizeTest.get_httpserver_options}  s    t4HHr1   c                   $    e Zd Zd Zd Zd Zd Zy)&StreamingChunkSizeTest.MessageDelegatec                     || _         y r*   
connectionr.   r|  s     r/   __init__z/StreamingChunkSizeTest.MessageDelegate.__init__  	    (DOr1   c                     g | _         y r*   )chunk_lengthsr-   s      r/   r0   z7StreamingChunkSizeTest.MessageDelegate.headers_received  s
    !#Dr1   c                 L    | j                   j                  t        |             y r*   )r  r3   rc   )r.   r4   s     r/   r6   z4StreamingChunkSizeTest.MessageDelegate.data_received  s    %%c%j1r1   c                 2   t        t        | j                              }| j                  j	                  t        ddd      t        dt        t        |            i             | j                  j                  |       | j                  j                          y )Nrv  rM  OKr   )r   r   r  r|  write_headersr   r   r  rc   r   r;   )r.   response_bodys     r/   r;   z-StreamingChunkSizeTest.MessageDelegate.finish  sq     T-?-?!@AMOO))!*c48-s3}3E/FGH OO!!-0OO""$r1   N)r<   r=   r>   r~  r0   r6   r;   rV   r1   r/   MessageDelegatery    s    	)	$	2	%r1   r  c                 .     G d dt               } |       S )Nc                       e Zd Zd Zy)+StreamingChunkSizeTest.get_app.<locals>.Appc                 ,    t         j                  |      S r*   )rp  r  r.   server_connrequest_conns      r/   start_requestz9StreamingChunkSizeTest.get_app.<locals>.App.start_request  s    -==lKKr1   Nr<   r=   r>   r  rV   r1   r/   Appr    s    Lr1   r  r   r.   r  s     r/   rM   zStreamingChunkSizeTest.get_app  s    	L. 	L ur1   c           	      r    | j                   dddi|}|j                          t        |j                        }| j	                  t        | j                        t        |             |D ]J  }| j                  || j                  dt        |      z          | j                  |ddt        |      z          L |S )Nr   r~   zoversized chunk: r   zempty chunk: )rI   )rO   rP   r   rQ   rz   rc   BODYsumassertLessEqualrw  r  assertGreater)r.   rS   rT   r5   rv  s        r/   fetch_chunk_sizesz(StreamingChunkSizeTest.fetch_chunk_sizes  s    4::;&;F;X]]+TYYV5 J  DOO-@3v;-N z1oF.KL	 !
 r1   c                     t               }t        j                  d|      }|j                  |       |j	                          |j                         }t        |      t        |      k\  rt        d      |S )NrT  rU  z#body did not shrink when compressed)r#   rY  rZ  r   r   r[  rc   r`   )r.   rQ   r\  gzfile
compresseds        r/   compresszStreamingChunkSizeTest.compress  s^    )C9T%%'
z?c$i'ABBr1   c                 d    | j                  | j                        }| j                  g d|       y )N)rQ   )rq  rq  rq     )r  r  rz   )r.   r5   s     r/   test_regular_bodyz(StreamingChunkSizeTest.test_regular_body  s)    ''TYY'7&1r1   c                 `    | j                  | j                  | j                        ddi       y )NrX  rY  )rQ   r+   )r  r  r  rL   s    r/   test_compressed_bodyz+StreamingChunkSizeTest.test_compressed_body  s-    tyy)4F3O 	 	
r1   c                 \      fd} j                  |      } j                  g d|       y )Nc                 Z     | j                   d d         | j                   dd         y N   )r  )r   r.   s    r/   body_producerz?StreamingChunkSizeTest.test_chunked_body.<locals>.body_producer  s'    $))CR.!$))BC.!r1   )r  )rq     rq     )r  rz   )r.   r  r5   s   `  r/   test_chunked_bodyz(StreamingChunkSizeTest.test_chunked_body  s-    	" ''m'D&1r1   c                     | j                  | j                        | j                  t              d       fd}| j	                  |ddi       y )Nr  c                 2     | d d         | dd         y r  rV   )r   r  s    r/   r  zEStreamingChunkSizeTest.test_chunked_compressed.<locals>.body_producer  s    *Sb/"*RS/"r1   rX  rY  )r  r+   )r  r  r  rc   r  )r.   r  r  s     @r/   test_chunked_compressedz.StreamingChunkSizeTest.test_chunked_compressed  sN    ]]499-
3z?B/	# 	'2Df1M 	 	
r1   N)r<   r=   r>   r  rw  rs  r  r   r  rM   r  r  r  r  r  r  rV   r1   r/   rp  rp  s  sG    @DJ'
I%- %&
2

2

r1   rp  c                   .    e Zd Z G d de      Zd Zd Zy)InvalidOutputContentLengthTestc                       e Zd Zd Zd Zy).InvalidOutputContentLengthTest.MessageDelegatec                     || _         y r*   r{  r}  s     r/   r~  z7InvalidOutputContentLengthTest.MessageDelegate.__init__  r  r1   c           	          ddddd}| j                   j                  t        ddd      t        d	||d
      i             | j                   j	                  d       | j                   j                          y )N10r=  r  r  )normalr  r  
underscorerv  rM  r  r   x-test
   1234567890)r|  r  r   r   r   r;   )r.   r,   r+   content_lengthss       r/   r0   z?InvalidOutputContentLengthTest.MessageDelegate.headers_received  sq    # %#	O OO))!*c48-wx?P/QRS OO!!-0OO""$r1   N)r<   r=   r>   r~  r0   rV   r1   r/   r  r    s    	)	%r1   r  c                 .     G d dt               } |       S )Nc                       e Zd Zd Zy)3InvalidOutputContentLengthTest.get_app.<locals>.Appc                 ,    t         j                  |      S r*   )r  r  r  s      r/   r  zAInvalidOutputContentLengthTest.get_app.<locals>.App.start_request  s    5EElSSr1   Nr  rV   r1   r/   r  r    s    Tr1   r  r  r  s     r/   rM   z&InvalidOutputContentLengthTest.get_app  s    	T. 	T ur1   c           
         | j                  d      5  | j                  ddddi      }|j                          | j                  |j                  d       d d d        dD ]i  }| j                  |      5  t        t        d      5  | j                  t              5  | j                  ddd|i       d d d        d d d        d d d        k y # 1 sw Y   xxY w# 1 sw Y   (xY w# 1 sw Y   ,xY w# 1 sw Y   xY w)	Nr  rI   GETr  )r   r+   r  )r  r  r  r   )	rT  rO   rP   rz   rQ   r   r   r   r   )r.   rT   tests      r/   "test_invalid_output_content_lengthzAInvalidOutputContentLengthTest.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3C0C$C	1C$9C0CC!C$$C-)C00C9	N)r<   r=   r>   r   r  rM   r  rV   r1   r/   r  r    s    %- %$Pr1   r  c                   $    e Zd Zd Zd Zd Zd Zy)MaxHeaderSizeTestc                 &    t        dt        fg      S rH   r   rX   rL   s    r/   rM   zMaxHeaderSizeTest.get_app      S":;<==r1   c                     t        d      S )Nr
  )max_header_sizer  rL   s    r/   r  z(MaxHeaderSizeTest.get_httpserver_options  s    D))r1   c                     | j                  dddi      }|j                          | j                  |j                  d       y )NrI   X-FillerdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarI  rx   )rO   rP   rz   rQ   r{   s     r/   test_small_headersz$MaxHeaderSizeTest.test_small_headers  s9    ::cJ	+B:C7r1   c                 2   t        t        dd      5  	 | j                  dddid       | j                  d	       d d d        y # t        $ r<}|j
                  &| j                  |j
                  j                  d
       Y d }~Id }~ww xY w# 1 sw Y   y xY w)NzUnsatisfiable readFr   rI   r    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaT)r+   r   z did not raise expected exception)i  iW  )r   r   rO   failr   rT   assertInrN  )r.   es     r/   test_large_headersz$MaxHeaderSizeTest.test_large_headers  s    w 4uE?

3Z(@d
S		<= FE  ? ::)MM!**//:>?	 FEs.   B'A	B
2B BB

BBN)r<   r=   r>   rM   r  r  r  rV   r1   r/   r  r    s    >*8

?r1   r  c                   x     e Zd Zd Zd Z fdZ fdZej                  d        Z	e
d        Ze
d        Z xZS )IdleTimeoutTestc                 &    t        dt        fg      S rH   r  rL   s    r/   rM   zIdleTimeoutTest.get_app  r  r1   c                     t        d      S )Ng?)idle_connection_timeoutr  rL   s    r/   r  z&IdleTimeoutTest.get_httpserver_options  s    C00r1   c                 0    t         |           g | _        y r*   )r_  r`  streamsra  s    r/   r`  zIdleTimeoutTest.setUp  s    r1   c                 d    t         |           | j                  D ]  }|j                           y r*   )r_  rc  r  r   )r.   rB   rJ   s     r/   rc  zIdleTimeoutTest.tearDown  s%    llFLLN #r1   c              #      K   t        t        j                               }|j                  d| j                         f       | j                  j                  |       t        j                  |      wr   )r   r   r   r   r  r3   r   r)  r   s     r/   r   zIdleTimeoutTest.connect$  sT     &--/*nnk4+=+=+?@AAF#jj  s   A1A3c              #      K   | j                         }t               }|j                  |j                         |j	                          y wr*   )r   r   set_close_callbackrJ  rl  )r.   rB   events      r/   test_unused_connectionz&IdleTimeoutTest.test_unused_connection+  s9     ||~%!!%)),jjls   AAc              #   P  K   | j                         }t               }|j                  |j                         t	        d      D ]K  }|j                  d       |j                  d       |j                  d      }| j                  |d       M |j                          y w)Nr  r/  r      rx   )
r   r   r  rJ  r  r   r   r   rz   rl  )r.   rB   r  r  r   s        r/   test_idle_after_usez#IdleTimeoutTest.test_idle_after_use2  s     ||~%!!%)), qALL23##K00**2..DT>2	  jjls   B$B&)r<   r=   r>   rM   r  r`  rc  r   r  r   r   r  r  r  r  s   @r/   r  r    sW    >1
 	]]! !    r1   r  c                       e Zd Zd Zd Zd Zd Zd Z ej                  e
j                  dk(  d      d        Zd	 Z ej                  e
j                  dk(  d      d
        Zd Zd Zed        Zed        Zy)BodyLimitsTestc                 r     G d dt               }t         G d dt                      }t        d|fd|fg      S )Nc                       e Zd Zd Zy)/BodyLimitsTest.get_app.<locals>.BufferedHandlerc                 r    | j                  t        t        | j                  j                                     y r*   )r   r  rc   r_   rQ   rL   s    r/   putz3BodyLimitsTest.get_app.<locals>.BufferedHandler.putF  s"    

3s4<<#4#4567r1   N)r<   r=   r>   r  rV   r1   r/   BufferedHandlerr  E  s    8r1   r  c                   $    e Zd Zd Zd Zd Zd Zy)0BodyLimitsTest.get_app.<locals>.StreamingHandlerc                     d| _         y )Nr   )
bytes_readrL   s    r/   r\   z;BodyLimitsTest.get_app.<locals>.StreamingHandler.initializeK  s	    "#r1   c                 f   t        j                  t        | j                  j                        }d| j                  j
                  v r)|j                  t        | j                  d                   d| j                  j
                  v r*|j                  t        | j                  d                   y y )Nexpected_sizebody_timeout)r   castr   r_   r|  r  set_max_body_sizer   r   set_body_timeoutfloatr9   s     r/   r#  z8BodyLimitsTest.get_app.<locals>.StreamingHandler.prepareN  s    {{?DLL4K4KL"dll&<&<<**3t/@/@/Q+RS!T\\%;%;;))%0A0A.0Q*RS <r1   c                 @    | xj                   t        |      z  c_         y r*   )r  rc   r5  s     r/   r6   z>BodyLimitsTest.get_app.<locals>.StreamingHandler.data_receivedU  s    3t9,r1   c                 L    | j                  t        | j                               y r*   )r   r  r  rL   s    r/   r  z4BodyLimitsTest.get_app.<locals>.StreamingHandler.putX  s    

3t/0r1   N)r<   r=   r>   r\   r#  r6   r  rV   r1   r/   StreamingHandlerr  I  s    $T-1r1   r  	/buffered
/streaming)r    r!   r   )r.   r  r  s      r/   rM   zBodyLimitsTest.get_appD  sK    	8n 	8 
	1~ 	1 
	1" ?+l<L-MN
 	
r1   c                     t        dd      S )Nr   i   )r  max_body_sizer  rL   s    r/   r  z%BodyLimitsTest.get_httpserver_options_  s    T::r1   c                     t               S r*   r   rL   s    r/   rs  zBodyLimitsTest.get_http_clientb  rt  r1   c                     | j                  ddd      }| j                  |j                  d       | j                  ddd      }| j                  |j                  d       y )Nr  PUTs   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar   s   4096r  ry   r{   s     r/   test_small_bodyzBodyLimitsTest.test_small_bodyg  sR    ::k%k:J0::l5{:K0r1   c                     t        t        dt        j                        5  | j	                  ddddz        }d d d        | j                  j                  d       y # 1 sw Y   &xY w)	N.*Content-Length too longrp  r  r     a (  r   r4  r   r   rw  rx  rO   rz   rN  r{   s     r/   test_large_body_bufferedz'BodyLimitsTest.test_large_body_bufferedm  sO    w ;7<<Pzz+e$,zOH Q, QP   AA'ntzflaky on windowsc                     t        t        dt        j                        5  | j	                  ddd       }d d d        | j                  j                  d       y # 1 sw Y   &xY w)N.*chunked body too largerp  r  r  c                      | ddz        S Nr  r  rV   r   s    r/   r   zABodyLimitsTest.test_large_body_buffered_chunked.<locals>.<lambda>y      E$,,?r1   r   r  r4  r  r{   s     r/    test_large_body_buffered_chunkedz/BodyLimitsTest.test_large_body_buffered_chunkedr  sW     w :',,Ozz? " H P 	, PO   AA%c                     t        t        dt        j                        5  | j	                  ddddz        }d d d        | j                  j                  d       y # 1 sw Y   &xY w)	Nr  rp  r  r  r  r  r   r4  r  r{   s     r/   test_large_body_streamingz(BodyLimitsTest.test_large_body_streaming}  sO    w ;7<<Pzz,u4%<zPH Q, QPr  c                     t        t        dt        j                        5  | j	                  ddd       }d d d        | j                  j                  d       y # 1 sw Y   &xY w)Nr
  rp  r  r  c                      | ddz        S r  rV   r  s    r/   r   zBBodyLimitsTest.test_large_body_streaming_chunked.<locals>.<lambda>  r  r1   r  r4  r  r{   s     r/   !test_large_body_streaming_chunkedz0BodyLimitsTest.test_large_body_streaming_chunked  sU    w :',,Ozz? " H P 	, POr  c                 j    | j                  ddddz        }| j                  |j                  d       y )N/streaming?expected_size=10240r  r  r  r      10240ry   r{   s     r/   "test_large_body_streaming_overridez1BodyLimitsTest.test_large_body_streaming_override  s6    ::,U  
 	1r1   c                 f    | j                  ddd       }| j                  |j                  d       y )Nr  r  c                      | ddz        S r  rV   r  s    r/   r   zKBodyLimitsTest.test_large_body_streaming_chunked_override.<locals>.<lambda>  s    dUl(;r1   r  r  ry   r{   s     r/   *test_large_body_streaming_chunked_overridez9BodyLimitsTest.test_large_body_streaming_chunked_override  s4    ::,;  

 	1r1   c              #     K   t        t        j                               }	 |j                  d| j                         f       |j	                  d       t        t        dt        j                        5  |j                         }d d d        | j                  d       |j                          y # 1 sw Y   ,xY w# |j                          w xY ww)Nr   s@   PUT /streaming?body_timeout=0.1 HTTP/1.0
Content-Length: 42

zTimeout reading bodyrp  r1   )r   r   r   r   r   r   r   rw  rx  r  rz   r   )r.   rB   rT   s      r/   test_timeoutzBodyLimitsTest.test_timeout  s     &--/*	..+t/A/A/C!DEE LL. 7$:',,O!'!8!8!:: PXs+LLN	 PO LLNs5   CAB? 5B3B? "C3B<8B? ?CCc              #   <  K   t        t        j                               }	 |j                  d| j                         f       |j	                  d       |j	                  ddz         t        |      \  }}}| j                  |d       |j	                  d       t        t        dt        j                        5  |j                         }d d d        | j                  d	       |j                          y # 1 sw Y   ,xY w# |j                          w xY ww)
Nr   sF   PUT /streaming?expected_size=10240 HTTP/1.1
Content-Length: 10240

r  r  r  s2   PUT /streaming HTTP/1.1
Content-Length: 10240

r  rp  r  )r   r   r   r   r   rD   rz   r   r   rw  rx  r  r   )r.   rB   r,   r+   rT   r   s         r/   test_body_size_override_resetz,BodyLimitsTest.test_body_size_override_reset  s      &--/*	..+t/A/A/C!DEELL1 LL&2B62J,J)JXx0LLO 7$?w||T#4466 UT#FGLLN	 UT LLNs5   DBD =C;D *D;D D DDN)r<   r=   r>   rM   r  rs  r   r  unittestskipIfr   r(  r  r  r  r  r  r   r  r!  rV   r1   r/   r  r  C  s    
6;'
1-
 X__RWW_&89- :--
 X__RWW_&89- :-22     r1   r  c                       e Zd Zd Zd Zy)LegacyInterfaceTestc                       fd}|S )Nc                    | j                   j                  d      _        j                  sJ| j                  j	                  t        ddd      t                      | j                  j                          y d}| j                  j                  t        dt        |      z               | j                  j                  |       | j                  j                          y )NzHTTP/1.rA  rM  r  rx   z'HTTP/1.1 200 OK
Content-Length: %d

)r  r   http1r|  r  r   r   r;   r   r   rc   )r_   messager.   s     r/   handle_requestz3LegacyInterfaceTest.get_app.<locals>.handle_request  s     33I>DJ:: ""00%b#t4km ""))+$G$$G#g,VW $$W-%%'r1   rV   )r.   r*  s   ` r/   rM   zLegacyInterfaceTest.get_app  s    	(" r1   c                     | j                  d      }| j                  s| j                  d       | j                  |j                  d       y )NrI   r  rx   )rO   r(  r  rz   rQ   r{   s     r/   test_legacy_interfacez)LegacyInterfaceTest.test_legacy_interface  s7    ::c?zzMM-.7r1   N)r<   r=   r>   rM   r,  rV   r1   r/   r%  r%    s    .8r1   r%  )h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.netutilr   tornado.simple_httpclientr   tornado.testingr   r   r   r   r   tornado.test.utilr   tornado.webr   r    r!   
contextlibr"   ri  rY  rw  r   r  r   r   sysr  r  r"  urllib.parserU  ior#   r   TYPE_CHECKINGr$   r%   rD   rF   rX   r#  r  skipIfOldSSLri   objectro   r   r   r   r   TestCaser   r   r   r  r	  r,  r1  r7  rZ  r  r  r  r%  platformr  r  rQ  rc  rl  rp  r  r  r  r  r%  rV   r1   r/   <module>rD     s      4 ( )  &  ( 2 ;  + H H     	   
 
      	!C,	*+ 	*
E~ 
E$ xC'069.V$ V
'26 '2`#l #
 "\ " "
 "\ " "
[, &
)) &
R	
> 	
Z* Zz>. >&U~ &UR9n 9
B B>U& >UB[4) [4|\
% \
~
')< 
.	D, 	D 	"">cllh&>1.H] .H	.HbQ% QhG$ G,G|. G09,(9 9\
. \
~%P%6 %PP?) ?2 ,' , ,^~& ~B8+ 8r1   