U
    luf                     @   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 pe5j\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                    sN   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*   @/tmp/pip-unpacked-wheel-bmg6zs32/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   s    z0read_stream_body.<locals>.Delegate.data_receivedc                    s       d S r%   )detachr)   )connr*   r+   finishD   s    z)read_stream_body.<locals>.Delegate.finishN)__name__
__module____qualname__r,   r1   r5   r*   r0   r4   r*   r+   Delegate<   s   r:   TN    )r   r
   read_responser'   r&   join)streamr:   Zdelegater*   r9   r+   read_stream_body7   s    
r?   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__Handlerr3   r*   r*   r+   get_appP   s    zHandlerBaseTestCase.get_appc                 O   s   | j ||}|  t|jS r%   )fetchrethrowr   body)r)   argskwargsresponser*   r*   r+   
fetch_jsonS   s    zHandlerBaseTestCase.fetch_json)r6   r7   r8   rD   rE   rL   r*   r*   r*   r+   r@   M   s   r@   c                   @   s&   e Zd Zd	ddZdd Zdd ZdS )
HelloWorldRequestHandlerhttpc                 C   s
   || _ d S r%   )expected_protocol)r)   protocolr*   r*   r+   
initializeZ   s    z#HelloWorldRequestHandler.initializec                 C   s$   | j j| jkrtd| d d S )Nzunexpected protocolHello world)requestrP   rO   	Exceptionr5   r3   r*   r*   r+   get]   s    zHelloWorldRequestHandler.getc                 C   s   |  dt| jj  d S )NzGot %d bytes in POST)r5   lenrS   rH   r3   r*   r*   r+   postb   s    zHelloWorldRequestHandler.postN)rN   )r6   r7   r8   rQ   rU   rW   r*   r*   r*   r+   rM   Y   s   
rM   OPENSSL_VERSION_INFO)r   r   )   r   z(old version of ssl module and/or opensslc                   @   s   e Zd Zdd ZdS )BaseSSLTestc                 C   s   t dttddfgS )NrB   httpsrP   )r   rM   dictr3   r*   r*   r+   rE   r   s    zBaseSSLTest.get_appN)r6   r7   r8   rE   r*   r*   r*   r+   rZ   q   s   rZ   c                   @   s\   e Zd Zdd Zdd ZejdddZejddd	Zejdd
dZ	ejdddZ
dS )SSLTestMixinc                 C   s   t f d|  it S )Nssl_version)r]   get_ssl_versionr   Zdefault_ssl_optionsr3   r*   r*   r+   get_ssl_optionsw   s
    zSSLTestMixin.get_ssl_optionsc                 C   s
   t  d S r%   )NotImplementedErrorr3   r*   r*   r+   r`   }   s    zSSLTestMixin.get_ssl_versionr3   c                 C   s   |  d}| |jd d S )NrB      Hello worldrF   assertEqualrH   r)   rK   r*   r*   r+   test_ssl   s    
zSSLTestMixin.test_sslc                 C   s&   | j dddd d}| |jd d S )NrB   POSTAi  methodrH   s   Got 5000 bytes in POSTrd   rf   r*   r*   r+   test_large_post   s    zSSLTestMixin.test_large_postc                 C   sn   t tdZ t tddd@ | ttf& | j| dddddd	d
 W 5 Q R X W 5 Q R X W 5 Q R X d S )Nz(SSL Error|uncaught exception)Uncaught exceptionFrequiredrB   https:http:  T)request_timeoutconnect_timeoutraise_error)r   r   assertRaisesIOErrorr   rF   get_urlreplacer3   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 5 Q R X W 5 Q R X | |j	 d S )Nz	SSL ErrorrB   rp   rq   T)ru   )
r   r   rv   rw   r   rF   rx   ry   ZassertFalseZlogged_stack)r)   Z
expect_logr*   r*   r+   test_error_logging   s     zSSLTestMixin.test_error_loggingN)r6   r7   r8   ra   r`   typingAnyrg   rl   rz   r{   r*   r*   r*   r+   r^   v   s   r^   c                   @   s   e Zd Zdd ZdS )
SSLv23Testc                 C   s   t jS r%   )sslPROTOCOL_SSLv23r3   r*   r*   r+   r`      s    zSSLv23Test.get_ssl_versionNr6   r7   r8   r`   r*   r*   r*   r+   r~      s   r~   c                   @   s   e Zd Zdd ZdS )	SSLv3Testc                 C   s   t jS r%   )r   ZPROTOCOL_SSLv3r3   r*   r*   r+   r`      s    zSSLv3Test.get_ssl_versionNr   r*   r*   r*   r+   r      s   r   c                   @   s   e Zd Zdd ZdS )	TLSv1Testc                 C   s   t jS r%   )r   PROTOCOL_TLSv1r3   r*   r*   r+   r`      s    zTLSv1Test.get_ssl_versionNr   r*   r*   r*   r+   r      s   r   c                   @   s   e Zd Zdd ZdS )SSLContextTestc                 C   s&   t t| dd}t|tjs"t|S )NT)server_side)r   r   ra   
isinstancer   
SSLContextAssertionError)r)   contextr*   r*   r+   ra      s     zSSLContextTest.get_ssl_optionsN)r6   r7   r8   ra   r*   r*   r*   r+   r      s   r   c                   @   s   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   rv   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=   rv   
ValueErrorrw   r   )r)   r   Z
module_dirZexisting_certificateZexisting_keyr*   r*   r+   test_missing_key   s,    z"BadSSLOptionsTest.test_missing_keyN)r6   r7   r8   r   r   r*   r*   r*   r+   r      s   	r   c                   @   s   e Zd Zdd ZdS )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   rH   )headerr   filenamefilebody)r5   rS   r&   get_argumentr   r   r   r3   r*   r*   r+   rW      s    
zMultipartTestHandler.postNr6   r7   r8   rW   r*   r*   r*   r+   r      s   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   rM   r3   r*   r*   r+   get_handlers   s    zHTTPConnectionTest.get_handlersc                 C   s   t |  S r%   )r   r   r3   r*   r*   r+   rE      s    zHTTPConnectionTest.get_app   
c              
      s   t tt p j fdd ||tdt| g | | |   jfdd\}}}|W  5 Q R  S Q R X d S )Nc                      s    d  fS N	127.0.0.1)connectget_http_portr*   r)   r>   r*   r+   <lambda>  r;   z.HTTPConnectionTest.raw_fetch.<locals>.<lambda>zContent-Length: %dc                      s   t  S r%   )r?   r*   )r>   r*   r+   r     r;   )	r!   r   socketio_looprun_syncwriter=   r   rV   )r)   r&   rH   newliner'   r*   r   r+   	raw_fetch   s"    

zHTTPConnectionTest.raw_fetchc                 C   s   |  dddg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 )Ns   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   re   r)   rK   datar*   r*   r+   test_multipart_form  s2    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   rc   )r   re   )r)   r   rK   r*   r*   r+   test_newlines/  s    z HTTPConnectionTest.test_newlinesc              	   c   s   t t }|d|  fV  |ddddddg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: close   

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intre   close)r)   r>   r   
first_lineheader_datar&   rH   r*   r*   r+   test_100_continue5  s,    
z$HTTPConnectionTest.test_100_continueN)r   )
r6   r7   r8   r   rE   r   r   r   r   r   r*   r*   r*   r+   r      s   
r   c                   @   s   e Zd Zdd Zdd ZdS )EchoHandlerc                 C   s   |  t| jj d S r%   r   r   rS   	argumentsr3   r*   r*   r+   rU   T  s    zEchoHandler.getc                 C   s   |  t| jj d S r%   r   r3   r*   r*   r+   rW   W  s    zEchoHandler.postNr6   r7   r8   rU   rW   r*   r*   r*   r+   r   S  s   r   c                   @   s,   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 )Nrk   uriversion	remote_iprP   hostr   queryZ
header_keyr   header_valueZ
cookie_keyZcookie_valueZarg_key	arg_value)errorsstr
check_typegetattrrS   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 )NrH   )r   rS   rH   r   r   r   r3   r*   r*   r+   rW   w  s    zTypeCheckHandler.postc                 C   s   |  | j d S r%   )r   r   r3   r*   r*   r+   rU   {  s    zTypeCheckHandler.getc                 C   s&   t |}||kr"d||f | j|< d S )Nzexpected %s, got %s)typer   )r)   nameobjr   Zactual_typer*   r*   r+   r   ~  s    zTypeCheckHandler.check_typeN)r6   r7   r8   r   rW   rU   r   r*   r*   r*   r+   r   [  s   r   c                   @   s   e Zd Zdd ZdS )PostEchoHandlerc                 G   s   |  t| dd d S )Nr   )echo)r   r]   r   )r)   Z	path_argsr*   r*   r+   rW     s    zPostEchoHandler.postNr   r*   r*   r*   r+   r     s   r   c                   @   s   e Zd ZdddZdS )PostEchoGBKHandlerNc                 C   s4   z| dW S  tk
r.   tdd| Y nX d S )Ngbk  zinvalid gbk bytes: %r)r   rT   r   )r)   r   r   r*   r*   r+   decode_argument  s    z"PostEchoGBKHandler.decode_argument)N)r6   r7   r8   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   r3   r*   r*   r+   rE     s    zHTTPServerTest.get_appc                 C   s*   |  d}t|j}| |ddgi d S )Nz/echo?foo=%C3%A9foor   rF   r   rH   re   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   rh   z	foo=&bar=rj   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   rh   rk   rH   r&   r   )r)   r&   rK   r   r*   r*   r+   
test_types  s    
   
zHTTPServerTest.test_typesc                 C   s.   |  d}| d|j | t|ji  d S )Nr      )rF   re   coder   rH   rf   r*   r*   r+   test_double_slash  s    
z HTTPServerTest.test_double_slashc                 C   s   ddi}d}dD ]x}dD ]n}| j ||dV ||}|rLtj|d}| jd| d	|d
| d}| t|jd|i W 5 Q R X qqd S )NzContent-Typez!application/x-www-form-urlencodedu   chinese: 张三)r   r   )TF)encquoteasciiz/post_rh   s   data=)rk   r&   rH   r   )	subTestr   urllibr   r   rF   re   r   rH   )r)   r&   Zuni_textr   r   Zbin_textrK   r*   r*   r+   test_post_encodings  s    
z"HTTPServerTest.test_post_encodingsN)
r6   r7   r8   rE   r   r   r   r   r   r  r*   r*   r*   r+   r     s   r   c                       st   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edd Z  ZS )HTTPServerRawTestc                 C   s   t dtfgS )Nr   r   r   r3   r*   r*   r+   rE     s    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*   r3   r*   r+   r     r;   z)HTTPServerRawTest.setUp.<locals>.<lambda>)supersetUpr   r   r>   r   r   r3   rC   r3   r+   r    s
    

zHTTPServerRawTest.setUpc                    s   | j   t   d S r%   )r>   r   r  tearDownr3   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waitr3   r*   r*   r+   test_empty_request  s    
z$HTTPServerRawTest.test_empty_requestc              	      sp   t tdtjdV  jd  j fdd\}}} d|j	  d|j
  d|j W 5 Q R X d S )	N.*Malformed HTTP request linelevel   asdf

c                      s
   t  jS r%   r?   r>   r*   r3   r*   r+   r     r;   zFHTTPServerRawTest.test_malformed_first_line_response.<locals>.<lambda>HTTP/1.1r   zBad Request)r   r   loggingINFOr>   r   r   r   re   r   r   reasonr)   r'   r&   rK   r*   r3   r+   "test_malformed_first_line_response  s    

z4HTTPServerRawTest.test_malformed_first_line_responsec              	   C   sL   t tdtjd2 | jd | jtj	dd| j
 |   W 5 Q R X d S )Nr  r  r  皙?r  r   r   r  r  r>   r   r   r  r  r  r  r  r3   r*   r*   r+   test_malformed_first_line_log  s    z/HTTPServerRawTest.test_malformed_first_line_logc              	   C   sL   t tdtjd2 | jd | jtj	dd| j
 |   W 5 Q R X d S )Nz1.*Malformed HTTP message.*no colon in header liner  s   GET / HTTP/1.0
asdf

r  r  r   r3   r*   r*   r+   test_malformed_headers  s    z(HTTPServerRawTest.test_malformed_headersc                    sH    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                      s
   t  jS r%   r  r*   r3   r*   r+   r     r;   z=HTTPServerRawTest.test_chunked_request_body.<locals>.<lambda>r   r   r>   r   ry   r   r   re   r   r  r*   r3   r+   test_chunked_request_body  s     

z+HTTPServerRawTest.test_chunked_request_bodyc                    sH    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                      s
   t  jS r%   r  r*   r3   r*   r+   r   .  r;   zBHTTPServerRawTest.test_chunked_request_uppercase.<locals>.<lambda>r   r   r#  r  r*   r3   r+   test_chunked_request_uppercase  s     

z0HTTPServerRawTest.test_chunked_request_uppercasec              	      s\    j ddd ttdtjd   j fdd\}}}W 5 Q R X  	d|j
 d S )	NsR   POST /echo HTTP/1.1
Transfer-Encoding: chunked

1_a
1234567890abcdef1234567890
0

r   r   z.*invalid chunk sizer  c                      s
   t  jS r%   r  r*   r3   r*   r+   r   D  r;   zJHTTPServerRawTest.test_chunked_request_body_invalid_size.<locals>.<lambda>r   )r>   r   ry   r   r   r  r  r   r   re   r   r  r*   r3   r+   &test_chunked_request_body_invalid_size2  s    	 
z8HTTPServerRawTest.test_chunked_request_body_invalid_sizec                 c   s   dddg}|D ]\}}| j |d ttt d}ttdtjdH |d| 	 fV  |
ttd| d	d
d | V  W 5 Q R X W 5 Q R X W 5 Q R X 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dedentry   read_until_close)r)   Z
test_casesr   r   r>   r*   r*   r+   test_invalid_content_lengthH  s2      z-HTTPServerRawTest.test_invalid_content_length)r6   r7   r8   rE   r  r
  r  r  r!  r"  r$  r%  r&  r   r/  __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                   @   s   e Zd Zdd ZdS )zXHeaderTest.Handlerc                 C   s.   |  d| jj | t| jj| jjd d S )Nrequest-version)r   remote_protocol)Z
set_headerrS   r   r   r]   r   rP   r3   r*   r*   r+   rU   l  s    zXHeaderTest.Handler.getNr6   r7   r8   rU   r*   r*   r*   r+   rD   k  s   rD   c                 C   s   t ddgdS )NTz5.5.5.5)xheadersZtrusted_downstreamr]   r3   r*   r*   r+   get_httpserver_optionsu  s    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 )NrB   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re   rL   )r)   Z
valid_ipv4valid_ipv4_listZ
valid_ipv6Zvalid_ipv6_listZinvalid_charsZinvalid_chars_listZinvalid_hostr*   r*   r+   test_ip_headersx  sH         zXHeaderTest.test_ip_headersc                 C   sN   ddi}| j d|d}|jd dr0| d t|j}| |d d	 d S )
Nr9  z127.0.0.1, 4.4.4.4, 5.5.5.5rB   r   r2  zHTTP/2requires HTTP/1.xr   r8  )rF   r&   r   skipTestr   rH   re   )r)   r;  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 )NrB   r3  rN   X-Schemer[   r   zX-Forwarded-Protozhttps , httpz
http,httpsunknownr:  )r)   Zhttps_schemeZhttps_forwardedZhttps_multi_forwardedZhttp_multi_forwardedZbad_forwardedr*   r*   r+   test_scheme_headers  s4       zXHeaderTest.test_scheme_headersN)	r6   r7   r8   r   rD   r7  r<  rA  rD  r*   r*   r*   r+   r1  j  s
   
(
r1  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 rA   )r   r1  rD   r3   r*   r*   r+   rE     s    zSSLXHeaderTest.get_appc                    s   t   }d|d< |S )NTr5  )r  r7  )r)   outputr	  r*   r+   r7    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 )NrB   r3  r[   rB  rN   r   rC  r:  )r)   Zhttp_schemeZ
bad_schemer*   r*   r+   test_request_without_xprotocol  s      z-SSLXHeaderTest.test_request_without_xprotocol)r6   r7   r8   rE   r7  rG  r0  r*   r*   r	  r+   rE    s   rE  c                   @   s,   e Zd ZG dd deZdd Zdd ZdS )ManualProtocolTestc                   @   s   e Zd Zdd ZdS )zManualProtocolTest.Handlerc                 C   s   |  t| jjd d S )Nr\   )r   r]   rS   rP   r3   r*   r*   r+   rU     s    zManualProtocolTest.Handler.getNr4  r*   r*   r*   r+   rD     s   rD   c                 C   s
   t ddS )Nr[   r\   r6  r3   r*   r*   r+   r7    s    z)ManualProtocolTest.get_httpserver_optionsc                 C   s   |  | dd d d S )NrB   rP   r[   r:  r3   r*   r*   r+   test_manual_protocol  s    z'ManualProtocolTest.test_manual_protocolN)r6   r7   r8   r   rD   r7  rI  r*   r*   r*   r+   rH    s   rH  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*   r3   r*   r+   r     r;   z&UnixSocketTest.setUp.<locals>.<lambda>)r  r  tempfilemkdtemptmpdirr   r   r=   rM  r   Zbind_unix_socketr   rM   r   serverZ
add_socketr   r   rJ  r>   r   r   )r)   sockZappr	  r3   r+   r    s    


zUnixSocketTest.setUpc                    s>   | j   | j| jj | j  t| j	 t
   d S r%   )r>   r   r   r   rQ  Zclose_all_connectionsr  shutilrmtreerP  r  r
  r3   r	  r*   r+   r
    s
    

zUnixSocketTest.tearDownc                 c   sj   | 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   rc   )	r>   r   r   re   r   r   r   r   r   )r)   rK   r   r&   rH   r*   r*   r+   test_unix_socket  s    zUnixSocketTest.test_unix_socketc              	   c   sD   t tdtjd | jd | j V }W 5 Q R X | |d d S )NzMalformed HTTP message fromr  s   garbage

   HTTP/1.1 400 Bad Request

)r   r   r  r  r>   r   r.  re   rf   r*   r*   r+   test_unix_socket_bad_request  s    z+UnixSocketTest.test_unix_socket_bad_request)
r6   r7   r8   __doc__r  r
  r   rU  rW  r0  r*   r*   r	  r+   rL    s   

	rL  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                   @   s   e Zd Zdd Zdd ZdS )z+KeepAliveTest.get_app.<locals>.HelloHandlerc                 S   s   |  d d S NrR   r5   r3   r*   r*   r+   rU   *  s    z/KeepAliveTest.get_app.<locals>.HelloHandler.getc                 S   s   |  d d S rZ  r[  r3   r*   r*   r+   rW   -  s    z0KeepAliveTest.get_app.<locals>.HelloHandler.postNr   r*   r*   r*   r+   HelloHandler)  s   r\  c                   @   s   e Zd Zdd ZdS )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>4  s     zBKeepAliveTest.get_app.<locals>.LargeHandler.get.<locals>.<genexpr>i   )r   r=   ranger3   r*   r*   r+   rU   1  s    z/KeepAliveTest.get_app.<locals>.LargeHandler.getNr4  r*   r*   r*   r+   LargeHandler0  s   rd  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 rZ  )r   flushr3   r*   r*   r+   head7  s    
zBKeepAliveTest.get_app.<locals>.TransferEncodingChunkedHandler.headN)r6   r7   r8   r   	coroutinerf  r*   r*   r*   r+   TransferEncodingChunkedHandler6  s   rh  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   s
   || _ d S r%   cleanup_event)r)   rj  r*   r*   r+   rQ   =  s    z>KeepAliveTest.get_app.<locals>.FinishOnCloseHandler.initializec                 s   s   |    | j V  d S r%   )re  rj  r  r3   r*   r*   r+   rU   @  s    z7KeepAliveTest.get_app.<locals>.FinishOnCloseHandler.getc                 S   s   |  d d S )Nclosedr[  r3   r*   r*   r+   on_connection_closeE  s    zGKeepAliveTest.get_app.<locals>.FinishOnCloseHandler.on_connection_closeN)r6   r7   r8   rQ   r   rg  rU   rl  r*   r*   r*   r+   FinishOnCloseHandler<  s   
rm  rB   z/largez/chunkedz/finish_on_closeri  )r   r   rj  r   r]   )r)   r\  rd  rh  rm  r*   r*   r+   rE   (  s    
zKeepAliveTest.get_appc                    s   t    d| _d S )Ns   HTTP/1.1)r  r  http_versionr3   r	  r*   r+   r  Y  s    
zKeepAliveTest.setUpc                    sB   | j tjdd| j |   t| dr4| j  t	 
  d S )Nr  r  r>   )r   r  r  r  r  r  hasattrr>   r   r  r
  r3   r	  r*   r+   r
  ]  s
    

zKeepAliveTest.tearDownc                 c   s(   t t | _| jd|  fV  d S r   )r   r   r>   r   r   r3   r*   r*   r+   r   h  s    zKeepAliveTest.connectc                 c   sL   | j dV }| |d| | j dV }t|d}t|d S )Nr   r   r   r   )	r>   r   r   r   r   r   r   r   Return)r)   r   header_bytesr&   r*   r*   r+   read_headersm  s
    zKeepAliveTest.read_headersc                 c   s4   |   V | _| jt| jd V }| d| d S )Nr   rc   )rr  r&   r>   r   r   re   )r)   rH   r*   r*   r+   r<   u  s    zKeepAliveTest.read_responsec                 C   s   | j   | ` d S r%   )r>   r   r3   r*   r*   r+   r   {  s    
zKeepAliveTest.closec                 c   sB   |   V  | jd |  V  | jd |  V  |   d S )N   GET / HTTP/1.1

r   r>   r   r<   r   r3   r*   r*   r+   test_two_requests  s    


zKeepAliveTest.test_two_requestsc                 c   sV   |   V  | jd |  V  | j V }| |  | | jd d |   d S )Ns%   GET / HTTP/1.1
Connection: close


Connectionr   )	r   r>   r   r<   r.  r   re   r&   r   r)   r   r*   r*   r+   test_request_close  s    

z KeepAliveTest.test_request_closec                 c   sZ   d| _ |  V  | jd |  V  | j V }| |  | d| jk |   d S )N   HTTP/1.0s   GET / HTTP/1.0

rv  )	rn  r   r>   r   r<   r.  r   r&   r   rw  r*   r*   r+   test_http10  s    

zKeepAliveTest.test_http10c                 c   sl   d| _ |  V  | jd |  V  | | jd d | jd |  V  | | jd d |   d S )Nry  *   GET / HTTP/1.0
Connection: keep-alive

rv  
Keep-Alivern  r   r>   r   r<   re   r&   r   r3   r*   r*   r+   test_http10_keepalive  s    


z#KeepAliveTest.test_http10_keepalivec                 c   sl   d| _ |  V  | jd |  V  | | jd d | jd |  V  | | jd d |   d S )Nry  s,   GET / HTTP/1.0
Connection: keep-alive


rv  r|  r{  r}  r3   r*   r*   r+    test_http10_keepalive_extra_crlf  s    


z.KeepAliveTest.test_http10_keepalive_extra_crlfc                 c   s6   |   V  | jd |  V  |  V  |   d S Ns$   GET / HTTP/1.1

GET / HTTP/1.1

rt  r3   r*   r*   r+   test_pipelined_requests  s
    


z%KeepAliveTest.test_pipelined_requestsc                 c   s,   |   V  | jd |  V  |   d S r  rt  r3   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   rr  r   r   r3   r*   r*   r+   test_cancel_during_download  s
    

z)KeepAliveTest.test_cancel_during_downloadc                 c   s6   |   V  | jd |  V  |   | j  d S )Ns!   GET /finish_on_close HTTP/1.1

)r   r>   r   rr  r   rj  setr3   r*   r*   r+   test_finish_while_closed  s
    

z&KeepAliveTest.test_finish_while_closedc                 c   sl   d| _ |  V  | jd |  V  | | jd d | jd |  V  | | jd d |   d S )Nry  sL   POST / HTTP/1.0
Connection: keep-alive
Transfer-Encoding: chunked

0

rv  r|  r{  r}  r3   r*   r*   r+   test_keepalive_chunked  s    


z$KeepAliveTest.test_keepalive_chunkedc                 c   sB   |   V  | jd |  V  | jd |  V  |   d S )Ns   HEAD /chunked HTTP/1.1

)r   r>   r   rr  r   r3   r*   r*   r+   #test_keepalive_chunked_head_no_body  s    


z1KeepAliveTest.test_keepalive_chunked_head_no_body)r6   r7   r8   rX  rE   r  r
  r   rg  r   rr  r<   r   r   ru  rx  rz  r~  r  r  r  r  r  r  r  r0  r*   r*   r	  r+   rY  !  sB   1














rY  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )GzipBaseTestc                 C   s   t dtfgS rA   r  r3   r*   r*   r+   rE     s    zGzipBaseTest.get_appc                 C   sH   t  }tjd|d}|t| |  | }| jdd|ddidS )NwmodefileobjrB   rh   Content-Encodinggzipr   )r"   r  GzipFiler   r   r   getvaluerF   )r)   rH   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 )NrB   rh   r   rj   r   r   )rF   re   r   rH   rf   r*   r*   r+   test_uncompressed  s    zGzipBaseTest.test_uncompressedN)r6   r7   r8   rE   r  r  r*   r*   r*   r+   r    s   r  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )GzipTestc                 C   s
   t ddS )NT)decompress_requestr6  r3   r*   r*   r+   r7    s    zGzipTest.get_httpserver_optionsc                 C   s&   |  d}| t|jddgi d S )Nr   r   r   )r  re   r   rH   rf   r*   r*   r+   	test_gzip  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   rB   rh   r  ZGZIPr   r   r   )r"   r  r  r   r   r   r  rF   re   r   rH   )r)   r  r  r  rK   r*   r*   r+   test_gzip_case_insensitive  s    z#GzipTest.test_gzip_case_insensitiveN)r6   r7   r8   r7  r  r  r*   r*   r*   r+   r    s   r  c                   @   s   e Zd Zdd ZdS )GzipUnsupportedTestc              	   C   s6   t td | d}W 5 Q R X | t|ji  d S )NzUnsupported Content-Encodingr   )r   r   r  re   r   rH   rf   r*   r*   r+   test_gzip_unsupported$  s    z)GzipUnsupportedTest.test_gzip_unsupportedN)r6   r7   r8   r  r*   r*   r*   r+   r  #  s   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   s   t  S r%   r   r3   r*   r*   r+   get_http_client2  s    z&StreamingChunkSizeTest.get_http_clientc                 C   s   t | jddS )NT)
chunk_sizer  )r]   
CHUNK_SIZEr3   r*   r*   r+   r7  7  s    z-StreamingChunkSizeTest.get_httpserver_optionsc                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
z&StreamingChunkSizeTest.MessageDelegatec                 C   s
   || _ d S r%   
connectionr)   r  r*   r*   r+   __init__;  s    z/StreamingChunkSizeTest.MessageDelegate.__init__c                 C   s
   g | _ d S r%   )chunk_lengthsr(   r*   r*   r+   r,   >  s    z7StreamingChunkSizeTest.MessageDelegate.headers_receivedc                 C   s   | j t| d S r%   )r  r-   rV   r.   r*   r*   r+   r1   A  s    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   rV   r   r5   )r)   Zresponse_bodyr*   r*   r+   r5   D  s    
z-StreamingChunkSizeTest.MessageDelegate.finishN)r6   r7   r8   r  r,   r1   r5   r*   r*   r*   r+   MessageDelegate:  s   r  c                 C   s   G dd dt }| S )Nc                   @   s   e Zd Zdd ZdS )z+StreamingChunkSizeTest.get_app.<locals>.Appc                 S   s
   t |S r%   )r  r  r)   Zserver_connZrequest_connr*   r*   r+   start_requestO  s    z9StreamingChunkSizeTest.get_app.<locals>.App.start_requestNr6   r7   r8   r  r*   r*   r*   r+   AppN  s   r  r   r)   r  r*   r*   r+   rE   M  s    zStreamingChunkSizeTest.get_appc                 K   sx   | j dddi|}|  t|j}| t| jt| |D ]2}| || j	dt
|  | |ddt
|  q@|S )NrB   rk   rh   zoversized chunk: r   zempty chunk: )rB   )rF   rG   r   rH   re   rV   BODYsumZassertLessEqualr  r   assertGreater)r)   rJ   rK   r0   r  r*   r*   r+   fetch_chunk_sizesT  s    
  
z(StreamingChunkSizeTest.fetch_chunk_sizesc                 C   sJ   t  }tjd|d}|| |  | }t|t|krFtd|S )Nr  r  z#body did not shrink when compressed)r"   r  r  r   r   r  rV   rT   )r)   rH   r  Zgzfile
compressedr*   r*   r+   compress`  s    
zStreamingChunkSizeTest.compressc                 C   s&   | j | jd}| ddddg| d S )N)rH   r     )r  r  re   )r)   r0   r*   r*   r+   test_regular_bodyj  s    z(StreamingChunkSizeTest.test_regular_bodyc                 C   s   | j | | jddid d S )Nr  r  )rH   r&   )r  r  r  r3   r*   r*   r+   test_compressed_bodyo  s    
 z+StreamingChunkSizeTest.test_compressed_bodyc                    s0    fdd} j |d} ddddg| d S )Nc                    s(   |  j d d  |  j dd   d S N   )r  r   r3   r*   r+   body_producerw  s    z?StreamingChunkSizeTest.test_chunked_body.<locals>.body_producer)r  r        )r  re   )r)   r  r0   r*   r3   r+   test_chunked_bodyv  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  rV   r  )r)   r  r*   r  r+   test_chunked_compressed  s     z.StreamingChunkSizeTest.test_chunked_compressedN)r6   r7   r8   r  r  r  r7  r   r  rE   r  r  r  r  r  r  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S )InvalidOutputContentLengthTestc                   @   s   e Zd Zdd Zdd ZdS )z.InvalidOutputContentLengthTest.MessageDelegatec                 C   s
   || _ d S r%   r  r  r*   r*   r+   r    s    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   r)  r*  )normalr'  r(  
underscorer  r   r  r   x-test
   1234567890)r  r  r   r   r   r5   )r)   r'   r&   Zcontent_lengthsr*   r*   r+   r,     s    
z?InvalidOutputContentLengthTest.MessageDelegate.headers_receivedN)r6   r7   r8   r  r,   r*   r*   r*   r+   r    s   r  c                 C   s   G dd dt }| S )Nc                   @   s   e Zd Zdd ZdS )z3InvalidOutputContentLengthTest.get_app.<locals>.Appc                 S   s
   t |S r%   )r  r  r  r*   r*   r+   r    s    zAInvalidOutputContentLengthTest.get_app.<locals>.App.start_requestNr  r*   r*   r*   r+   r    s   r  r  r  r*   r*   r+   rE     s    z&InvalidOutputContentLengthTest.get_appc                 C   s   |  d0 | jddddid}|  | |jd W 5 Q R X dD ]Z}|  |F ttd0 | t | jddd|id W 5 Q R X W 5 Q R X W 5 Q R X qDd S )	Nr  rB   GETr  )rk   r&   r  )r'  r(  r  rm   )	r  rF   rG   re   rH   r   r   rv   r   )r)   rK   testr*   r*   r+   "test_invalid_output_content_length  s    zAInvalidOutputContentLengthTest.test_invalid_output_content_lengthN)r6   r7   r8   r   r  rE   r  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	S )
MaxHeaderSizeTestc                 C   s   t dtfgS rA   r   rM   r3   r*   r*   r+   rE     s    zMaxHeaderSizeTest.get_appc                 C   s
   t ddS )Nr^  )Zmax_header_sizer6  r3   r*   r*   r+   r7    s    z(MaxHeaderSizeTest.get_httpserver_optionsc                 C   s,   | j dddid}|  | |jd d S )NrB   X-FillerZdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar   rc   )rF   rG   re   rH   rf   r*   r*   r+   test_small_headers  s    z$MaxHeaderSizeTest.test_small_headersc                 C   s~   t tdddf z"| jdddidd | d	 W n< tk
rn } z|jd k	r^| |jjd
 W 5 d }~X Y nX W 5 Q R X d S )NzUnsatisfiable readFrn   rB   r  A  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaT)r&   ru   z did not raise expected exception)i  iW  )r   r   rF   Zfailr   rK   ZassertInr   )r)   er*   r*   r+   test_large_headers  s    
z$MaxHeaderSizeTest.test_large_headersN)r6   r7   r8   rE   r7  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   s   t dtfgS rA   r  r3   r*   r*   r+   rE     s    zIdleTimeoutTest.get_appc                 C   s
   t ddS )Ng?)Zidle_connection_timeoutr6  r3   r*   r*   r+   r7    s    z&IdleTimeoutTest.get_httpserver_optionsc                    s   t    g | _d S r%   )r  r  streamsr3   r	  r*   r+   r    s    
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   s:   t t }|d|  fV  | j| t|d S r   )r   r   r   r   r  r-   r   rp  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   sf   |   V }t }||j tdD ]2}|d |dV  |dV }| |d q$|	 V  d S )Nr  rs  r      rc   )
r   r   r  r  rc  r   r   r   re   r  )r)   r>   r  ra  r   r*   r*   r+   test_idle_after_use  s    

z#IdleTimeoutTest.test_idle_after_use)r6   r7   r8   rE   r7  r  r
  r   rg  r   r   r  r  r0  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                   @   s   e Zd Zdd ZdS )z/BodyLimitsTest.get_app.<locals>.BufferedHandlerc                 S   s   |  tt| jj d S r%   )r   r   rV   rS   rH   r3   r*   r*   r+   put   s    z3BodyLimitsTest.get_app.<locals>.BufferedHandler.putN)r6   r7   r8   r  r*   r*   r*   r+   BufferedHandler  s   r  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
z0BodyLimitsTest.get_app.<locals>.StreamingHandlerc                 S   s
   d| _ d S )Nr   )
bytes_readr3   r*   r*   r+   rQ     s    z;BodyLimitsTest.get_app.<locals>.StreamingHandler.initializec                 S   sT   t t| jj}d| jjkr0|t| d d| jjkrP|	t
| d d S )NZexpected_sizebody_timeout)r|   castr
   rS   r  r   Zset_max_body_sizer   r   Zset_body_timeoutfloat)r)   r4   r*   r*   r+   r     s
    z8BodyLimitsTest.get_app.<locals>.StreamingHandler.preparec                 S   s   |  j t|7  _ d S r%   )r  rV   rw  r*   r*   r+   r1     s    z>BodyLimitsTest.get_app.<locals>.StreamingHandler.data_receivedc                 S   s   |  t| j d S r%   )r   r   r  r3   r*   r*   r+   r    s    z4BodyLimitsTest.get_app.<locals>.StreamingHandler.putN)r6   r7   r8   rQ   r   r1   r  r*   r*   r*   r+   StreamingHandler  s   r  	/buffered
/streaming)r   r    r   )r)   r  r  r*   r*   r+   rE     s    zBodyLimitsTest.get_appc                 C   s   t dddS )Nrr   i   )r  Zmax_body_sizer6  r3   r*   r*   r+   r7    s    z%BodyLimitsTest.get_httpserver_optionsc                 C   s   t  S r%   r   r3   r*   r*   r+   r    s    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   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarj   s   4096r  rd   rf   r*   r*   r+   test_small_body!  s    zBodyLimitsTest.test_small_bodyc              	   C   sB   t tdtjd | jdddd d}W 5 Q R X | |jd d S )	N.*Content-Length too longr  r  r     a (  rj   r   r   r   r  r  rF   re   r   rf   r*   r*   r+   test_large_body_buffered'  s    z'BodyLimitsTest.test_large_body_bufferedntzflaky on windowsc              	   C   sB   t tdtjd | jdddd d}W 5 Q R X | |jd d S )	N.*chunked body too larger  r  r  c                 S   s   | dd S Nr  r  r*   r  r*   r*   r+   r   3  r;   zABodyLimitsTest.test_large_body_buffered_chunked.<locals>.<lambda>rk   r  r   r  rf   r*   r*   r+    test_large_body_buffered_chunked,  s    z/BodyLimitsTest.test_large_body_buffered_chunkedc              	   C   sB   t tdtjd | jdddd d}W 5 Q R X | |jd d S )	Nr  r  r  r  r  r  rj   r   r  rf   r*   r*   r+   test_large_body_streaming7  s    z(BodyLimitsTest.test_large_body_streamingc              	   C   sB   t tdtjd | jdddd d}W 5 Q R X | |jd d S )	Nr  r  r  r  c                 S   s   | dd S r  r*   r  r*   r*   r+   r   B  r;   zBBodyLimitsTest.test_large_body_streaming_chunked.<locals>.<lambda>r  r   r  rf   r*   r*   r+   !test_large_body_streaming_chunked<  s    z0BodyLimitsTest.test_large_body_streaming_chunkedc                 C   s&   | j dddd d}| |jd d S )N/streaming?expected_size=10240r  r  r  rj      10240rd   rf   r*   r*   r+   "test_large_body_streaming_overrideF  s      z1BodyLimitsTest.test_large_body_streaming_overridec                 C   s&   | j dddd d}| |jd d S )Nr  r  c                 S   s   | dd S r  r*   r  r*   r*   r+   r   P  r;   zKBodyLimitsTest.test_large_body_streaming_chunked_override.<locals>.<lambda>r  r  rd   rf   r*   r*   r+   *test_large_body_streaming_chunked_overrideL  s    z9BodyLimitsTest.test_large_body_streaming_chunked_overridec              	   c   sp   t t }zT|d|  fV  |d ttdtj	d |
 V }W 5 Q R X | |d W 5 |  X d S )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  r  r.  re   )r)   r>   rK   r*   r*   r+   test_timeoutT  s    zBodyLimitsTest.test_timeoutc              	   c   s   t t }z|d|  fV  |d |dd  t|V \}}}| |d |d tt	dt
jd | V }W 5 Q R X | |d	 W 5 |  X d S )
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  rV  )r   r   r   r   r   r   r?   re   r   r   r  r  r.  )r)   r>   r'   r&   rK   r   r*   r*   r+   test_body_size_override_resete  s     z,BodyLimitsTest.test_body_size_override_resetN)r6   r7   r8   rE   r7  r  r  r  unittestskipIfr   r   r  r  r  r  r  r   r  r  r*   r*   r*   r+   r    s    


	
r  c                   @   s   e Zd Zdd Zdd ZdS )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  rc   z'HTTP/1.1 200 OK
Content-Length: %d

)r   r   http1r  r  r   r   r5   r   r   rV   )rS   messager3   r*   r+   handle_request  s    
 
z3LegacyInterfaceTest.get_app.<locals>.handle_requestr*   )r)   r  r*   r3   r+   rE     s    zLegacyInterfaceTest.get_appc                 C   s,   |  d}| js| d | |jd d S )NrB   r=  rc   )rF   r  r>  re   rH   rf   r*   r*   r+   test_legacy_interface  s    

z)LegacyInterfaceTest.test_legacy_interfaceN)r6   r7   r8   rE   r  r*   r*   r*   r+   r  ~  s   r  )hZ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   rS  r   r   sysrN  r,  r  urllib.parser  ior"   r|   TYPE_CHECKINGr#   r$   r?   r@   rM   r  r   ZskipIfOldSSLrZ   objectr^   r~   r   r   r   ZTestCaser   r   r   r   r   r   r   r   r  r1  rE  rH  ro  platformrL  rY  r  r  r  r  r  r  r  r  r  r*   r*   r*   r+   <module>   s    0	)])A _1 U
_(/ 