o
    Ehp                     @   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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+m,Z, d dl-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l8Z9d dl:Z: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(ZCG dd de ZDG dd de7jEZFG dd de(ZGG dd deZHG d d! d!e(ZIG d"d# d#e(ZJG d$d% d%e(ZKG d&d' d'eKZLG d(d) d)eZMG d*d+ d+eZNG d,d- d-eBZOG d.d/ d/e eBZPG d0d1 d1eBZQe%G d2d3 d3e!ZRe7SeTe2d4 pTe4jUd5kd6G d7d8 d8eRZVe7SeTe2d4ole4jUWd9 d:G d;d< d<eRZXG d=d> d>eZYG d?d@ d@eZZG dAdB dBeZeZ[G dCdD dDeZeZ\G dEdF dFeZ]G dGdH dHeZ^G dIdJ dJeZ_G dKdL dLeZ`G dMdN dNeZaG dOdP dPeZbdS )Q    )gennetutil)json_decodejson_encodeutf8_unicoderecursive_unicode
native_str)HTTP1Connection)	HTTPError)
HTTPServer)HTTPHeadersHTTPMessageDelegateHTTPServerConnectionDelegateResponseStartLine)IOStream)Event)gen_logapp_logSimpleAsyncHTTPClient)AsyncHTTPTestCaseAsyncHTTPSTestCaseAsyncTestCase	ExpectLoggen_test)abstract_base_test)ApplicationRequestHandlerstream_request_body)closingcontextmanagerN)BytesIO)DictListc                    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*   ]/var/www/html/Persson_Maskin/env/lib/python3.10/site-packages/tornado/test/httpserver_test.pyheaders_received=   s   
z3read_stream_body.<locals>.Delegate.headers_receivedc                    s     | d S r%   )appendr)   chunk)chunksr*   r+   data_receivedA      z0read_stream_body.<locals>.Delegate.data_receivedc                    s       d S r%   )detachr)   )connr*   r+   finishD      z)read_stream_body.<locals>.Delegate.finishN)__name__
__module____qualname__r,   r1   r6   r*   r0   r5   r*   r+   Delegate<   s    r<   TN    )r   r
   read_responser'   r&   join)streamr<   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   c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )SSLTestc                 C   s   t dttddfgS )NrE   httpsrT   )r   rP   dictr4   r*   r*   r+   rH   g      zSSLTest.get_appc                 C   s   t ddtjit S )Nssl_versionr*   )ra   sslPROTOCOL_TLS_SERVERr   default_ssl_optionsr4   r*   r*   r+   get_ssl_optionsj   s
   zSSLTest.get_ssl_optionsc                 C   s   |  d}| |jd d S )NrE      Hello worldrI   assertEqualrK   r)   rN   r*   r*   r+   test_sslp   s   
zSSLTest.test_sslc                 C   &   | j dddd d}| |jd d S )NrE   POSTAi  methodrK   s   Got 5000 bytes in POSTri   rk   r*   r*   r+   test_large_postt   s   zSSLTest.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_requestx   s   "zSSLTest.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   rv   rw   T)r{   )
r   r   r|   r}   r   rI   r~   r   assertFalselogged_stack)r)   
expect_logr*   r*   r+   test_error_logging   s   zSSLTest.test_error_loggingN)	r8   r9   r:   rH   rg   rl   rr   r   r   r*   r*   r*   r+   r^   f   s    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                   @      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   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          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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=      ás   --1234567890u;   Content-Disposition: form-data; name="files"; filename="ó"   ús   --1234567890--   ér   r      ór   r   )r   r?   encoder   rj   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   rh   )r   rj   )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   Host: 127.0.0.1s   Content-Length: 1024s   Expect: 100-continues   Connection: closer      

s   HTTP/1.1 100 s   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa   HTTP/1.1 200latin1Content-Lengths   Got 1024 bytes in POST)r   r   r   r   r   r?   
read_until
assertTrue
startswithr   parser	   decode
read_bytesintrj   close)r)   r@   r   
first_lineheader_datar&   rK   r*   r*   r+   test_100_continue  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   #  rb   zEchoHandler.getc                 C   r   r%   r   r4   r*   r*   r+   r\   &  rb   zEchoHandler.postNr8   r9   r:   rZ   r\   r*   r*   r*   r+   r   "      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 )Nrq   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\   F  s   zTypeCheckHandler.postc                 C   s   |  | j d S r%   )r   r   r4   r*   r*   r+   rZ   J     zTypeCheckHandler.getc                 C   s.   t |}||krd| d| | j|< d S d S )Nz	expected z, got )typer   )r)   nameobjr   actual_typer*   r*   r+   r   M  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   ra   r   )r)   	path_argsr*   r*   r+   r\   T  r]   zPostEchoHandler.postNr   r*   r*   r*   r+   r   S  r   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_argumentY  s
   z"PostEchoGBKHandler.decode_argumentr%   )r8   r9   r:   r   r*   r*   r*   r+   r   X  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   a  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   rj   r   r*   r*   r+   test_query_string_encodingl  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_stringq  s   

z&HTTPServerTest.test_empty_query_stringc                 C   s4   | j dddd}t|j}| |dgdgd d S )Nr   rn   z	foo=&bar=rp   r   )r   barr   r   r*   r*   r+   test_empty_post_parametersv  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   rn   rq   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   rj   coder   rK   rk   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_rn   s   data=)rq   r&   rK   r   )	subTestr   urllibr   r  rI   rj   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dd Ze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                       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   Bad Requestr   r   loggingINFOr@   r   r   r   rj   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 )Nr#  r$  r&  皙?r  r   r   r-  r.  r@   r   r   r  r  r  r  r   r4   r*   r*   r+   test_malformed_first_line_log  s
   
"z/HTTPServerRawTest.test_malformed_first_line_logc                 C   r2  )Nz1.*Malformed HTTP message.*no colon in header liner$  s   GET / HTTP/1.0
asdf

r3  r  r4  r4   r*   r*   r+   test_malformed_headers  s   
"z(HTTPServerRawTest.test_malformed_headersc                    r"  )	Nz-.*Malformed HTTP message.*Invalid Host headerr$  s!   GET / HTTP/1.0
Host: foo bar

c                      r'  r%   r(  r*   r4   r*   r+   r     r)  zLHTTPServerRawTest.test_invalid_host_header_with_whitespace.<locals>.<lambda>r*  r   r+  r,  r0  r*   r4   r+   (test_invalid_host_header_with_whitespace  s   

"z:HTTPServerRawTest.test_invalid_host_header_with_whitespacec                    H    j ddd  j fdd\}}} t|ddgi d S )Ns   POST /echo HTTP/1.1
Host: 127.0.0.1
Transfer-Encoding: chunked
Content-Type: application/x-www-form-urlencoded

4
foo=
3
bar
0

r   r   c                      r'  r%   r(  r*   r4   r*   r+   r     r)  z=HTTPServerRawTest.test_chunked_request_body.<locals>.<lambda>r   r   r@   r   r   r   r   rj   r   r0  r*   r4   r+   test_chunked_request_body     

z+HTTPServerRawTest.test_chunked_request_bodyc                    r8  )Ns   POST /echo HTTP/1.1
Host: 127.0.0.1
Transfer-Encoding: Chunked
Content-Type: application/x-www-form-urlencoded

4
foo=
3
bar
0

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

1_a
1234567890abcdef1234567890
0

r   r   z.*invalid chunk sizer$  c                      r'  r%   r(  r*   r4   r*   r+   r   "  r)  zJHTTPServerRawTest.test_chunked_request_body_invalid_size.<locals>.<lambda>r   )r@   r   r   r   r   r-  r.  r   r   rj   r  r0  r*   r4   r+   &test_chunked_request_body_invalid_size  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 )Nsc   POST /echo HTTP/1.1
Host: 127.0.0.1
Transfer-Encoding: chunked
Transfer-encoding: chunked

2
ok
0

z/.*Unsupported Transfer-Encoding chunked,chunkedr$  c                      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   rj   r  r0  r*   r4   r+   *test_chunked_request_body_duplicate_header&  s   
z<HTTPServerRawTest.test_chunked_request_body_duplicate_headerc                    r>  )NsN   POST /echo HTTP/1.1
Host: 127.0.0.1
Transfer-Encoding: gzip, chunked

2
ok
0

z-.*Unsupported Transfer-Encoding gzip, chunkedr$  c                      r'  r%   r(  r*   r4   r*   r+   r   R  r)  z[HTTPServerRawTest.test_chunked_request_body_unsupported_transfer_encoding.<locals>.<lambda>r   r?  r0  r*   r4   r+   7test_chunked_request_body_unsupported_transfer_encoding@  s   
zIHTTPServerRawTest.test_chunked_request_body_unsupported_transfer_encodingc                    r>  )NsZ   POST /echo HTTP/1.1
Host: 127.0.0.1
Transfer-Encoding: chunked
Content-Length: 2

2
ok
0

z8.*Message with both Transfer-Encoding and Content-Lengthr$  c                      r'  r%   r(  r*   r4   r*   r+   r   k  r)  zbHTTPServerRawTest.test_chunked_request_body_transfer_encoding_and_content_length.<locals>.<lambda>r   r?  r0  r*   r4   r+   >test_chunked_request_body_transfer_encoding_and_content_lengthV  s   
zPHTTPServerRawTest.test_chunked_request_body_transfer_encoding_and_content_lengthc                 c   s    g d}|D ]k\}}| j |dY ttt A}ttdtjd) |d| 	 fV  |
ttd| ddd	 | V  W d    n1 sOw   Y  W d    n1 s^w   Y  W d    n1 smw   Y  qd S )
N))
alphabeticr   )leading plus+10)zinternal underscore1_0)r   z(.*Only integer Content-Length is allowedr$  r   z                            POST /echo HTTP/1.1
                            Host: 127.0.0.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_lengtho  s8    	 z-HTTPServerRawTest.test_invalid_content_lengthc           	      c   s    ddg}|D ]\}}}|d urt t|tjd}n	tdd }| }| j|d] ttt E}|3 |	d| 
 fV  |t| d |d	V }| |d
| d| d| W d    n1 sjw   Y  W d    n1 syw   Y  W d    n1 sw   Y  qd S )N)FOOi  N)zFOO,BARr   r#  r$  c                   s   s    d V  d S r%   r*   r*   r*   r*   r+   noop_context  s   
z<HTTPServerRawTest.test_invalid_methods.<locals>.noop_context)rq   r   z# /echo HTTP/1.1
Host:127.0.0.1

r   s   HTTP/1.1 %dzexpected status code z in )r   r   r-  r.  r!   r  r    r   r   r   r   r   r   r   r   r   )	r)   rK  rq   r  log_msgr   rN  r@   respr*   r*   r+   test_invalid_methods  s>   

  z&HTTPServerRawTest.test_invalid_methods)r8   r9   r:   rH   r  r  r!  r1  r5  r6  r7  r:  r<  r=  r@  rA  rB  r   rL  rQ  __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   ra   r   rT   r4   r*   r*   r+   rZ     s   zXHeaderTest.Handler.getNr8   r9   r:   rZ   r*   r*   r*   r+   rG     r   rG   c                 C   s   t ddgdS )NTz5.5.5.5)xheaderstrusted_downstreamra   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rj   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 )
Nr]  z127.0.0.1, 4.4.4.4, 5.5.5.5rE   r  rT  zHTTP/2requires HTTP/1.xr   r\  )rI   r&   r   skipTestr   rK   rj   )r)   r`  rP  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   rU  rQ   X-Schemer_   r  zX-Forwarded-Protozhttps , httpz
http,httpsunknownr^  )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   r[  rf  rj  rr  r*   r*   r*   r+   rS    s    
(
rS  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   rS  rG   r4   r*   r*   r+   rH     r   zSSLXHeaderTest.get_appc                    s   t   }d|d< |S )NTrX  )r  r[  )r)   outputr  r*   r+   r[    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   rU  r_   rk  rQ   r  rl  r^  )r)   http_scheme
bad_schemer*   r*   r+   test_request_without_xprotocol  s   z-SSLXHeaderTest.test_request_without_xprotocol)r8   r9   r:   rH   r[  rw  rR  r*   r*   r  r+   rs    s    rs  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 )Nr`   )r   ra   rX   rT   r4   r*   r*   r+   rZ   *  s   zManualProtocolTest.Handler.getNrW  r*   r*   r*   r+   rG   )  r   rG   c                 C   
   t ddS )Nr_   r`   rZ  r4   r*   r*   r+   r[  -  rV   z)ManualProtocolTest.get_httpserver_optionsc                 C   s   |  | dd d d S )NrE   rT   r_   r^  r4   r*   r*   r+   test_manual_protocol0  r]   z'ManualProtocolTest.test_manual_protocolN)r8   r9   r:   r   rG   r[  r{  r*   r*   r*   r+   ry  (  s    ry  c                       sH   e Zd 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.
    r   c                    s:   t    tdtfg}t|| _| jt| j	 d S )Nr   )
r  r  r   rP   r   server
add_socketr   bind_unix_socketaddress)r)   appr  r*   r+   r  B  s   

zUnixSocketTest.setUpc                    s(   | j | jj | j  t   d S r%   )r   r   r}  close_all_connectionsr  r  r  r4   r  r*   r+   r  H  s   
zUnixSocketTest.tearDownc                 c   s    t tttj>}|| j |d |dV }| |d |dV }t	
|d}|t|d V }| |d W d    d S 1 sLw   Y  d S )Ns   GET /hello HTTP/1.0

r   s   HTTP/1.1 200 OK
r   r   r   rh   )r    r   r   AF_UNIXr   r  r   r   rj   r   r   r   r   r   )r)   r@   rN   r   r&   rK   r*   r*   r+   test_unix_socketM  s   
"zUnixSocketTest.test_unix_socketc              	   c   s    t tdtjd2 ttttj}|| j	 |
d | V }W d    n1 s/w   Y  W d    n1 s>w   Y  | |d d S )NzMalformed HTTP message fromr$  s   garbage

   HTTP/1.1 400 Bad Request

)r   r   r-  r.  r    r   r   r  r   r  r   rJ  rj   r)   r@   rN   r*   r*   r+   test_unix_socket_bad_requestY  s   
z+UnixSocketTest.test_unix_socket_bad_request)r8   r9   r:   __doc__r  r  r  r   r  r  rR  r*   r*   r  r+   r|  4  s    

r|  r  cygwinz+unix sockets not supported on this platformc                       s(   e Zd Z fddZ fddZ  ZS )UnixSocketTestFilec                    s*   t  | _tj| jd| _t   d S )Nz	test.sock)	tempfilemkdtemptmpdirr   r   r?   r  r  r  r4   r  r*   r+   r  j  s   
zUnixSocketTestFile.setUpc                    s   t    t| j d S r%   )r  r  shutilrmtreer  r4   r  r*   r+   r  o  s   
zUnixSocketTestFile.tearDown)r8   r9   r:   r  r  rR  r*   r*   r  r+   r  e  s    r  linuxz>abstract namespace unix sockets not supported on this platformc                       s   e Zd Z fddZ  ZS )UnixSocketTestAbstractc                    s   dt  j | _t   d S )N )uuiduuid4hexr  r  r  r4   r  r*   r+   r  y  s   zUnixSocketTestAbstract.setUp)r8   r9   r:   r  rR  r*   r*   r  r+   r  t  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     r2   z/KeepAliveTest.get_app.<locals>.HelloHandler.getc                 S   r  r  r  r4   r*   r*   r+   r\     r2   z0KeepAliveTest.get_app.<locals>.HelloHandler.postNr   r*   r*   r*   r+   HelloHandler  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>  s    zBKeepAliveTest.get_app.<locals>.LargeHandler.get.<locals>.<genexpr>i   )r   r?   ranger4   r*   r*   r+   rZ     s   "z/KeepAliveTest.get_app.<locals>.LargeHandler.getNrW  r*   r*   r*   r+   LargeHandler  r   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  r   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   ra   )r)   r  r  r  r  r*   r*   r+   rH     s   
zKeepAliveTest.get_appc                    s   t    d| _d S )Ns   HTTP/1.1)r  r  http_versionr4   r  r*   r+   r       

zKeepAliveTest.setUpc                    sB   | j tjdd| j |   t| dr| j  t	 
  d S )Nr  r  r@   )r   r  r  r  r  r   hasattrr@   r   r  r  r4   r  r*   r+   r    s
   

zKeepAliveTest.tearDownc                 c   s*    t t | _| jd|  fV  d S r   )r   r   r@   r   r   r4   r*   r*   r+   r     s   zKeepAliveTest.connectc                 c   sJ    | j dV }| |d| | j dV }t|d}t|)Nr   r   r   r   )	r@   r   r   r   r   r   r   r   Return)r)   r   header_bytesr&   r*   r*   r+   read_headers  s   
zKeepAliveTest.read_headersc                 c   s6    |   V | _| jt| jd V }| d| d S )Nr   rh   )r  r&   r@   r   r   rj   )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 )Ns"   GET / HTTP/1.1
Host:127.0.0.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 )Ns5   GET / HTTP/1.1
Host:127.0.0.1
Connection: close


Connectionr   )	r   r@   r   r>   rJ  r   rj   r&   r   r)   r   r*   r*   r+   test_request_close  s   

z KeepAliveTest.test_request_closec                 c   sX    d| _ |  V  | jd |  V  | j V }| | | d| j | 	  d S )N   HTTP/1.0s   GET / HTTP/1.0

r  )
r  r   r@   r   r>   rJ  r   assertNotInr&   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>   rj   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 NsD   GET / HTTP/1.1
Host:127.0.0.1

GET / HTTP/1.1
Host:127.0.0.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
Host:127.0.0.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 )Ns1   GET /finish_on_close HTTP/1.1
Host:127.0.0.1

)r   r@   r   r  r   r  setr4   r*   r*   r+   test_finish_while_closed1  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
Host:127.0.0.1

)r   r@   r   r  r   r4   r*   r*   r+   #test_keepalive_chunked_head_no_bodyM  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  rR  r*   r*   r  r+   r  ~  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   Y  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   rn   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   rn   r  rp   r   r   )rI   rj   r   rK   rk   r*   r*   r+   test_uncompressedi  s   zGzipBaseTest.test_uncompressedN)r8   r9   r:   rH   r  r  r*   r*   r*   r+   r  X  s    r  c                   @   r  )GzipTestc                 C   rz  )NT)decompress_requestrZ  r4   r*   r*   r+   r[  o  rV   zGzipTest.get_httpserver_optionsc                 C   s&   |  d}| t|jddgi d S )Nr  r   r   )r  rj   r   rK   rk   r*   r*   r+   	test_gzipr  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   rn   r  GZIPr  r   r   )r"   r  r  r   r   r   r  rI   rj   r   rK   )r)   r  r  r  rN   r*   r*   r+   test_gzip_case_insensitivev  s   z#GzipTest.test_gzip_case_insensitiveN)r8   r9   r:   r[  r  r  r*   r*   r*   r+   r  n  s    r  c                   @   r   )GzipUnsupportedTestc                 C   sF   t td | d}W d    n1 sw   Y  | |jd d S )Nz.*Unsupported Content-Encodingr  r   )r   r   r  rj   r  rk   r*   r*   r+   test_gzip_unsupported  s   z)GzipUnsupportedTest.test_gzip_unsupportedN)r8   r9   r:   r  r*   r*   r*   r+   r    r   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_client     z&StreamingChunkSizeTest.get_http_clientc                 C   s   t | jddS )NT)
chunk_sizer  )ra   
CHUNK_SIZEr4   r*   r*   r+   r[    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  r   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   rq   rn   zoversized chunk: r   zempty chunk: )rE   )rI   rJ   r   rK   rj   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  rj   )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   rj   )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  r[  r   r  rH   r   r  r  r  r  r  r*   r*   r*   r+   r    s    
	r  c                   @   rx  )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   rE  rF  )normalrC  rD  
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    r   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  )rq   r&   r  )rC  rD  r  rs   )	r  rI   rJ   rj   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   rz  )Nr  )max_header_sizerZ  r4   r*   r*   r+   r[    rV   z(MaxHeaderSizeTest.get_httpserver_optionsc                 C   s,   | j dddid}|  | |jd d S )NrE   X-Fillerdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar  rh   )rI   rJ   rj   rK   rk   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 readFrt   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   r[  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   1  r2   zIdleTimeoutTest.get_appc                 C   rz  )Ng?)idle_connection_timeoutrZ  r4   r*   r*   r+   r[  4  rV   z&IdleTimeoutTest.get_httpserver_optionsc                    s   t    g | _d S r%   )r  r  streamsr4   r  r*   r+   r  7  r  zIdleTimeoutTest.setUpc                    s"   t    | jD ]}|  qd S r%   )r  r  r'  r   r   r  r*   r+   r  ;  s   


zIdleTimeoutTest.tearDownc                 c   s8    t t }|d|  fV  | j| t|r   )r   r   r   r   r'  r-   r   r  r   r*   r*   r+   r   @  s
   
zIdleTimeoutTest.connectc                 c   s,    |   V }t }||j | V  d S r%   )r   r   set_close_callbackr  r   )r)   r@   eventr*   r*   r+   test_unused_connectionG  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  s#   GET / HTTP/1.1
Host: 127.0.0.1

r      rh   )
r   r   r(  r  r  r   r   r   rj   r   )r)   r@   r)  r  r   r*   r*   r+   test_idle_after_useN  s   

z#IdleTimeoutTest.test_idle_after_use)r8   r9   r:   rH   r[  r  r  r   r  r   r   r*  r,  rR  r*   r*   r  r+   r%  0  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+   putb  r]   z3BodyLimitsTest.get_app.<locals>.BufferedHandler.putN)r8   r9   r:   r.  r*   r*   r*   r+   BufferedHandlera  r   r/  c                   @   r   )
z0BodyLimitsTest.get_app.<locals>.StreamingHandlerc                 S   s
   d| _ d S )Nr   )
bytes_readr4   r*   r*   r+   rU   g  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)typingcastr
   rX   r  r   set_max_body_sizer   r   set_body_timeoutfloat)r)   r5   r*   r*   r+   r   j  s   z8BodyLimitsTest.get_app.<locals>.StreamingHandler.preparec                 S   s   |  j t|7  _ d S r%   )r0  r[   r  r*   r*   r+   r1   q  rb   z>BodyLimitsTest.get_app.<locals>.StreamingHandler.data_receivedc                 S   s   |  t| j d S r%   )r   r   r0  r4   r*   r*   r+   r.  t  r  z4BodyLimitsTest.get_app.<locals>.StreamingHandler.putN)r8   r9   r:   rU   r   r1   r.  r*   r*   r*   r+   StreamingHandlere  s
    r8  	/buffered
/streaming)r   r   r   )r)   r/  r8  r*   r*   r+   rH   `  s   zBodyLimitsTest.get_appc                 C   s   t dddS )Nrx   i   )r2  max_body_sizerZ  r4   r*   r*   r+   r[  {  r7   z%BodyLimitsTest.get_httpserver_optionsc                 C   r  r%   r   r4   r*   r*   r+   r  ~  r  zBodyLimitsTest.get_http_clientc                 C   s@   | j dddd}| |jd | j dddd}| |jd d S )Nr9  PUTs   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarp   s   4096r:  ri   rk   r*   r*   r+   test_small_body  s   zBodyLimitsTest.test_small_bodyc                 C   V   t tdtjd | jdddd d}W d    n1 sw   Y  | |jd d S )	N.*Content-Length too longr$  r9  r<     a (  rp   r   r   r   r-  r.  rI   rj   r  rk   r*   r*   r+   test_large_body_buffered     z'BodyLimitsTest.test_large_body_bufferedntzflaky on windowsc                 C   V   t tdtjd | jdddd d}W d    n1 sw   Y  | |jd d S )	N.*chunked body too larger$  r9  r<  c                 S      | dd S Nr@  rA  r*   r	  r*   r*   r+   r         zABodyLimitsTest.test_large_body_buffered_chunked.<locals>.<lambda>rq   r
  r   rB  rk   r*   r*   r+    test_large_body_buffered_chunked  s   z/BodyLimitsTest.test_large_body_buffered_chunkedc                 C   r>  )	Nr?  r$  r:  r<  r@  rA  rp   r   rB  rk   r*   r*   r+   test_large_body_streaming  rD  z(BodyLimitsTest.test_large_body_streamingc                 C   rF  )	NrG  r$  r:  r<  c                 S   rH  rI  r*   r	  r*   r*   r+   r     rJ  zBBodyLimitsTest.test_large_body_streaming_chunked.<locals>.<lambda>rK  r   rB  rk   r*   r*   r+   !test_large_body_streaming_chunked  s   z0BodyLimitsTest.test_large_body_streaming_chunkedc                 C   rm   )N/streaming?expected_size=10240r<  r@  rA  rp      10240ri   rk   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 )NrO  r<  c                 S   rH  rI  r*   r	  r*   r*   r+   r     rJ  zKBodyLimitsTest.test_large_body_streaming_chunked_override.<locals>.<lambda>rK  rP  ri   rk   r*   r*   r+   *test_large_body_streaming_chunked_override  s   z9BodyLimitsTest.test_large_body_streaming_chunked_overridec                 c   s    t t }z9|d|  fV  |d ttdtjd |	 V }W d    n1 s/w   Y  | 
|d W |  d S |  w )Nr   s@   PUT /streaming?body_timeout=0.1 HTTP/1.0
Content-Length: 42

zTimeout reading bodyr$  r=   )r   r   r   r   r   r   r   r-  r.  rJ  rj   r   r  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   sW   PUT /streaming?expected_size=10240 HTTP/1.1
Host: 127.0.0.1
Content-Length: 10240

r@  rA  rP  sC   PUT /streaming HTTP/1.1
Host: 127.0.0.1
Content-Length: 10240

r?  r$  r  )r   r   r   r   r   rB   rj   r   r   r-  r.  rJ  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   r[  r  r=  rC  unittestskipIfr   r   rL  rM  rN  rQ  rR  r   rS  rT  r*   r*   r*   r+   r-  _  s"    


	
r-  c                   @   r   )LegacyInterfaceTestc                    s    fdd}|S )Nc                    sp   | j d _ js| jtdddt  | j  d S d}| jt	dt
|  | j| | j  d S )NzHTTP/1.r   r  r  rh   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)   rZ  r*   r4   r+   rH     s   zLegacyInterfaceTest.get_appc                 C   s,   |  d}| js| d | |jd d S )NrE   rg  rh   )rI   rX  rh  rj   rK   rk   r*   r*   r+   test_legacy_interface  s   

z)LegacyInterfaceTest.test_legacy_interfaceN)r8   r9   r:   rH   r[  r*   r*   r*   r+   rW    s    rW  )ctornador   r   tornado.escaper   r   r   r   r   r	   tornado.http1connectionr
   tornado.httpclientr   tornado.httpserverr   tornado.httputilr   r   r   r   tornado.iostreamr   tornado.locksr   tornado.logr   r   tornado.simple_httpclientr   tornado.testingr   r   r   r   r   tornado.test.utilr   tornado.webr   r   r   
contextlibr    r!   r  r  r-  r   r  r   rd   sysr  rH  rU  urllib.parser  r  ior"   r3  TYPE_CHECKINGr#   r$   rB   rC   rP   r^   TestCaser   r   r   r   r   r   r   r   r  rS  rs  ry  r|  rV  r  platformr  r   r  r  r  r  r  r  r  r  r%  r-  rW  r*   r*   r*   r+   <module>   s     *)\)A  _0 [
_(/ 