o
    hy                     @   s  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	Z	d dl
Z
d dlmZmZ d dlmZmZ d dlmZ d dlmZmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZm Z  d dl!m"Z"m#Z#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/m0Z0m1Z1m2Z2 d dl3m4Z4m5Z5m6Z6 d dl7m8Z8m9Z9m:Z:m;Z; G dd de,j<Z=G dd de8Z>G dd de8Z?G dd de8Z@G dd de8ZAG dd de8ZBG dd de8ZCG d d! d!e8ZDG d"d# d#e8ZEG d$d% d%e8ZFG d&d' d'e8ZGe;G d(d) d)e8ZHG d*d+ d+eIZJG d,d- d-eJe.ZKG d.d/ d/eJe/ZLG d0d1 d1e0ZMG d2d3 d3e.ZNG d4d5 d5e.ZOG d6d7 d7e.ZPG d8d9 d9e.ZQG d:d; d;e.ZRG d<d= d=e.ZSG d>d? d?e.ZTG d@dA dAe.ZUdS )B    N)closing)
to_unicodeutf8)genversion)AsyncHTTPClient)HTTPHeadersResponseStartLine)IOLoop)UnsatisfiableReadError)Event)gen_log)Resolverbind_sockets)SimpleAsyncHTTPClientHTTPStreamClosedErrorHTTPTimeoutError)ChunkHandlerCountdownHandlerHelloWorldHandlerRedirectHandlerUserAgentHandler)httpclient_test)AsyncHTTPTestCaseAsyncHTTPSTestCaseAsyncTestCase	ExpectLoggen_test)skipOnTravisskipIfNoIPv6refusing_port)RequestHandlerApplicationurlstream_request_bodyc                   @      e Zd Zdd ZdS )SimpleHTTPClientCommonTestCasec                 C   s   t dd}| t|t  |S )NTforce_instance)r   
assertTrue
isinstanceselfclient r.   W/var/www/vscode/kcb/lib/python3.10/site-packages/tornado/test/simple_httpclient_test.pyget_http_client.   s   
z.SimpleHTTPClientCommonTestCase.get_http_clientN)__name__
__module____qualname__r0   r.   r.   r.   r/   r&   -       r&   c                   @   "   e Zd Zdd Zejdd ZdS )TriggerHandlerc                 C   s   || _ || _d S Nqueuewake_callback)r,   r9   r:   r.   r.   r/   
initialize5   s   
zTriggerHandler.initializec                 c   sF    t d t }| j|j | dddkr|   | V  d S )Nzqueuing triggerwaketrue)	loggingdebugr   r9   appendsetget_argumentr:   wait)r,   eventr.   r.   r/   get9   s   
zTriggerHandler.getN)r1   r2   r3   r;   r   	coroutinerE   r.   r.   r.   r/   r6   4       r6   c                   @   r5   )ContentLengthHandlerc                 C   s   |   | _t | j d S r7   )detachstreamr
   currentspawn_callbackwrite_responser,   r.   r.   r/   rE   D   s   
zContentLengthHandler.getc                 c   s,    | j td| d V  | j   d S )Nz)HTTP/1.0 200 OK
Content-Length: %s

okvalue)rJ   writer   rB   closerN   r.   r.   r/   rM   H   s   z#ContentLengthHandler.write_responseN)r1   r2   r3   rE   r   rF   rM   r.   r.   r.   r/   rH   C   rG   rH   c                   @   r%   )HeadHandlerc                 C   s   |  dd d S )NContent-Length7)
set_headerrN   r.   r.   r/   headT      zHeadHandler.headN)r1   r2   r3   rV   r.   r.   r.   r/   rR   S   r4   rR   c                   @   r%   )OptionsHandlerc                 C      |  dd | d d S )NzAccess-Control-Allow-Origin*okrU   rP   rN   r.   r.   r/   optionsY      zOptionsHandler.optionsN)r1   r2   r3   r]   r.   r.   r.   r/   rX   X   r4   rX   c                   @   r%   )NoContentHandlerc                 C   s   |  d |   d S )N   
set_statusfinishrN   r.   r.   r/   rE   _      
zNoContentHandler.getNr1   r2   r3   rE   r.   r.   r.   r/   r_   ^   r4   r_   c                   @   r%   )SeeOtherPostHandlerc                 C   s>   t | jj}|dv sJ d| jj | dd | | d S )N.  i/  unexpected body %rLocation/see_other_get)intrequestbodyrU   rb   )r,   redirect_coder.   r.   r/   poste   s   zSeeOtherPostHandler.postNr1   r2   r3   rp   r.   r.   r.   r/   rf   d   r4   rf   c                   @   r%   )SeeOtherGetHandlerc                 C   s&   | j jrtd| j j | d d S )Nri   r[   )rm   rn   	ExceptionrP   rN   r.   r.   r/   rE   m   s   zSeeOtherGetHandler.getNre   r.   r.   r.   r/   rr   l   r4   rr   c                   @   r%   )HostEchoHandlerc                 C   s   |  | jjd  d S )NHost)rP   rm   headersrN   r.   r.   r/   rE   t   s   zHostEchoHandler.getNre   r.   r.   r.   r/   rt   s   r4   rt   c                   @   r%   )NoContentLengthHandlerc                 C   s:   | j jdr|  }|d |  d S | d d S )NzHTTP/1s   HTTP/1.0 200 OK

hellozHTTP/1 required)rm   r   
startswithrI   rP   rQ   rc   )r,   rJ   r.   r.   r/   rE   y   s
   
zNoContentLengthHandler.getNre   r.   r.   r.   r/   rw   x   r4   rw   c                   @   r%   )EchoPostHandlerc                 C   s   |  | jj d S r7   )rP   rm   rn   rN   r.   r.   r/   rp         zEchoPostHandler.postNrq   r.   r.   r.   r/   ry      r4   ry   c                   @   r%   )RespondInPrepareHandlerc                 C   s   |  d | d d S )N  	forbiddenra   rN   r.   r.   r/   prepare      
zRespondInPrepareHandler.prepareN)r1   r2   r3   r~   r.   r.   r.   r/   r{      s    r{   c                   @   s  e Z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e	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ejfddZee	dejfddZedejfddZe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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ejfd(d)Zd*d+ Zejd,d- Zdejfd.d/Z dejfd0d1Z!dejfd2d3Z"dejfd4d5Z#dejfd6d7Z$dejfd8d9Z%dejfd:d;Z&dejfd<d=Z'dejfd>d?Z(d@S )ASimpleHTTPClientTestMixinc                 K   s   t  r7   )NotImplementedErrorr,   kwargsr.   r.   r/   create_client      z'SimpleHTTPClientTestMixin.create_clientr,   c                 C   s   t  | _ttdtt| j| jd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tdttdttdttdttdttdtgddS )N/triggerr8   z/chunkz/countdown/([0-9]+)	countdown)name/helloz/content_length/head/options/no_content/see_other_postrk   
/host_echo/no_content_length
/echo_post/respond_in_preparez	/redirect/user_agentT)gzip)collectionsdequetriggersr"   r#   r6   dictstopr   r   r   rH   rR   rX   r_   rf   rr   rt   rw   ry   r{   r   r   rN   r.   r.   r/   get_app   s4   z!SimpleHTTPClientTestMixin.get_appc                 C   s   |  t t u  |  t tddu tt }dd }| j|}||}|  ||u W d    d S 1 s;w   Y  d S )NTr'   c                      s   t dI d H  t S Nr   )r   sleepr   r.   r.   r.   r/   make_client   s   z=SimpleHTTPClientTestMixin.test_singleton.<locals>.make_client)r)   r   r   r
   io_looprun_sync)r,   io_loop2r   client1client2r.   r.   r/   test_singleton   s   
"z(SimpleHTTPClientTestMixin.test_singletonc                    sR  t jdd}|jd g  tdD ]}|f fdd	}|d| qjfddd	 t	|j
d j   j   j fd
dd	 t tddg t	|j
d j   j   j fddd	 t tg d t	jd W d    d S 1 sw   Y  d S )N   max_clients   c                    s     |   d S r7   )r@   r   )futiseenr,   r.   r/   cb   rd   z;SimpleHTTPClientTestMixin.test_connection_limit.<locals>.cbr   c                      s   t  jdkS Nr   lenr   r.   rN   r.   r/   <lambda>       zASimpleHTTPClientTestMixin.test_connection_limit.<locals>.<lambda>)	conditionc                      s   t jdkot  dkS r   r   r.   r   r.   r/   r          r      c                      s   t  dkS )Nr   )r   r.   )r   r.   r/   r      s    )r   r   r      )r   r   assertEqualr   rangefetchget_urladd_done_callbackrC   r   r9   r   popleftrA   )r,   r-   r   r   r.   r   r/   test_connection_limit   s&   "z/SimpleHTTPClientTestMixin.test_connection_limitc                 c   sV    t | jdd}|j| dddV }|  W d    d S 1 s$w   Y  d S )Nr   r   z/countdown/3r   max_redirects)r   r   r   r   rethrow)r,   r-   responser.   r.   r/   test_redirect_connection_limit   s
   
"z8SimpleHTTPClientTestMixin.test_redirect_connection_limitc                 C   s\   | j ddd}| d|j | |jjd | |jd | |jd d d S )Nz/countdown/5r   r   rh   z/countdown/2rj   z/countdown/1)	r   r   coder)   rm   r#   endswitheffective_urlrv   r,   r   r.   r.   r/   test_max_redirects   s
   z,SimpleHTTPClientTestMixin.test_max_redirectsc                 C   s4   t ddi}| jd|d | t| dg d S )N
User-AgentFoor   )rv   )r   r   )r   r   r   listget_all)r,   rv   r.   r.   r/   test_header_reuse   s   z+SimpleHTTPClientTestMixin.test_header_reusec                 C   s8   | j ddd}| d|j | |j dt d S )Nr   GETmethod   z
Tornado/{})r   r   r   rn   decodeformatr   r   r.   r.   r/   test_default_user_agent   s   z1SimpleHTTPClientTestMixin.test_default_user_agentc                 C   sf   dD ].}| j ddd| d}| d|j | |jjd | |jd | d|jj qd S )Nrg   r   POSTz%d)r   rn   r   rk   )	r   r   r   r)   rm   r#   r   r   r   )r,   r   r   r.   r.   r/   test_see_other_redirect   s   z1SimpleHTTPClientTestMixin.test_see_other_redirectc              	   #   s    d}t   | G  fdddt}t| j| d*}| t |j| d|dddV  W d    n1 s:w   Y  W d    n1 sIw   Y     t	
d	V  d S )
N皙?c                       s   e Zd Z fddZdS )zGSimpleHTTPClientTestMixin.test_connect_timeout.<locals>.TimeoutResolverc                    s$      I d H  tjd ffgS N	127.0.0.1)rC   socketAF_INETget_http_portr,   argsr   cleanup_eventtestr.   r/   resolve  s   zOSimpleHTTPClientTestMixin.test_connect_timeout.<locals>.TimeoutResolver.resolveN)r1   r2   r3   r   r.   r   r.   r/   TimeoutResolver  s    r   resolverr   i  T)connect_timeoutrequest_timeoutraise_errorg?)r   r   r   r   assertRaisesr   r   r   rA   r   r   )r,   timeoutr   r-   r.   r   r/   test_connect_timeout	  s$   
z.SimpleHTTPClientTestMixin.test_connect_timeoutc                 C   sl   d}t jdkr	d}| t | jd|dd W d    n1 s!w   Y  | j   | jdd  d S )	Nr   ntg      ?z/trigger?wake=falseT)r   r   c                   S   
   t dS r   r   r   r.   r.   r.   r/   r   0     
 z@SimpleHTTPClientTestMixin.test_request_timeout.<locals>.<lambda>)	osr   r   r   r   r   r   r   r   )r,   r   r.   r.   r/   test_request_timeout&  s   
z.SimpleHTTPClientTestMixin.test_request_timeoutc                 C   s   t ddtjd\}| d }| j| d|  |f }| t | j	|ddd W d    n1 s5w   Y  | 	|}| 
|jd	 d S )
Nr   z::1)familyr   z%s://[::1]:%d/helloFT)
allow_ipv6r      Hello world!)r   r   AF_INET6getsocknamehttp_server
add_socketget_protocolr   rs   r   r   rn   )r,   sockportr#   r   r.   r.   r/   	test_ipv62  s   
z#SimpleHTTPClientTestMixin.test_ipv6c              	   C   s   |  d}| |jd |  d}| |jd ttdtjdI | t | j ddd W d    n1 s8w   Y  | t | j d	dd W d    n1 sTw   Y  W d    d S W d    d S 1 slw   Y  d S )
Nz/content_length?value=2,2   okz/content_length?value=2,%202,2z".*Multiple unequal Content-Lengthslevelz/content_length?value=2,4Tr   z/content_length?value=2,%202,3)	r   r   rn   r   r   r>   INFOr   r   r   r.   r.   r/   %test_multiple_content_length_accepted@  s    

"z?SimpleHTTPClientTestMixin.test_multiple_content_length_acceptedc                 C   s>   | j ddd}| |jd | |jd d | |j d S )Nr   HEADr   r   content-lengthrT   )r   r   r   rv   assertFalsern   r   r.   r.   r/   test_head_requestN  s   z+SimpleHTTPClientTestMixin.test_head_requestc                 C   sR   | j ddd}| |jd | |jd d | |jd d | |jd	 d S )
Nr   OPTIONSr   r   r  2zaccess-control-allow-originrZ   r   )r   r   r   rv   rn   r   r.   r.   r/   test_options_requestT  s
   z.SimpleHTTPClientTestMixin.test_options_requestc                 C   s*   |  d}| |jd | d|j d S )Nr   r`   rS   )r   r   r   assertNotInrv   r   r.   r.   r/   test_no_content[  s   
z)SimpleHTTPClientTestMixin.test_no_contentc                 C   s\   t d}| d}| ||j | ddd}| |}| ||j|j d S )Ns   ^127.0.0.1:[0-9]+$r   zhttp://zhttp://me:secret@)recompiler   r)   matchrn   r   replace)r,   host_rer   r#   r.   r.   r/   test_host_headerd  s   


z*SimpleHTTPClientTestMixin.test_host_headerc              	   C   s   t  \}}| | ttddd' | tj}| jd| dd W d    n1 s,w   Y  W d    n1 s;w   Y  tj	dkr{t
tjt
|jv }|s`ttdr`t
tjt
|jv }| ||j ttj}| |t
|jv |j d S d S )	N.*Frequiredzhttp://127.0.0.1:%d/Tr   cygwinWSAECONNREFUSED)r    
addCleanupr   r   r   r   errorr   sysplatformstrerrnoECONNREFUSED	exceptionhasattrr  r)   r   strerror)r,   cleanup_funcr   cmcontains_errnoexpected_messager.   r.   r/   test_connection_refusedm  s$   



z1SimpleHTTPClientTestMixin.test_connection_refusedc              	      s   t jddP  jddd  t}j fdd W d    n1 s2w   Y  	t
|jd j   jfd	d W d    d S 1 s[w   Y  d S )
Nr   r   r   
   )r   c                      s    j ddddS )Nr   r   Tr   r   )r   r   r.   )r-   r,   r.   r/   r     s    z>SimpleHTTPClientTestMixin.test_queue_timeout.<locals>.<lambda>zTimeout in request queuec                      s    S r7   r.   r.   )fut1r.   r/   r     s    )r   r   r   r   rC   r   r   r   r   r   r  r  r   r   )r,   r  r.   )r-   r%  r,   r/   test_queue_timeout  s   "z,SimpleHTTPClientTestMixin.test_queue_timeoutc                 C   s4   |  d}|jdkr| d d S | d|j d S )Nr   s   HTTP/1 requiredrequires HTTP/1.xs   hello)r   rn   skipTestr   r   r.   r.   r/   test_no_content_length  s   

z0SimpleHTTPClientTestMixin.test_no_content_lengthc                 C   s   |d |d d S N   1234   5678r.   r,   rP   r.   r.   r/   sync_body_producer  s   z,SimpleHTTPClientTestMixin.sync_body_producerc                 c   s"    |dV  t jV  |dV  d S r*  )r   momentr-  r.   r.   r/   async_body_producer  s   
z-SimpleHTTPClientTestMixin.async_body_producerc                 C   ,   | j dd| jd}|  | |jd d S Nr   r   r   body_producer   12345678r   r.  r   r   rn   r   r.   r.   r/   test_sync_body_producer_chunked  
   z9SimpleHTTPClientTestMixin.test_sync_body_producer_chunkedc                 C   2   | j dd| jddid}|  | |jd d S Nr   r   rS   8r   r4  rv   r5  r6  r   r.   r.   r/   &test_sync_body_producer_content_length     z@SimpleHTTPClientTestMixin.test_sync_body_producer_content_lengthc                 C   r1  r2  r   r0  r   r   rn   r   r.   r.   r/    test_async_body_producer_chunked  r8  z:SimpleHTTPClientTestMixin.test_async_body_producer_chunkedc                 C   r9  r:  r?  r   r.   r.   r/   'test_async_body_producer_content_length  r>  zASimpleHTTPClientTestMixin.test_async_body_producer_content_lengthc                 C   s2   dd }| j dd|d}|  | |jd d S )Nc                    :   | dI d H  dd l }|dI d H  | dI d H  d S Nr+  r   r,  asyncior   rP   rE  r.   r.   r/   r4    
   zRSimpleHTTPClientTestMixin.test_native_body_producer_chunked.<locals>.body_producerr   r   r3  r5  r   r   r   rn   r,   r4  r   r.   r.   r/   !test_native_body_producer_chunked  s   z;SimpleHTTPClientTestMixin.test_native_body_producer_chunkedc                 C   s8   dd }| j dd|ddid}|  | |jd d S )	Nc                    rB  rC  rD  rF  r.   r.   r/   r4    rG  zYSimpleHTTPClientTestMixin.test_native_body_producer_content_length.<locals>.body_producerr   r   rS   r;  r<  r5  rH  rI  r.   r.   r/   (test_native_body_producer_content_length  s   zBSimpleHTTPClientTestMixin.test_native_body_producer_content_lengthc                 C   s$   | j ddddd}| |jd d S )Nr   r   r+  T)r   rn   expect_100_continue)r   r   rn   r   r.   r.   r/   test_100_continue  s   z+SimpleHTTPClientTestMixin.test_100_continuec                 C   s,   dd }| j dd|dd}| |jd d S )Nc                 S   s   t d)Nzshould not be called)rs   rP   r.   r.   r/   r4    s   zQSimpleHTTPClientTestMixin.test_100_continue_early_response.<locals>.body_producerr   r   T)r   r4  rL  r|   )r   r   r   rI  r.   r.   r/    test_100_continue_early_response  s   z:SimpleHTTPClientTestMixin.test_100_continue_early_responsec                 C   sZ   g }g }| j d|j|jd ttt|}| |dg tdd |D }| |d d S )Nz/redirect?url=/hello)header_callbackstreaming_callbackzHello world!c                 S   s   g | ]	}| d r|qS )zHTTP/)rx   ).0hr.   r.   r/   
<listcomp>  r   zMSimpleHTTPClientTestMixin.test_streaming_follow_redirects.<locals>.<listcomp>r   )r   r@   r   mapr   r   r   )r,   rv   chunk_byteschunksnum_start_linesr.   r.   r/   test_streaming_follow_redirects  s   z9SimpleHTTPClientTestMixin.test_streaming_follow_redirectsN))r1   r2   r3   r   typingAnyr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r"  r&  r)  r.  r   rF   r0  r7  r=  r@  rA  rJ  rK  rM  rO  rY  r.   r.   r.   r/   r      sL    				


r   c                       s$   e Zd Z fddZdd Z  ZS )SimpleHTTPClientTestCasec                       t    |  | _d S r7   supersetUpr   http_clientrN   	__class__r.   r/   r`  	  r   zSimpleHTTPClientTestCase.setUpc                 K   s   t dddi|S )Nr(   Tr.   r   r   r.   r.   r/   r     rz   z&SimpleHTTPClientTestCase.create_client)r1   r2   r3   r`  r   __classcell__r.   r.   rb  r/   r\    s    r\  c                       sL   e Zd Z fddZdd Zdd Zdd Zd	d
 Zdd Zdd Z	  Z
S )SimpleHTTPSClientTestCasec                    r]  r7   r^  rN   rb  r.   r/   r`    r   zSimpleHTTPSClientTestCase.setUpc                 K   s   t ddtddd|S )NTF)validate_cert)r(   defaultsr.   )r   r   r   r.   r.   r/   r     s
   
z'SimpleHTTPSClientTestCase.create_clientc                 C   s&   | j ddtjid}| |jd d S )Nr   	cert_reqsssl_optionsr   )r   ssl	CERT_NONEr   rn   r,   respr.   r.   r/   test_ssl_options  s   z*SimpleHTTPSClientTestCase.test_ssl_optionsc                 C   s<   t t jj}d|_t j|_| jd|d}| |j	d d S )NFr   rj  r   )
rl  create_default_contextPurposeSERVER_AUTHcheck_hostnamerm  verify_moder   r   rn   )r,   ssl_ctxro  r.   r.   r/   test_ssl_context  s
   z*SimpleHTTPSClientTestCase.test_ssl_contextc              	   C   s   t tddd3 | tj | jdttjddd W d    n1 s%w   Y  W d    d S W d    d S 1 s=w   Y  d S )NSSL Error|Uncaught exceptionFr  r   )ri  Trk  r   )r   r   r   rl  SSLErrorr   r   CERT_REQUIREDrN   r.   r.   r/   test_ssl_options_handshake_fail&  s   
"z9SimpleHTTPSClientTestCase.test_ssl_options_handshake_failc              	   C   s   t td6 ttjj}| tj | jd|dd W d    n1 s&w   Y  W d    d S W d    d S 1 s>w   Y  d S )Nrx  r   Try  )	r   r   rl  rq  rr  rs  r   rz  r   )r,   ctxr.   r.   r/   test_ssl_context_handshake_fail/  s   "z9SimpleHTTPSClientTestCase.test_ssl_context_handshake_failc              	   C   sv   t td&}| tj | jdddd W d    n1 sw   Y  W d    n1 s.w   Y  | |j d S )Nr  /T)rg  r   )r   r   r   rl  rz  r   r  logged_stack)r,   
expect_logr.   r.   r/   test_error_logging6  s   z,SimpleHTTPSClientTestCase.test_error_logging)r1   r2   r3   r`  r   rp  rw  r|  r~  r  re  r.   r.   rb  r/   rf    s    	rf  c                       s0   e Zd Z fddZ fddZdd Z  ZS )CreateAsyncHTTPClientTestCasec                    s   t    t | _d S r7   )r_  r`  r   _save_configurationsavedrN   rb  r.   r/   r`  A  r   z#CreateAsyncHTTPClientTestCase.setUpc                    s   t | j t   d S r7   )r   _restore_configurationr  r_  tearDownrN   rb  r.   r/   r  E  r^   z&CreateAsyncHTTPClientTestCase.tearDownc                 C   sP  t t tt dd}| |jd W d    n1 sw   Y  tt ddd}| |jd W d    n1 s=w   Y  t jtdd tt dd}| |jd W d    n1 sbw   Y  tt ddd}| |jd W d    n1 sw   Y  tt d	dd}| |jd	 W d    d S 1 sw   Y  d S )
NTr'   r#     )r   r(      r         )r   	configurer   r   r   r   r+   r.   r.   r/   test_max_clientsI  s"   
"z.CreateAsyncHTTPClientTestCase.test_max_clients)r1   r2   r3   r`  r  r  re  r.   r.   rb  r/   r  @  s    r  c                   @   ,   e Zd Zdd Zdd Zdd Zdd Zd	S )
HTTP100ContinueTestCasec                 C   s`   |j d| _| js|jtdddt  |j  d S || _| jjj	
d}|| j d S )NHTTP/1. r   OKs   HTTP/1.1 100 CONTINUE

)r   rx   http1
connectionwrite_headersr	   r   rc   rm   rJ   rP   r   respond_200)r,   rm   r   r.   r.   r/   respond_100\  s   
z#HTTP100ContinueTestCase.respond_100c                    s.   |    jjjd}| fdd d S )Ns'   HTTP/1.1 200 OK
Content-Length: 1

Ac                    s    j jj S r7   )rm   r  rJ   rQ   )frN   r.   r/   r   m  r   z5HTTP100ContinueTestCase.respond_200.<locals>.<lambda>)resultrm   r  rJ   rP   r   )r,   r   r.   rN   r/   r  h  s
   
z#HTTP100ContinueTestCase.respond_200c                 C      | j S r7   )r  rN   r.   r.   r/   r   o  s   zHTTP100ContinueTestCase.get_appc                 C   s,   |  d}| js| d | |jd d S )Nr  r'     A)r   r  r(  r   rn   )r,   resr.   r.   r/   rM  s  s   

z)HTTP100ContinueTestCase.test_100_continueN)r1   r2   r3   r  r  r   rM  r.   r.   r.   r/   r  [  s
    r  c                   @   r  )
HTTP204NoContentTestCasec                 C   s   |j d| _| js|jtdddt  |j  d S |j }|	d |j
ddgd r7|	d	 n|	d
 |	d |  d S )Nr  r  r   r  s   HTTP/1.1 204 No content
r  Fs   Content-Length: 5
s   Content-Length: 0
s   
)r   rx   r  r  r  r	   r   rc   rI   rP   	argumentsrE   rQ   )r,   rm   rJ   r.   r.   r/   respond_204{  s   




z$HTTP204NoContentTestCase.respond_204c                 C   r  r7   )r  rN   r.   r.   r/   r     r   z HTTP204NoContentTestCase.get_appc                 C   s:   |  d}| js| d | |jd | |jd d S )Nr  r'  r`       )r   r  r(  r   r   rn   rn  r.   r.   r/   test_204_no_content  s
   

z,HTTP204NoContentTestCase.test_204_no_contentc              	   C   s   t tdtjd@ | t" | jddd | js| d | j	j
tkr)| d W d    n1 s3w   Y  W d    d S W d    d S 1 sKw   Y  d S )Nz-.*Response with code 204 should not have bodyr   z	/?error=1Tr   r'  z#curl client accepts invalid headers)r   r   r>   r   r   r   r   r  r(  ra  configured_classr   rN   r.   r.   r/   test_204_invalid_content_length  s   

"z8HTTP204NoContentTestCase.test_204_invalid_content_lengthN)r1   r2   r3   r  r   r  r  r.   r.   r.   r/   r  z  s
    r  c                       s4   e Zd Z fddZdd Zdd Zdd Z  ZS )	HostnameMappingTestCasec                    s(   t    tdd|  fdd| _d S )Nr   )zwww.example.com)zfoo.example.comi@  )hostname_mapping)r_  r`  r   r   ra  rN   rb  r.   r/   r`    s   

zHostnameMappingTestCase.setUpc                 C      t tdtgS Nr   r"   r#   r   rN   r.   r.   r/   r     rW   zHostnameMappingTestCase.get_appc                 C   s,   |  d|   }|  | |jd d S )Nzhttp://www.example.com:%d/hellor   )r   r   r   r   rn   r   r.   r.   r/   test_hostname_mapping  s   z-HostnameMappingTestCase.test_hostname_mappingc                 C   $   |  d}|  | |jd d S )Nz!http://foo.example.com:8000/hellor   rH  r   r.   r.   r/   test_port_mapping     
z)HostnameMappingTestCase.test_port_mapping)r1   r2   r3   r`  r   r  r  re  r.   r.   rb  r/   r    s
    	r  c                       s,   e Zd Z fddZdd Zdd Z  ZS )ResolveTimeoutTestCasec                    s<   t  | _|  G  fdddt}t   t| d| _d S )Nc                       s   e Zd Zej fddZdS )z1ResolveTimeoutTestCase.setUp.<locals>.BadResolverc                 ?   s"     j  V  tjd  ffgS r   )r   rC   r   r   r   r   r   r.   r/   r     s   z9ResolveTimeoutTestCase.setUp.<locals>.BadResolver.resolveN)r1   r2   r3   r   rF   r   r.   r  r.   r/   BadResolver  s    r  r   )r   r   r   r_  r`  r   ra  )r,   r  rb  r  r/   r`    s
   
zResolveTimeoutTestCase.setUpc                 C   r  r  r  rN   r.   r.   r/   r     rW   zResolveTimeoutTestCase.get_appc                 C   sX   |  t | jdddd W d    n1 sw   Y  | j  | jdd  d S )Nr   r   Tr$  c                   S   r   r   r   r.   r.   r.   r/   r     r   z=ResolveTimeoutTestCase.test_resolve_timeout.<locals>.<lambda>)r   r   r   r   rA   r   r   rN   r.   r.   r/   test_resolve_timeout  s
   
z+ResolveTimeoutTestCase.test_resolve_timeout)r1   r2   r3   r`  r   r  re  r.   r.   rb  r/   r    s    r  c                   @   r  )
MaxHeaderSizeTestc                 C   4   G dd dt }G dd dt }td|fd|fgS )Nc                   @   r%   )z/MaxHeaderSizeTest.get_app.<locals>.SmallHeadersc                 S   rY   )NX-Fillerdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar[   r\   rN   r.   r.   r/   rE     r^   z3MaxHeaderSizeTest.get_app.<locals>.SmallHeaders.getNre   r.   r.   r.   r/   SmallHeaders  r4   r  c                   @   r%   )z/MaxHeaderSizeTest.get_app.<locals>.LargeHeadersc                 S   rY   )Nr    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar[   r\   rN   r.   r.   r/   rE     r^   z3MaxHeaderSizeTest.get_app.<locals>.LargeHeaders.getNre   r.   r.   r.   r/   LargeHeaders  r4   r  /small/larger!   r"   )r,   r  r  r.   r.   r/   r     s   zMaxHeaderSizeTest.get_appc                 C   
   t ddS )Ni   )max_header_sizerd  rN   r.   r.   r/   r0        
z!MaxHeaderSizeTest.get_http_clientc                 C   r  )Nr  r   rH  r   r.   r.   r/   test_small_headers  r  z$MaxHeaderSizeTest.test_small_headersc              	   C   ~   t tdtjd- | t | jddd W d    n1 s w   Y  W d    d S W d    d S 1 s8w   Y  d S )NzUnsatisfiable readr   r  Tr   )r   r   r>   r   r   r   r   rN   r.   r.   r/   test_large_headers  s   "z$MaxHeaderSizeTest.test_large_headersN)r1   r2   r3   r   r0   r  r  r.   r.   r.   r/   r    s
    r  c                   @   r  )
MaxBodySizeTestc                 C   r  )Nc                   @   r%   )z*MaxBodySizeTest.get_app.<locals>.SmallBodyc                 S      |  dd  d S )N   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@   rN  rN   r.   r.   r/   rE     rz   z.MaxBodySizeTest.get_app.<locals>.SmallBody.getNre   r.   r.   r.   r/   	SmallBody  r4   r  c                   @   r%   )z*MaxBodySizeTest.get_app.<locals>.LargeBodyc                 S   r  Nr  d   rN  rN   r.   r.   r/   rE     rz   z.MaxBodySizeTest.get_app.<locals>.LargeBody.getNre   r.   r.   r.   r/   	LargeBody  r4   r  r  r  r  )r,   r  r  r.   r.   r/   r     s   zMaxBodySizeTest.get_appc                 C   r  )N   )max_body_sizerd  rN   r.   r.   r/   r0     r  zMaxBodySizeTest.get_http_clientc                 C   (   |  d}|  | |jdd  d S )Nr     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar  rH  r   r.   r.   r/   test_small_body
     
zMaxBodySizeTest.test_small_bodyc              	   C   r  )Nz9Malformed HTTP message from None: Content-Length too longr   r  Tr   r   r   r>   r   r   r   r   rN   r.   r.   r/   test_large_body  s   "zMaxBodySizeTest.test_large_bodyN)r1   r2   r3   r   r0   r  r  r.   r.   r.   r/   r    s
    r  c                   @   $   e Zd Zdd Zdd Zdd ZdS )MaxBufferSizeTestc                 C      G dd dt }td|fgS )Nc                   @   r%   )z,MaxBufferSizeTest.get_app.<locals>.LargeBodyc                 S   r  r  rN  rN   r.   r.   r/   rE     rz   z0MaxBufferSizeTest.get_app.<locals>.LargeBody.getNre   r.   r.   r.   r/   r    r4   r  r  r  )r,   r  r.   r.   r/   r     s   zMaxBufferSizeTest.get_appc                 C   s   t dddS )Ni  r  )r  max_buffer_sizerd  rN   r.   r.   r/   r0   !  s   z!MaxBufferSizeTest.get_http_clientc                 C   r  )Nr  r  r  rH  r   r.   r.   r/   r  '  r  z!MaxBufferSizeTest.test_large_bodyN)r1   r2   r3   r   r0   r  r.   r.   r.   r/   r    s    r  c                   @   r  )ChunkedWithContentLengthTestc                 C   r  )Nc                   @   r%   )zFChunkedWithContentLengthTest.get_app.<locals>.ChunkedWithContentLengthc                 S   rY   )NzTransfer-EncodingchunkedzHello worldr\   rN   r.   r.   r/   rE   0  s   zJChunkedWithContentLengthTest.get_app.<locals>.ChunkedWithContentLength.getNre   r.   r.   r.   r/   ChunkedWithContentLength/  r4   r  /chunkwithclr  )r,   r  r.   r.   r/   r   .  s   z$ChunkedWithContentLengthTest.get_appc                 C   s   t  S r7   rd  rN   r.   r.   r/   r0   7  r   z,ChunkedWithContentLengthTest.get_http_clientc              	   C   r  )NzXMalformed HTTP message from None: Message with both Transfer-Encoding and Content-Lengthr   r  Tr   r  rN   r.   r.   r/    test_chunked_with_content_length:  s   "z=ChunkedWithContentLengthTest.test_chunked_with_content_lengthN)r1   r2   r3   r   r0   r  r.   r.   r.   r/   r  -  s    	r  )Vr   
contextlibr   r  r>   r   r	  r   rl  r  rZ  tornado.escaper   r   tornador   r   tornado.httpclientr   tornado.httputilr   r	   tornado.ioloopr
   tornado.iostreamr   tornado.locksr   tornado.logr   tornado.netutilr   r   tornado.simple_httpclientr   r   r   tornado.test.httpclient_testr   r   r   r   r   tornado.testr   tornado.testingr   r   r   r   r   tornado.test.utilr   r   r    tornado.webr!   r"   r#   r$   HTTPClientCommonTestCaser&   r6   rH   rR   rX   r_   rf   rr   rt   rw   ry   r{   objectr   r\  rf  r  r  r  r  r  r  r  r  r  r.   r.   r.   r/   <module>   sh      y	/1