o
    u3b¶  ã                   @   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<r¹d dl;m=Z=m>Z> dd„ Z?G dd„ de ƒZ@G dd„ de)ƒZAe6 BeCe3d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@ƒZXe6 BeYe2dAƒ �p€e4jZdBkdC¡e6 Be4jZdDkdE¡G dFdG„ dGe"ƒƒƒZ[G dHdI„ dIe ƒZ\G dJdK„ dKe ƒZ]G dLdM„ dMe]e ƒZ^G dNdO„ dOe]e ƒZ_G dPdQ„ dQe ƒZ`G dRdS„ dSe ƒZae&G dTdU„ dUe ƒƒZbG dVdW„ dWe ƒZcG dXdY„ dYe ƒZddS )Zé    )ÚgenÚnetutil)Újson_decodeÚjson_encodeÚutf8Ú_unicodeÚrecursive_unicodeÚ
native_str)ÚHTTP1Connection)Ú	HTTPError)Ú
HTTPServer)ÚHTTPHeadersÚHTTPMessageDelegateÚHTTPServerConnectionDelegateÚResponseStartLine)ÚIOStream)ÚEvent)Úgen_log)Ússl_options_to_context©ÚSimpleAsyncHTTPClient)ÚAsyncHTTPTestCaseÚAsyncHTTPSTestCaseÚAsyncTestCaseÚ	ExpectLogÚgen_test)ÚskipOnTravis)ÚApplicationÚRequestHandlerÚstream_request_body)ÚclosingN)ÚBytesIO)ÚDictÚListc                 ƒ   sP   �g ‰ G ‡ ‡fdd„dt ƒ}t| dƒ‰|ƒ }ˆ |¡I dH  |j|jd ˆ ¡fS )zaReads an HTTP response from `stream` and returns a tuple of its
    start_line, headers and body.c                       s,   e Zd Zdd„ Z‡ fdd„Z‡fdd„ZdS )z"read_stream_body.<locals>.Delegatec                 S   s   || _ || _d S ©N)ÚheadersÚ
start_line©Úselfr&   r%   © r)   ú>/usr/lib/python3/dist-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_received@   ó   z0read_stream_body.<locals>.Delegate.data_receivedc                    s   ˆ   ¡  d S r$   )Údetach©r(   )Úconnr)   r*   ÚfinishC   ó   z)read_stream_body.<locals>.Delegate.finishN)Ú__name__Ú
__module__Ú__qualname__r+   r0   r5   r)   ©r/   r4   r)   r*   ÚDelegate;   s    r;   TNó    )r   r
   Úread_responser&   r%   Újoin)Ústreamr;   Údelegater)   r:   r*   Úread_stream_body6   s   €
rA   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚHandlerBaseTestCaseNc                 C   s   t d| jjfgƒS ©Nú/)r   Ú	__class__ÚHandlerr3   r)   r)   r*   Úget_appO   s   zHandlerBaseTestCase.get_appc                 O   s"   | j |i |¤Ž}| ¡  t|jƒS r$   )ÚfetchÚrethrowr   Úbody)r(   ÚargsÚkwargsÚresponser)   r)   r*   Ú
fetch_jsonR   s   
zHandlerBaseTestCase.fetch_json)r7   r8   r9   rF   rG   rN   r)   r)   r)   r*   rB   L   s    rB   c                   @   s&   e Zd Zd	dd„Zdd„ Zdd„ ZdS )
ÚHelloWorldRequestHandlerÚhttpc                 C   ó
   || _ d S r$   )Úexpected_protocol)r(   Úprotocolr)   r)   r*   Ú
initializeY   ó   
z#HelloWorldRequestHandler.initializec                 C   s$   | j j| jkrtdƒ‚|  d¡ d S )Nzunexpected protocolúHello world)ÚrequestrS   rR   Ú	Exceptionr5   r3   r)   r)   r*   Úget\   s   zHelloWorldRequestHandler.getc                 C   s   |   dt| jjƒ ¡ d S )NzGot %d bytes in POST)r5   ÚlenrW   rJ   r3   r)   r)   r*   Úposta   ó   zHelloWorldRequestHandler.postN)rP   )r7   r8   r9   rT   rY   r[   r)   r)   r)   r*   rO   X   s    
rO   ÚOPENSSL_VERSION_INFO)r   r   )é   r   z(old version of ssl module and/or opensslc                   @   ó   e Zd Zdd„ ZdS )ÚBaseSSLTestc                 C   s   t dttdd�fgƒS )NrD   Úhttps©rS   )r   rO   Údictr3   r)   r)   r*   rG   q   ó   zBaseSSLTest.get_appN)r7   r8   r9   rG   r)   r)   r)   r*   r`   p   ó    r`   c                   @   s\   e Zd Zdd„ Zdd„ Zdejfdd„Zdejfdd	„Zdejfd
d„Z	dejfdd„Z
dS )ÚSSLTestMixinc                 C   s   t dd|  ¡ it ¡ ¤ŽS )NÚssl_versionr)   )rc   Úget_ssl_versionr   Údefault_ssl_optionsr3   r)   r)   r*   Úget_ssl_optionsv   s
   ÿþzSSLTestMixin.get_ssl_optionsc                 C   s   t ƒ ‚r$   )ÚNotImplementedErrorr3   r)   r)   r*   rh   |   ó   zSSLTestMixin.get_ssl_versionr(   c                 C   s   |   d¡}|  |jd¡ d S )NrD   ó   Hello world©rH   ÚassertEqualrJ   ©r(   rM   r)   r)   r*   Útest_ssl   s   
zSSLTestMixin.test_sslc                 C   ó&   | j dddd d�}|  |jd¡ d S )NrD   ÚPOSTÚAiˆ  ©ÚmethodrJ   s   Got 5000 bytes in POSTrn   rp   r)   r)   r*   Útest_large_postƒ   s   zSSLTestMixin.test_large_postc              
   C   s¼   t tdƒ�O t tddd��/ |  ttf¡� | j|  d¡ dd¡ddd	d
� W d   ƒ n1 s0w   Y  W d   ƒ n1 s?w   Y  W d   ƒ d S W d   ƒ d S 1 sWw   Y  d S )Nz(SSL Error|uncaught exception)zUncaught exceptionF©ÚrequiredrD   úhttps:úhttp:é  T)Úrequest_timeoutÚconnect_timeoutÚraise_error)r   r   ÚassertRaisesÚIOErrorr   rH   Úget_urlÚreplacer3   r)   r)   r*   Útest_non_ssl_request‡   s   üÿ€ÿÿ"ÿz!SSLTestMixin.test_non_ssl_requestc              	   C   s„   t tdƒ�-}|  ttf¡� | j|  d¡ dd¡dd� W d   ƒ n1 s&w   Y  W d   ƒ n1 s5w   Y  |  |j	¡ d S )Nz	SSL ErrorrD   rz   r{   T)r   )
r   r   r€   r�   r   rH   r‚   rƒ   ÚassertFalseÚlogged_stack)r(   Ú
expect_logr)   r)   r*   Útest_error_logging•   s   ÿÿ€ÿzSSLTestMixin.test_error_loggingN)r7   r8   r9   rj   rh   ÚtypingÚAnyrq   rw   r„   rˆ   r)   r)   r)   r*   rf   u   s    rf   c                   @   r_   )Ú
SSLv23Testc                 C   ó   t jS r$   )ÚsslÚPROTOCOL_SSLv23r3   r)   r)   r*   rh   ¦   rl   zSSLv23Test.get_ssl_versionN©r7   r8   r9   rh   r)   r)   r)   r*   r‹   ¥   re   r‹   c                   @   r_   )Ú	SSLv3Testc                 C   rŒ   r$   )r�   ÚPROTOCOL_SSLv3r3   r)   r)   r*   rh   ¬   rl   zSSLv3Test.get_ssl_versionNr�   r)   r)   r)   r*   r�   ª   ó    r�   c                   @   r_   )Ú	TLSv1Testc                 C   rŒ   r$   )r�   ÚPROTOCOL_TLSv1r3   r)   r)   r*   rh   ²   rl   zTLSv1Test.get_ssl_versionNr�   r)   r)   r)   r*   r“   °   r’   r“   c                   @   r_   )ÚSSLContextTestc                 C   s"   t t | ¡ƒ}t|tjƒsJ ‚|S r$   )r   r   rj   Ú
isinstancer�   Ú
SSLContext)r(   Úcontextr)   r)   r*   rj   ·   s   zSSLContextTest.get_ssl_optionsN)r7   r8   r9   rj   r)   r)   r)   r*   r•   ¶   re   r•   c                   @   ó   e Zd Zdd„ Zdd„ ZdS )ÚBadSSLOptionsTestc                 C   s    t ƒ }| jtt|ddid� d S )NÚkeyfilez/__missing__.crt©Ú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)r7   r8   r9   r    rª   r)   r)   r)   r*   rš   ½   s    	rš   c                   @   r_   )ÚMultipartTestHandlerc                 C   sH   |   | jjd |  d¡| jjd d jt| jjd d d ƒdœ¡ d S )NzX-Header-Encoding-TestÚargumentÚfilesr   rJ   )Úheaderr¬   ÚfilenameÚfilebody)r5   rW   r%   Úget_argumentr­   r¯   r   r3   r)   r)   r*   r[   ç   s   
üÿzMultipartTestHandler.postN©r7   r8   r9   r[   r)   r)   r)   r*   r«   æ   re   r«   c                   @   sB   e Zd Zdd„ Zdd„ Zddd„Zdd	„ Zd
d„ Zedd„ ƒZ	dS )ÚHTTPConnectionTestc                 C   s   dt fdtfgS )Nz
/multipartú/hello)r«   rO   r3   r)   r)   r*   Úget_handlersô   s   þzHTTPConnectionTest.get_handlersc                 C   s   t |  ¡ ƒS r$   )r   rµ   r3   r)   r)   r*   rG   ú   r6   zHTTPConnectionTest.get_appó   
c              
      s–   t tt ¡ ƒƒ�9‰ˆ j ‡ ‡fdd„¡ ˆ | |tdt|ƒ ƒg ¡| | | ¡ ˆ j ‡fdd„¡\}}}|W  d   ƒ S 1 sDw   Y  d S )Nc                      s   ˆ  dˆ  ¡ f¡S ©Nú	127.0.0.1)ÚconnectÚget_http_portr)   ©r(   r?   r)   r*   Ú<lambda>   s    z.HTTPConnectionTest.raw_fetch.<locals>.<lambda>zContent-Length: %dc                      s   t ˆ ƒS r$   )rA   r)   )r?   r)   r*   r¼   	  s    )	r    r   ÚsocketÚio_loopÚrun_syncÚwriter>   r   rZ   )r(   r%   rJ   Únewliner&   r)   r»   r*   Ú	raw_fetchý   s$   ÿÿþýÿ

ÿ$ózHTTPConnectionTest.raw_fetchc                 C   s†   |   g d¢d ddd d¡dd d	¡dd
 d¡ddg	¡¡}t|ƒ}|  d|d ¡ |  d|d ¡ |  d|d ¡ |  d
|d ¡ d S )N)s   POST /multipart HTTP/1.0s6   Content-Type: multipart/form-data; boundary=1234567890s   X-Header-encoding-test: ér¶   s-   Content-Disposition: form-data; name=argumentr<   õ   Ã¡zutf-8s   --1234567890u;   Content-Disposition: form-data; name="files"; filename="Ã³"r   õ   Ãºs   --1234567890--õ   Ã©r®   r¬   õ   Ã³r¯   r°   )rÂ   r>   Úencoder   ro   ©r(   rM   Údatar)   r)   r*   Útest_multipart_form  s,   ÿõÿúz&HTTPConnectionTest.test_multipart_formc                 C   s,   dD ]}| j dgd|d�}|  |d¡ qd S )N)r¶   ó   
s   GET /hello HTTP/1.0r<   )rÁ   rm   )rÂ   ro   )r(   rÁ   rM   r)   r)   r*   Útest_newlines,  s   þz HTTPConnectionTest.test_newlinesc                 c   sÊ   � t t ¡ ƒ}| d|  ¡ f¡V  | d g d¢¡¡V  | d¡V }|  | d¡|¡ | d¡ | d¡V }|  | d¡|¡ | d¡V }t	 
t| d¡ƒ¡}| t|d	 ƒ¡V }|  |d
¡ | ¡  d S )Nr¸   r¶   )s   POST /hello HTTP/1.1s   Content-Length: 1024s   Expect: 100-continues   Connection: closer¶   ó   

s   HTTP/1.1 100 s   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaó   HTTP/1.1 200Úlatin1úContent-Lengths   Got 1024 bytes in POST)r   r½   r¹   rº   rÀ   r>   Ú
read_untilÚ
assertTrueÚ
startswithr   Úparser	   ÚdecodeÚ
read_bytesÚintro   Úclose)r(   r?   rÉ   Ú
first_lineÚheader_datar%   rJ   r)   r)   r*   Útest_100_continue2  s$   €ÿÿ
z$HTTPConnectionTest.test_100_continueN)r¶   )
r7   r8   r9   rµ   rG   rÂ   rÊ   rÌ   r   rÛ   r)   r)   r)   r*   r³   ó   s    
r³   c                   @   r™   )ÚEchoHandlerc                 C   ó   |   t| jjƒ¡ d S r$   ©rÀ   r   rW   Ú	argumentsr3   r)   r)   r*   rY   Q  rd   zEchoHandler.getc                 C   rÝ   r$   rÞ   r3   r)   r)   r*   r[   T  rd   zEchoHandler.postN©r7   r8   r9   rY   r[   r)   r)   r)   r*   rÜ   P  ó    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 )Nrv   ÚuriÚversionÚ	remote_iprS   Úhostr£   ÚqueryÚ
header_keyr   Úheader_valueÚ
cookie_keyÚcookie_valueÚarg_keyÚ	arg_value)ÚerrorsÚstrÚ
check_typeÚgetattrrW   Úlistr%   ÚkeysÚvaluesÚcookiesÚvaluerß   Úbytes)r(   ÚfieldsÚfieldÚexpected_typer)   r)   r*   ÚprepareY  s(   ø
ÿ&zTypeCheckHandler.preparec                 C   s"   |   d| jjt¡ |  | j¡ d S )NrJ   )rñ   rW   rJ   rø   rÀ   rï   r3   r)   r)   r*   r[   t  s   zTypeCheckHandler.postc                 C   s   |   | j¡ d S r$   )rÀ   rï   r3   r)   r)   r*   rY   x  ó   zTypeCheckHandler.getc                 C   s*   t |ƒ}||krd||f | j|< d S d S )Nzexpected %s, got %s)Útyperï   )r(   ÚnameÚobjrû   Úactual_typer)   r)   r*   rñ   {  s   ÿzTypeCheckHandler.check_typeN)r7   r8   r9   rü   r[   rY   rñ   r)   r)   r)   r*   rã   X  s
    rã   c                   @   r_   )ÚPostEchoHandlerc                 G   s   |   t|  d¡d�¡ d S )NrÉ   )Úecho)rÀ   rc   r±   )r(   Ú	path_argsr)   r)   r*   r[   ‚  r\   zPostEchoHandler.postNr²   r)   r)   r)   r*   r  �  re   r  c                   @   s   e Zd Zddd„ZdS )ÚPostEchoGBKHandlerNc                 C   s*   z|  d¡W S  ty   tdd| ƒ‚w )NÚgbké�  zinvalid gbk bytes: %r)rÕ   rX   r   )r(   r÷   rÿ   r)   r)   r*   Údecode_argument‡  s
   ÿz"PostEchoGBKHandler.decode_argumentr$   )r7   r8   r9   r  r)   r)   r)   r*   r  †  s    r  c                   @   sD   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dS )ÚHTTPServerTestc                 C   s&   t dtfdtfdtfdtfdtfgƒS )Nú/echoú
/typecheckú//doubleslashz
/post_utf8z	/post_gbk)r   rÜ   rã   r  r  r3   r)   r)   r*   rG   �  s   ûÿzHTTPServerTest.get_appc                 C   s*   |   d¡}t|jƒ}|  |ddgi¡ d S )Nz/echo?foo=%C3%A9ÚfoorÅ   ©rH   r   rJ   ro   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
  rs   z	foo=&bar=ru   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  rs   ©rv   rJ   r%   r  )r(   r%   rM   rÉ   r)   r)   r*   Ú
test_types©  s   
ÿ
zHTTPServerTest.test_typesc                 C   s.   |   d¡}|  d|j¡ |  t|jƒi ¡ d S )Nr  éÈ   )rH   ro   Úcoder   rJ   rp   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_rs   s   data=)rv   r%   rJ   r  )	ÚsubTestrÇ   ÚurllibrÔ   r  rH   ro   r   rJ   )r(   r%   Úuni_textr  r  Úbin_textrM   r)   r)   r*   Útest_post_encodings½  s&   
üö€ÿÿz"HTTPServerTest.test_post_encodingsN)
r7   r8   r9   rG   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   ó   t dtfgƒS )Nr
  ©r   rÜ   r3   r)   r)   r*   rG   Ð  r1   zHTTPServerRawTest.get_appc                    s0   t ƒ  ¡  tt ¡ ƒˆ _ˆ j ‡ fdd„¡ d S )Nc                      s   ˆ j  dˆ  ¡ f¡S r·   )r?   r¹   rº   r)   r3   r)   r*   r¼   ×  s    z)HTTPServerRawTest.setUp.<locals>.<lambda>)ÚsuperÚsetUpr   r½   r?   r¾   r¿   r3   ©rE   r3   r*   r(  Ó  s
   

ÿzHTTPServerRawTest.setUpc                    s   | j  ¡  tƒ  ¡  d S r$   )r?   rØ   r'  ÚtearDownr3   r)  r)   r*   r*  Ú  s   
zHTTPServerRawTest.tearDownc                 C   s.   | j  ¡  | j tjdd�| j¡ |  ¡  d S )Nçü©ñÒMbP?©Úseconds)r?   rØ   r¾   Úadd_timeoutÚdatetimeÚ	timedeltaÚstopÚwaitr3   r)   r)   r*   Útest_empty_requestÞ  s   
z$HTTPServerRawTest.test_empty_requestc                    s†   t tdtjd��1 ˆ j d¡ ˆ j ‡ fdd„¡\}}}ˆ  d|j	¡ ˆ  d|j
¡ ˆ  d|j¡ W d   ƒ d S 1 s<w   Y  d S )	Nú.*Malformed HTTP request line©Úleveló   asdf

c                      ó
   t ˆ jƒS r$   ©rA   r?   r)   r3   r)   r*   r¼   ç  ó   
 zFHTTPServerRawTest.test_malformed_first_line_response.<locals>.<lambda>úHTTP/1.1r  zBad Request)r   r   ÚloggingÚINFOr?   rÀ   r¾   r¿   ro   rå   r  Úreason©r(   r&   r%   rM   r)   r3   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 )Nr4  r5  r7  çš™™™™™©?r,  ©r   r   r<  r=  r?   rÀ   r¾   r.  r/  r0  r1  r2  r3   r)   r)   r*   Útest_malformed_first_line_logí  s
   
"ûz/HTTPServerRawTest.test_malformed_first_line_logc                 C   rA  )Nz1.*Malformed HTTP message.*no colon in header liner5  s   GET / HTTP/1.0
asdf

rB  r,  rC  r3   r)   r)   r*   Útest_malformed_headersõ  s   ý
"ùz(HTTPServerRawTest.test_malformed_headersc                    óH   ˆ j  d dd¡¡ ˆ j ‡ fdd„¡\}}}ˆ  t|ƒddgi¡ d S )Nsp   POST /echo HTTP/1.1
Transfer-Encoding: chunked
Content-Type: application/x-www-form-urlencoded

4
foo=
3
bar
0

rË   r¶   c                      r8  r$   r9  r)   r3   r)   r*   r¼     r:  z=HTTPServerRawTest.test_chunked_request_body.<locals>.<lambda>r  r  ©r?   rÀ   rƒ   r¾   r¿   ro   r   r?  r)   r3   r*   Útest_chunked_request_bodyÿ  ó   ÿô

ÿz+HTTPServerRawTest.test_chunked_request_bodyc                    rF  )Nsp   POST /echo HTTP/1.1
Transfer-Encoding: Chunked
Content-Type: application/x-www-form-urlencoded

4
foo=
3
bar
0

rË   r¶   c                      r8  r$   r9  r)   r3   r)   r*   r¼   +  r:  zBHTTPServerRawTest.test_chunked_request_uppercase.<locals>.<lambda>r  r  rG  r?  r)   r3   r*   Útest_chunked_request_uppercase  rI  z0HTTPServerRawTest.test_chunked_request_uppercasec                 c   sX   � t tdtjd�� | j d dd¡¡ | j ¡ V  W d   ƒ d S 1 s%w   Y  d S )Nz(.*Only integer Content-Length is allowedr5  s.   POST /echo HTTP/1.1
Content-Length: foo

bar

rË   r¶   )r   r   r<  r=  r?   rÀ   rƒ   Úread_until_closer3   r)   r)   r*   Útest_invalid_content_length/  s   €ÿÿù"òz-HTTPServerRawTest.test_invalid_content_length)r7   r8   r9   rG   r(  r*  r3  r@  rD  rE  rH  rJ  r   rL  Ú__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_headerrW   rå   rÀ   rc   ræ   rS   r3   r)   r)   r*   rY   D  s   þÿzXHeaderTest.Handler.getN©r7   r8   r9   rY   r)   r)   r)   r*   rF   C  re   rF   c                 C   s   t ddgd�S )NTz5.5.5.5)ÚxheadersÚtrusted_downstream©rc   r3   r)   r)   r*   Úget_httpserver_optionsM  r1   z"XHeaderTest.get_httpserver_optionsc                 C   s  |   |  d¡d d¡ ddi}|   | jd|d�d d¡ ddi}|   | jd|d�d d¡ dd	i}|   | jd|d�d d	¡ dd
i}|   | jd|d�d d	¡ ddi}|   | jd|d�d d¡ ddi}|   | jd|d�d d¡ ddi}|   | jd|d�d d¡ d S )NrD   ræ   r¸   z	X-Real-IPú4.4.4.4r  úX-Forwarded-Forz127.0.0.1, 4.4.4.4z2620:0:1cfe:face:b00c::3z::1, 2620:0:1cfe:face:b00c::3z4.4.4.4<script>z4.4.4.4, 5.5.5.5<script>zwww.google.com©ro   rN   )r(   Ú
valid_ipv4Úvalid_ipv4_listÚ
valid_ipv6Úvalid_ipv6_listÚinvalid_charsÚinvalid_chars_listÚinvalid_hostr)   r)   r*   Útest_ip_headersP  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 )
NrX  z127.0.0.1, 4.4.4.4, 5.5.5.5rD   r  rO  zHTTP/2úrequires HTTP/1.xræ   rW  )rH   r%   rÓ   ÚskipTestr   rJ   ro   )r(   r[  ÚrespÚresultr)   r)   r*   Útest_trusted_downstreamx  s   

z#XHeaderTest.test_trusted_downstreamc                 C   sÄ   |   |  d¡d d¡ ddi}|   | jd|d�d d¡ ddi}|   | jd|d�d d¡ ddi}|   | jd|d�d d¡ dd	i}|   | jd|d�d d¡ dd
i}|   | jd|d�d d¡ d S )NrD   rP  rP   úX-Schemera   r  zX-Forwarded-Protozhttps , httpz
http,httpsÚunknownrY  )r(   Úhttps_schemeÚhttps_forwardedÚhttps_multi_forwardedÚhttp_multi_forwardedÚbad_forwardedr)   r)   r*   Útest_scheme_headers‚  s.   ÿÿþþÿzXHeaderTest.test_scheme_headersN)	r7   r8   r9   r   rF   rV  ra  rf  rn  r)   r)   r)   r*   rN  B  s    
(
rN  c                       s,   e Zd Zdd„ Z‡ fdd„Zdd„ Z‡  ZS )ÚSSLXHeaderTestc                 C   s   t dtjfgƒS rC   )r   rN  rF   r3   r)   r)   r*   rG   ¢  rý   zSSLXHeaderTest.get_appc                    s   t ƒ  ¡ }d|d< |S )NTrS  )r'  rV  )r(   Úoutputr)  r)   r*   rV  ¥  s   
z%SSLXHeaderTest.get_httpserver_optionsc                 C   s^   |   |  d¡d d¡ ddi}|   | jd|d�d d¡ ddi}|   | jd|d�d d¡ d S )NrD   rP  ra   rg  rP   r  rh  rY  )r(   Úhttp_schemeÚ
bad_schemer)   r)   r*   Útest_request_without_xprotocolª  s   ÿÿz-SSLXHeaderTest.test_request_without_xprotocol)r7   r8   r9   rG   rV  rs  rM  r)   r)   r)  r*   ro  ¡  s    ro  c                   @   s,   e Zd ZG dd„ deƒZdd„ Zdd„ ZdS )ÚManualProtocolTestc                   @   r_   )zManualProtocolTest.Handlerc                 C   s   |   t| jjd�¡ d S )Nrb   )rÀ   rc   rW   rS   r3   r)   r)   r*   rY   º  s   zManualProtocolTest.Handler.getNrR  r)   r)   r)   r*   rF   ¹  re   rF   c                 C   ó
   t dd�S )Nra   rb   rU  r3   r)   r)   r*   rV  ½  rU   z)ManualProtocolTest.get_httpserver_optionsc                 C   s   |   |  d¡d d¡ d S )NrD   rS   ra   rY  r3   r)   r)   r*   Útest_manual_protocolÀ  r\   z'ManualProtocolTest.test_manual_protocolN)r7   r8   r9   r   rF   rV  rv  r)   r)   r)   r*   rt  ¸  s    rt  ÚAF_UNIXÚcygwinz+unix sockets not supported on this platformÚgnu0z=unix sockets with SO_REUSEADDR not supported on this platformc                       sD   e Zd ZdZ‡ fdd„Z‡ fdd„Zedd„ ƒZedd	„ ƒZ‡  Z	S )
ÚUnixSocketTesta…  HTTPServers can listen on Unix sockets too.

    Why would you want to do this?  Nginx can proxy to backends listening
    on unix sockets, for one thing (and managing a namespace for unix
    sockets can be easier than managing a bunch of TCP port numbers).

    Unfortunately, there's no way to specify a unix socket in a url for
    an HTTP client, so we have to test this by hand.
    c                    s€   t ƒ  ¡  t ¡ ˆ _tj ˆ jd¡ˆ _t	 
ˆ j¡}tdtfgƒ}t|ƒˆ _ˆ j |¡ tt tj¡ƒˆ _ˆ j ‡ fdd„¡ d S )Nz	test.sockr´   c                      s   ˆ j  ˆ j¡S r$   )r?   r¹   Úsockfiler)   r3   r)   r*   r¼   Þ  s    z&UnixSocketTest.setUp.<locals>.<lambda>)r'  r(  ÚtempfileÚmkdtempÚtmpdirr¢   r£   r>   r{  r   Úbind_unix_socketr   rO   r   ÚserverÚ
add_socketr   r½   rw  r?   r¾   r¿   )r(   ÚsockÚappr)  r3   r*   r(  Õ  s   


zUnixSocketTest.setUpc                    s>   | j  ¡  | j | jj¡ | j ¡  t | j	¡ t
ƒ  ¡  d S r$   )r?   rØ   r¾   r¿   r€  Úclose_all_connectionsr1  ÚshutilÚrmtreer~  r'  r*  r3   r)  r)   r*   r*  à  s
   

zUnixSocketTest.tearDownc                 c   sl   � | j  d¡ | j  d¡V }|  |d¡ | j  d¡V }t | d¡¡}| j  t|d ƒ¡V }|  |d¡ d S )Ns   GET /hello HTTP/1.0

r¶   s   HTTP/1.1 200 OK
rÍ   rÏ   rÐ   rm   )	r?   rÀ   rÑ   ro   r   rÔ   rÕ   rÖ   r×   )r(   rM   rÚ   r%   rJ   r)   r)   r*   Útest_unix_socketç  s   €zUnixSocketTest.test_unix_socketc                 c   sT   � t tdƒ� | j d¡ | j ¡ V }W d   ƒ n1 sw   Y  |  |d¡ d S )NzMalformed HTTP message froms   garbage

ó   HTTP/1.1 400 Bad Request

)r   r   r?   rÀ   rK  ro   rp   r)   r)   r*   Útest_unix_socket_bad_requestñ  s   €þz+UnixSocketTest.test_unix_socket_bad_request)
r7   r8   r9   Ú__doc__r(  r*  r   r‡  r‰  rM  r)   r)   r)  r*   rz  Ä  s    

	rz  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 )&ÚKeepAliveTestz¥Tests various scenarios for HTTP 1.1 keep-alive support.

    These tests don't use AsyncHTTPClient because we want to control
    connection reuse and closing.
    c              	   C   sr   G dd„ dt ƒ}G dd„ dt ƒ}G dd„ dt ƒ}G dd„ dt ƒ}tƒ | _td	|fd
|fd|fd|t| jd�fgƒS )Nc                   @   r™   )z+KeepAliveTest.get_app.<locals>.HelloHandlerc                 S   ó   |   d¡ d S ©NrV   ©r5   r3   r)   r)   r*   rY     r1   z/KeepAliveTest.get_app.<locals>.HelloHandler.getc                 S   rŒ  r�  rŽ  r3   r)   r)   r*   r[     r1   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>   Úranger3   r)   r)   r*   rY     s   "z/KeepAliveTest.get_app.<locals>.LargeHandler.getNrR  r)   r)   r)   r*   ÚLargeHandler
  re   r—  c                   @   s   e Zd Zejdd„ ƒZdS )z=KeepAliveTest.get_app.<locals>.TransferEncodingChunkedHandlerc                 s   s   � |   d¡ |  ¡ V  d S r�  )rÀ   Úflushr3   r)   r)   r*   Úhead  s   €
zBKeepAliveTest.get_app.<locals>.TransferEncodingChunkedHandler.headN)r7   r8   r9   r   Ú	coroutiner™  r)   r)   r)   r*   ÚTransferEncodingChunkedHandler  s    r›  c                   @   s*   e Zd Zdd„ Zejdd„ ƒZdd„ ZdS )z3KeepAliveTest.get_app.<locals>.FinishOnCloseHandlerc                 S   rQ   r$   ©Úcleanup_event)r(   r�  r)   r)   r*   rT     rU   z>KeepAliveTest.get_app.<locals>.FinishOnCloseHandler.initializec                 s   s   � |   ¡  | j ¡ V  d S r$   )r˜  r�  r2  r3   r)   r)   r*   rY     s   €z7KeepAliveTest.get_app.<locals>.FinishOnCloseHandler.getc                 S   rŒ  )NÚclosedrŽ  r3   r)   r)   r*   Úon_connection_close  s   zGKeepAliveTest.get_app.<locals>.FinishOnCloseHandler.on_connection_closeN)r7   r8   r9   rT   r   rš  rY   rŸ  r)   r)   r)   r*   ÚFinishOnCloseHandler  s
    
r   rD   z/largez/chunkedz/finish_on_closerœ  )r   r   r�  r   rc   )r(   r�  r—  r›  r   r)   r)   r*   rG     s   
ýüÿzKeepAliveTest.get_appc                    s   t ƒ  ¡  d| _d S )Ns   HTTP/1.1)r'  r(  Úhttp_versionr3   r)  r)   r*   r(  3  ó   

zKeepAliveTest.setUpc                    sB   | j  tjdd�| j¡ |  ¡  t| dƒr| j ¡  t	ƒ  
¡  d S )Nr+  r,  r?   )r¾   r.  r/  r0  r1  r2  Úhasattrr?   rØ   r'  r*  r3   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º   r3   r)   r)   r*   r¹   B  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_headersG  s   €
zKeepAliveTest.read_headersc                 c   s6   � |   ¡ V | _| j t| jd ƒ¡V }|  d|¡ d S )NrÐ   rm   )r¦  r%   r?   rÖ   r×   ro   )r(   rJ   r)   r)   r*   r=   O  s   €zKeepAliveTest.read_responsec                 C   s   | j  ¡  | ` d S r$   )r?   rØ   r3   r)   r)   r*   rØ   U  s   
zKeepAliveTest.closec                 c   óD   � |   ¡ V  | j d¡ |  ¡ V  | j d¡ |  ¡ V  |  ¡  d S )Nó   GET / HTTP/1.1

©r¹   r?   rÀ   r=   rØ   r3   r)   r)   r*   Útest_two_requestsY  s   €


zKeepAliveTest.test_two_requestsc                 c   sX   � |   ¡ V  | j d¡ |  ¡ V  | j ¡ V }|  | ¡ |  | jd d¡ |  ¡  d S )Ns%   GET / HTTP/1.1
Connection: close

Ú
ConnectionrØ   )	r¹   r?   rÀ   r=   rK  rÒ   ro   r%   rØ   ©r(   rÉ   r)   r)   r*   Útest_request_closeb  s   €

z KeepAliveTest.test_request_closec                 c   s\   � d| _ |  ¡ V  | j d¡ |  ¡ V  | j ¡ V }|  | ¡ |  d| jv¡ |  ¡  d S )Nó   HTTP/1.0s   GET / HTTP/1.0

r«  )	r¡  r¹   r?   rÀ   r=   rK  rÒ   r%   rØ   r¬  r)   r)   r*   Útest_http10m  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=   ro   r%   rØ   r3   r)   r)   r*   Útest_http10_keepalivex  ó   €


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²  r3   r)   r)   r*   Ú test_http10_keepalive_extra_crlf„  r´  z.KeepAliveTest.test_http10_keepalive_extra_crlfc                 c   s8   � |   ¡ V  | j d¡ |  ¡ V  |  ¡ V  |  ¡  d S ©Ns$   GET / HTTP/1.1

GET / HTTP/1.1

r©  r3   r)   r)   r*   Útest_pipelined_requests�  s   €


z%KeepAliveTest.test_pipelined_requestsc                 c   s.   � |   ¡ V  | j d¡ |  ¡ V  |  ¡  d S r·  r©  r3   r)   r)   r*   Útest_pipelined_cancel˜  s
   €

z#KeepAliveTest.test_pipelined_cancelc                 c   s<   � |   ¡ V  | j d¡ |  ¡ V  | j d¡V  |  ¡  d S )Ns   GET /large HTTP/1.1

r‘  )r¹   r?   rÀ   r¦  rÖ   rØ   r3   r)   r)   r*   Útest_cancel_during_download   s   €

z)KeepAliveTest.test_cancel_during_downloadc                 c   s8   � |   ¡ V  | j d¡ |  ¡ V  |  ¡  | j ¡  d S )Ns!   GET /finish_on_close HTTP/1.1

)r¹   r?   rÀ   r¦  rØ   r�  Úsetr3   r)   r)   r*   Útest_finish_while_closed¨  s   €

z&KeepAliveTest.test_finish_while_closedc                 c   rµ  )Nr®  sL   POST / HTTP/1.0
Connection: keep-alive
Transfer-Encoding: chunked

0

r«  r±  r°  r²  r3   r)   r)   r*   Útest_keepalive_chunked±  s   €
ÿ

z$KeepAliveTest.test_keepalive_chunkedc                 c   r§  )Ns   HEAD /chunked HTTP/1.1

)r¹   r?   rÀ   r¦  rØ   r3   r)   r)   r*   Ú#test_keepalive_chunked_head_no_bodyÄ  s   €


z1KeepAliveTest.test_keepalive_chunked_head_no_body)r7   r8   r9   rŠ  rG   r(  r*  r   rš  r¹   r¦  r=   rØ   r   rª  r­  r¯  r³  r¶  r¸  r¹  rº  r¼  r½  r¾  rM  r)   r)   r)  r*   r‹  û  sD    1














r‹  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚGzipBaseTestc                 C   r%  rC   r&  r3   r)   r)   r*   rG   Ð  r1   zGzipBaseTest.get_appc                 C   sH   t ƒ }tjd|d�}| t|ƒ¡ | ¡  | ¡ }| jdd|ddid�S )NÚw©ÚmodeÚfileobjrD   rs   úContent-EncodingÚgzipr  )r!   rÅ  ÚGzipFilerÀ   r   rØ   ÚgetvaluerH   )r(   rJ   ÚbytesioÚ	gzip_fileÚcompressed_bodyr)   r)   r*   Ú	post_gzipÓ  s   üzGzipBaseTest.post_gzipc                 C   s,   | j dddd�}|  t|jƒddgi¡ d S )NrD   rs   r  ru   r  r  )rH   ro   r   rJ   rp   r)   r)   r*   Útest_uncompressedà  s   zGzipBaseTest.test_uncompressedN)r7   r8   r9   rG   rË  rÌ  r)   r)   r)   r*   r¿  Ï  s    r¿  c                   @   r™   )ÚGzipTestc                 C   ru  )NT)Údecompress_requestrU  r3   r)   r)   r*   rV  æ  rU   zGzipTest.get_httpserver_optionsc                 C   s&   |   d¡}|  t|jƒddgi¡ d S )Nr  r  r  )rË  ro   r   rJ   rp   r)   r)   r*   Ú	test_gzipé  s   
zGzipTest.test_gzipN)r7   r8   r9   rV  rÏ  r)   r)   r)   r*   rÍ  å  rá   rÍ  c                   @   r_   )ÚGzipUnsupportedTestc                 C   sJ   t tdƒ� |  d¡}W d   ƒ n1 sw   Y  |  t|jƒi ¡ d S )NzUnsupported Content-Encodingr  )r   r   rË  ro   r   rJ   rp   r)   r)   r*   Útest_gzip_unsupportedï  s   ÿz)GzipUnsupportedTest.test_gzip_unsupportedN)r7   r8   r9   rÑ  r)   r)   r)   r*   rÐ  î  re   rÐ  c                   @   sl   e Zd ZdZdZdd„ Zdd„ ZG dd„ deƒZd	d
„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚStreamingChunkSizeTests2   01234567890123456789012345678901234567890123456789é   c                 C   ó   t ƒ S r$   r   r3   r)   r)   r*   Úget_http_clientý  ó   z&StreamingChunkSizeTest.get_http_clientc                 C   s   t | jdd�S )NT)Ú
chunk_sizerÎ  )rc   Ú
CHUNK_SIZEr3   r)   r)   r*   rV    r1   z-StreamingChunkSizeTest.get_httpserver_optionsc                   @   râ   )
z&StreamingChunkSizeTest.MessageDelegatec                 C   rQ   r$   )Ú
connection)r(   rÙ  r)   r)   r*   Ú__init__  rU   z/StreamingChunkSizeTest.MessageDelegate.__init__c                 C   s
   g | _ d S r$   )Úchunk_lengthsr'   r)   r)   r*   r+   	  rU   z7StreamingChunkSizeTest.MessageDelegate.headers_receivedc                 C   s   | j  t|ƒ¡ d S r$   )rÛ  r,   rZ   r-   r)   r)   r*   r0     ó   z4StreamingChunkSizeTest.MessageDelegate.data_receivedc                 C   sN   t t| jƒƒ}| j tdddƒtdtt|ƒƒiƒ¡ | j 	|¡ | j 
¡  d S )Nr;  r  ÚOKrÐ   )r   r   rÛ  rÙ  Úwrite_headersr   r   rð   rZ   rÀ   r5   )r(   Úresponse_bodyr)   r)   r*   r5     s   
þz-StreamingChunkSizeTest.MessageDelegate.finishN)r7   r8   r9   rÚ  r+   r0   r5   r)   r)   r)   r*   ÚMessageDelegate  s
    rà  c                 C   s   G dd„ dt ƒ}|ƒ S )Nc                   @   r_   )z+StreamingChunkSizeTest.get_app.<locals>.Appc                 S   s
   t  |¡S r$   )rÒ  rà  )r(   Úserver_connÚrequest_connr)   r)   r*   Ústart_request  rU   z9StreamingChunkSizeTest.get_app.<locals>.App.start_requestN)r7   r8   r9   rã  r)   r)   r)   r*   ÚApp  re   rä  )r   )r(   rä  r)   r)   r*   rG     s   zStreamingChunkSizeTest.get_appc                 K   sx   | j dddi|¤Ž}| ¡  t|jƒ}|  t| jƒt|ƒ¡ |D ]}|  || j	dt
|ƒ ¡ |  |ddt
|ƒ ¡ q |S )NrD   rv   rs   zoversized chunk: r   zempty chunk: )rD   )rH   rI   r   rJ   ro   rZ   ÚBODYÚsumÚassertLessEqualrØ  rð   ÚassertGreater)r(   rL   rM   r/   r×  r)   r)   r*   Úfetch_chunk_sizes  s   
ÿz(StreamingChunkSizeTest.fetch_chunk_sizesc                 C   sJ   t ƒ }tjd|d�}| |¡ | ¡  | ¡ }t|ƒt|ƒkr#tdƒ‚|S )NrÀ  rÁ  z#body did not shrink when compressed)r!   rÅ  rÆ  rÀ   rØ   rÇ  rZ   rX   )r(   rJ   rÈ  ÚgzfileÚ
compressedr)   r)   r*   Úcompress+  s   
zStreamingChunkSizeTest.compressc                 C   s"   | j | jd�}|  g d¢|¡ d S )N)rJ   )rÓ  rÓ  rÓ  é   )ré  rå  ro   )r(   r/   r)   r)   r*   Útest_regular_body5  s   z(StreamingChunkSizeTest.test_regular_bodyc                 C   s   | j |  | j¡ddid� d S )NrÄ  rÅ  )rJ   r%   )ré  rì  rå  r3   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À   r3   r)   r*   Úbody_producerB  s   z?StreamingChunkSizeTest.test_chunked_body.<locals>.body_producer)ró  )rÓ  é   rÓ  é   )ré  ro   )r(   ró  r/   r)   r3   r*   Útest_chunked_bodyA  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ó  N  s   zEStreamingChunkSizeTest.test_chunked_compressed.<locals>.body_producerrÄ  rÅ  )ró  r%   )rì  rå  rè  rZ   ré  )r(   ró  r)   r÷  r*   Útest_chunked_compressedJ  s   
ÿz.StreamingChunkSizeTest.test_chunked_compressedN)r7   r8   r9   rå  rØ  rÕ  rV  r   rà  rG   ré  rì  rî  rï  rö  rø  r)   r)   r)   r*   rÒ  ø  s    
	rÒ  c                   @   râ   )
ÚMaxHeaderSizeTestc                 C   r%  rC   ©r   rO   r3   r)   r)   r*   rG   X  r1   zMaxHeaderSizeTest.get_appc                 C   ru  )Nr‘  )Úmax_header_sizerU  r3   r)   r)   r*   rV  [  rU   z(MaxHeaderSizeTest.get_httpserver_optionsc                 C   s,   | j dddid�}| ¡  |  |jd¡ d S )NrD   úX-FillerÚdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar  rm   )rH   rI   ro   rJ   rp   r)   r)   r*   Útest_small_headers^  s   z$MaxHeaderSizeTest.test_small_headersc                 C   s¦   t tddd��B z| jdddidd� |  d	¡ W n ty8 } z|jd ur.|  |jjd
¡ W Y d }~nd }~ww W d   ƒ d S W d   ƒ d S 1 sLw   Y  d S )NzUnsatisfiable readFrx   rD   rü  Áè  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaT)r%   r   z did not raise expected exception)i¯  iW  )r   r   rH   Úfailr   rM   ÚassertInr  )r(   Úer)   r)   r*   Útest_large_headersc  s   
€ûÿý€" z$MaxHeaderSizeTest.test_large_headersN)r7   r8   r9   rG   rV  rþ  r  r)   r)   r)   r*   rù  W  s
    rù  c                       s^   e Zd Zdd„ Zdd„ Z‡ fdd„Z‡ fdd„Zejd	d
„ ƒZ	e
dd„ ƒZe
dd„ ƒZ‡  ZS )ÚIdleTimeoutTestc                 C   r%  rC   rú  r3   r)   r)   r*   rG   r  r1   zIdleTimeoutTest.get_appc                 C   ru  )Ngš™™™™™¹?)Úidle_connection_timeoutrU  r3   r)   r)   r*   rV  u  rU   z&IdleTimeoutTest.get_httpserver_optionsc                    s   t ƒ  ¡  g | _d S r$   )r'  r(  Ústreamsr3   r)  r)   r*   r(  x  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»  r2  )r(   r?   Úeventr)   r)   r*   Útest_unused_connectionˆ  s
   €
z&IdleTimeoutTest.test_unused_connectionc                 c   sh   � |   ¡ V }tƒ }| |j¡ tdƒD ]}| d¡ | d¡V  | d¡V }|  |d¡ q| 	¡ V  d S )Nrí  r¨  rÍ   é   rm   )
r¹   r   r  r»  r–  rÀ   rÑ   rÖ   ro   r2  )r(   r?   r  r”  rÉ   r)   r)   r*   Útest_idle_after_use�  s   €

z#IdleTimeoutTest.test_idle_after_use)r7   r8   r9   rG   rV  r(  r*  r   rš  r¹   r   r	  r  rM  r)   r)   r)  r*   r  p  s    

r  c                   @   s˜   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Ze 	e
jdkd¡dd„ ƒZdd„ Ze 	e
jdkd¡dd„ ƒZdd„ Zdd„ Zedd„ ƒZedd„ ƒZdS )ÚBodyLimitsTestc                 C   s8   G dd„ dt ƒ}tG dd„ dt ƒƒ}td|fd|fgƒS )Nc                   @   r_   )z/BodyLimitsTest.get_app.<locals>.BufferedHandlerc                 S   s   |   tt| jjƒƒ¡ d S r$   )rÀ   rð   rZ   rW   rJ   r3   r)   r)   r*   Úput£  r\   z3BodyLimitsTest.get_app.<locals>.BufferedHandler.putN)r7   r8   r9   r  r)   r)   r)   r*   ÚBufferedHandler¢  re   r  c                   @   râ   )
z0BodyLimitsTest.get_app.<locals>.StreamingHandlerc                 S   s
   d| _ d S )Nr   )Ú
bytes_readr3   r)   r)   r*   rT   ¨  rU   z;BodyLimitsTest.get_app.<locals>.StreamingHandler.initializec                 S   sX   t  t| jj¡}d| jjv r| t|  d¡ƒ¡ d| jjv r*| 	t
|  d¡ƒ¡ d S d S )NÚexpected_sizeÚbody_timeout)r‰   Úcastr
   rW   rÙ  rß   Úset_max_body_sizer×   r±   Úset_body_timeoutÚfloat)r(   r4   r)   r)   r*   rü   «  s   ÿz8BodyLimitsTest.get_app.<locals>.StreamingHandler.preparec                 S   s   |  j t|ƒ7  _ d S r$   )r  rZ   r¬  r)   r)   r*   r0   ²  rd   z>BodyLimitsTest.get_app.<locals>.StreamingHandler.data_receivedc                 S   s   |   t| jƒ¡ d S r$   )rÀ   rð   r  r3   r)   r)   r*   r  µ  rÜ  z4BodyLimitsTest.get_app.<locals>.StreamingHandler.putN)r7   r8   r9   rT   rü   r0   r  r)   r)   r)   r*   ÚStreamingHandler¦  s
    r  ú	/bufferedú
/streaming)r   r   r   )r(   r  r  r)   r)   r*   rG   ¡  s   ÿzBodyLimitsTest.get_appc                 C   s   t ddd�S )Nr|   i   )r  Úmax_body_sizerU  r3   r)   r)   r*   rV  ¼  r6   z%BodyLimitsTest.get_httpserver_optionsc                 C   rÔ  r$   r   r3   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 )Nr  ÚPUTs   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaru   s   4096r  rn   rp   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 longr5  r  r  ó   aé (  ru   r  ©r   r   r<  r=  rH   ro   r  rp   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 larger5  r  r  c                 S   ó   | dd ƒS ©Nr  r  r)   rò  r)   r)   r*   r¼   Ö  ó    zABodyLimitsTest.test_large_body_buffered_chunked.<locals>.<lambda>©rv   ró  r  r   rp   r)   r)   r*   Ú test_large_body_buffered_chunkedÏ  s   ýÿz/BodyLimitsTest.test_large_body_buffered_chunkedc                 C   r  )	Nr  r5  r  r  r  r  ru   r  r   rp   r)   r)   r*   Útest_large_body_streamingÚ  r"  z(BodyLimitsTest.test_large_body_streamingc                 C   r$  )	Nr%  r5  r  r  c                 S   r&  r'  r)   rò  r)   r)   r*   r¼   å  r(  zBBodyLimitsTest.test_large_body_streaming_chunked.<locals>.<lambda>r)  r  r   rp   r)   r)   r*   Ú!test_large_body_streaming_chunkedß  s   ýÿz0BodyLimitsTest.test_large_body_streaming_chunkedc                 C   rr   )Nú/streaming?expected_size=10240r  r  r  ru   ó   10240rn   rp   r)   r)   r*   Ú"test_large_body_streaming_overrideé  s   
ÿz1BodyLimitsTest.test_large_body_streaming_overridec                 C   s&   | j dddd„ d�}|  |jd¡ d S )Nr-  r  c                 S   r&  r'  r)   rò  r)   r)   r*   r¼   ó  r(  zKBodyLimitsTest.test_large_body_streaming_chunked_override.<locals>.<lambda>r)  r.  rn   rp   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 bodyr5  r<   )r   r½   r¹   rº   rÀ   r   r   r<  r=  rK  ro   rØ   )r(   r?   rM   r)   r)   r*   Útest_timeout÷  s   €ÿÿzBodyLimitsTest.test_timeoutc                 c   sÀ   � t t ¡ ƒ}zS| d|  ¡ f¡V  | d¡ | dd ¡ t|ƒV \}}}|  |d¡ | d¡ ttdt	j
d�� | ¡ V }W d   ƒ n1 sIw   Y  |  |d	¡ W | ¡  d S | ¡  w )
Nr¸   sF   PUT /streaming?expected_size=10240 HTTP/1.1
Content-Length: 10240

r  r  r.  s2   PUT /streaming HTTP/1.1
Content-Length: 10240

r  r5  rˆ  )r   r½   r¹   rº   rÀ   rA   ro   r   r   r<  r=  rK  rØ   )r(   r?   r&   r%   rM   rÉ   r)   r)   r*   Útest_body_size_override_reset  s$   €ÿÿÿz,BodyLimitsTest.test_body_size_override_resetN)r7   r8   r9   rG   rV  rÕ  r  r!  ÚunittestÚskipIfr¢   rÿ   r*  r+  r,  r/  r0  r   r1  r2  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Ý  rm   z'HTTP/1.1 200 OK
Content-Length: %d

)rå   rÓ   Úhttp1rÙ  rÞ  r   r   r5   rÀ   r   rZ   )rW   Úmessager3   r)   r*   Úhandle_request&  s   ÿ
ÿz3LegacyInterfaceTest.get_app.<locals>.handle_requestr)   )r(   r8  r)   r3   r*   rG   "  s   zLegacyInterfaceTest.get_appc                 C   s,   |   d¡}| js|  d¡ |  |jd¡ d S )NrD   rb  rm   )rH   r6  rc  ro   rJ   rp   r)   r)   r*   Útest_legacy_interface9  s   

z)LegacyInterfaceTest.test_legacy_interfaceN)r7   r8   r9   rG   r9  r)   r)   r)   r*   r5  !  s    r5  )eÚ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   Útornado.netutilr   Útornado.simple_httpclientr   Útornado.testingr   r   r   r   r   Útornado.test.utilr   Útornado.webr   r   r   Ú
contextlibr    r/  rÅ  r<  r¢   r…  r½   r�   Úsysr|  r3  Úurllib.parser   Úior!   r‰   ÚTYPE_CHECKINGr"   r#   rA   rB   rO   r4  rò   ÚskipIfOldSSLr`   Úobjectrf   r‹   r�   r“   r•   ÚTestCaserš   r«   r³   rÜ   rã   r  r  r	  r$  rN  ro  rt  r£  Úplatformrz  r‹  r¿  rÍ  rÐ  rÒ  rù  r  r  r5  r)   r)   r)   r*   Ú<module>   sš     þ0)])As_þÿ1 U	
_/ 