o
    )Zh                     @   s  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>rd dl=m?Z?m@Z@ dd ZAG dd de!ZBG dd de*ZCe8DeEe4dddk dZFG dd de"ZGG dd  d eHZIG d!d" d"eGeIZJeFG d#d$ d$eGeIZKeFG d%d& d&eGeIZLG d'd( d(eGeIZMG d)d* d*e8jNZOG d+d, d,e*ZPG d-d. d.e!ZQG d/d0 d0e*ZRG d1d2 d2e*ZSG d3d4 d4e*ZTG d5d6 d6eTZUG d7d8 d8e!ZVG d9d: d:e!ZWG d;d< d<eBZXG d=d> d>e"eBZYG d?d@ d@eBZZe8De[e3dA pe5j\dBkdCG dDdE dEe#Z]G dFdG dGe!Z^G dHdI dIe!Z_G dJdK dKe_e!Z`G dLdM dMe_e!ZaG dNdO dOe!ZbG dPdQ dQe!ZcG dRdS dSe!Zde'G dTdU dUe!ZeG dVdW dWe!ZfG dXdY dYe!ZgdS )Z    )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                    sP   g  G  fdddt }t| d| }|I dH  |j|jd fS )zaReads an HTTP response from `stream` and returns a tuple of its
    start_line, headers and body.c                       s,   e Zd Zdd Z fddZfddZdS )z"read_stream_body.<locals>.Delegatec                 S   s   || _ || _d S N)headers
start_lineselfr'   r&    r*   S/var/www/html/lang_env/lib/python3.10/site-packages/tornado/test/httpserver_test.pyheaders_received=   s   
z3read_stream_body.<locals>.Delegate.headers_receivedc                    s     | d S r%   )appendr)   chunk)chunksr*   r+   data_receivedA      z0read_stream_body.<locals>.Delegate.data_receivedc                    s       d S r%   )detachr)   )connr*   r+   finishD      z)read_stream_body.<locals>.Delegate.finishN)__name__
__module____qualname__r,   r1   r6   r*   r0   r5   r*   r+   Delegate<   s    r<   TN    )r   r
   read_responser'   r&   join)streamr<   Zdelegater*   r;   r+   read_stream_body7   s   
rA   c                   @   s    e Zd ZdZdd Zdd ZdS )HandlerBaseTestCaseNc                 C   s   t d| jjfgS N/)r   	__class__Handlerr4   r*   r*   r+   get_appP   s   zHandlerBaseTestCase.get_appc                 O   s"   | j |i |}|  t|jS r%   )fetchrethrowr   body)r)   argskwargsresponser*   r*   r+   
fetch_jsonS   s   
zHandlerBaseTestCase.fetch_json)r8   r9   r:   rF   rG   rN   r*   r*   r*   r+   rB   M   s    rB   c                   @   s&   e Zd Zd	ddZdd Zdd ZdS )
HelloWorldRequestHandlerhttpc                 C   
   || _ d S r%   )expected_protocol)r)   protocolr*   r*   r+   
initializeZ      
z#HelloWorldRequestHandler.initializec                 C   s$   | j j| jkrtd| d d S )Nzunexpected protocolHello world)requestrS   rR   	Exceptionr6   r4   r*   r*   r+   get]   s   zHelloWorldRequestHandler.getc                 C   s   |  dt| jj  d S )NzGot %d bytes in POST)r6   lenrW   rJ   r4   r*   r*   r+   postb      zHelloWorldRequestHandler.postN)rP   )r8   r9   r:   rT   rY   r[   r*   r*   r*   r+   rO   Y   s    
rO   OPENSSL_VERSION_INFO)r   r   )   r   z(old version of ssl module and/or opensslc                   @      e Zd Zdd ZdS )BaseSSLTestc                 C   s   t dttddfgS )NrD   httpsrS   )r   rO   dictr4   r*   r*   r+   rG   r      zBaseSSLTest.get_appN)r8   r9   r:   rG   r*   r*   r*   r+   r`   q       r`   c                   @   s\   e Zd Zdd Zdd ZdejfddZdejfdd	Zdejfd
dZ	dejfddZ
dS )SSLTestMixinc                 C   s   t dd|  it S )Nssl_versionr*   )rc   get_ssl_versionr   Zdefault_ssl_optionsr4   r*   r*   r+   get_ssl_optionsw   s
   zSSLTestMixin.get_ssl_optionsc                 C   s   t  r%   )NotImplementedErrorr4   r*   r*   r+   rh   }      zSSLTestMixin.get_ssl_versionr)   c                 C   s   |  d}| |jd d S )NrD      Hello worldrH   assertEqualrJ   r)   rM   r*   r*   r+   test_ssl   s   
zSSLTestMixin.test_sslc                 C   &   | j dddd d}| |jd d S )NrD   POSTAi  methodrJ   s   Got 5000 bytes in POSTrm   ro   r*   r*   r+   test_large_post   s   zSSLTestMixin.test_large_postc              
   C   s   t tdO t tddd/ | ttf | j| dddddd	d
 W d    n1 s0w   Y  W d    n1 s?w   Y  W d    d S W d    d S 1 sWw   Y  d S )Nz(SSL Error|uncaught exception)Uncaught exceptionFrequiredrD   https:http:  T)request_timeoutconnect_timeoutraise_error)r   r   assertRaisesIOErrorr   rH   get_urlreplacer4   r*   r*   r+   test_non_ssl_request   s   "z!SSLTestMixin.test_non_ssl_requestc              	   C   s   t td-}| ttf | j| ddddd W d    n1 s&w   Y  W d    n1 s5w   Y  | |j	 d S )Nz	SSL ErrorrD   rz   r{   T)r   )
r   r   r   r   r   rH   r   r   ZassertFalseZlogged_stack)r)   Z
expect_logr*   r*   r+   test_error_logging   s   zSSLTestMixin.test_error_loggingN)r8   r9   r:   ri   rh   typingAnyrp   rv   r   r   r*   r*   r*   r+   rf   v   s    rf   c                   @   r_   )
SSLv23Testc                 C      t jS r%   )sslPROTOCOL_SSLv23r4   r*   r*   r+   rh      rk   zSSLv23Test.get_ssl_versionNr8   r9   r:   rh   r*   r*   r*   r+   r      re   r   c                   @   r_   )	SSLv3Testc                 C   r   r%   )r   ZPROTOCOL_SSLv3r4   r*   r*   r+   rh      rk   zSSLv3Test.get_ssl_versionNr   r*   r*   r*   r+   r          r   c                   @   r_   )	TLSv1Testc                 C   r   r%   )r   PROTOCOL_TLSv1r4   r*   r*   r+   rh      rk   zTLSv1Test.get_ssl_versionNr   r*   r*   r*   r+   r      r   r   c                   @   r_   )SSLContextTestc                 C   s&   t t| dd}t|tjsJ |S )NT)server_side)r   r   ri   
isinstancer   
SSLContext)r)   contextr*   r*   r+   ri      s
   
zSSLContextTest.get_ssl_optionsN)r8   r9   r:   ri   r*   r*   r*   r+   r      re   r   c                   @      e Zd Zdd Zdd ZdS )BadSSLOptionsTestc                 C   s    t  }| jtt|ddid d S )Nkeyfilez/__missing__.crtZssl_options)r   r   KeyErrorr   )r)   applicationr*   r*   r+   test_missing_arguments   s   
z(BadSSLOptionsTest.test_missing_argumentsc                 C   sz   t  }tjt}tj|d}tj|d}| jttft	|ddid | jttft	||ddd t	|||dd dS )	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__r?   r   
ValueErrorr   r   )r)   r   Z
module_dirZexisting_certificateZexisting_keyr*   r*   r+   test_missing_key   s,   
z"BadSSLOptionsTest.test_missing_keyN)r8   r9   r:   r   r   r*   r*   r*   r+   r      s    	r   c                   @   r_   )MultipartTestHandlerc                 C   sH   |  | jjd | d| jjd d jt| jjd d d d d S )NzX-Header-Encoding-Testargumentfilesr   rJ   )headerr   filenamefilebody)r6   rW   r&   get_argumentr   r   r   r4   r*   r*   r+   r[      s   
zMultipartTestHandler.postNr8   r9   r:   r[   r*   r*   r*   r+   r      re   r   c                   @   sB   e Zd Zdd Zdd ZdddZdd	 Zd
d Zedd Z	dS )HTTPConnectionTestc                 C   s   dt fdtfgS )Nz
/multipart/hello)r   rO   r4   r*   r*   r+   get_handlers   s   zHTTPConnectionTest.get_handlersc                 C   s   t |  S r%   )r   r   r4   r*   r*   r+   rG      r7   zHTTPConnectionTest.get_app   
c              
      s   t tt 9 j fdd ||tdt| g | | |   jfdd\}}}|W  d    S 1 sDw   Y  d S )Nc                      s    d  fS N	127.0.0.1)connectget_http_portr*   r)   r@   r*   r+   <lambda>  s    z.HTTPConnectionTest.raw_fetch.<locals>.<lambda>zContent-Length: %dc                      s   t  S r%   )rA   r*   )r@   r*   r+   r     s    )	r!   r   socketio_looprun_syncwriter?   r   rZ   )r)   r&   rJ   newliner'   r*   r   r+   	raw_fetch   s$   

$zHTTPConnectionTest.raw_fetchc                 C   s   |  g ddddddddd	dd
dddg	}t|}| d|d  | d|d  | d|d  | d
|d  d S )N)s   POST /multipart HTTP/1.0s6   Content-Type: multipart/form-data; boundary=1234567890s   X-Header-encoding-test: r   s-   Content-Disposition: form-data; name=argumentr=      ázutf-8s   --1234567890u;   Content-Disposition: form-data; name="files"; filename="ó"r      ús   --1234567890--   ér   r      ór   r   )r   r?   encoder   rn   r)   rM   datar*   r*   r+   test_multipart_form  s,   z&HTTPConnectionTest.test_multipart_formc                 C   s,   dD ]}| j dgd|d}| |d qd S )N)r      
s   GET /hello HTTP/1.0r=   )r   rl   )r   rn   )r)   r   rM   r*   r*   r+   test_newlines/  s   z HTTPConnectionTest.test_newlinesc                 c   s    t t }|d|  fV  |dg dV  |dV }| |d| |d |dV }| |d| |dV }t	
t|d}|t|d	 V }| |d
 |  d S )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   r?   
read_until
assertTrue
startswithr   parser	   decode
read_bytesintrn   close)r)   r@   r   
first_lineheader_datar&   rJ   r*   r*   r+   test_100_continue5  s$   
z$HTTPConnectionTest.test_100_continueN)r   )
r8   r9   r:   r   rG   r   r   r   r   r   r*   r*   r*   r+   r      s    
r   c                   @   r   )EchoHandlerc                 C      |  t| jj d S r%   r   r   rW   	argumentsr4   r*   r*   r+   rY   T  rd   zEchoHandler.getc                 C   r   r%   r   r4   r*   r*   r+   r[   W  rd   zEchoHandler.postNr8   r9   r:   rY   r[   r*   r*   r*   r+   r   S      r   c                   @   ,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TypeCheckHandlerc              	   C   s  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 ]\}}| |t| j|| q| d	t| jj d
 t | dt| jj d
 t | dt| jj	 d
 t | dt| jj	 d
 j
t | dt| jj d
 t | dt| jj d
 d
 t d S )Nru   uriversion	remote_iprS   hostr   queryZ
header_keyr   header_valueZ
cookie_keyZcookie_valueZarg_key	arg_value)errorsstr
check_typegetattrrW   listr&   keysvaluescookiesvaluer   bytes)r)   fieldsfieldexpected_typer*   r*   r+   prepare\  s(   
&zTypeCheckHandler.preparec                 C   s"   |  d| jjt | | j d S )NrJ   )r   rW   rJ   r   r   r   r4   r*   r*   r+   r[   w  s   zTypeCheckHandler.postc                 C   s   |  | j d S r%   )r   r   r4   r*   r*   r+   rY   {     zTypeCheckHandler.getc                 C   s*   t |}||krd||f | j|< d S d S )Nzexpected %s, got %s)typer   )r)   nameobjr   Zactual_typer*   r*   r+   r   ~  s   zTypeCheckHandler.check_typeN)r8   r9   r:   r   r[   rY   r   r*   r*   r*   r+   r   [  s
    r   c                   @   r_   )PostEchoHandlerc                 G   s   |  t| dd d S )Nr   )echo)r   rc   r   )r)   Z	path_argsr*   r*   r+   r[     r\   zPostEchoHandler.postNr   r*   r*   r*   r+   r     re   r   c                   @   s   e Zd ZdddZdS )PostEchoGBKHandlerNc                 C   s*   z| dW S  ty   tdd| w )Ngbk  zinvalid gbk bytes: %r)r   rX   r   )r)   r   r   r*   r*   r+   decode_argument  s
   z"PostEchoGBKHandler.decode_argumentr%   )r8   r9   r:   r   r*   r*   r*   r+   r     s    r   c                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )HTTPServerTestc                 C   s&   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   r   r4   r*   r*   r+   rG     s   zHTTPServerTest.get_appc                 C   s*   |  d}t|j}| |ddgi d S )Nz/echo?foo=%C3%A9foor   rH   r   rJ   rn   r   r*   r*   r+   test_query_string_encoding  s   

z)HTTPServerTest.test_query_string_encodingc                 C   s,   |  d}t|j}| |dddgi d S )Nz/echo?foo=&foo=r    r  r   r*   r*   r+   test_empty_query_string  s   

z&HTTPServerTest.test_empty_query_stringc                 C   s4   | j dddd}t|j}| |dgdgd d S )Nr   rr   z	foo=&bar=rt   r  )r   barr  r   r*   r*   r+   test_empty_post_parameters  s   
z)HTTPServerTest.test_empty_post_parametersc                 C   sX   ddi}| j d|d}t|j}| |i  | j ddd|d}t|j}| |i  d S )NCookiefoo=barz/typecheck?foo=barr&   r   rr   ru   rJ   r&   r  )r)   r&   rM   r   r*   r*   r+   
test_types  s   

zHTTPServerTest.test_typesc                 C   s.   |  d}| d|j | t|ji  d S )Nr      )rH   rn   coder   rJ   ro   r*   r*   r+   test_double_slash  s   
z HTTPServerTest.test_double_slashc              
   C   s   ddi}d}dD ]F}dD ]A}| j ||d0 ||}|r&tj|d}| jd| d	|d
| d}| t|jd|i W d    n1 sHw   Y  qqd S )NzContent-Typez!application/x-www-form-urlencodedu   chinese: 张三)r   r   )TF)encquoteasciiz/post_rr   s   data=)ru   r&   rJ   r   )	subTestr   urllibr   r  rH   rn   r   rJ   )r)   r&   Zuni_textr  r  Zbin_textrM   r*   r*   r+   test_post_encodings  s&   
z"HTTPServerTest.test_post_encodingsN)
r8   r9   r:   rG   r  r  r  r  r  r  r*   r*   r*   r+   r     s    r   c                       s   e Zd Zdd Z fddZ fddZdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zedd Z  ZS )HTTPServerRawTestc                 C      t dtfgS )Nr   r   r   r4   r*   r*   r+   rG     r2   zHTTPServerRawTest.get_appc                    s0   t    tt  _ j fdd d S )Nc                      s    j d  fS r   )r@   r   r   r*   r4   r*   r+   r     s    z)HTTPServerRawTest.setUp.<locals>.<lambda>)supersetUpr   r   r@   r   r   r4   rE   r4   r+   r    s
   

zHTTPServerRawTest.setUpc                    s   | j   t   d S r%   )r@   r   r  tearDownr4   r  r*   r+   r    s   
zHTTPServerRawTest.tearDownc                 C   s.   | j   | jtjdd| j |   d S )NMbP?seconds)r@   r   r   add_timeoutdatetime	timedeltastopwaitr4   r*   r*   r+   test_empty_request  s   
z$HTTPServerRawTest.test_empty_requestc                    s   t tdtjd1  jd  j fdd\}}} d|j	  d|j
  d|j W d    d S 1 s<w   Y  d S )	N.*Malformed HTTP request linelevel   asdf

c                      
   t  jS r%   rA   r@   r*   r4   r*   r+   r        
 zFHTTPServerRawTest.test_malformed_first_line_response.<locals>.<lambda>HTTP/1.1r   zBad Request)r   r   loggingINFOr@   r   r   r   rn   r   r  reasonr)   r'   r&   rM   r*   r4   r+   "test_malformed_first_line_response  s   

"z4HTTPServerRawTest.test_malformed_first_line_responsec                 C   b   t tdtjd | jd | jtj	dd| j
 |   W d    d S 1 s*w   Y  d S )Nr%  r&  r(  皙?r  r   r   r-  r.  r@   r   r   r  r   r!  r"  r#  r4   r*   r*   r+   test_malformed_first_line_log  s
   
"z/HTTPServerRawTest.test_malformed_first_line_logc                 C   r2  )Nz1.*Malformed HTTP message.*no colon in header liner&  s   GET / HTTP/1.0
asdf

r3  r  r4  r4   r*   r*   r+   test_malformed_headers  s   
"z(HTTPServerRawTest.test_malformed_headersc                    H    j ddd  j fdd\}}} t|ddgi d S )Nsp   POST /echo HTTP/1.1
Transfer-Encoding: chunked
Content-Type: application/x-www-form-urlencoded

4
foo=
3
bar
0

r   r   c                      r)  r%   r*  r*   r4   r*   r+   r     r+  z=HTTPServerRawTest.test_chunked_request_body.<locals>.<lambda>r   r  r@   r   r   r   r   rn   r   r0  r*   r4   r+   test_chunked_request_body     

z+HTTPServerRawTest.test_chunked_request_bodyc                    r7  )Nsp   POST /echo HTTP/1.1
Transfer-Encoding: Chunked
Content-Type: application/x-www-form-urlencoded

4
foo=
3
bar
0

r   r   c                      r)  r%   r*  r*   r4   r*   r+   r   .  r+  zBHTTPServerRawTest.test_chunked_request_uppercase.<locals>.<lambda>r   r  r8  r0  r*   r4   r+   test_chunked_request_uppercase  r:  z0HTTPServerRawTest.test_chunked_request_uppercasec                    sp    j ddd ttdtjd  j fdd\}}}W d    n1 s*w   Y   	d|j
 d S )	NsR   POST /echo HTTP/1.1
Transfer-Encoding: chunked

1_a
1234567890abcdef1234567890
0

r   r   z.*invalid chunk sizer&  c                      r)  r%   r*  r*   r4   r*   r+   r   D  r+  zJHTTPServerRawTest.test_chunked_request_body_invalid_size.<locals>.<lambda>r   )r@   r   r   r   r   r-  r.  r   r   rn   r  r0  r*   r4   r+   &test_chunked_request_body_invalid_size2  s   
z8HTTPServerRawTest.test_chunked_request_body_invalid_sizec                    h    j d ttdtjd  j fdd\}}}W d    n1 s&w   Y   d|j	 d S )NsS   POST /echo HTTP/1.1
Transfer-Encoding: chunked
Transfer-encoding: chunked

2
ok
0

z/.*Unsupported Transfer-Encoding chunked,chunkedr&  c                      r)  r%   r*  r*   r4   r*   r+   r   ]  r+  zNHTTPServerRawTest.test_chunked_request_body_duplicate_header.<locals>.<lambda>r   
r@   r   r   r   r-  r.  r   r   rn   r  r0  r*   r4   r+   *test_chunked_request_body_duplicate_headerH  s   
z<HTTPServerRawTest.test_chunked_request_body_duplicate_headerc                    r=  )Ns>   POST /echo HTTP/1.1
Transfer-Encoding: gzip, chunked

2
ok
0

z-.*Unsupported Transfer-Encoding gzip, chunkedr&  c                      r)  r%   r*  r*   r4   r*   r+   r   r  r+  z[HTTPServerRawTest.test_chunked_request_body_unsupported_transfer_encoding.<locals>.<lambda>r   r>  r0  r*   r4   r+   7test_chunked_request_body_unsupported_transfer_encodinga  s   
zIHTTPServerRawTest.test_chunked_request_body_unsupported_transfer_encodingc                    r=  )NsJ   POST /echo HTTP/1.1
Transfer-Encoding: chunked
Content-Length: 2

2
ok
0

z8.*Message with both Transfer-Encoding and Content-Lengthr&  c                      r)  r%   r*  r*   r4   r*   r+   r     r+  zbHTTPServerRawTest.test_chunked_request_body_transfer_encoding_and_content_length.<locals>.<lambda>r   r>  r0  r*   r4   r+   >test_chunked_request_body_transfer_encoding_and_content_lengthv  s   
zPHTTPServerRawTest.test_chunked_request_body_transfer_encoding_and_content_lengthc                 c   s    g d}|D ]k\}}| j |dY ttt A}ttdtjd) |d| 	 fV  |
ttd| ddd	 | V  W d    n1 sOw   Y  W d    n1 s^w   Y  W d    n1 smw   Y  qd S )
N))
alphabeticr   )leading plus+10)zinternal underscore1_0)r   z(.*Only integer Content-Length is allowedr&  r   z\                            POST /echo HTTP/1.1
                            Content-Length: zs
                            Connection: close

                            1234567890
                            
z
)r  r!   r   r   r   r   r-  r.  r   r   r   r   textwrapdedentr   read_until_close)r)   Z
test_casesr   r   r@   r*   r*   r+   test_invalid_content_length  s8     z-HTTPServerRawTest.test_invalid_content_length)r8   r9   r:   rG   r  r  r$  r1  r5  r6  r9  r;  r<  r?  r@  rA  r   rJ  __classcell__r*   r*   r  r+   r    s     

r  c                   @   s<   e Zd ZG dd deZdd Zdd Zdd Zd	d
 ZdS )XHeaderTestc                   @   r_   )zXHeaderTest.Handlerc                 C   s.   |  d| jj | t| jj| jjd d S )Nrequest-version)r   remote_protocol)Z
set_headerrW   r   r   rc   r   rS   r4   r*   r*   r+   rY     s   zXHeaderTest.Handler.getNr8   r9   r:   rY   r*   r*   r*   r+   rF     re   rF   c                 C   s   t ddgdS )NTz5.5.5.5)xheadersZtrusted_downstreamrc   r4   r*   r*   r+   get_httpserver_options  r2   z"XHeaderTest.get_httpserver_optionsc                 C   s  |  | dd d ddi}|  | jd|dd d ddi}|  | jd|dd d dd	i}|  | jd|dd d	 dd
i}|  | jd|dd d	 ddi}|  | jd|dd d ddi}|  | jd|dd d ddi}|  | jd|dd d d S )NrD   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rn   rN   )r)   Z
valid_ipv4valid_ipv4_listZ
valid_ipv6Zvalid_ipv6_listZinvalid_charsZinvalid_chars_listZinvalid_hostr*   r*   r+   test_ip_headers  s>   zXHeaderTest.test_ip_headersc                 C   sN   ddi}| j d|d}|jd dr| d t|j}| |d d	 d S )
NrT  z127.0.0.1, 4.4.4.4, 5.5.5.5rD   r	  rM  zHTTP/2requires HTTP/1.xr   rS  )rH   r&   r   skipTestr   rJ   rn   )r)   rV  respresultr*   r*   r+   test_trusted_downstream  s   

z#XHeaderTest.test_trusted_downstreamc                 C   s   |  | dd d ddi}|  | jd|dd d ddi}|  | jd|dd d ddi}|  | jd|dd d dd	i}|  | jd|dd d dd
i}|  | jd|dd d d S )NrD   rN  rP   X-Schemera   r	  zX-Forwarded-Protozhttps , httpz
http,httpsunknownrU  )r)   Zhttps_schemeZhttps_forwardedZhttps_multi_forwardedZhttp_multi_forwardedZbad_forwardedr*   r*   r+   test_scheme_headers  s.   zXHeaderTest.test_scheme_headersN)	r8   r9   r:   r   rF   rR  rW  r\  r_  r*   r*   r*   r+   rL    s    
(
rL  c                       s,   e Zd Zdd Z fddZdd Z  ZS )SSLXHeaderTestc                 C   s   t dtjfgS rC   )r   rL  rF   r4   r*   r*   r+   rG     r   zSSLXHeaderTest.get_appc                    s   t   }d|d< |S )NTrP  )r  rR  )r)   outputr  r*   r+   rR    s   
z%SSLXHeaderTest.get_httpserver_optionsc                 C   s^   |  | dd d ddi}|  | jd|dd d ddi}|  | jd|dd d d S )NrD   rN  ra   r]  rP   r	  r^  rU  )r)   Zhttp_schemeZ
bad_schemer*   r*   r+   test_request_without_xprotocol  s   z-SSLXHeaderTest.test_request_without_xprotocol)r8   r9   r:   rG   rR  rb  rK  r*   r*   r  r+   r`    s    r`  c                   @   ,   e Zd ZG dd deZdd Zdd ZdS )ManualProtocolTestc                   @   r_   )zManualProtocolTest.Handlerc                 C   s   |  t| jjd d S )Nrb   )r   rc   rW   rS   r4   r*   r*   r+   rY   (  s   zManualProtocolTest.Handler.getNrO  r*   r*   r*   r+   rF   '  re   rF   c                 C   
   t ddS )Nra   rb   rQ  r4   r*   r*   r+   rR  +  rU   z)ManualProtocolTest.get_httpserver_optionsc                 C   s   |  | dd d d S )NrD   rS   ra   rU  r4   r*   r*   r+   test_manual_protocol.  r\   z'ManualProtocolTest.test_manual_protocolN)r8   r9   r:   r   rF   rR  rf  r*   r*   r*   r+   rd  &  s    rd  AF_UNIXcygwinz+unix sockets not supported on this platformc                       sD   e Zd ZdZ fddZ fddZedd Zedd	 Z  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                    s   t    t  _tj jd _t	
 j}tdtfg}t| _ j| tttj _ j fdd d S )Nz	test.sockr   c                      s    j  jS r%   )r@   r   sockfiler*   r4   r*   r+   r   J  s    z&UnixSocketTest.setUp.<locals>.<lambda>)r  r  tempfilemkdtemptmpdirr   r   r?   rj  r   Zbind_unix_socketr   rO   r   serverZ
add_socketr   r   rg  r@   r   r   )r)   sockZappr  r4   r+   r  A  s   


zUnixSocketTest.setUpc                    s>   | j   | j| jj | j  t| j	 t
   d S r%   )r@   r   r   r   rn  Zclose_all_connectionsr"  shutilrmtreerm  r  r  r4   r  r*   r+   r  L  s
   

zUnixSocketTest.tearDownc                 c   sl    | j d | j dV }| |d | j dV }t|d}| j t|d V }| |d d S )Ns   GET /hello HTTP/1.0

r   s   HTTP/1.1 200 OK
r   r   r   rl   )	r@   r   r   rn   r   r   r   r   r   )r)   rM   r   r&   rJ   r*   r*   r+   test_unix_socketS  s   zUnixSocketTest.test_unix_socketc                 c   sZ    t tdtjd | jd | j V }W d    n1 s w   Y  | |d d S )NzMalformed HTTP message fromr&  s   garbage

   HTTP/1.1 400 Bad Request

)r   r   r-  r.  r@   r   rI  rn   ro   r*   r*   r+   test_unix_socket_bad_request]  s   z+UnixSocketTest.test_unix_socket_bad_request)
r8   r9   r:   __doc__r  r  r   rr  rt  rK  r*   r*   r  r+   ri  2  s    

	ri  c                       s   e Zd ZdZdd Z fddZ fddZejdd	 Z	ejd
d Z
ejdd Zdd Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zed d! Zed"d# Zed$d% Z  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              	   C   sr   G dd dt }G dd dt }G dd dt }G dd dt }t | _td	|fd
|fd|fd|t| jdfgS )Nc                   @   r   )z+KeepAliveTest.get_app.<locals>.HelloHandlerc                 S      |  d d S NrV   r6   r4   r*   r*   r+   rY   p  r2   z/KeepAliveTest.get_app.<locals>.HelloHandler.getc                 S   rw  rx  ry  r4   r*   r*   r+   r[   s  r2   z0KeepAliveTest.get_app.<locals>.HelloHandler.postNr   r*   r*   r*   r+   HelloHandlero  r   rz  c                   @   r_   )z+KeepAliveTest.get_app.<locals>.LargeHandlerc                 S   s"   |  ddd tdD  d S )Nr  c                 s   s     | ]}t |d  d V  qdS )      N)chr).0ir*   r*   r+   	<genexpr>z  s    zBKeepAliveTest.get_app.<locals>.LargeHandler.get.<locals>.<genexpr>i   )r   r?   ranger4   r*   r*   r+   rY   w  s   "z/KeepAliveTest.get_app.<locals>.LargeHandler.getNrO  r*   r*   r*   r+   LargeHandlerv  re   r  c                   @   s   e Zd Zejdd ZdS )z=KeepAliveTest.get_app.<locals>.TransferEncodingChunkedHandlerc                 s   s    |  d |  V  d S rx  )r   flushr4   r*   r*   r+   head}  s   
zBKeepAliveTest.get_app.<locals>.TransferEncodingChunkedHandler.headN)r8   r9   r:   r   	coroutiner  r*   r*   r*   r+   TransferEncodingChunkedHandler|  s    r  c                   @   s*   e Zd Zdd Zejdd Zdd ZdS )z3KeepAliveTest.get_app.<locals>.FinishOnCloseHandlerc                 S   rQ   r%   cleanup_event)r)   r  r*   r*   r+   rT     rU   z>KeepAliveTest.get_app.<locals>.FinishOnCloseHandler.initializec                 s   s    |    | j V  d S r%   )r  r  r#  r4   r*   r*   r+   rY     s   z7KeepAliveTest.get_app.<locals>.FinishOnCloseHandler.getc                 S   rw  )Nclosedry  r4   r*   r*   r+   on_connection_close  s   zGKeepAliveTest.get_app.<locals>.FinishOnCloseHandler.on_connection_closeN)r8   r9   r:   rT   r   r  rY   r  r*   r*   r*   r+   FinishOnCloseHandler  s
    
r  rD   z/largez/chunkedz/finish_on_closer  )r   r   r  r   rc   )r)   rz  r  r  r  r*   r*   r+   rG   n  s   
zKeepAliveTest.get_appc                    s   t    d| _d S )Ns   HTTP/1.1)r  r  http_versionr4   r  r*   r+   r       

zKeepAliveTest.setUpc                    sB   | j tjdd| j |   t| dr| j  t	 
  d S )Nr  r  r@   )r   r  r   r!  r"  r#  hasattrr@   r   r  r  r4   r  r*   r+   r    s
   

zKeepAliveTest.tearDownc                 c   s*    t t | _| jd|  fV  d S r   )r   r   r@   r   r   r4   r*   r*   r+   r     s   zKeepAliveTest.connectc                 c   sJ    | j dV }| |d| | j dV }t|d}t|)Nr   r   r   r   )	r@   r   r   r   r   r   r   r   Return)r)   r   header_bytesr&   r*   r*   r+   read_headers  s   
zKeepAliveTest.read_headersc                 c   s6    |   V | _| jt| jd V }| d| d S )Nr   rl   )r  r&   r@   r   r   rn   )r)   rJ   r*   r*   r+   r>     s   zKeepAliveTest.read_responsec                 C   s   | j   | ` d S r%   )r@   r   r4   r*   r*   r+   r     s   
zKeepAliveTest.closec                 c   D    |   V  | jd |  V  | jd |  V  |   d S )N   GET / HTTP/1.1

r   r@   r   r>   r   r4   r*   r*   r+   test_two_requests  s   


zKeepAliveTest.test_two_requestsc                 c   sX    |   V  | jd |  V  | j V }| |  | | jd d |   d S )Ns%   GET / HTTP/1.1
Connection: close


Connectionr   )	r   r@   r   r>   rI  r   rn   r&   r   r)   r   r*   r*   r+   test_request_close  s   

z KeepAliveTest.test_request_closec                 c   s\    d| _ |  V  | jd |  V  | j V }| |  | d| jv |   d S )N   HTTP/1.0s   GET / HTTP/1.0

r  )	r  r   r@   r   r>   rI  r   r&   r   r  r*   r*   r+   test_http10  s   

zKeepAliveTest.test_http10c                 c   sn    d| _ |  V  | jd |  V  | | jd d | jd |  V  | | jd d |   d S )Nr  *   GET / HTTP/1.0
Connection: keep-alive

r  
Keep-Aliver  r   r@   r   r>   rn   r&   r   r4   r*   r*   r+   test_http10_keepalive     


z#KeepAliveTest.test_http10_keepalivec                 c   n    d| _ |  V  | jd |  V  | | jd d | jd |  V  | | jd d |   d S )Nr  s,   GET / HTTP/1.0
Connection: keep-alive


r  r  r  r  r4   r*   r*   r+    test_http10_keepalive_extra_crlf  r  z.KeepAliveTest.test_http10_keepalive_extra_crlfc                 c   s8    |   V  | jd |  V  |  V  |   d S Ns$   GET / HTTP/1.1

GET / HTTP/1.1

r  r4   r*   r*   r+   test_pipelined_requests  s   


z%KeepAliveTest.test_pipelined_requestsc                 c   s.    |   V  | jd |  V  |   d S r  r  r4   r*   r*   r+   test_pipelined_cancel  s
   

z#KeepAliveTest.test_pipelined_cancelc                 c   s<    |   V  | jd |  V  | jdV  |   d S )Ns   GET /large HTTP/1.1

r|  )r   r@   r   r  r   r   r4   r*   r*   r+   test_cancel_during_download  s   

z)KeepAliveTest.test_cancel_during_downloadc                 c   s8    |   V  | jd |  V  |   | j  d S )Ns!   GET /finish_on_close HTTP/1.1

)r   r@   r   r  r   r  setr4   r*   r*   r+   test_finish_while_closed  s   

z&KeepAliveTest.test_finish_while_closedc                 c   r  )Nr  sL   POST / HTTP/1.0
Connection: keep-alive
Transfer-Encoding: chunked

0

r  r  r  r  r4   r*   r*   r+   test_keepalive_chunked  s   


z$KeepAliveTest.test_keepalive_chunkedc                 c   r  )Ns   HEAD /chunked HTTP/1.1

)r   r@   r   r  r   r4   r*   r*   r+   #test_keepalive_chunked_head_no_body0  s   


z1KeepAliveTest.test_keepalive_chunked_head_no_body)r8   r9   r:   ru  rG   r  r  r   r  r   r  r>   r   r   r  r  r  r  r  r  r  r  r  r  r  rK  r*   r*   r  r+   rv  g  sD    1














rv  c                   @   $   e Zd Zdd Zdd Zdd ZdS )GzipBaseTestc                 C   r  rC   r  r4   r*   r*   r+   rG   <  r2   zGzipBaseTest.get_appc                 C   sH   t  }tjd|d}|t| |  | }| jdd|ddidS )NwmodefileobjrD   rr   Content-Encodinggzipr
  )r"   r  GzipFiler   r   r   getvaluerH   )r)   rJ   bytesio	gzip_filecompressed_bodyr*   r*   r+   	post_gzip?  s   zGzipBaseTest.post_gzipc                 C   s,   | j dddd}| t|jddgi d S )NrD   rr   r  rt   r   r  )rH   rn   r   rJ   ro   r*   r*   r+   test_uncompressedL  s   zGzipBaseTest.test_uncompressedN)r8   r9   r:   rG   r  r  r*   r*   r*   r+   r  ;  s    r  c                   @   r  )GzipTestc                 C   re  )NT)decompress_requestrQ  r4   r*   r*   r+   rR  R  rU   zGzipTest.get_httpserver_optionsc                 C   s&   |  d}| t|jddgi d S )Nr  r   r  )r  rn   r   rJ   ro   r*   r*   r+   	test_gzipU  s   
zGzipTest.test_gzipc                 C   sd   t  }tjd|d}|td |  | }| jdd|ddid}| t	|j
d	d
gi d S )Nr  r  r  rD   rr   r  ZGZIPr
  r   r  )r"   r  r  r   r   r   r  rH   rn   r   rJ   )r)   r  r  r  rM   r*   r*   r+   test_gzip_case_insensitiveY  s   z#GzipTest.test_gzip_case_insensitiveN)r8   r9   r:   rR  r  r  r*   r*   r*   r+   r  Q  s    r  c                   @   r_   )GzipUnsupportedTestc                 C   sJ   t td | d}W d    n1 sw   Y  | t|ji  d S )NzUnsupported Content-Encodingr  )r   r   r  rn   r   rJ   ro   r*   r*   r+   test_gzip_unsupportedj  s   z)GzipUnsupportedTest.test_gzip_unsupportedN)r8   r9   r:   r  r*   r*   r*   r+   r  i  re   r  c                   @   sl   e Zd ZdZdZdd Zdd ZG dd deZd	d
 Z	dd Z
dd Zdd Zdd Zdd Zdd ZdS )StreamingChunkSizeTests2   01234567890123456789012345678901234567890123456789   c                 C      t  S r%   r   r4   r*   r*   r+   get_http_clientx     z&StreamingChunkSizeTest.get_http_clientc                 C   s   t | jddS )NT)
chunk_sizer  )rc   
CHUNK_SIZEr4   r*   r*   r+   rR  }  r2   z-StreamingChunkSizeTest.get_httpserver_optionsc                   @   r   )
z&StreamingChunkSizeTest.MessageDelegatec                 C   rQ   r%   
connectionr)   r  r*   r*   r+   __init__  rU   z/StreamingChunkSizeTest.MessageDelegate.__init__c                 C   s
   g | _ d S r%   )chunk_lengthsr(   r*   r*   r+   r,     rU   z7StreamingChunkSizeTest.MessageDelegate.headers_receivedc                 C   s   | j t| d S r%   )r  r-   rZ   r.   r*   r*   r+   r1        z4StreamingChunkSizeTest.MessageDelegate.data_receivedc                 C   sN   t t| j}| jtdddtdtt|i | j	| | j
  d S )Nr,  r  OKr   )r   r   r  r  write_headersr   r   r   rZ   r   r6   )r)   Zresponse_bodyr*   r*   r+   r6     s   
z-StreamingChunkSizeTest.MessageDelegate.finishN)r8   r9   r:   r  r,   r1   r6   r*   r*   r*   r+   MessageDelegate  s
    r  c                 C      G dd dt }| S )Nc                   @   r_   )z+StreamingChunkSizeTest.get_app.<locals>.Appc                 S   
   t |S r%   )r  r  r)   Zserver_connZrequest_connr*   r*   r+   start_request  rU   z9StreamingChunkSizeTest.get_app.<locals>.App.start_requestNr8   r9   r:   r  r*   r*   r*   r+   App  re   r  r   r)   r  r*   r*   r+   rG        zStreamingChunkSizeTest.get_appc                 K   sx   | j dddi|}|  t|j}| t| jt| |D ]}| || j	dt
|  | |ddt
|  q |S )NrD   ru   rr   zoversized chunk: r   zempty chunk: )rD   )rH   rI   r   rJ   rn   rZ   BODYsumZassertLessEqualr  r   assertGreater)r)   rL   rM   r0   r  r*   r*   r+   fetch_chunk_sizes  s   
z(StreamingChunkSizeTest.fetch_chunk_sizesc                 C   sJ   t  }tjd|d}|| |  | }t|t|kr#td|S )Nr  r  z#body did not shrink when compressed)r"   r  r  r   r   r  rZ   rX   )r)   rJ   r  Zgzfile
compressedr*   r*   r+   compress  s   
zStreamingChunkSizeTest.compressc                 C   s"   | j | jd}| g d| d S )N)rJ   )r  r  r     )r  r  rn   )r)   r0   r*   r*   r+   test_regular_body  s   z(StreamingChunkSizeTest.test_regular_bodyc                 C   s   | j | | jddid d S )Nr  r  )rJ   r&   )r  r  r  r4   r*   r*   r+   test_compressed_body  s   
z+StreamingChunkSizeTest.test_compressed_bodyc                    s,    fdd} j |d} g d| d S )Nc                    s(   |  j d d  |  j dd   d S N   )r  r   r4   r*   r+   body_producer  s   z?StreamingChunkSizeTest.test_chunked_body.<locals>.body_producer)r  )r     r     )r  rn   )r)   r  r0   r*   r4   r+   test_chunked_body  s   z(StreamingChunkSizeTest.test_chunked_bodyc                    s>   |  | j | t d  fdd}| j|ddid d S )Nr  c                    s$   |  d d  |  dd   d S r  r*   r  r  r*   r+   r    s   zEStreamingChunkSizeTest.test_chunked_compressed.<locals>.body_producerr  r  )r  r&   )r  r  r  rZ   r  )r)   r  r*   r  r+   test_chunked_compressed  s   
z.StreamingChunkSizeTest.test_chunked_compressedN)r8   r9   r:   r  r  r  rR  r   r  rG   r  r  r  r  r  r  r*   r*   r*   r+   r  s  s    
	r  c                   @   rc  )InvalidOutputContentLengthTestc                   @   r   )z.InvalidOutputContentLengthTest.MessageDelegatec                 C   rQ   r%   r  r  r*   r*   r+   r    rU   z7InvalidOutputContentLengthTest.MessageDelegate.__init__c                 C   sN   ddddd}| j tdddtd	||d
  i | j d | j   d S )N10r   rD  rE  )normalrB  rC  
underscorer,  r  r  r   x-test
   1234567890)r  r  r   r   r   r6   )r)   r'   r&   Zcontent_lengthsr*   r*   r+   r,     s   
z?InvalidOutputContentLengthTest.MessageDelegate.headers_receivedN)r8   r9   r:   r  r,   r*   r*   r*   r+   r    r   r  c                 C   r  )Nc                   @   r_   )z3InvalidOutputContentLengthTest.get_app.<locals>.Appc                 S   r  r%   )r  r  r  r*   r*   r+   r    rU   zAInvalidOutputContentLengthTest.get_app.<locals>.App.start_requestNr  r*   r*   r*   r+   r    re   r  r  r  r*   r*   r+   rG     r  z&InvalidOutputContentLengthTest.get_appc                 C   s   |  d | jddddid}|  | |jd W d    n1 s%w   Y  dD ]K}|  |< ttd' | t | jddd|id W d    n1 sTw   Y  W d    n1 scw   Y  W d    n1 srw   Y  q,d S )	Nr  rD   GETr  )ru   r&   r  )rB  rC  r  rw   )	r  rH   rI   rn   rJ   r   r   r   r   )r)   rM   testr*   r*   r+   "test_invalid_output_content_length  s"   zAInvalidOutputContentLengthTest.test_invalid_output_content_lengthN)r8   r9   r:   r   r  rG   r  r*   r*   r*   r+   r    s    r  c                   @   r   )
MaxHeaderSizeTestc                 C   r  rC   r   rO   r4   r*   r*   r+   rG     r2   zMaxHeaderSizeTest.get_appc                 C   re  )Nr|  )Zmax_header_sizerQ  r4   r*   r*   r+   rR    rU   z(MaxHeaderSizeTest.get_httpserver_optionsc                 C   s,   | j dddid}|  | |jd d S )NrD   X-FillerZdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar	  rl   )rH   rI   rn   rJ   ro   r*   r*   r+   test_small_headers  s   z$MaxHeaderSizeTest.test_small_headersc                 C   s   t tdddB z| jdddidd | d	 W n ty8 } z|jd ur.| |jjd
 W Y d }~nd }~ww W d    d S W d    d S 1 sLw   Y  d S )NzUnsatisfiable readFrx   rD   r  A  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaT)r&   r   z did not raise expected exception)i  iW  )r   r   rH   Zfailr   rM   ZassertInr  )r)   er*   r*   r+   test_large_headers  s   
" z$MaxHeaderSizeTest.test_large_headersN)r8   r9   r:   rG   rR  r  r  r*   r*   r*   r+   r    s
    r  c                       s^   e Zd Zdd Zdd Z fddZ fddZejd	d
 Z	e
dd Ze
dd Z  ZS )IdleTimeoutTestc                 C   r  rC   r  r4   r*   r*   r+   rG     r2   zIdleTimeoutTest.get_appc                 C   re  )Ng?)Zidle_connection_timeoutrQ  r4   r*   r*   r+   rR    rU   z&IdleTimeoutTest.get_httpserver_optionsc                    s   t    g | _d S r%   )r  r  streamsr4   r  r*   r+   r    r  zIdleTimeoutTest.setUpc                    s"   t    | jD ]}|  qd S r%   )r  r  r  r   r   r  r*   r+   r    s   


zIdleTimeoutTest.tearDownc                 c   s8    t t }|d|  fV  | j| t|r   )r   r   r   r   r  r-   r   r  r   r*   r*   r+   r   $  s
   
zIdleTimeoutTest.connectc                 c   s,    |   V }t }||j | V  d S r%   )r   r   set_close_callbackr  r#  )r)   r@   eventr*   r*   r+   test_unused_connection+  s
   
z&IdleTimeoutTest.test_unused_connectionc                 c   sh    |   V }t }||j tdD ]}|d |dV  |dV }| |d q|	 V  d S )Nr  r  r      rl   )
r   r   r  r  r  r   r   r   rn   r#  )r)   r@   r  r  r   r*   r*   r+   test_idle_after_use2  s   

z#IdleTimeoutTest.test_idle_after_use)r8   r9   r:   rG   rR  r  r  r   r  r   r   r  r  rK  r*   r*   r  r+   r    s    

r  c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Ze	e
jdkddd Zdd Ze	e
jdkddd Zdd Zdd Zedd Zedd ZdS )BodyLimitsTestc                 C   s8   G dd dt }tG dd dt }td|fd|fgS )Nc                   @   r_   )z/BodyLimitsTest.get_app.<locals>.BufferedHandlerc                 S   s   |  tt| jj d S r%   )r   r   rZ   rW   rJ   r4   r*   r*   r+   putF  r\   z3BodyLimitsTest.get_app.<locals>.BufferedHandler.putN)r8   r9   r:   r  r*   r*   r*   r+   BufferedHandlerE  re   r  c                   @   r   )
z0BodyLimitsTest.get_app.<locals>.StreamingHandlerc                 S   s
   d| _ d S )Nr   )
bytes_readr4   r*   r*   r+   rT   K  rU   z;BodyLimitsTest.get_app.<locals>.StreamingHandler.initializec                 S   sX   t t| jj}d| jjv r|t| d d| jjv r*|	t
| d d S d S )NZexpected_sizebody_timeout)r   castr
   rW   r  r   Zset_max_body_sizer   r   Zset_body_timeoutfloat)r)   r5   r*   r*   r+   r   N  s   z8BodyLimitsTest.get_app.<locals>.StreamingHandler.preparec                 S   s   |  j t|7  _ d S r%   )r  rZ   r  r*   r*   r+   r1   U  rd   z>BodyLimitsTest.get_app.<locals>.StreamingHandler.data_receivedc                 S   s   |  t| j d S r%   )r   r   r  r4   r*   r*   r+   r  X  r  z4BodyLimitsTest.get_app.<locals>.StreamingHandler.putN)r8   r9   r:   rT   r   r1   r  r*   r*   r*   r+   StreamingHandlerI  s
    r  	/buffered
/streaming)r   r    r   )r)   r  r  r*   r*   r+   rG   D  s   zBodyLimitsTest.get_appc                 C   s   t dddS )Nr|   i   )r  Zmax_body_sizerQ  r4   r*   r*   r+   rR  _  r7   z%BodyLimitsTest.get_httpserver_optionsc                 C   r  r%   r   r4   r*   r*   r+   r  b  r  zBodyLimitsTest.get_http_clientc                 C   s@   | j dddd}| |jd | j dddd}| |jd d S )Nr  PUTs   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaart   s   4096r	  rm   ro   r*   r*   r+   test_small_bodyg  s   zBodyLimitsTest.test_small_bodyc                 C   V   t tdtjd | jdddd d}W d    n1 sw   Y  | |jd d S )	N.*Content-Length too longr&  r  r
     a (  rt   r   r   r   r-  r.  rH   rn   r  ro   r*   r*   r+   test_large_body_bufferedm     z'BodyLimitsTest.test_large_body_bufferedntzflaky on windowsc                 C   V   t tdtjd | jdddd d}W d    n1 sw   Y  | |jd d S )	N.*chunked body too larger&  r  r
  c                 S      | dd S Nr  r  r*   r  r*   r*   r+   r   y      zABodyLimitsTest.test_large_body_buffered_chunked.<locals>.<lambda>ru   r  r   r  ro   r*   r*   r+    test_large_body_buffered_chunkedr  s   z/BodyLimitsTest.test_large_body_buffered_chunkedc                 C   r  )	Nr  r&  r	  r
  r  r  rt   r   r  ro   r*   r*   r+   test_large_body_streaming}  r  z(BodyLimitsTest.test_large_body_streamingc                 C   r  )	Nr  r&  r	  r
  c                 S   r  r  r*   r  r*   r*   r+   r     r  zBBodyLimitsTest.test_large_body_streaming_chunked.<locals>.<lambda>r  r   r  ro   r*   r*   r+   !test_large_body_streaming_chunked  s   z0BodyLimitsTest.test_large_body_streaming_chunkedc                 C   rq   )N/streaming?expected_size=10240r
  r  r  rt      10240rm   ro   r*   r*   r+   "test_large_body_streaming_override  s   
z1BodyLimitsTest.test_large_body_streaming_overridec                 C   s&   | j dddd d}| |jd d S )Nr  r
  c                 S   r  r  r*   r  r*   r*   r+   r     r  zKBodyLimitsTest.test_large_body_streaming_chunked_override.<locals>.<lambda>r  r  rm   ro   r*   r*   r+   *test_large_body_streaming_chunked_override  s   z9BodyLimitsTest.test_large_body_streaming_chunked_overridec                 c   s    t t }z9|d|  fV  |d ttdtjd |	 V }W d    n1 s/w   Y  | 
|d W |  d S |  w )Nr   s@   PUT /streaming?body_timeout=0.1 HTTP/1.0
Content-Length: 42

zTimeout reading bodyr&  r=   )r   r   r   r   r   r   r   r-  r.  rI  rn   r   )r)   r@   rM   r*   r*   r+   test_timeout  s   zBodyLimitsTest.test_timeoutc                 c   s    t t }zS|d|  fV  |d |dd  t|V \}}}| |d |d ttdt	j
d | V }W d    n1 sIw   Y  | |d	 W |  d S |  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  r&  rs  )r   r   r   r   r   rA   rn   r   r   r-  r.  rI  r   )r)   r@   r'   r&   rM   r   r*   r*   r+   test_body_size_override_reset  s$   z,BodyLimitsTest.test_body_size_override_resetN)r8   r9   r:   rG   rR  r  r  r  unittestskipIfr   r   r  r  r  r  r   r   r!  r"  r*   r*   r*   r+   r   C  s"    


	
r   c                   @   r   )LegacyInterfaceTestc                    s    fdd}|S )Nc                    sp   | j d _ js| jtdddt  | j  d S d}| jt	dt
|  | j| | j  d S )NzHTTP/1.r  r  r  rl   z'HTTP/1.1 200 OK
Content-Length: %d

)r   r   http1r  r  r   r   r6   r   r   rZ   )rW   messager4   r*   r+   handle_request  s   
z3LegacyInterfaceTest.get_app.<locals>.handle_requestr*   )r)   r(  r*   r4   r+   rG     s   zLegacyInterfaceTest.get_appc                 C   s,   |  d}| js| d | |jd d S )NrD   rX  rl   )rH   r&  rY  rn   rJ   ro   r*   r*   r+   test_legacy_interface  s   

z)LegacyInterfaceTest.test_legacy_interfaceN)r8   r9   r:   rG   r)  r*   r*   r*   r+   r%    s    r%  )htornador   r   Ztornado.escaper   r   r   r   r   r	   Ztornado.http1connectionr
   Ztornado.httpclientr   Ztornado.httpserverr   Ztornado.httputilr   r   r   r   Ztornado.iostreamr   Ztornado.locksr   Ztornado.logr   r   Ztornado.netutilr   Ztornado.simple_httpclientr   Ztornado.testingr   r   r   r   r   Ztornado.test.utilr   Ztornado.webr   r   r    
contextlibr!   r   r  r-  r   rp  r   r   sysrk  rG  r#  urllib.parser  ior"   r   TYPE_CHECKINGr#   r$   rA   rB   rO   r$  r   ZskipIfOldSSLr`   objectrf   r   r   r   r   ZTestCaser   r   r   r   r   r   r   r   r  rL  r`  rd  r  platformri  rv  r  r  r  r  r  r  r  r   r%  r*   r*   r*   r+   <module>   s     0	)])A __1 U
_(/ 