U
    d                     @   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 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l/Z/d dl0Z0d dl1Z1d dl2Z2d dl3Z3d dl4Z4d dl5Z5d dl6Z6d dl7Z8d dl9m:Z: d dl;Z;e;j<rtd dl;m=Z=m>Z> dd Z?G dd de Z@G dd de)ZAe6BeCe3dddk dZDG dd de!ZEG dd  d eFZGG d!d" d"eEeGZHeDG d#d$ d$eEeGZIeDG d%d& d&eEeGZJG d'd( d(eEeGZKG d)d* d*e6jLZMG d+d, d,e)ZNG d-d. d.e ZOG d/d0 d0e)ZPG d1d2 d2e)ZQG d3d4 d4e)ZRG d5d6 d6eRZSG d7d8 d8e ZTG d9d: d:e ZUG d;d< d<e@ZVG d=d> d>e!e@ZWG d?d@ d@e@ZXe6BeYe2dA pe4jZdBkdCG dDdE dEe"Z[G dFdG dGe Z\G dHdI dIe Z]G dJdK dKe]e Z^G dLdM dMe]e Z_G dNdO dOe Z`G dPdQ dQe Zae&G dRdS dSe ZbG dTdU dUe ZcG dVdW dWe ZddS )X    )gennetutil)json_decodejson_encodeutf8_unicoderecursive_unicode
native_str)HTTP1Connection)	HTTPError)
HTTPServer)HTTPHeadersHTTPMessageDelegateHTTPServerConnectionDelegateResponseStartLine)IOStream)Event)gen_log)ssl_options_to_contextSimpleAsyncHTTPClient)AsyncHTTPTestCaseAsyncHTTPSTestCaseAsyncTestCase	ExpectLoggen_test)skipOnTravis)ApplicationRequestHandlerstream_request_body)closingN)BytesIO)DictListc                    sN   g  G  fdddt }t| d| }|I dH  |j|jd fS )zaReads an HTTP response from `stream` and returns a tuple of its
    start_line, headers and body.c                       s,   e Zd Zdd Z fddZfddZdS )z"read_stream_body.<locals>.Delegatec                 S   s   || _ || _d S N)headers
start_lineselfr&   r%    r)   @/tmp/pip-unpacked-wheel-fekwu36z/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_received@   s    z0read_stream_body.<locals>.Delegate.data_receivedc                    s       d S r$   )detachr(   )connr)   r*   finishC   s    z)read_stream_body.<locals>.Delegate.finishN)__name__
__module____qualname__r+   r0   r4   r)   r/   r3   r)   r*   Delegate;   s   r9   TN    )r   r
   read_responser&   r%   join)streamr9   Zdelegater)   r8   r*   read_stream_body6   s    
r>   c                   @   s    e Zd ZdZdd Zdd ZdS )HandlerBaseTestCaseNc                 C   s   t d| jjfgS N/)r   	__class__Handlerr2   r)   r)   r*   get_appO   s    zHandlerBaseTestCase.get_appc                 O   s   | j ||}|  t|jS r$   )fetchrethrowr   body)r(   argskwargsresponser)   r)   r*   
fetch_jsonR   s    zHandlerBaseTestCase.fetch_json)r5   r6   r7   rC   rD   rK   r)   r)   r)   r*   r?   L   s   r?   c                   @   s&   e Zd Zd	ddZdd Zdd ZdS )
HelloWorldRequestHandlerhttpc                 C   s
   || _ d S r$   )expected_protocol)r(   protocolr)   r)   r*   
initializeY   s    z#HelloWorldRequestHandler.initializec                 C   s$   | j j| jkrtd| d d S )Nzunexpected protocolHello world)requestrO   rN   	Exceptionr4   r2   r)   r)   r*   get\   s    zHelloWorldRequestHandler.getc                 C   s   |  dt| jj  d S )NzGot %d bytes in POST)r4   lenrR   rG   r2   r)   r)   r*   posta   s    zHelloWorldRequestHandler.postN)rM   )r5   r6   r7   rP   rT   rV   r)   r)   r)   r*   rL   X   s   
rL   OPENSSL_VERSION_INFO)r   r   )   r   z(old version of ssl module and/or opensslc                   @   s   e Zd Zdd ZdS )BaseSSLTestc                 C   s   t dttddfgS )NrA   httpsrO   )r   rL   dictr2   r)   r)   r*   rD   q   s    zBaseSSLTest.get_appN)r5   r6   r7   rD   r)   r)   r)   r*   rY   p   s   rY   c                   @   s\   e Zd Zdd Zdd ZejdddZejddd	Zejdd
dZ	ejdddZ
dS )SSLTestMixinc                 C   s   t f d|  it S )Nssl_version)r\   get_ssl_versionr   Zdefault_ssl_optionsr2   r)   r)   r*   get_ssl_optionsv   s
    zSSLTestMixin.get_ssl_optionsc                 C   s
   t  d S r$   )NotImplementedErrorr2   r)   r)   r*   r_   |   s    zSSLTestMixin.get_ssl_versionr2   c                 C   s   |  d}| |jd d S )NrA      Hello worldrE   assertEqualrG   r(   rJ   r)   r)   r*   test_ssl   s    
zSSLTestMixin.test_sslc                 C   s&   | j dddd d}| |jd d S )NrA   POSTAi  methodrG   s   Got 5000 bytes in POSTrc   re   r)   r)   r*   test_large_post   s    zSSLTestMixin.test_large_postc                 C   sn   t tdZ t tddd@ | ttf& | j| dddddd	d
 W 5 Q R X W 5 Q R X W 5 Q R X d S )Nz(SSL Error|uncaught exception)zUncaught exceptionFrequiredrA   https:http:  T)request_timeoutconnect_timeoutraise_error)r   r   assertRaisesIOErrorr   rE   get_urlreplacer2   r)   r)   r*   test_non_ssl_request   s    z!SSLTestMixin.test_non_ssl_requestc              
   C   s\   t td<}| ttf" | j| ddddd W 5 Q R X W 5 Q R X | |j	 d S )Nz	SSL ErrorrA   rn   ro   T)rs   )
r   r   rt   ru   r   rE   rv   rw   ZassertFalseZlogged_stack)r(   Z
expect_logr)   r)   r*   test_error_logging   s     zSSLTestMixin.test_error_loggingN)r5   r6   r7   r`   r_   typingAnyrf   rk   rx   ry   r)   r)   r)   r*   r]   u   s   r]   c                   @   s   e Zd Zdd ZdS )
SSLv23Testc                 C   s   t jS r$   )sslPROTOCOL_SSLv23r2   r)   r)   r*   r_      s    zSSLv23Test.get_ssl_versionNr5   r6   r7   r_   r)   r)   r)   r*   r|      s   r|   c                   @   s   e Zd Zdd ZdS )	SSLv3Testc                 C   s   t jS r$   )r}   ZPROTOCOL_SSLv3r2   r)   r)   r*   r_      s    zSSLv3Test.get_ssl_versionNr   r)   r)   r)   r*   r      s   r   c                   @   s   e Zd Zdd ZdS )	TLSv1Testc                 C   s   t jS r$   )r}   PROTOCOL_TLSv1r2   r)   r)   r*   r_      s    zTLSv1Test.get_ssl_versionNr   r)   r)   r)   r*   r      s   r   c                   @   s   e Zd Zdd ZdS )SSLContextTestc                 C   s&   t t| dd}t|tjs"t|S )NT)server_side)r   r   r`   
isinstancer}   
SSLContextAssertionError)r(   contextr)   r)   r*   r`      s     zSSLContextTest.get_ssl_optionsN)r5   r6   r7   r`   r)   r)   r)   r*   r      s   r   c                   @   s   e Zd Zdd Zdd ZdS )BadSSLOptionsTestc                 C   s    t  }| jtt|ddid d S )Nkeyfilez/__missing__.crtZssl_options)r   rt   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<   rt   
ValueErrorru   r   )r(   r   Z
module_dirZexisting_certificateZexisting_keyr)   r)   r*   test_missing_key   s,    z"BadSSLOptionsTest.test_missing_keyN)r5   r6   r7   r   r   r)   r)   r)   r*   r      s   	r   c                   @   s   e Zd Zdd ZdS )MultipartTestHandlerc                 C   sH   |  | jjd | d| jjd d jt| jjd d d d d S )NzX-Header-Encoding-Testargumentfilesr   rG   )headerr   filenamefilebody)r4   rR   r%   get_argumentr   r   r   r2   r)   r)   r*   rV      s    
zMultipartTestHandler.postNr5   r6   r7   rV   r)   r)   r)   r*   r      s   r   c                   @   sB   e Zd Zdd Zdd ZdddZdd	 Zd
d Zedd Z	dS )HTTPConnectionTestc                 C   s   dt fdtfgS )Nz
/multipart/hello)r   rL   r2   r)   r)   r*   get_handlers   s    zHTTPConnectionTest.get_handlersc                 C   s   t |  S r$   )r   r   r2   r)   r)   r*   rD      s    zHTTPConnectionTest.get_app   
c              
      s   t tt p j fdd ||tdt| g | | |   jfdd\}}}|W  5 Q R  S Q R X d S )Nc                      s    d  fS N	127.0.0.1)connectget_http_portr)   r(   r=   r)   r*   <lambda>  r:   z.HTTPConnectionTest.raw_fetch.<locals>.<lambda>zContent-Length: %dc                      s   t  S r$   )r>   r)   )r=   r)   r*   r     r:   )	r    r   socketio_looprun_syncwriter<   r   rU   )r(   r%   rG   newliner&   r)   r   r*   	raw_fetch   s"    

zHTTPConnectionTest.raw_fetchc                 C   s   |  dddgdddddd	d
ddddddg	}t|}| d|d  | d|d  | d|d  | d|d  d S )Ns   POST /multipart HTTP/1.0s6   Content-Type: multipart/form-data; boundary=1234567890s   X-Header-encoding-test: r   s-   Content-Disposition: form-data; name=argumentr:      ázutf-8s   --1234567890u;   Content-Disposition: form-data; name="files"; filename="ó"r      ús   --1234567890--   ér   r      ór   r   )r   r<   encoder   rd   r(   rJ   datar)   r)   r*   test_multipart_form  s2    z&HTTPConnectionTest.test_multipart_formc                 C   s,   dD ]"}| j dgd|d}| |d qd S )N)r      
s   GET /hello HTTP/1.0r:   )r   rb   )r   rd   )r(   r   rJ   r)   r)   r*   test_newlines.  s    z HTTPConnectionTest.test_newlinesc              	   c   s   t t }|d|  fV  |ddddddgV  |dV }| |d| |d	 |dV }| |d
| |dV }t	
t|d}|t|d V }| |d |  d S )Nr   r   s   POST /hello HTTP/1.1s   Content-Length: 1024s   Expect: 100-continues   Connection: close   

s   HTTP/1.1 100 s   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa   HTTP/1.1 200latin1Content-Lengths   Got 1024 bytes in POST)r   r   r   r   r   r<   
read_until
assertTrue
startswithr   parser	   decode
read_bytesintrd   close)r(   r=   r   
first_lineheader_datar%   rG   r)   r)   r*   test_100_continue4  s,    
z$HTTPConnectionTest.test_100_continueN)r   )
r5   r6   r7   r   rD   r   r   r   r   r   r)   r)   r)   r*   r      s   
r   c                   @   s   e Zd Zdd Zdd ZdS )EchoHandlerc                 C   s   |  t| jj d S r$   r   r   rR   	argumentsr2   r)   r)   r*   rT   S  s    zEchoHandler.getc                 C   s   |  t| jj d S r$   r   r2   r)   r)   r*   rV   V  s    zEchoHandler.postNr5   r6   r7   rT   rV   r)   r)   r)   r*   r   R  s   r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
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 )Nrj   uriversion	remote_iprO   hostr   queryZ
header_keyr   header_valueZ
cookie_keyZcookie_valueZarg_key	arg_value)errorsstr
check_typegetattrrR   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 )NrG   )r   rR   rG   r   r   r   r2   r)   r)   r*   rV   v  s    zTypeCheckHandler.postc                 C   s   |  | j d S r$   )r   r   r2   r)   r)   r*   rT   z  s    zTypeCheckHandler.getc                 C   s&   t |}||kr"d||f | j|< d S )Nzexpected %s, got %s)typer   )r(   nameobjr   Zactual_typer)   r)   r*   r   }  s    zTypeCheckHandler.check_typeN)r5   r6   r7   r   rV   rT   r   r)   r)   r)   r*   r   Z  s   r   c                   @   s   e Zd Zdd ZdS )PostEchoHandlerc                 G   s   |  t| dd d S )Nr   )echo)r   r\   r   )r(   Z	path_argsr)   r)   r*   rV     s    zPostEchoHandler.postNr   r)   r)   r)   r*   r     s   r   c                   @   s   e Zd ZdddZdS )PostEchoGBKHandlerNc                 C   s4   z| dW S  tk
r.   tdd| Y nX d S )Ngbk  zinvalid gbk bytes: %r)r   rS   r   )r(   r   r   r)   r)   r*   decode_argument  s    z"PostEchoGBKHandler.decode_argument)N)r5   r6   r7   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   r2   r)   r)   r*   rD     s    zHTTPServerTest.get_appc                 C   s*   |  d}t|j}| |ddgi d S )Nz/echo?foo=%C3%A9foor   rE   r   rG   rd   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   rg   z	foo=&bar=ri   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   rg   rj   rG   r%   r   )r(   r%   rJ   r   r)   r)   r*   
test_types  s    
   
zHTTPServerTest.test_typesc                 C   s.   |  d}| d|j | t|ji  d S )Nr      )rE   rd   coder   rG   re   r)   r)   r*   test_double_slash  s    
z HTTPServerTest.test_double_slashc                 C   s   ddi}d}dD ]x}dD ]n}| j ||dV ||}|rLtj|d}| jd| d	|d
| d}| t|jd|i W 5 Q R X qqd S )NzContent-Typez!application/x-www-form-urlencodedu   chinese: 张三)r   r   )TF)encquoteasciiz/post_rg   s   data=)rj   r%   rG   r   )	ZsubTestr   urllibr   r   rE   rd   r   rG   )r(   r%   Zuni_textr   r   Zbin_textrJ   r)   r)   r*   test_post_encodings  s    
z"HTTPServerTest.test_post_encodingsN)
r5   r6   r7   rD   r   r   r   r   r   r  r)   r)   r)   r*   r     s   r   c                       sl   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edd Z  ZS )HTTPServerRawTestc                 C   s   t dtfgS )Nr   r   r   r2   r)   r)   r*   rD     s    zHTTPServerRawTest.get_appc                    s0   t    tt  _ j fdd d S )Nc                      s    j d  fS r   )r=   r   r   r)   r2   r)   r*   r     r:   z)HTTPServerRawTest.setUp.<locals>.<lambda>)supersetUpr   r   r=   r   r   r2   rB   r2   r*   r    s
    

zHTTPServerRawTest.setUpc                    s   | j   t   d S r$   )r=   r   r  tearDownr2   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waitr2   r)   r)   r*   test_empty_request  s    
z$HTTPServerRawTest.test_empty_requestc              	      sp   t tdtjdV  jd  j fdd\}}} d|j	  d|j
  d|j W 5 Q R X d S )	N.*Malformed HTTP request linelevel   asdf

c                      s
   t  jS r$   r>   r=   r)   r2   r)   r*   r     r:   zFHTTPServerRawTest.test_malformed_first_line_response.<locals>.<lambda>HTTP/1.1r   zBad Request)r   r   loggingINFOr=   r   r   r   rd   r   r   reasonr(   r&   r%   rJ   r)   r2   r*   "test_malformed_first_line_response  s    

z4HTTPServerRawTest.test_malformed_first_line_responsec              	   C   sL   t tdtjd2 | jd | jtj	dd| j
 |   W 5 Q R X d S )Nr  r  r  皙?r	  r   r   r  r  r=   r   r   r  r  r  r  r  r2   r)   r)   r*   test_malformed_first_line_log  s    z/HTTPServerRawTest.test_malformed_first_line_logc              	   C   sL   t tdtjd2 | jd | jtj	dd| j
 |   W 5 Q R X d S )Nz1.*Malformed HTTP message.*no colon in header liner  s   GET / HTTP/1.0
asdf

r  r	  r  r2   r)   r)   r*   test_malformed_headers  s    z(HTTPServerRawTest.test_malformed_headersc                    sH    j ddd  j fdd\}}} t|ddgi d S )Nsp   POST /echo HTTP/1.1
Transfer-Encoding: chunked
Content-Type: application/x-www-form-urlencoded

4
foo=
3
bar
0

r   r   c                      s
   t  jS r$   r  r)   r2   r)   r*   r     r:   z=HTTPServerRawTest.test_chunked_request_body.<locals>.<lambda>r   r   r=   r   rw   r   r   rd   r   r  r)   r2   r*   test_chunked_request_body  s     

z+HTTPServerRawTest.test_chunked_request_bodyc                    sH    j ddd  j fdd\}}} t|ddgi d S )Nsp   POST /echo HTTP/1.1
Transfer-Encoding: Chunked
Content-Type: application/x-www-form-urlencoded

4
foo=
3
bar
0

r   r   c                      s
   t  jS r$   r  r)   r2   r)   r*   r   -  r:   zBHTTPServerRawTest.test_chunked_request_uppercase.<locals>.<lambda>r   r   r   r  r)   r2   r*   test_chunked_request_uppercase  s     

z0HTTPServerRawTest.test_chunked_request_uppercasec              	   c   s@   t tdtjd& | jddd | j V  W 5 Q R X d S )Nz(.*Only integer Content-Length is allowedr  s.   POST /echo HTTP/1.1
Content-Length: foo

bar

r   r   )r   r   r  r  r=   r   rw   read_until_closer2   r)   r)   r*   test_invalid_content_length1  s       z-HTTPServerRawTest.test_invalid_content_length)r5   r6   r7   rD   r  r  r  r  r  r  r!  r"  r   r$  __classcell__r)   r)   r  r*   r    s   

r  c                   @   s<   e Zd ZG dd deZdd Zdd Zdd Zd	d
 ZdS )XHeaderTestc                   @   s   e Zd Zdd ZdS )zXHeaderTest.Handlerc                 C   s.   |  d| jj | t| jj| jjd d S )Nrequest-version)r   remote_protocol)Z
set_headerrR   r   r   r\   r   rO   r2   r)   r)   r*   rT   F  s    zXHeaderTest.Handler.getNr5   r6   r7   rT   r)   r)   r)   r*   rC   E  s   rC   c                 C   s   t ddgdS )NTz5.5.5.5)xheadersZtrusted_downstreamr\   r2   r)   r)   r*   get_httpserver_optionsO  s    z"XHeaderTest.get_httpserver_optionsc                 C   s  |  | dd d ddi}|  | jd|dd d ddi}|  | jd|dd d dd	i}|  | jd|dd d	 dd
i}|  | jd|dd d	 ddi}|  | jd|dd d ddi}|  | jd|dd d ddi}|  | jd|dd d d S )NrA   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rd   rK   )r(   Z
valid_ipv4valid_ipv4_listZ
valid_ipv6Zvalid_ipv6_listZinvalid_charsZinvalid_chars_listZinvalid_hostr)   r)   r*   test_ip_headersR  sH         zXHeaderTest.test_ip_headersc                 C   sN   ddi}| j d|d}|jd dr0| d t|j}| |d d	 d S )
Nr.  z127.0.0.1, 4.4.4.4, 5.5.5.5rA   r   r'  zHTTP/2requires HTTP/1.xr   r-  )rE   r%   r   skipTestr   rG   rd   )r(   r0  respresultr)   r)   r*   test_trusted_downstreamz  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 )NrA   r(  rM   X-SchemerZ   r   zX-Forwarded-Protozhttps , httpz
http,httpsunknownr/  )r(   Zhttps_schemeZhttps_forwardedZhttps_multi_forwardedZhttp_multi_forwardedZbad_forwardedr)   r)   r*   test_scheme_headers  s4       zXHeaderTest.test_scheme_headersN)	r5   r6   r7   r   rC   r,  r1  r6  r9  r)   r)   r)   r*   r&  D  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 r@   )r   r&  rC   r2   r)   r)   r*   rD     s    zSSLXHeaderTest.get_appc                    s   t   }d|d< |S )NTr*  )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 )NrA   r(  rZ   r7  rM   r   r8  r/  )r(   Zhttp_schemeZ
bad_schemer)   r)   r*   test_request_without_xprotocol  s      z-SSLXHeaderTest.test_request_without_xprotocol)r5   r6   r7   rD   r,  r<  r%  r)   r)   r  r*   r:    s   r:  c                   @   s,   e Zd ZG dd deZdd Zdd ZdS )ManualProtocolTestc                   @   s   e Zd Zdd ZdS )zManualProtocolTest.Handlerc                 C   s   |  t| jjd d S )Nr[   )r   r\   rR   rO   r2   r)   r)   r*   rT     s    zManualProtocolTest.Handler.getNr)  r)   r)   r)   r*   rC     s   rC   c                 C   s
   t ddS )NrZ   r[   r+  r2   r)   r)   r*   r,    s    z)ManualProtocolTest.get_httpserver_optionsc                 C   s   |  | dd d d S )NrA   rO   rZ   r/  r2   r)   r)   r*   test_manual_protocol  s    z'ManualProtocolTest.test_manual_protocolN)r5   r6   r7   r   rC   r,  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)   r2   r)   r*   r     r:   z&UnixSocketTest.setUp.<locals>.<lambda>)r  r  tempfilemkdtemptmpdirr   r   r<   rB  r   Zbind_unix_socketr   rL   r   serverZ
add_socketr   r   r?  r=   r   r   )r(   sockZappr  r2   r*   r    s    


zUnixSocketTest.setUpc                    s>   | j   | j| jj | j  t| j	 t
   d S r$   )r=   r   r   r   rF  Zclose_all_connectionsr  shutilrmtreerE  r  r  r2   r  r)   r*   r    s
    

zUnixSocketTest.tearDownc                 c   sj   | j d | j dV }| |d | j dV }t|d}| j t|d V }| |d d S )Ns   GET /hello HTTP/1.0

r   s   HTTP/1.1 200 OK
r   r   r   rb   )	r=   r   r   rd   r   r   r   r   r   )r(   rJ   r   r%   rG   r)   r)   r*   test_unix_socket  s    zUnixSocketTest.test_unix_socketc              	   c   s>   t td | jd | j V }W 5 Q R X | |d d S )NzMalformed HTTP message froms   garbage

   HTTP/1.1 400 Bad Request

)r   r   r=   r   r#  rd   re   r)   r)   r*   test_unix_socket_bad_request  s    z+UnixSocketTest.test_unix_socket_bad_request)
r5   r6   r7   __doc__r  r  r   rJ  rL  r%  r)   r)   r  r*   rA    s   

	rA  c                       s   e Zd ZdZdd Z fddZ fddZejdd	 Z	ejd
d Z
ejdd Zdd Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zed d! Zed"d# Zed$d% Z  ZS )&KeepAliveTestzTests various scenarios for HTTP 1.1 keep-alive support.

    These tests don't use AsyncHTTPClient because we want to control
    connection reuse and closing.
    c              	   C   sr   G dd dt }G dd dt }G dd dt }G dd dt }t | _td	|fd
|fd|fd|t| jdfgS )Nc                   @   s   e Zd Zdd Zdd ZdS )z+KeepAliveTest.get_app.<locals>.HelloHandlerc                 S   s   |  d d S NrQ   r4   r2   r)   r)   r*   rT     s    z/KeepAliveTest.get_app.<locals>.HelloHandler.getc                 S   s   |  d d S rO  rP  r2   r)   r)   r*   rV     s    z0KeepAliveTest.get_app.<locals>.HelloHandler.postNr   r)   r)   r)   r*   HelloHandler  s   rQ  c                   @   s   e Zd Zdd ZdS )z+KeepAliveTest.get_app.<locals>.LargeHandlerc                 S   s"   |  ddd tdD  d S )Nr   c                 s   s   | ]}t |d  d V  qdS )      N)chr).0ir)   r)   r*   	<genexpr>  s     zBKeepAliveTest.get_app.<locals>.LargeHandler.get.<locals>.<genexpr>i   )r   r<   ranger2   r)   r)   r*   rT     s    z/KeepAliveTest.get_app.<locals>.LargeHandler.getNr)  r)   r)   r)   r*   LargeHandler
  s   rY  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 rO  )r   flushr2   r)   r)   r*   head  s    
zBKeepAliveTest.get_app.<locals>.TransferEncodingChunkedHandler.headN)r5   r6   r7   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   s
   || _ d S r$   cleanup_event)r(   r_  r)   r)   r*   rP     s    z>KeepAliveTest.get_app.<locals>.FinishOnCloseHandler.initializec                 s   s   |    | j V  d S r$   )rZ  r_  r  r2   r)   r)   r*   rT     s    z7KeepAliveTest.get_app.<locals>.FinishOnCloseHandler.getc                 S   s   |  d d S )NclosedrP  r2   r)   r)   r*   on_connection_close  s    zGKeepAliveTest.get_app.<locals>.FinishOnCloseHandler.on_connection_closeN)r5   r6   r7   rP   r   r\  rT   ra  r)   r)   r)   r*   FinishOnCloseHandler  s   
rb  rA   z/largez/chunkedz/finish_on_closer^  )r   r   r_  r   r\   )r(   rQ  rY  r]  rb  r)   r)   r*   rD     s    
zKeepAliveTest.get_appc                    s   t    d| _d S )Ns   HTTP/1.1)r  r  http_versionr2   r  r)   r*   r  3  s    
zKeepAliveTest.setUpc                    sB   | j tjdd| j |   t| dr4| j  t	 
  d S )Nr  r	  r=   )r   r  r  r  r  r  hasattrr=   r   r  r  r2   r  r)   r*   r  7  s
    

zKeepAliveTest.tearDownc                 c   s(   t t | _| jd|  fV  d S r   )r   r   r=   r   r   r2   r)   r)   r*   r   B  s    zKeepAliveTest.connectc                 c   sL   | j dV }| |d| | j dV }t|d}t|d S )Nr   r   r   r   )	r=   r   r   r   r   r   r   r   Return)r(   r   header_bytesr%   r)   r)   r*   read_headersG  s
    zKeepAliveTest.read_headersc                 c   s4   |   V | _| jt| jd V }| d| d S )Nr   rb   )rg  r%   r=   r   r   rd   )r(   rG   r)   r)   r*   r;   O  s    zKeepAliveTest.read_responsec                 C   s   | j   | ` d S r$   )r=   r   r2   r)   r)   r*   r   U  s    
zKeepAliveTest.closec                 c   sB   |   V  | jd |  V  | jd |  V  |   d S )N   GET / HTTP/1.1

r   r=   r   r;   r   r2   r)   r)   r*   test_two_requestsY  s    


zKeepAliveTest.test_two_requestsc                 c   sV   |   V  | jd |  V  | j V }| |  | | jd d |   d S )Ns%   GET / HTTP/1.1
Connection: close


Connectionr   )	r   r=   r   r;   r#  r   rd   r%   r   r(   r   r)   r)   r*   test_request_closeb  s    

z KeepAliveTest.test_request_closec                 c   sZ   d| _ |  V  | jd |  V  | j V }| |  | d| jk |   d S )N   HTTP/1.0s   GET / HTTP/1.0

rk  )	rc  r   r=   r   r;   r#  r   r%   r   rl  r)   r)   r*   test_http10m  s    

zKeepAliveTest.test_http10c                 c   sl   d| _ |  V  | jd |  V  | | jd d | jd |  V  | | jd d |   d S )Nrn  *   GET / HTTP/1.0
Connection: keep-alive

rk  
Keep-Aliverc  r   r=   r   r;   rd   r%   r   r2   r)   r)   r*   test_http10_keepalivex  s    


z#KeepAliveTest.test_http10_keepalivec                 c   sl   d| _ |  V  | jd |  V  | | jd d | jd |  V  | | jd d |   d S )Nrn  s,   GET / HTTP/1.0
Connection: keep-alive


rk  rq  rp  rr  r2   r)   r)   r*    test_http10_keepalive_extra_crlf  s    


z.KeepAliveTest.test_http10_keepalive_extra_crlfc                 c   s6   |   V  | jd |  V  |  V  |   d S Ns$   GET / HTTP/1.1

GET / HTTP/1.1

ri  r2   r)   r)   r*   test_pipelined_requests  s
    


z%KeepAliveTest.test_pipelined_requestsc                 c   s,   |   V  | jd |  V  |   d S ru  ri  r2   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

rS  )r   r=   r   rg  r   r   r2   r)   r)   r*   test_cancel_during_download  s
    

z)KeepAliveTest.test_cancel_during_downloadc                 c   s6   |   V  | jd |  V  |   | j  d S )Ns!   GET /finish_on_close HTTP/1.1

)r   r=   r   rg  r   r_  setr2   r)   r)   r*   test_finish_while_closed  s
    

z&KeepAliveTest.test_finish_while_closedc                 c   sl   d| _ |  V  | jd |  V  | | jd d | jd |  V  | | jd d |   d S )Nrn  sL   POST / HTTP/1.0
Connection: keep-alive
Transfer-Encoding: chunked

0

rk  rq  rp  rr  r2   r)   r)   r*   test_keepalive_chunked  s    


z$KeepAliveTest.test_keepalive_chunkedc                 c   sB   |   V  | jd |  V  | jd |  V  |   d S )Ns   HEAD /chunked HTTP/1.1

)r   r=   r   rg  r   r2   r)   r)   r*   #test_keepalive_chunked_head_no_body  s    


z1KeepAliveTest.test_keepalive_chunked_head_no_body)r5   r6   r7   rM  rD   r  r  r   r\  r   rg  r;   r   r   rj  rm  ro  rs  rt  rv  rw  rx  rz  r{  r|  r%  r)   r)   r  r*   rN    sB   1














rN  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )GzipBaseTestc                 C   s   t dtfgS r@   r  r2   r)   r)   r*   rD     s    zGzipBaseTest.get_appc                 C   sH   t  }tjd|d}|t| |  | }| jdd|ddidS )NwmodefileobjrA   rg   Content-Encodinggzipr   )r!   r  GzipFiler   r   r   getvaluerE   )r(   rG   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 )NrA   rg   r   ri   r   r   )rE   rd   r   rG   re   r)   r)   r*   test_uncompressed  s    zGzipBaseTest.test_uncompressedN)r5   r6   r7   rD   r  r  r)   r)   r)   r*   r}    s   r}  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )GzipTestc                 C   s
   t ddS )NT)decompress_requestr+  r2   r)   r)   r*   r,    s    zGzipTest.get_httpserver_optionsc                 C   s&   |  d}| t|jddgi d S )Nr   r   r   )r  rd   r   rG   re   r)   r)   r*   	test_gzip  s    
zGzipTest.test_gzipc                 C   sd   t  }tjd|d}|td |  | }| jdd|ddid}| t	|j
d	d
gi d S )Nr~  r  r   rA   rg   r  ZGZIPr   r   r   )r!   r  r  r   r   r   r  rE   rd   r   rG   )r(   r  r  r  rJ   r)   r)   r*   test_gzip_case_insensitive  s    z#GzipTest.test_gzip_case_insensitiveN)r5   r6   r7   r,  r  r  r)   r)   r)   r*   r    s   r  c                   @   s   e Zd Zdd ZdS )GzipUnsupportedTestc              	   C   s6   t td | d}W 5 Q R X | t|ji  d S )NzUnsupported Content-Encodingr   )r   r   r  rd   r   rG   re   r)   r)   r*   test_gzip_unsupported  s    z)GzipUnsupportedTest.test_gzip_unsupportedN)r5   r6   r7   r  r)   r)   r)   r*   r    s   r  c                   @   sl   e Zd ZdZdZdd Zdd ZG dd deZd	d
 Z	dd Z
dd Zdd Zdd Zdd Zdd ZdS )StreamingChunkSizeTests2   01234567890123456789012345678901234567890123456789   c                 C   s   t  S r$   r   r2   r)   r)   r*   get_http_client  s    z&StreamingChunkSizeTest.get_http_clientc                 C   s   t | jddS )NT)
chunk_sizer  )r\   
CHUNK_SIZEr2   r)   r)   r*   r,    s    z-StreamingChunkSizeTest.get_httpserver_optionsc                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
z&StreamingChunkSizeTest.MessageDelegatec                 C   s
   || _ d S r$   )
connection)r(   r  r)   r)   r*   __init__  s    z/StreamingChunkSizeTest.MessageDelegate.__init__c                 C   s
   g | _ d S r$   )chunk_lengthsr'   r)   r)   r*   r+     s    z7StreamingChunkSizeTest.MessageDelegate.headers_receivedc                 C   s   | j t| d S r$   )r  r,   rU   r-   r)   r)   r*   r0     s    z4StreamingChunkSizeTest.MessageDelegate.data_receivedc                 C   sN   t t| j}| jtdddtdtt|i | j	| | j
  d S )Nr  r   OKr   )r   r   r  r  write_headersr   r   r   rU   r   r4   )r(   Zresponse_bodyr)   r)   r*   r4     s    
z-StreamingChunkSizeTest.MessageDelegate.finishN)r5   r6   r7   r  r+   r0   r4   r)   r)   r)   r*   MessageDelegate  s   r  c                 C   s   G dd dt }| S )Nc                   @   s   e Zd Zdd ZdS )z+StreamingChunkSizeTest.get_app.<locals>.Appc                 S   s
   t |S r$   )r  r  )r(   Zserver_connZrequest_connr)   r)   r*   start_request)  s    z9StreamingChunkSizeTest.get_app.<locals>.App.start_requestN)r5   r6   r7   r  r)   r)   r)   r*   App(  s   r  )r   )r(   r  r)   r)   r*   rD   '  s    zStreamingChunkSizeTest.get_appc                 K   sx   | j dddi|}|  t|j}| t| jt| |D ]2}| || j	dt
|  | |ddt
|  q@|S )NrA   rj   rg   zoversized chunk: r   zempty chunk: )rA   )rE   rF   r   rG   rd   rU   BODYsumZassertLessEqualr  r   assertGreater)r(   rI   rJ   r/   r  r)   r)   r*   fetch_chunk_sizes.  s    
  
z(StreamingChunkSizeTest.fetch_chunk_sizesc                 C   sJ   t  }tjd|d}|| |  | }t|t|krFtd|S )Nr~  r  z#body did not shrink when compressed)r!   r  r  r   r   r  rU   rS   )r(   rG   r  Zgzfile
compressedr)   r)   r*   compress:  s    
zStreamingChunkSizeTest.compressc                 C   s&   | j | jd}| ddddg| d S )N)rG   r     )r  r  rd   )r(   r/   r)   r)   r*   test_regular_bodyD  s    z(StreamingChunkSizeTest.test_regular_bodyc                 C   s   | j | | jddid d S )Nr  r  )rG   r%   )r  r  r  r2   r)   r)   r*   test_compressed_bodyI  s    
 z+StreamingChunkSizeTest.test_compressed_bodyc                    s0    fdd} j |d} ddddg| d S )Nc                    s(   |  j d d  |  j dd   d S N   )r  r   r2   r)   r*   body_producerQ  s    z?StreamingChunkSizeTest.test_chunked_body.<locals>.body_producer)r  r        )r  rd   )r(   r  r/   r)   r2   r*   test_chunked_bodyP  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  rU   r  )r(   r  r)   r  r*   test_chunked_compressedY  s     z.StreamingChunkSizeTest.test_chunked_compressedN)r5   r6   r7   r  r  r  r,  r   r  rD   r  r  r  r  r  r  r)   r)   r)   r*   r    s   
	r  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
MaxHeaderSizeTestc                 C   s   t dtfgS r@   r   rL   r2   r)   r)   r*   rD   g  s    zMaxHeaderSizeTest.get_appc                 C   s
   t ddS )NrS  )Zmax_header_sizer+  r2   r)   r)   r*   r,  j  s    z(MaxHeaderSizeTest.get_httpserver_optionsc                 C   s,   | j dddid}|  | |jd d S )NrA   X-FillerZdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar   rb   )rE   rF   rd   rG   re   r)   r)   r*   test_small_headersm  s    z$MaxHeaderSizeTest.test_small_headersc                 C   s~   t tdddf z"| jdddidd | d	 W n< tk
rn } z|jd k	r^| |jjd
 W 5 d }~X Y nX W 5 Q R X d S )NzUnsatisfiable readFrl   rA   r  A  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaT)r%   rs   z did not raise expected exception)i  iW  )r   r   rE   Zfailr   rJ   ZassertInr   )r(   er)   r)   r*   test_large_headersr  s    
z$MaxHeaderSizeTest.test_large_headersN)r5   r6   r7   rD   r,  r  r  r)   r)   r)   r*   r  f  s   r  c                       s^   e Zd Zdd Zdd Z fddZ fddZejd	d
 Z	e
dd Ze
dd Z  ZS )IdleTimeoutTestc                 C   s   t dtfgS r@   r  r2   r)   r)   r*   rD     s    zIdleTimeoutTest.get_appc                 C   s
   t ddS )Ng?)Zidle_connection_timeoutr+  r2   r)   r)   r*   r,    s    z&IdleTimeoutTest.get_httpserver_optionsc                    s   t    g | _d S r$   )r  r  streamsr2   r  r)   r*   r    s    
zIdleTimeoutTest.setUpc                    s"   t    | jD ]}|  qd S r$   )r  r  r  r   r   r  r)   r*   r    s    

zIdleTimeoutTest.tearDownc                 c   s:   t t }|d|  fV  | j| t|d S r   )r   r   r   r   r  r,   r   re  r   r)   r)   r*   r     s    zIdleTimeoutTest.connectc                 c   s*   |   V }t }||j | V  d S r$   )r   r   set_close_callbackry  r  )r(   r=   eventr)   r)   r*   test_unused_connection  s    
z&IdleTimeoutTest.test_unused_connectionc                 c   sf   |   V }t }||j tdD ]2}|d |dV  |dV }| |d q$|	 V  d S )Nr  rh  r      rb   )
r   r   r  ry  rX  r   r   r   rd   r  )r(   r=   r  rV  r   r)   r)   r*   test_idle_after_use  s    

z#IdleTimeoutTest.test_idle_after_use)r5   r6   r7   rD   r,  r  r  r   r\  r   r   r  r  r%  r)   r)   r  r*   r    s   

r  c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Ze	e
jdkddd Zdd Ze	e
jdkddd Zdd Zdd Zedd Zedd ZdS )BodyLimitsTestc                 C   s8   G dd dt }tG dd dt }td|fd|fgS )Nc                   @   s   e Zd Zdd ZdS )z/BodyLimitsTest.get_app.<locals>.BufferedHandlerc                 S   s   |  tt| jj d S r$   )r   r   rU   rR   rG   r2   r)   r)   r*   put  s    z3BodyLimitsTest.get_app.<locals>.BufferedHandler.putN)r5   r6   r7   r  r)   r)   r)   r*   BufferedHandler  s   r  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
z0BodyLimitsTest.get_app.<locals>.StreamingHandlerc                 S   s
   d| _ d S )Nr   )
bytes_readr2   r)   r)   r*   rP     s    z;BodyLimitsTest.get_app.<locals>.StreamingHandler.initializec                 S   sT   t t| jj}d| jjkr0|t| d d| jjkrP|	t
| d d S )NZexpected_sizebody_timeout)rz   castr
   rR   r  r   Zset_max_body_sizer   r   Zset_body_timeoutfloat)r(   r3   r)   r)   r*   r     s
    z8BodyLimitsTest.get_app.<locals>.StreamingHandler.preparec                 S   s   |  j t|7  _ d S r$   )r  rU   rl  r)   r)   r*   r0     s    z>BodyLimitsTest.get_app.<locals>.StreamingHandler.data_receivedc                 S   s   |  t| j d S r$   )r   r   r  r2   r)   r)   r*   r    s    z4BodyLimitsTest.get_app.<locals>.StreamingHandler.putN)r5   r6   r7   rP   r   r0   r  r)   r)   r)   r*   StreamingHandler  s   r  	/buffered
/streaming)r   r   r   )r(   r  r  r)   r)   r*   rD     s    zBodyLimitsTest.get_appc                 C   s   t dddS )Nrp   i   )r  Zmax_body_sizer+  r2   r)   r)   r*   r,    s    z%BodyLimitsTest.get_httpserver_optionsc                 C   s   t  S r$   r   r2   r)   r)   r*   r    s    zBodyLimitsTest.get_http_clientc                 C   s@   | j dddd}| |jd | j dddd}| |jd d S )Nr  PUTs   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaari   s   4096r  rc   re   r)   r)   r*   test_small_body  s    zBodyLimitsTest.test_small_bodyc              	   C   sB   t tdtjd | jdddd d}W 5 Q R X | |jd d S )	N.*Content-Length too longr  r  r     a (  ri   r   r   r   r  r  rE   rd   r   re   r)   r)   r*   test_large_body_buffered  s    z'BodyLimitsTest.test_large_body_bufferedntzflaky on windowsc              	   C   sB   t tdtjd | jdddd d}W 5 Q R X | |jd d S )	N.*chunked body too larger  r  r  c                 S   s   | dd S Nr  r  r)   r  r)   r)   r*   r     r:   zABodyLimitsTest.test_large_body_buffered_chunked.<locals>.<lambda>rj   r  r   r  re   r)   r)   r*    test_large_body_buffered_chunked  s    z/BodyLimitsTest.test_large_body_buffered_chunkedc              	   C   sB   t tdtjd | jdddd d}W 5 Q R X | |jd d S )	Nr  r  r  r  r  r  ri   r   r  re   r)   r)   r*   test_large_body_streaming  s    z(BodyLimitsTest.test_large_body_streamingc              	   C   sB   t tdtjd | jdddd d}W 5 Q R X | |jd d S )	Nr  r  r  r  c                 S   s   | dd S r  r)   r  r)   r)   r*   r     r:   zBBodyLimitsTest.test_large_body_streaming_chunked.<locals>.<lambda>r  r   r  re   r)   r)   r*   !test_large_body_streaming_chunked  s    z0BodyLimitsTest.test_large_body_streaming_chunkedc                 C   s&   | j dddd d}| |jd d S )N/streaming?expected_size=10240r  r  r  ri      10240rc   re   r)   r)   r*   "test_large_body_streaming_override  s      z1BodyLimitsTest.test_large_body_streaming_overridec                 C   s&   | j dddd d}| |jd d S )Nr  r  c                 S   s   | dd S r  r)   r  r)   r)   r*   r     r:   zKBodyLimitsTest.test_large_body_streaming_chunked_override.<locals>.<lambda>r  r  rc   re   r)   r)   r*   *test_large_body_streaming_chunked_override  s    z9BodyLimitsTest.test_large_body_streaming_chunked_overridec              	   c   sp   t t }zT|d|  fV  |d ttdtj	d |
 V }W 5 Q R X | |d W 5 |  X d S )Nr   s@   PUT /streaming?body_timeout=0.1 HTTP/1.0
Content-Length: 42

zTimeout reading bodyr  r:   )r   r   r   r   r   r   r   r   r  r  r#  rd   )r(   r=   rJ   r)   r)   r*   test_timeout  s    zBodyLimitsTest.test_timeoutc              	   c   s   t t }z|d|  fV  |d |dd  t|V \}}}| |d |d tt	dt
jd | V }W 5 Q R X | |d	 W 5 |  X d S )
Nr   sF   PUT /streaming?expected_size=10240 HTTP/1.1
Content-Length: 10240

r  r  r  s2   PUT /streaming HTTP/1.1
Content-Length: 10240

r  r  rK  )r   r   r   r   r   r   r>   rd   r   r   r  r  r#  )r(   r=   r&   r%   rJ   r   r)   r)   r*   test_body_size_override_reset  s     z,BodyLimitsTest.test_body_size_override_resetN)r5   r6   r7   rD   r,  r  r  r  unittestskipIfr   r   r  r  r  r  r  r   r  r  r)   r)   r)   r*   r    s    


	
r  c                   @   s   e Zd Zdd Zdd ZdS )LegacyInterfaceTestc                    s    fdd}|S )Nc                    sp   | j d _ js:| jtdddt  | j  d S d}| jt	dt
|  | j| | j  d S )NzHTTP/1.r   r   r  rb   z'HTTP/1.1 200 OK
Content-Length: %d

)r   r   http1r  r  r   r   r4   r   r   rU   )rR   messager2   r)   r*   handle_request5  s    
 
z3LegacyInterfaceTest.get_app.<locals>.handle_requestr)   )r(   r  r)   r2   r*   rD   1  s    zLegacyInterfaceTest.get_appc                 C   s,   |  d}| js| d | |jd d S )NrA   r2  rb   )rE   r  r3  rd   rG   re   r)   r)   r*   test_legacy_interfaceH  s    

z)LegacyInterfaceTest.test_legacy_interfaceN)r5   r6   r7   rD   r  r)   r)   r)   r*   r  0  s   r  )eZtornador   r   Ztornado.escaper   r   r   r   r   r	   Ztornado.http1connectionr
   Ztornado.httpclientr   Ztornado.httpserverr   Ztornado.httputilr   r   r   r   Ztornado.iostreamr   Ztornado.locksr   Ztornado.logr   Ztornado.netutilr   Ztornado.simple_httpclientr   Ztornado.testingr   r   r   r   r   Ztornado.test.utilr   Ztornado.webr   r   r   
contextlibr    r  r  r  r   rH  r   r}   sysrC  r  urllib.parser   ior!   rz   TYPE_CHECKINGr"   r#   r>   r?   rL   r  r   ZskipIfOldSSLrY   objectr]   r|   r   r   r   ZTestCaser   r   r   r   r   r   r   r   r  r&  r:  r=  rd  platformrA  rN  r}  r  r  r  r  r  r  r  r)   r)   r)   r*   <module>   s    0	)])As_1 U
_/ 