o
    h                     @   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*   P/var/www/vscode/kcb/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<   delegater*   r;   r+   read_stream_body7   s   
rB   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:   rG   rH   rO   r*   r*   r*   r+   rC   M   s    rC   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)requestrT   rS   	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   lenrX   rK   r4   r*   r*   r+   postb      zHelloWorldRequestHandler.postN)rQ   )r8   r9   r:   rU   rZ   r\   r*   r*   r*   r+   rP   Y   s    
rP   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 )NrE   httpsrT   )r   rP   dictr4   r*   r*   r+   rH   r      zBaseSSLTest.get_appN)r8   r9   r:   rH   r*   r*   r*   r+   ra   q       ra   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*   )rd   get_ssl_versionr   default_ssl_optionsr4   r*   r*   r+   get_ssl_optionsw   s
   zSSLTestMixin.get_ssl_optionsc                 C   s   t  r%   )NotImplementedErrorr4   r*   r*   r+   ri   }      zSSLTestMixin.get_ssl_versionr)   c                 C   s   |  d}| |jd d S )NrE      Hello worldrI   assertEqualrK   r)   rN   r*   r*   r+   test_ssl   s   
zSSLTestMixin.test_sslc                 C   &   | j dddd d}| |jd d S )NrE   POSTAi  methodrK   s   Got 5000 bytes in POSTro   rq   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requiredrE   https:http:  T)request_timeoutconnect_timeoutraise_error)r   r   assertRaisesIOErrorr   rI   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 ErrorrE   r|   r}   T)r   )
r   r   r   r   r   rI   r   r   assertFalselogged_stack)r)   
expect_logr*   r*   r+   test_error_logging   s   zSSLTestMixin.test_error_loggingN)r8   r9   r:   rk   ri   typingAnyrr   rx   r   r   r*   r*   r*   r+   rg   v   s    rg   c                   @   r`   )
SSLv23Testc                 C      t jS r%   )sslPROTOCOL_SSLv23r4   r*   r*   r+   ri      rm   zSSLv23Test.get_ssl_versionNr8   r9   r:   ri   r*   r*   r*   r+   r      rf   r   c                   @   r`   )	SSLv3Testc                 C   r   r%   )r   PROTOCOL_SSLv3r4   r*   r*   r+   ri      rm   zSSLv3Test.get_ssl_versionNr   r*   r*   r*   r+   r          r   c                   @   r`   )	TLSv1Testc                 C   r   r%   )r   PROTOCOL_TLSv1r4   r*   r*   r+   ri      rm   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   rk   
isinstancer   
SSLContext)r)   contextr*   r*   r+   rk      s
   
zSSLContextTest.get_ssl_optionsN)r8   r9   r:   rk   r*   r*   r*   r+   r      rf   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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   
module_direxisting_certificate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   rK   )headerr   filenamefilebody)r6   rX   r&   get_argumentr   r   r   r4   r*   r*   r+   r\      s   
zMultipartTestHandler.postNr8   r9   r:   r\   r*   r*   r*   r+   r      rf   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   rP   r4   r*   r*   r+   get_handlers   s   zHTTPConnectionTest.get_handlersc                 C   s   t |  S r%   )r   r   r4   r*   r*   r+   rH      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%   )rB   r*   )r@   r*   r+   r     s    )	r!   r   socketio_looprun_syncwriter?   r   r[   )r)   r&   rK   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   rp   r)   rN   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   rn   )r   rp   )r)   r   rN   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intrp   close)r)   r@   r   
first_lineheader_datar&   rK   r*   r*   r+   test_100_continue5  s$   
z$HTTPConnectionTest.test_100_continueN)r   )
r8   r9   r:   r   rH   r   r   r   r   r   r*   r*   r*   r+   r      s    
r   c                   @   r   )EchoHandlerc                 C      |  t| jj d S r%   r   r   rX   	argumentsr4   r*   r*   r+   rZ   T  re   zEchoHandler.getc                 C   r   r%   r   r4   r*   r*   r+   r\   W  re   zEchoHandler.postNr8   r9   r:   rZ   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 )Nrw   uriversion	remote_iprT   hostr   query
header_keyr   header_value
cookie_keycookie_valuearg_key	arg_value)errorsstr
check_typegetattrrX   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 )NrK   )r   rX   rK   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+   rZ   {     zTypeCheckHandler.getc                 C   s*   t |}||krd||f | j|< d S d S )Nzexpected %s, got %s)typer   )r)   nameobjr   actual_typer*   r*   r+   r   ~  s   zTypeCheckHandler.check_typeN)r8   r9   r:   r   r\   rZ   r   r*   r*   r*   r+   r   [  s
    r   c                   @   r`   )PostEchoHandlerc                 G   s   |  t| dd d S )Nr   )echo)r   rd   r   )r)   	path_argsr*   r*   r+   r\     r]   zPostEchoHandler.postNr   r*   r*   r*   r+   r    rf   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   rY   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+   rH     s   zHTTPServerTest.get_appc                 C   s*   |  d}t|j}| |ddgi d S )Nz/echo?foo=%C3%A9foor   rI   r   rK   rp   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  rt   z	foo=&bar=rv   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  rt   rw   rK   r&   r  )r)   r&   rN   r   r*   r*   r+   
test_types  s   

zHTTPServerTest.test_typesc                 C   s.   |  d}| d|j | t|ji  d S )Nr     )rI   rp   coder   rK   rq   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_rt   s   data=)rw   r&   rK   r  )	subTestr   urllibr   r   rI   rp   r   rK   )r)   r&   uni_textr  r   bin_textrN   r*   r*   r+   test_post_encodings  s&   
z"HTTPServerTest.test_post_encodingsN)
r8   r9   r:   rH   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+   rH     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   rF   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%   rB   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   rp   r   r  reasonr)   r'   r&   rN   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 )Nr7  r8  r:  皙?r/  r   r   r?  r@  r@   r   r   r1  r2  r3  r4  r5  r4   r*   r*   r+   test_malformed_first_line_log  s
   
"z/HTTPServerRawTest.test_malformed_first_line_logc                 C   rD  )Nz1.*Malformed HTTP message.*no colon in header liner8  s   GET / HTTP/1.0
asdf

rE  r/  rF  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   rp   r   rB  r*   r4   r+   test_chunked_request_body     

z+HTTPServerRawTest.test_chunked_request_bodyc                    rI  )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  rJ  rB  r*   r4   r+   test_chunked_request_uppercase  rL  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 sizer8  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   rp   r  rB  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,chunkedr8  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   rp   r  rB  r*   r4   r+   *test_chunked_request_body_duplicate_headerH  s   
z<HTTPServerRawTest.test_chunked_request_body_duplicate_headerc                    rO  )Ns>   POST /echo HTTP/1.1
Transfer-Encoding: gzip, chunked

2
ok
0

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

2
ok
0

z8.*Message with both Transfer-Encoding and Content-Lengthr8  c                      r;  r%   r<  r*   r4   r*   r+   r     r=  zbHTTPServerRawTest.test_chunked_request_body_transfer_encoding_and_content_length.<locals>.<lambda>r
  rP  rB  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 allowedr8  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)   
test_casesr  r   r@   r*   r*   r+   test_invalid_content_length  s8     z-HTTPServerRawTest.test_invalid_content_length)r8   r9   r:   rH   r+  r-  r6  rC  rG  rH  rK  rM  rN  rQ  rR  rS  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                   @   r`   )zXHeaderTest.Handlerc                 C   s.   |  d| jj | t| jj| jjd d S )Nrequest-version)r   remote_protocol)
set_headerrX   r   r   rd   r   rT   r4   r*   r*   r+   rZ     s   zXHeaderTest.Handler.getNr8   r9   r:   rZ   r*   r*   r*   r+   rG     rf   rG   c                 C   s   t ddgdS )NTz5.5.5.5)xheaderstrusted_downstreamrd   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 )NrE   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rp   rO   )r)   
valid_ipv4valid_ipv4_list
valid_ipv6valid_ipv6_listinvalid_charsinvalid_chars_list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 )
Nri  z127.0.0.1, 4.4.4.4, 5.5.5.5rE   r  r`  zHTTP/2requires HTTP/1.xr   rh  )rI   r&   r   skipTestr   rK   rp   )r)   rl  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 )NrE   ra  rQ   X-Schemerb   r  zX-Forwarded-Protozhttps , httpz
http,httpsunknownrj  )r)   https_schemehttps_forwardedhttps_multi_forwardedhttp_multi_forwardedbad_forwardedr*   r*   r+   test_scheme_headers  s.   zXHeaderTest.test_scheme_headersN)	r8   r9   r:   r   rG   rg  rr  rw  r  r*   r*   r*   r+   r_    s    
(
r_  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 rD   )r   r_  rG   r4   r*   r*   r+   rH     r   zSSLXHeaderTest.get_appc                    s   t   }d|d< |S )NTrd  )r*  rg  )r)   outputr,  r*   r+   rg    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 )NrE   ra  rb   rx  rQ   r  ry  rj  )r)   http_scheme
bad_schemer*   r*   r+   test_request_without_xprotocol  s   z-SSLXHeaderTest.test_request_without_xprotocol)r8   r9   r:   rH   rg  r  r^  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 )Nrc   )r   rd   rX   rT   r4   r*   r*   r+   rZ   (  s   zManualProtocolTest.Handler.getNrc  r*   r*   r*   r+   rG   '  rf   rG   c                 C   
   t ddS )Nrb   rc   rf  r4   r*   r*   r+   rg  +  rV   z)ManualProtocolTest.get_httpserver_optionsc                 C   s   |  | dd d d S )NrE   rT   rb   rj  r4   r*   r*   r+   test_manual_protocol.  r]   z'ManualProtocolTest.test_manual_protocolN)r8   r9   r:   r   rG   rg  r  r*   r*   r*   r+   r  &  s    r  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?   r  r   bind_unix_socketr   rP   r   server
add_socketr   r   r  r@   r   r   )r)   sock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   r  close_all_connectionsr4  shutilrmtreer  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   rn   )	r@   r   r   rp   r   r   r   r   r   )r)   rN   r   r&   rK   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 fromr8  s   garbage

   HTTP/1.1 400 Bad Request

)r   r   r?  r@  r@   r   r[  rp   rq   r*   r*   r+   test_unix_socket_bad_request]  s   z+UnixSocketTest.test_unix_socket_bad_request)
r8   r9   r:   __doc__r+  r-  r   r  r  r^  r*   r*   r,  r+   r  2  s    

	r  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 NrW   r6   r4   r*   r*   r+   rZ   p  r2   z/KeepAliveTest.get_app.<locals>.HelloHandler.getc                 S   r  r  r  r4   r*   r*   r+   r\   s  r2   z0KeepAliveTest.get_app.<locals>.HelloHandler.postNr   r*   r*   r*   r+   HelloHandlero  r   r  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+   rZ   w  s   "z/KeepAliveTest.get_app.<locals>.LargeHandler.getNrc  r*   r*   r*   r+   LargeHandlerv  rf   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 r  )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   rR   r%   cleanup_event)r)   r  r*   r*   r+   rU     rV   z>KeepAliveTest.get_app.<locals>.FinishOnCloseHandler.initializec                 s   s    |    | j V  d S r%   )r  r  r5  r4   r*   r*   r+   rZ     s   z7KeepAliveTest.get_app.<locals>.FinishOnCloseHandler.getc                 S   r  )Nclosedr  r4   r*   r*   r+   on_connection_close  s   zGKeepAliveTest.get_app.<locals>.FinishOnCloseHandler.on_connection_closeN)r8   r9   r:   rU   r   r  rZ   r  r*   r*   r*   r+   FinishOnCloseHandler  s
    
r  rE   z/largez/chunkedz/finish_on_closer  )r   r   r  r   rd   )r)   r  r  r  r  r*   r*   r+   rH   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   r1  r2  r3  r4  r5  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   rn   )r  r&   r@   r   r   rp   )r)   rK   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>   r[  r   rp   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>   r[  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>   rp   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:   r  rH   r+  r-  r   r  r   r  r>   r   r   r  r  r  r  r  r  r  r  r  r  r  r^  r*   r*   r,  r+   r  g  sD    1














r  c                   @   $   e Zd Zdd Zdd Zdd ZdS )GzipBaseTestc                 C   r(  rD   r)  r4   r*   r*   r+   rH   <  r2   zGzipBaseTest.get_appc                 C   sH   t  }tjd|d}|t| |  | }| jdd|ddidS )NwmodefileobjrE   rt   Content-Encodinggzipr  )r"   r  GzipFiler   r   r   getvaluerI   )r)   rK   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 )NrE   rt   r  rv   r  r  )rI   rp   r   rK   rq   r*   r*   r+   test_uncompressedL  s   zGzipBaseTest.test_uncompressedN)r8   r9   r:   rH   r  r  r*   r*   r*   r+   r  ;  s    r  c                   @   r  )GzipTestc                 C   r  )NT)decompress_requestrf  r4   r*   r*   r+   rg  R  rV   zGzipTest.get_httpserver_optionsc                 C   s&   |  d}| t|jddgi d S )Nr  r  r  )r  rp   r   rK   rq   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  rE   rt   r  GZIPr  r  r  )r"   r  r  r   r   r   r  rI   rp   r   rK   )r)   r  r  r  rN   r*   r*   r+   test_gzip_case_insensitiveY  s   z#GzipTest.test_gzip_case_insensitiveN)r8   r9   r:   rg  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  rp   r   rK   rq   r*   r*   r+   test_gzip_unsupportedj  s   z)GzipUnsupportedTest.test_gzip_unsupportedN)r8   r9   r:   r  r*   r*   r*   r+   r  i  rf   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  )rd   
CHUNK_SIZEr4   r*   r*   r+   rg  }  r2   z-StreamingChunkSizeTest.get_httpserver_optionsc                   @   r   )
z&StreamingChunkSizeTest.MessageDelegatec                 C   rR   r%   
connectionr)   r  r*   r*   r+   __init__  rV   z/StreamingChunkSizeTest.MessageDelegate.__init__c                 C   s
   g | _ d S r%   )chunk_lengthsr(   r*   r*   r+   r,     rV   z7StreamingChunkSizeTest.MessageDelegate.headers_receivedc                 C   s   | j t| d S r%   )r  r-   r[   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   r[   r   r6   )r)   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)   server_connrequest_connr*   r*   r+   start_request  rV   z9StreamingChunkSizeTest.get_app.<locals>.App.start_requestNr8   r9   r:   r  r*   r*   r*   r+   App  rf   r  r   r)   r  r*   r*   r+   rH        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 )NrE   rw   rt   zoversized chunk: r   zempty chunk: )rE   )rI   rJ   r   rK   rp   r[   BODYsumassertLessEqualr  r   assertGreater)r)   rM   rN   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  r[   rY   )r)   rK   r  gzfile
compressedr*   r*   r+   compress  s   
zStreamingChunkSizeTest.compressc                 C   s"   | j | jd}| g d| d S )N)rK   )r  r  r     )r  r  rp   )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  )rK   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  rp   )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  r[   r  )r)   r  r*   r  r+   test_chunked_compressed  s   
z.StreamingChunkSizeTest.test_chunked_compressedN)r8   r9   r:   r  r  r  rg  r   r  rH   r  r	  r  r  r  r  r*   r*   r*   r+   r  s  s    
	r  c                   @   r  )InvalidOutputContentLengthTestc                   @   r   )z.InvalidOutputContentLengthTest.MessageDelegatec                 C   rR   r%   r  r  r*   r*   r+   r    rV   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  rV  rW  )normalrT  rU  
underscorer>  r  r  r   x-test
   1234567890)r  r  r   r   r   r6   )r)   r'   r&   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    rV   zAInvalidOutputContentLengthTest.get_app.<locals>.App.start_requestNr  r*   r*   r*   r+   r    rf   r  r  r   r*   r*   r+   rH     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  rE   GETr  )rw   r&   r  )rT  rU  r  ry   )	r"  rI   rJ   rp   rK   r   r   r   r   )r)   rN   testr*   r*   r+   "test_invalid_output_content_length  s"   zAInvalidOutputContentLengthTest.test_invalid_output_content_lengthN)r8   r9   r:   r   r  rH   r  r*   r*   r*   r+   r    s    r  c                   @   r   )
MaxHeaderSizeTestc                 C   r(  rD   r   rP   r4   r*   r*   r+   rH     r2   zMaxHeaderSizeTest.get_appc                 C   r  )Nr  )max_header_sizerf  r4   r*   r*   r+   rg    rV   z(MaxHeaderSizeTest.get_httpserver_optionsc                 C   s,   | j dddid}|  | |jd d S )NrE   X-Fillerdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar  rn   )rI   rJ   rp   rK   rq   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 readFrz   rE   r#    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaT)r&   r   z did not raise expected exception)i  iW  )r   r   rI   failr   rN   assertInr  )r)   er*   r*   r+   test_large_headers  s   
" z$MaxHeaderSizeTest.test_large_headersN)r8   r9   r:   rH   rg  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(  rD   r!  r4   r*   r*   r+   rH     r2   zIdleTimeoutTest.get_appc                 C   r  )Ng?)idle_connection_timeoutrf  r4   r*   r*   r+   rg    rV   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  r5  )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      rn   )
r   r   r.  r  r  r   r   r   rp   r5  )r)   r@   r/  r  r   r*   r*   r+   test_idle_after_use2  s   

z#IdleTimeoutTest.test_idle_after_use)r8   r9   r:   rH   rg  r+  r-  r   r  r   r   r0  r2  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	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   r[   rX   rK   r4   r*   r*   r+   putF  r]   z3BodyLimitsTest.get_app.<locals>.BufferedHandler.putN)r8   r9   r:   r4  r*   r*   r*   r+   BufferedHandlerE  rf   r5  c                   @   r   )
z0BodyLimitsTest.get_app.<locals>.StreamingHandlerc                 S   s
   d| _ d S )Nr   )
bytes_readr4   r*   r*   r+   rU   K  rV   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 )Nexpected_sizebody_timeout)r   castr
   rX   r  r   set_max_body_sizer   r   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%   )r6  r[   r  r*   r*   r+   r1   U  re   z>BodyLimitsTest.get_app.<locals>.StreamingHandler.data_receivedc                 S   s   |  t| j d S r%   )r   r   r6  r4   r*   r*   r+   r4  X  r  z4BodyLimitsTest.get_app.<locals>.StreamingHandler.putN)r8   r9   r:   rU   r   r1   r4  r*   r*   r*   r+   StreamingHandlerI  s
    r=  	/buffered
/streaming)r   r    r   )r)   r5  r=  r*   r*   r+   rH   D  s   zBodyLimitsTest.get_appc                 C   s   t dddS )Nr~   i   )r8  max_body_sizerf  r4   r*   r*   r+   rg  _  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   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarv   s   4096r?  ro   rq   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 longr8  r>  rA     a (  rv   r
  r   r   r?  r@  rI   rp   r  rq   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 larger8  r>  rA  c                 S      | dd S NrE  rF  r*   r  r*   r*   r+   r   y      zABodyLimitsTest.test_large_body_buffered_chunked.<locals>.<lambda>rw   r  r
  rG  rq   r*   r*   r+    test_large_body_buffered_chunkedr  s   z/BodyLimitsTest.test_large_body_buffered_chunkedc                 C   rC  )	NrD  r8  r?  rA  rE  rF  rv   r
  rG  rq   r*   r*   r+   test_large_body_streaming}  rI  z(BodyLimitsTest.test_large_body_streamingc                 C   rK  )	NrL  r8  r?  rA  c                 S   rM  rN  r*   r  r*   r*   r+   r     rO  zBBodyLimitsTest.test_large_body_streaming_chunked.<locals>.<lambda>rP  r
  rG  rq   r*   r*   r+   !test_large_body_streaming_chunked  s   z0BodyLimitsTest.test_large_body_streaming_chunkedc                 C   rs   )N/streaming?expected_size=10240rA  rE  rF  rv      10240ro   rq   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 )NrT  rA  c                 S   rM  rN  r*   r  r*   r*   r+   r     rO  zKBodyLimitsTest.test_large_body_streaming_chunked_override.<locals>.<lambda>rP  rU  ro   rq   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 bodyr8  r=   )r   r   r   r   r   r   r   r?  r@  r[  rp   r   )r)   r@   rN   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

rE  rF  rU  s2   PUT /streaming HTTP/1.1
Content-Length: 10240

rD  r8  r  )r   r   r   r   r   rB   rp   r   r   r?  r@  r[  r   )r)   r@   r'   r&   rN   r   r*   r*   r+   test_body_size_override_reset  s$   z,BodyLimitsTest.test_body_size_override_resetN)r8   r9   r:   rH   rg  r  rB  rH  unittestskipIfr   r  rQ  rR  rS  rV  rW  r   rX  rY  r*   r*   r*   r+   r3  C  s"    


	
r3  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  rn   z'HTTP/1.1 200 OK
Content-Length: %d

)r   r   http1r  r  r   r   r6   r   r   r[   )rX   messager4   r*   r+   handle_request  s   
z3LegacyInterfaceTest.get_app.<locals>.handle_requestr*   )r)   r_  r*   r4   r+   rH     s   zLegacyInterfaceTest.get_appc                 C   s,   |  d}| js| d | |jd d S )NrE   rs  rn   )rI   r]  rt  rp   rK   rq   r*   r*   r+   test_legacy_interface  s   

z)LegacyInterfaceTest.test_legacy_interfaceN)r8   r9   r:   rH   r`  r*   r*   r*   r+   r\    s    r\  )htornador   r   tornado.escaper   r   r   r   r   r	   tornado.http1connectionr
   tornado.httpclientr   tornado.httpserverr   tornado.httputilr   r   r   r   tornado.iostreamr   tornado.locksr   tornado.logr   r   tornado.netutilr   tornado.simple_httpclientr   tornado.testingr   r   r   r   r   tornado.test.utilr   tornado.webr   r   r    
contextlibr!   r2  r  r?  r   r  r   r   sysr  rY  rZ  urllib.parser#  ior"   r   TYPE_CHECKINGr#   r$   rB   rC   rP   r[  r   skipIfOldSSLra   objectrg   r   r   r   r   TestCaser   r   r   r   r   r  r  r  r'  r_  r  r  r  platformr  r  r  r  r  r  r  r   r+  r3  r\  r*   r*   r*   r+   <module>   s     0	)])A __1 U
_(/ 