o
    u3b¯…  ã                   @   s¬  d dl Z d dlZd dlmZ d dlZd dlZd dlZd dlZd dlm	Z	 d dl
Z
d dlZd dlZd dlZd dlZd dlZd dlmZmZmZ d dlmZ d dlmZmZmZmZmZ d dlmZ d dlmZ d d	l m!Z! d d
l"m#Z#m$Z$ d dlm%Z% d dl&m'Z'm(Z(m)Z)m*Z* d dl+m,Z, d dl-m.Z.m/Z/m0Z0 d dl1m2Z2m3Z3 G dd„ de/ƒZ4G dd„ de/ƒZ5G dd„ de/ƒZ6G dd„ de/ƒZ7G dd„ de/ƒZ8G dd„ de/ƒZ9G dd„ de/ƒZ:G dd„ de/ƒZ;G d d!„ d!e/ƒZ<G d"d#„ d#e/ƒZ=G d$d%„ d%e/ƒZ>G d&d'„ d'e/ƒZ?G d(d)„ d)e/ƒZ@G d*d+„ d+e/ƒZAG d,d-„ d-e/ƒZBG d.d/„ d/e'ƒZCG d0d1„ d1ejDƒZEG d2d3„ d3ejDƒZFG d4d5„ d5ejDƒZGG d6d7„ d7ejDƒZHG d8d9„ d9ejDƒZIG d:d;„ d;ejDƒZJdS )<é    N)Úclosing)ÚBytesIO)Úutf8Ú
native_strÚ
to_unicode)Úgen)ÚHTTPRequestÚHTTPResponseÚ_RequestProxyÚ	HTTPErrorÚ
HTTPClient)Ú
HTTPServer)ÚIOLoop)ÚIOStream)Úgen_logÚapp_log)Únetutil)ÚAsyncHTTPTestCaseÚbind_unused_portÚgen_testÚ	ExpectLog)ÚskipOnTravis)ÚApplicationÚRequestHandlerÚurl)Úformat_timestampÚHTTPHeadersc                   @   ó   e Zd Zdd„ ZdS )ÚHelloWorldHandlerc                 C   s*   |   dd¡}|  dd¡ |  d| ¡ d S )NÚnameÚworldúContent-Typeú
text/plainz	Hello %s!)Úget_argumentÚ
set_headerÚfinish)Úselfr   © r'   ú>/usr/lib/python3/dist-packages/tornado/test/httpclient_test.pyÚget%   s   zHelloWorldHandler.getN©Ú__name__Ú
__module__Ú__qualname__r)   r'   r'   r'   r(   r   $   ó    r   c                   @   r   )ÚPostHandlerc                 C   s"   |   d|  d¡|  d¡f ¡ d S )NzPost arg1: %s, arg2: %sÚarg1Úarg2)r%   r#   ©r&   r'   r'   r(   Úpost,   s
   ÿÿzPostHandler.postN©r+   r,   r-   r3   r'   r'   r'   r(   r/   +   r.   r/   c                   @   r   )Ú
PutHandlerc                 C   s   |   d¡ |   | jj¡ d S )Nz
Put body: ©ÚwriteÚrequestÚbodyr2   r'   r'   r(   Úput4   s   
zPutHandler.putN)r+   r,   r-   r:   r'   r'   r'   r(   r5   3   r.   r5   c                   @   r   )ÚRedirectHandlerc                 C   s.   |   d¡ | j|  d¡t|  dd¡ƒd� d S )Nzredirects can have bodies toor   ÚstatusÚ302)r<   )r7   Úredirectr#   Úintr2   r'   r'   r(   Úprepare:   s   

ÿzRedirectHandler.prepareN©r+   r,   r-   r@   r'   r'   r'   r(   r;   9   r.   r;   c                   @   r   )ÚRedirectWithoutLocationHandlerc                 C   s   |   d¡ |  ¡  d S )Né-  )Ú
set_statusr%   r2   r'   r'   r(   r@   B   s   
z&RedirectWithoutLocationHandler.prepareNrA   r'   r'   r'   r(   rB   A   r.   rB   c                   @   s   e Zd Zejdd„ ƒZdS )ÚChunkHandlerc                 c   s.   � |   d¡ |  ¡  t d¡V  |   d¡ d S )NÚasdfç{®Gáz„?Úqwer)r7   Úflushr   Úsleepr2   r'   r'   r(   r)   I   s
   €
zChunkHandler.getN)r+   r,   r-   r   Ú	coroutiner)   r'   r'   r'   r(   rE   H   s    rE   c                   @   r   )ÚAuthHandlerc                 C   s   |   | jjd ¡ d S )NÚAuthorization)r%   r8   Úheadersr2   r'   r'   r(   r)   S   s   zAuthHandler.getNr*   r'   r'   r'   r(   rL   R   r.   rL   c                   @   r   )ÚCountdownHandlerc                 C   s8   t |ƒ}|dkr|  |  d|d ¡¡ d S |  d¡ d S )Nr   Ú	countdowné   ÚZero)r?   r>   Úreverse_urlr7   )r&   Úcountr'   r'   r(   r)   X   s   zCountdownHandler.getNr*   r'   r'   r'   r(   rO   W   r.   rO   c                   @   r   )ÚEchoPostHandlerc                 C   s   |   | jj¡ d S ©Nr6   r2   r'   r'   r(   r3   a   s   zEchoPostHandler.postNr4   r'   r'   r'   r(   rU   `   r.   rU   c                   @   r   )ÚUserAgentHandlerc                 C   s   |   | jj dd¡¡ d S )Nú
User-AgentzUser agent not set)r7   r8   rN   r)   r2   r'   r'   r(   r)   f   s   zUserAgentHandler.getNr*   r'   r'   r'   r(   rW   e   r.   rW   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚContentLength304Handlerc                 C   s   |   d¡ |  dd¡ d S )Né0  úContent-Lengthé*   )rD   r$   r2   r'   r'   r(   r)   k   s   
zContentLength304Handler.getc                 C   s   d S rV   r'   r2   r'   r'   r(   Ú_clear_representation_headerso   s   z5ContentLength304Handler._clear_representation_headersN)r+   r,   r-   r)   r]   r'   r'   r'   r(   rY   j   s    rY   c                   @   r   )ÚPatchHandlerc                 C   s   |   | jj¡ dS )z=Return the request payload - so we can check it is being keptNr6   r2   r'   r'   r(   Úpatchv   s   zPatchHandler.patchN)r+   r,   r-   r_   r'   r'   r'   r(   r^   u   r.   r^   c                   @   s>   e Zd Zejd Zdd„ Ze Z Z Z Z	 Z
 Z ZZdS )ÚAllMethodsHandler)ÚOTHERc                 C   s"   | j jd usJ ‚|  | j j¡ d S rV   )r8   Úmethodr7   r2   r'   r'   r(   rb   ~   ó   zAllMethodsHandler.methodN)r+   r,   r-   r   ÚSUPPORTED_METHODSrb   r)   Úheadr3   r:   ÚdeleteÚoptionsr_   Úotherr'   r'   r'   r(   r`   {   s    
$r`   c                   @   r   )ÚSetHeaderHandlerc                 C   s2   t |  d¡| jjd ƒD ]
\}}|  ||¡ qd S )NÚkÚv)ÚzipÚget_argumentsr8   Ú	argumentsr$   )r&   rj   rk   r'   r'   r(   r)   †   s    ÿzSetHeaderHandler.getNr*   r'   r'   r'   r(   ri   …   r.   ri   c                   @   r   )ÚInvalidGzipHandlerc                 C   s\   |   dd¡ |   dd¡ d dd„ tdƒD ƒ¡d d	… }tj| ¡ d
d�d }|  |¡ d S )Nr!   r"   úContent-EncodingÚgzipÚ c                 s   s   � | ]}d   |¡V  qdS )zHello World {}
N)Úformat)Ú.0Úir'   r'   r(   Ú	<genexpr>•   s   € z)InvalidGzipHandler.get.<locals>.<genexpr>i(#  i;F é   )Úcompressleveló    )r$   ÚjoinÚrangerq   ÚcompressÚencoder7   )r&   r9   r'   r'   r(   r)   Ž   s
    zInvalidGzipHandler.getNr*   r'   r'   r'   r(   ro   �   r.   ro   c                   @   s\  e Zd Zdd„ Zdd„ Zedd„ ƒZdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zed-d.„ ƒZd/d0„ Zd1d2„ Zd3d4„ Zed5d6„ ƒZed7d8„ ƒZ ed9d:„ ƒZ!ed;d<„ ƒZ"ed=d>„ ƒZ#d?d@„ Z$dAdB„ Z%dCdD„ Z&dEdF„ Z'dGdH„ Z(dIdJ„ Z)edKdL„ ƒZ*dMS )NÚHTTPClientCommonTestCasec                 C   sˆ   t tdtƒtdtƒtdtƒtdtƒtdtƒtdtƒtdtƒtdt	d	d
�tdt
ƒtdtƒtdtƒtdtƒtdtƒtdtƒtdtƒgdd�S )Nú/helloú/postz/putz	/redirectú/redirect_without_locationú/chunkú/authz/countdown/([0-9]+)rP   )r   ú	/echopostú/user_agentú/304_with_content_lengthú/all_methodsú/patchz/set_headerú/invalid_gzipT)rq   )r   r   r   r/   r5   r;   rB   rE   rL   rO   rU   rW   rY   r`   r^   ri   ro   r2   r'   r'   r(   Úget_app    s&   ñîz HTTPClientCommonTestCase.get_appc                 C   s4   d}| j dd|d�}|  |jd¡ |  |j|¡ d S )Ns   some patch datarˆ   ÚPATCH©rb   r9   éÈ   ©ÚfetchÚassertEqualÚcoder9   )r&   r9   Úresponser'   r'   r(   Útest_patch_receives_payload¶   s   z4HTTPClientCommonTestCase.test_patch_receives_payloadc                 C   st   |   d¡}|  |jd¡ |  |jd d¡ |  |jd¡ |jd us#J ‚|  t|jƒd¡ |   d¡}|  |jd¡ d S )	Nr   r�   r!   r"   ó   Hello world!r   z/hello?name=Bens
   Hello Ben!)r�   r�   r‘   rN   r9   Úrequest_timer?   ©r&   r’   r'   r'   r(   Útest_hello_world¼   s   

z)HTTPClientCommonTestCase.test_hello_worldc                 C   s2   g }| j d|jd�}|  |dg¡ |  |j¡ d S )Nr   ©Ústreaming_callbackr”   )r�   Úappendr�   ÚassertFalser9   )r&   Úchunksr’   r'   r'   r(   Útest_streaming_callbackÈ   s   z0HTTPClientCommonTestCase.test_streaming_callbackc                 C   s0   | j dddd�}|  |jd¡ |  |jd¡ d S )Nr€   ÚPOSTzarg1=foo&arg2=barrŒ   r�   s   Post arg1: foo, arg2: barrŽ   r–   r'   r'   r(   Ú	test_postÐ   s   z"HTTPClientCommonTestCase.test_postc                 C   sL   |   d¡}|  |jd¡ g }| j d|jd�}|  |ddg¡ |  |j¡ d S )Nr‚   ó   asdfqwerr˜   ó   asdfó   qwer)r�   r�   r9   rš   r›   )r&   r’   rœ   r'   r'   r(   Útest_chunkedÕ   s   
z%HTTPClientCommonTestCase.test_chunkedc                    sŠ   t ƒ \}}t|ƒ�2 tj‡ fdd„ƒ}t ||¡ ˆ  d| ¡}| ¡  ˆ  |j	d¡ ˆ j
 | ¡ ¡ W d   ƒ d S 1 s>w   Y  d S )Nc                 3   óH   � t | ƒ}| d¡V }d|vrˆ  d¡ | d dd¡¡V  | ¡  d S )Nó   

ó   HTTP/1.úrequires HTTP/1.xs7   HTTP/1.1 200 OK
Transfer-Encoding: chunked

1
1
1
2
0

ó   
ó   
©r   Ú
read_untilÚskipTestr7   ÚreplaceÚclose©ÚconnÚaddressÚstreamÚrequest_datar2   r'   r(   Úaccept_callbackä   s   €

ÿõzDHTTPClientCommonTestCase.test_chunked_close.<locals>.accept_callbackúhttp://127.0.0.1:%d/s   12)r   r   r   rK   r   Úadd_accept_handlerr�   Úrethrowr�   r9   Úio_loopÚremove_handlerÚfileno©r&   ÚsockÚportr´   Úrespr'   r2   r(   Útest_chunked_closeÞ   s   

"áz+HTTPClientCommonTestCase.test_chunked_closec                 C   s   |   | jdddd�jd¡ d S )Nrƒ   ÚAladdinúopen sesame©Úauth_usernameÚauth_passwordó"   Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==©r�   r�   r9   r2   r'   r'   r(   Útest_basic_auth  s   ÿüz(HTTPClientCommonTestCase.test_basic_authc                 C   s    |   | jddddd�jd¡ d S )Nrƒ   rÀ   rÁ   Úbasic)rÃ   rÄ   Ú	auth_moderÅ   rÆ   r2   r'   r'   r(   Útest_basic_auth_explicit_mode  s   üùz6HTTPClientCommonTestCase.test_basic_auth_explicit_modec                 C   sD   |   | jdddd�jd¡ t dd¡}|   | jd|dd�jd	¡ d S )
Nrƒ   Útestu   123Â£rÂ   s   Basic dGVzdDoxMjPCow==ÚNFDu   josÃ©u   sÉ™crÉ™ts   Basic am9zw6k6c8mZY3LJmXQ=)r�   r�   r9   ÚunicodedataÚ	normalize)r&   Úusernamer'   r'   r(   Útest_basic_auth_unicode  s   þþz0HTTPClientCommonTestCase.test_basic_auth_unicodec              	   C   s†   t tddd��2 |  ttf¡� | jdddddd	� W d   ƒ n1 s$w   Y  W d   ƒ d S W d   ƒ d S 1 s<w   Y  d S )
Nzuncaught exceptionF©Úrequiredrƒ   rÀ   rÁ   rF   T)rÃ   rÄ   rÉ   Úraise_error)r   r   ÚassertRaisesÚ
ValueErrorr   r�   r2   r'   r'   r(   Útest_unsupported_auth_mode&  s   ûÿÿ"ÿz3HTTPClientCommonTestCase.test_unsupported_auth_modec                 C   sn   | j ddd�}|  d|j¡ |  |jd  d¡¡ |   d¡}|  d|j¡ |  |j d¡¡ |  d	|j¡ d S )
Nz/countdown/2F©Úfollow_redirectsé.  ÚLocationz/countdown/1r�   z/countdown/0s   Zero)r�   r�   r‘   Ú
assertTruerN   ÚendswithÚeffective_urlr9   r–   r'   r'   r(   Útest_follow_redirect4  s   
z-HTTPClientCommonTestCase.test_follow_redirectc                 C   s    | j ddd�}|  d|j¡ d S )Nr�   Tr×   rC   ©r�   r�   r‘   r–   r'   r'   r(   Útest_redirect_without_location>  s   z7HTTPClientCommonTestCase.test_redirect_without_locationc                 C   ó"   | j dddd�}|  |jd¡ d S )Nú/redirect?url=/put&status=307ÚPUTÚhellorŒ   ó   Put body: hello©r�   r�   r9   r–   r'   r'   r(   Útest_redirect_put_with_bodyF  s   ÿz4HTTPClientCommonTestCase.test_redirect_put_with_bodyc                 C   rá   )Nrâ   rã   T©rb   Úallow_nonstandard_methodss
   Put body: ræ   r–   r'   r'   r(   Útest_redirect_put_without_bodyL  s   ýz7HTTPClientCommonTestCase.test_redirect_put_without_bodyc                 C   s  dD ]P}d| }| j |ddd�}|  d|j¡ dD ]#}| j ||dd	�}|d
v r1|  t|ƒ|j¡ q|  |jt|ƒdg¡ q| j |dd�}|  d|j¡ |  d|j¡ qdD ]/}d}dD ]}| j ||dd	�}|  |t|jƒ¡ q[| j |dd�}|  d|j¡ |  d|j¡ qUd S )N)rC   rÙ   i/  z$/redirect?url=/all_methods&status=%drž   ó    rŒ   s   GET)ÚGETÚOPTIONSrã   ÚDELETETrè   )rC   rÙ   ÚHEAD©rb   r�   )i3  i4  z%/redirect?url=/all_methods&status=307)rì   rí   rž   rã   rî   )r�   r�   r9   r   ÚassertInr‘   r   )r&   r<   r   r¾   rb   r'   r'   r(   Útest_method_after_redirectU  s*   ùz3HTTPClientCommonTestCase.test_method_after_redirectc                 C   s8   |   d¡ dd¡}|  |¡}|  dt d¡ |j¡ d S )Nrƒ   zhttp://zhttp://me:secret@s   Basic s	   me:secret)Úget_urlr­   r�   r�   Úbase64Ú	b64encoder9   )r&   r   r’   r'   r'   r(   Útest_credentials_in_urls  s   
z0HTTPClientCommonTestCase.test_credentials_in_urlc                 C   sº   d}t  d¡}| jdd|ddid�}|  |jd d	¡ |  |jt|ƒ¡ | jdd|ddid�}|  |jd d
¡ |  |j|¡ | jdd|ddidd�}|  |jd d
¡ |  |j|¡ d S )Nõ   Ã©s   e9r„   rž   r!   zapplication/blah)rb   r9   rN   r[   Ú2Ú1Úfoo)rb   r9   rN   Ú
user_agent)ÚbinasciiÚa2b_hexr�   r�   rN   r9   r   )r&   Úunicode_bodyÚ	byte_bodyr’   r'   r'   r(   Útest_body_encodingx  s6   
üüûz+HTTPClientCommonTestCase.test_body_encodingc                 C   sZ   |   d¡}|  t|jƒt¡ |  t|jd ƒt¡ |  t|jƒt¡ |  t|j	ƒt¡ d S )Nr   r!   )
r�   r�   Útyper9   ÚbytesrN   Ústrr‘   r?   rÝ   r–   r'   r'   r(   Ú
test_typesœ  s
   
z#HTTPClientCommonTestCase.test_typesc                 C   sj   | j ddddid�}|  |jd d¡ |  |jd¡ |  t|jƒd¡ tjd	|jd
�}|  | 	¡ d¡ d S )Nr‚   FzAccept-Encodingrq   )Údecompress_responserN   rp   r    é"   Úr)ÚmodeÚfileobj)
r�   r�   rN   ÚassertNotEqualr9   Úlenrq   ÚGzipFileÚbufferÚread)r&   r’   Úfr'   r'   r(   Ú	test_gzip£  s   
ÿz"HTTPClientCommonTestCase.test_gzipc              	   C   sŠ   t tddd��4 z|  d¡}|  |jd¡ |  |jd d… d¡ W n	 ty*   Y n	w W d   ƒ d S W d   ƒ d S 1 s>w   Y  d S )Nz*(Uncaught exception|Exception in callback)FrÑ   r‰   r�   é   s   Hello World 0
)r   r   r�   r�   r‘   r9   r   r–   r'   r'   r(   Útest_invalid_gzip´  s   ÿ
ÿÿú"øz*HTTPClientCommonTestCase.test_invalid_gzipc                    sp   g ‰i ‰g ‰ ‡‡fdd„}‡ ‡‡fdd„}ˆj d||d� ˆ tˆƒdˆ¡ ˆ ˆd d	¡ ˆ ˆ d
dg¡ d S )Nc                    sV   |   d¡rd S |   d¡rˆ  | ¡ d S | dkr)|  dd¡\}}| ¡ ˆ| ¡ < d S d S )NzHTTP/1.1 101zHTTP/z
ú:rQ   )Ú
startswithrš   ÚsplitÚstripÚlower)Úheader_linerj   rk   )Ú
first_linerN   r'   r(   Úheader_callbackÆ  s   

þzFHTTPClientCommonTestCase.test_header_callback.<locals>.header_callbackc                    s   ˆ  ˆd d¡ ˆ  | ¡ d S )Nzcontent-typeztext/html; charset=UTF-8)r�   rš   )Úchunk)rœ   rN   r&   r'   r(   r™   Ð  s   zIHTTPClientCommonTestCase.test_header_callback.<locals>.streaming_callbackr‚   )r  r™   rQ   r   zHTTP/[0-9]\.[0-9] 200.*
r¡   r¢   )r�   r�   r  ÚassertRegex)r&   r  r™   r'   )rœ   r  rN   r&   r(   Útest_header_callbackÁ  s   
ýz-HTTPClientCommonTestCase.test_header_callbackc                 c   sX   � t ddd�}| jjd|d�}z| |  d¡¡V }|  |jd¡ W | ¡  d S | ¡  w )NÚTestDefaultUserAgentF)rû   Ú
allow_ipv6T)Úforce_instanceÚdefaultsr…   s   TestDefaultUserAgent)ÚdictÚhttp_clientÚ	__class__r�   ró   r�   r9   r®   )r&   r!  Úclientr’   r'   r'   r(   Útest_configure_defaultsà  s   €z0HTTPClientCommonTestCase.test_configure_defaultsc              
   C   sT   dD ]%}t tfD ]}|ƒ }||d< | jd|d�}|  |jdd|j||f ¡ qqd S )N)ÚMyUserAgentó   MyUserAgentrX   r…   ©rN   r(  z#response=%r, value=%r, container=%r)r"  r   r�   r�   r9   )r&   ÚvalueÚ	containerrN   r¾   r'   r'   r(   Útest_header_typesë  s   
ÿýüÿz*HTTPClientCommonTestCase.test_header_typesc                    s¦   t ƒ \}}t|ƒ�@ tj‡ fdd„ƒ}t ||¡ zˆ  d| ¡}| ¡  ˆ  |j	d d¡ W ˆ j
 | ¡ ¡ n	ˆ j
 | ¡ ¡ w W d   ƒ d S 1 sLw   Y  d S )Nc                 3   r¤   )Nr¥   r¦   r§   s2   HTTP/1.1 200 OK
X-XSS-Protection: 1;
	mode=block

r¨   r©   rª   r¯   r2   r'   r(   r´     s   €
ÿú
zIHTTPClientCommonTestCase.test_multi_line_headers.<locals>.accept_callbackrµ   zX-XSS-Protectionz1; mode=block)r   r   r   rK   r   r¶   r�   r·   r�   rN   r¸   r¹   rº   r»   r'   r2   r(   Útest_multi_line_headersü  s   

&"æz0HTTPClientCommonTestCase.test_multi_line_headersc                 C   s.   |   d¡}|  |jd¡ |  |jd d¡ d S )Nr†   rZ   r[   Ú42)r�   r�   r‘   rN   r–   r'   r'   r(   Útest_304_with_content_length  s   
z5HTTPClientCommonTestCase.test_304_with_content_lengthc                 c   s(   � | j  |  d¡¡V }|  |jd¡ d S ©Nr   r”   ©r#  r�   ró   r�   r9   r–   r'   r'   r(   Útest_future_interface%  s   €z.HTTPClientCommonTestCase.test_future_interfacec                 c   s„   � |   t¡�}| j |  d¡¡V  W d   ƒ n1 sw   Y  |jd us'J ‚|jjd us/J ‚|  |jjd¡ |  |jjjd¡ d S ©Nú	/notfoundé”  )	rÔ   r   r#  r�   ró   Ú	exceptionr’   r�   r‘   )r&   Úcontextr'   r'   r(   Útest_future_http_error*  s   €ÿz/HTTPClientCommonTestCase.test_future_http_errorc                 c   s,   � | j j|  d¡dd�V }|  |jd¡ d S )Nr4  F)rÓ   r5  )r#  r�   ró   r�   r‘   r–   r'   r'   r(   Útest_future_http_error_no_raise3  s
   €
ÿz8HTTPClientCommonTestCase.test_future_http_error_no_raisec                 c   s^   � |   d¡}| j |¡V }|  |jj|¡ |  t|jtƒ¡ | j |j¡V }|  |j	d¡ d S r0  )
ró   r#  r�   r�   r8   r   rÛ   Ú
isinstancer   r9   )r&   r   r’   Ú	response2r'   r'   r(   Ú test_reuse_request_from_response:  s   €
z9HTTPClientCommonTestCase.test_reuse_request_from_responsec                 c   s’   � |   d¡}t|dd�}| j |¡V }|  |jd¡ |  ttf¡�}t|dd�}| j |¡V  W d   ƒ n1 s9w   Y  |  	dt
|jƒ¡ d S )Nr   z	127.0.0.1©Únetwork_interfacer�   znot-interface-or-ip)ró   r   r#  r�   r�   r‘   rÔ   rÕ   r   rñ   r  r6  )r&   r   r8   r’   r7  r'   r'   r(   Útest_bind_source_ipG  s   €
þz,HTTPClientCommonTestCase.test_bind_source_ipc                 C   s”   dD ]}| j d|d�}|  |jt|ƒ¡ qdD ]}| j d|dd�}|  |jt|ƒ¡ q| j ddd�}|  |jd¡ | j ddd	d
�}|  |jd¡ d S )N©rì   rî   rí   r‡   rð   ©rž   rã   r‹   rë   rŒ   rï   ra   Trè   s   OTHER)r�   r�   r9   r   )r&   rb   r’   r'   r'   r(   Útest_all_methodsS  s   ÿz)HTTPClientCommonTestCase.test_all_methodsc              	   C   sú   dD ]7}|   t¡�}| jd|dd� W d   ƒ n1 sw   Y  |  dt|jƒ¡ | jd|dd�}|  |jd¡ qdD ]>}|   t¡�}| jd|d	dd
� W d   ƒ n1 sWw   Y  |  dt|jƒ¡ |dkrz| jd|d	ddd� |  |jd¡ q<d S )NrA  r‡   T)rb   rÓ   zmust not be Nonerè   r�   r@  r¡   )rb   r9   rÓ   zmust be Nonerì   )rb   r9   ré   rÓ   )rÔ   rÕ   r�   rñ   r  r6  r�   r‘   )r&   rb   r7  r¾   r'   r'   r(   Útest_body_sanity_checksa  s6   ÿÿÿÿû€ïz0HTTPClientCommonTestCase.test_body_sanity_checksc                 C   s*   | j dddd�}| ¡  |  |jd¡ d S )Nz/redirect?status=307&url=/putrã   s   hellorŒ   rå   )r�   r·   r�   r9   r–   r'   r'   r(   Útest_put_307‘  s
   ÿz%HTTPClientCommonTestCase.test_put_307c                 C   s,   |   d¡}| ¡  |  |jd tdƒ¡ d S )Nz/set_header?k=foo&v=%E9ÚFoor÷   )r�   r·   r�   rN   r   r–   r'   r'   r(   Útest_non_ascii_header˜  s   
z.HTTPClientCommonTestCase.test_non_ascii_headerc                 C   sš   t   ¡ }|  d¡}| ¡  |  |jd¡ |  |jd¡ |jd us"J ‚|  t|j| ƒd¡ |j 	¡ D ]\}}|  
d|  koAdk n  d||f ¡ q2d S )Nr   r   g      ð?ztime_info[%s] out of bounds: %s)Útimer�   r·   ÚassertGreaterEqualr•   Ú
assertLessÚ
start_timeÚabsÚ	time_infoÚitemsrÛ   )r&   rJ  r’   rj   rk   r'   r'   r(   Útest_response_timesž  s   
*ÿz,HTTPClientCommonTestCase.test_response_timesc                 C   sZ   | j ddd�}|  |jd¡ | j ddd�}|  |jd¡ | j dddd�}|  |jd¡ d S )Nr   r   )Úconnect_timeoutr�   )Úrequest_timeout)rO  rP  rß   r–   r'   r'   r(   Útest_zero_timeout¯  s   z*HTTPClientCommonTestCase.test_zero_timeoutc                 c   s†   � | j  |  d¡¡}|  | ¡ ¡ ttdƒ�#}tdƒD ]}t 	d¡V  |j
r( n	qW d   ƒ d S W d   ƒ d S 1 s<w   Y  d S )Nz/404z$Exception after Future was cancelledéd   rG   )r#  r�   ró   rÛ   Úcancelr   r   r{   r   rJ   Úlogged_stack)r&   ÚfutÚelru   r'   r'   r(   Útest_error_after_cancel¹  s   €ÿþû"øz0HTTPClientCommonTestCase.test_error_after_cancelN)+r+   r,   r-   rŠ   r“   r   r—   r�   rŸ   r£   r¿   rÇ   rÊ   rÐ   rÖ   rÞ   rà   rç   rê   rò   rö   r   r  r  r  r  r   r&  r,  r-  r/  r2  r8  r9  r<  r?  rB  rC  rD  rF  rN  rQ  rW  r'   r'   r'   r(   r~   Ÿ   s^    
	%	
	$

 	




0
r~   c                   @   ó<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚRequestProxyTestc                 C   s&   t tddd�tƒ ƒ}|  |jd¡ d S )Núhttp://example.com/rú   )rû   )r
   r   r"  r�   rû   ©r&   Úproxyr'   r'   r(   Útest_request_setÉ  ó   ÿz!RequestProxyTest.test_request_setc                 C   s&   t tdƒtdd�ƒ}|  |jd¡ d S )NrZ  rú   r=  )r
   r   r"  r�   r>  r[  r'   r'   r(   Útest_default_setÏ  r^  z!RequestProxyTest.test_default_setc                 C   s*   t tddd�tdd�ƒ}|  |jd¡ d S )NrZ  rú   )Ú
proxy_hostÚbar)r
   r   r"  r�   r`  r[  r'   r'   r(   Útest_both_setÕ  s   ÿzRequestProxyTest.test_both_setc                 C   s"   t tdƒtƒ ƒ}|  |jd ¡ d S ©NrZ  )r
   r   r"  ÚassertIsrÃ   r[  r'   r'   r(   Útest_neither_setÛ  rc   z!RequestProxyTest.test_neither_setc                 C   sF   t tdƒtƒ ƒ}|  t¡� |j W d   ƒ d S 1 sw   Y  d S rc  )r
   r   r"  rÔ   ÚAttributeErrorrú   r[  r'   r'   r(   Útest_bad_attributeß  s   "ÿz#RequestProxyTest.test_bad_attributec                 C   s    t tdƒd ƒ}|  |jd ¡ d S rc  )r
   r   rd  rÃ   r[  r'   r'   r(   Útest_defaults_noneä  s   z#RequestProxyTest.test_defaults_noneN)	r+   r,   r-   r]  r_  rb  re  rg  rh  r'   r'   r'   r(   rY  È  s    rY  c                   @   r   )ÚHTTPResponseTestCasec                 C   s<   t tdƒdtƒ d�}t|ƒ}|  | d¡¡ |  d|¡ d S )Núhttp://example.comr�   )r  zHTTPResponse(zcode=200)r	   r   r   r  rÛ   r  rñ   )r&   r’   Úsr'   r'   r(   Útest_strê  s   ÿzHTTPResponseTestCase.test_strN)r+   r,   r-   rl  r'   r'   r'   r(   ri  é  r.   ri  c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚSyncHTTPClientTestc                    s^   t ƒ ˆ_t ¡ ‰ tj‡ ‡fdd„ƒ‰‡‡fdd„}tj|d�ˆ_ˆj ¡  ˆ  	¡  t
ƒ ˆ_d S )Nc                     s<   t ƒ \} ˆ_tdtfgƒ}t|ƒˆ_ˆj | ¡ ˆ  ¡  d S )Nú/)r   r½   r   r   r   ÚserverÚ
add_socketÚset)r¼   Úapp)Úeventr&   r'   r(   Úinit_serverø  s
   
z-SyncHTTPClientTest.setUp.<locals>.init_serverc                      s   ˆj  ˆ ¡ ˆj  ¡  d S rV   )Úserver_ioloopÚrun_syncÚstartr'   )rt  r&   r'   r(   rw     s   z'SyncHTTPClientTest.setUp.<locals>.start)Útarget)r   ru  Ú	threadingÚEventr   rK   ÚThreadÚserver_threadrw  Úwaitr   r#  )r&   rw  r'   )rs  rt  r&   r(   ÚsetUpô  s   
zSyncHTTPClientTest.setUpc                    s>   ‡ fdd„}ˆ j  |¡ ˆ j ¡  ˆ j ¡  ˆ j jdd� d S )Nc                     s,   ˆ j  ¡  tj‡ fdd„ƒ} ˆ j | ¡ d S )Nc                  3   s0   � ˆ j  ¡ V  tdƒD ]} d V  qˆ j ¡  d S )Né   )ro  Úclose_all_connectionsr{   ru  Ústop)ru   r2   r'   r(   Ú	slow_stop  s
   €zCSyncHTTPClientTest.tearDown.<locals>.stop_server.<locals>.slow_stop)ro  r�  r   rK   ru  Úadd_callback)r‚  r2   r'   r(   Ústop_server  s   
z0SyncHTTPClientTest.tearDown.<locals>.stop_serverT)Úall_fds)ru  rƒ  r|  rz   r#  r®   )r&   r„  r'   r2   r(   ÚtearDown
  s
   

zSyncHTTPClientTest.tearDownc                 C   s   d| j |f S )Nzhttp://127.0.0.1:%d%s)r½   )r&   Úpathr'   r'   r(   ró   #  s   zSyncHTTPClientTest.get_urlc                 C   s$   | j  |  d¡¡}|  d|j¡ d S )Nrn  r”   r1  r–   r'   r'   r(   Útest_sync_client&  s   z#SyncHTTPClientTest.test_sync_clientc                 C   sP   |   t¡�}| j |  d¡¡ W d   ƒ n1 sw   Y  |  |jjd¡ d S r3  )rÔ   r   r#  r�   ró   r�   r6  r‘   )r&   Ú	assertionr'   r'   r(   Útest_sync_client_error*  s   ÿz)SyncHTTPClientTest.test_sync_client_errorN)r+   r,   r-   r~  r†  ró   rˆ  rŠ  r'   r'   r'   r(   rm  ó  s    rm  c                   @   r   )ÚSyncHTTPClientSubprocessTestc                 C   sT   t jtjddgt jt jddd�}|jrtdƒ tt|jƒƒ |jr(|  	d¡ d S d S )Nz-czMfrom tornado.httpclient import HTTPClient; f = lambda: None; c = HTTPClient()Tr  )ÚstdoutÚstderrÚcheckÚtimeoutzSTDOUT:z%subprocess produced unexpected output)
Ú
subprocessÚrunÚsysÚ
executableÚPIPEÚSTDOUTrŒ  Úprintr   Úfail)r&   Úprocr'   r'   r(   Útest_destructor_log3  s    ý÷ÿz0SyncHTTPClientSubprocessTest.test_destructor_logN)r+   r,   r-   r™  r'   r'   r'   r(   r‹  2  r.   r‹  c                   @   rX  )ÚHTTPRequestTestCasec                 C   s&   t dddid�}|  |jddi¡ d S )Nrj  rú   ra  r)  )r   r�   rN   ©r&   r8   r'   r'   r(   Útest_headersQ  s   z HTTPRequestTestCase.test_headersc                 C   s(   t dƒ}ddi|_|  |jddi¡ d S )Nrj  ra  Úbaz©r   rN   r�   r›  r'   r'   r(   Útest_headers_setterU  s   
z'HTTPRequestTestCase.test_headers_setterc                 C   s    t dƒ}d |_|  |ji ¡ d S )Nrj  rž  r›  r'   r'   r(   Útest_null_headers_setterZ  s   z,HTTPRequestTestCase.test_null_headers_setterc                 C   s"   t ddd�}|  |jtdƒ¡ d S )Nrj  rú   )r9   )r   r�   r9   r   r›  r'   r'   r(   Ú	test_body_  s   zHTTPRequestTestCase.test_bodyc                 C   s$   t dƒ}d|_|  |jtdƒ¡ d S )Nrj  rú   )r   r9   r�   r   r›  r'   r'   r(   Útest_body_setterc  s   z$HTTPRequestTestCase.test_body_setterc                 C   s0   t j  ¡ }td|d�}|  |jdt|ƒi¡ d S )Nrj  )Úif_modified_sincezIf-Modified-Since)ÚdatetimeÚutcnowr   r�   rN   r   )r&   Ú	http_dater8   r'   r'   r(   Útest_if_modified_sinceh  s
   
ÿz*HTTPRequestTestCase.test_if_modified_sinceN)	r+   r,   r-   rœ  rŸ  r   r¡  r¢  r§  r'   r'   r'   r(   rš  P  s    rš  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚHTTPErrorTestCasec                 C   s2   t dƒ}t |¡}|  ||¡ |  |j|j¡ d S )Né“  )r   ÚcopyÚassertIsNotr�   r‘   )r&   ÚeÚe2r'   r'   r(   Ú	test_copyq  s   
zHTTPErrorTestCase.test_copyc                 C   s,   t dƒ}|  t|ƒd¡ |  t|ƒd¡ d S )Nr©  úHTTP 403: Forbidden)r   r�   r  Úrepr)r&   r¬  r'   r'   r(   Útest_plain_errorw  s   z"HTTPErrorTestCase.test_plain_errorc                 C   sj   t tdƒdƒ}|  t¡�}| ¡  W d   ƒ n1 sw   Y  |j}|  t|ƒd¡ |  t|ƒd¡ d S )NrZ  r©  r¯  )	r	   r   rÔ   r   r·   r6  r�   r  r°  )r&   r¾   Úcmr¬  r'   r'   r(   Útest_error_with_response|  s   
ÿz*HTTPErrorTestCase.test_error_with_responseN)r+   r,   r-   r®  r±  r³  r'   r'   r'   r(   r¨  p  s    r¨  )Krô   rü   Ú
contextlibr   rª  rq   ry  r¤  Úior   r�  r’  rG  ÚtypingrÍ   ÚunittestÚtornado.escaper   r   r   Útornador   Útornado.httpclientr   r	   r
   r   r   Útornado.httpserverr   Útornado.ioloopr   Útornado.iostreamr   Útornado.logr   r   r   Útornado.testingr   r   r   r   Útornado.test.utilr   Útornado.webr   r   r   Útornado.httputilr   r   r   r/   r5   r;   rB   rE   rL   rO   rU   rW   rY   r^   r`   ri   ro   r~   ÚTestCaserY  ri  rm  r‹  rš  r¨  r'   r'   r'   r(   Ú<module>   sh    
	
    -!
? 