o
    )Zh.                    @   s  d dl mZ d dl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 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mZmZmZ d dl m!Z! d dl"m#Z#m$Z$ d dl%m&Z&m'Z'm(Z(m)Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9 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lAmBZB d dlCZCd dlDZDd dlEZEd dlFZFd dlGZGd dlHZHd dlIZId dlJZKdd ZLG dd deZMG dd deMZNG dd de'ZOG dd de'ZPG dd deIjQZRG dd deIjQZSG d d! d!eMZTG d"d# d#eMZUG d$d% d%e'ZVG d&d' d'eMZWG d(d) d)e'ZXG d*d+ d+eMZYG d,d- d-e'ZZG d.d/ d/eMZ[G d0d1 d1e'Z\G d2d3 d3e'Z]G d4d5 d5e'Z^G d6d7 d7e'Z_G d8d9 d9e'Z`G d:d; d;e'ZaG d<d= d=e'Z)G d>d? d?e'ZbG d@dA dAe'ZcG dBdC dCe'ZdG dDdE dEe'ZeG dFdG dGeMZfG dHdI dIeMZgG dJdK dKeMZhG dLdM dMeMZiG dNdO dOeMZjG dPdQ dQeMZkG dRdS dSeMZlG dTdU dUeMZmG dVdW dWeMZnG dXdY dYeMZoG dZd[ d[eMZpG d\d] d]eNZqG d^d_ d_eNZrG d`da daeNZsG dbdc dceNZtG ddde deeNZuG dfdg dgeNZvG dhdi dieMZwG djdk dkeNZxG dldm dmeMZyG dndo doeNZzG dpdq dqe{Z|G drds dseNZ}G dtdu dueNZ~G dvdw dweNZG dxdy dyeNZG dzd{ d{eNZG d|d} d}eMZG d~d deNZG dd deNZG dd deNZG dd deNZG dd deNZG dd deMZG dd deMZG dd deMZG dd deMZG dd deMZe6G dd de'ZG dd deZG dd deeMZG dd deeMZG dd deNZG dd deNZG dd deIjQZG dd deNZG dd deNZG dd deNZG dd deNZG dd deMZG dd deMZG dd deNZG dd deIjQZG dd deZG dd deIjQZG dd deMZG dd deMZdS )    )Future)gen)json_decodeutf8
to_unicoderecursive_unicode
native_strto_basestring)HTTPClientError)format_timestamp)IOStream)locale)Event)app_loggen_logSimpleAsyncHTTPClient
DictLoader)AsyncHTTPTestCaseAsyncTestCase	ExpectLoggen_test)ignore_deprecation)
ObjectDictunicode_type)ApplicationRequestHandlerStaticFileHandlerRedirectHandler	HTTPErrorMissingArgumentErrorErrorHandlerauthenticatedurl_create_signature_v1create_signed_valuedecode_signed_valueget_signature_key_versionUIModuleFinishstream_request_bodyremoveslashaddslashGZipContentEncodingN)BytesIOc                  G   s   t jjt jtg| R  S N)ospathjoindirname__file__)a r7   L/var/www/html/lang_env/lib/python3.10/site-packages/tornado/test/web_test.pyrelpath=      r9   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	WebTestCasezBase class for web tests that also supports WSGI mode.

    Override get_handlers and get_app_kwargs instead of get_app.
    This class is deprecated since WSGI mode is no longer supported.
    c                 C   s    t |  fi |  | _| jS r0   )r   get_handlersget_app_kwargsappselfr7   r7   r8   get_appH   s   zWebTestCase.get_appc                 C      t  r0   NotImplementedErrorr?   r7   r7   r8   r<   L      zWebTestCase.get_handlersc                 C   s   i S r0   r7   r?   r7   r7   r8   r=   O      zWebTestCase.get_app_kwargsN)__name__
__module____qualname____doc__rA   r<   r=   r7   r7   r7   r8   r;   A   s
    r;   c                   @   s   e Zd ZdZdZdd ZdS )SimpleHandlerTestCasezSimplified base class for tests that work with a single handler class.

    To use, define a nested class named ``Handler``.
    Nc                 C   s   d| j fgS )N/Handlerr?   r7   r7   r8   r<   [      z"SimpleHandlerTestCase.get_handlers)rG   rH   rI   rJ   rN   r<   r7   r7   r7   r8   rK   S   s    rK   c                   @      e Zd Zdd ZdS )HelloHandlerc                 C      |  d d S Nhellowriter?   r7   r7   r8   get`      zHelloHandler.getNrG   rH   rI   rW   r7   r7   r7   r8   rQ   _       rQ   c                   @   s(   e Zd Zd	ddZdd Zd
ddZdS )CookieTestRequestHandler
0123456789Nc                 C   s<   i | _ |d u rtt|dd| _d S tt||dd| _d S )N)cookie_secret)settingsr]   key_version)_cookiesr   dictapplication)r@   r]   r`   r7   r7   r8   __init__f   s   
z!CookieTestRequestHandler.__init__c                 C   s   | j |S r0   )ra   rW   )r@   namer7   r7   r8   
get_cookier   rO   z#CookieTestRequestHandler.get_cookiec                 C   s   || j |< d S r0   )ra   )r@   re   valueexpires_daysr7   r7   r8   
set_cookieu   rX   z#CookieTestRequestHandler.set_cookie)r\   Nr0   )rG   rH   rI   rd   rf   ri   r7   r7   r7   r8   r[   d   s    
r[   c                   @   $   e Zd Zdd Zdd Zdd ZdS )SecureCookieV1Testc                 C   0   t  }|jdddd | |jdddd d S )Nfoo   bar   versionmin_versionr[   set_signed_cookieassertEqualget_signed_cookier@   handlerr7   r7   r8   test_round_trip{      z"SecureCookieV1Test.test_round_tripc                 C   s   t  }|jdtddd |jd }td|}|d usJ |d}|d}| t	|j
jd dd|| | t	|j
jd dd	d
| | tdt|t|f |jd< ttd | |jdddd u  W d    d S 1 suw   Y  d S )Nrm   s   d76df8e7aefcro   rp   s   12345678\|([0-9]+)\|([0-9a-f]+)   r]   Z123456781234s   5678z1234|5678%s|%szCookie timestamp in futurerr   )r[   ru   binasciia2b_hexra   rematchgrouprv   r%   rc   r^   r   r	   r   r   
assertTruerw   )r@   ry   cookier   	timestampsigr7   r7   r8   &test_cookie_tampering_future_timestamp   s>   






"z9SecureCookieV1Test.test_cookie_tampering_future_timestampc                 C   rl   )Nrm      ro   rp   rr   rt   rx   r7   r7   r8   test_arbitrary_bytes   s   z'SecureCookieV1Test.test_arbitrary_bytesN)rG   rH   rI   rz   r   r   r7   r7   r7   r8   rk   z   s    &rk   c                   @   s>   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd ZdS )SecureCookieV2TestZajklasdf0ojaisdfZaslkjasaolwkjsdf)r   ro   c                 C   rl   )Nrm   rn   r|   rp   rr   rt   rx   r7   r7   r8   rz      r{   z"SecureCookieV2Test.test_round_tripc                 C   0   t | jdd}|dd | |dd d S )Nr   r_   rm   rn   r[   KEY_VERSIONSru   rv   rw   rx   r7   r7   r8   test_key_version_roundtrip   
   z-SecureCookieV2Test.test_key_version_roundtripc                 C   r   )Nro   r_   rm   rn   r   rx   r7   r7   r8   ,test_key_version_roundtrip_differing_version   r   z?SecureCookieV2Test.test_key_version_roundtrip_differing_versionc                 C   sF   t | jdd}|dd t | jdd}|j|_| |dd d S Nr   r_   rm   rn   ro   )r[   r   ru   ra   rv   rw   )r@   ry   new_handlerr7   r7   r8   "test_key_version_increment_version   s   z5SecureCookieV2Test.test_key_version_increment_versionc                 C   sX   t | jdd}|dd | j }|d t |dd}|j|_| |dd  d S r   )r[   r   ru   copypopra   rv   rw   )r@   ry   Znew_key_versionsr   r7   r7   r8   #test_key_version_invalidate_version   s   

z6SecureCookieV2Test.test_key_version_invalidate_versionN)	rG   rH   rI   r   rz   r   r   r   r   r7   r7   r7   r8   r      s    
r   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 ZdS )
FinalReturnTestNc                    s<   |  G  fdddt }G  fdddt }d|fd|fgS )Nc                       s0   e Zd Zej fddZej fddZdS )z3FinalReturnTest.get_handlers.<locals>.FinishHandlerc                 3   s    |    _ jV  d S r0   )finishfinal_returnr?   testr7   r8   rW      s   
z7FinalReturnTest.get_handlers.<locals>.FinishHandler.getc                 3   s.    |  d |  V  | d _ jV  d S )Nzhello,Zworld)rV   flushr   r   r?   r   r7   r8   post   s
   

z8FinalReturnTest.get_handlers.<locals>.FinishHandler.postN)rG   rH   rI   r   	coroutinerW   r   r7   r   r7   r8   FinishHandler   s
    r   c                       s&   e Zd Zdd Zej fddZdS )z3FinalReturnTest.get_handlers.<locals>.RenderHandlerc                 S   s   t ddiS )Nfoo.htmlhir   r@   r2   r7   r7   r8   create_template_loader   rO   zJFinalReturnTest.get_handlers.<locals>.RenderHandler.create_template_loaderc                    s   |  d _d S Nr   )renderr   r?   r   r7   r8   rW      s   z7FinalReturnTest.get_handlers.<locals>.RenderHandler.getN)rG   rH   rI   r   r   r   rW   r7   r   r7   r8   RenderHandler   s    r   /finish/renderr   )r@   r   r   r7   r   r8   r<      s   zFinalReturnTest.get_handlersc                 C   
   t ddS )Nr   )Ztemplate_pathrb   r?   r7   r7   r8   r=         
zFinalReturnTest.get_app_kwargsc                 C   s   |  | d}| |jd | | jt | | j  | j | dddd}| |jd | | jt | | j  d S )Nr      POST    methodbody)	fetchget_urlrv   codeassertIsInstancer   r   r   doner@   responser7   r7   r8    test_finish_method_return_future   s   z0FinalReturnTest.test_finish_method_return_futurec                 C   s0   |  | d}| |jd | | jt d S )Nr   r   )r   r   rv   r   r   r   r   r   r7   r7   r8    test_render_method_return_future	  s   z0FinalReturnTest.test_render_method_return_future)rG   rH   rI   r   r<   r=   r   r   r7   r7   r7   r8   r      s    r   c                   @   s\   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd ZdS )
CookieTestc           
   
   C   s   G dd dt }G dd dt }G dd dt }G dd dt }G d	d
 d
t }G dd dt }G dd dt }G dd dt }G dd dt }	d|fd|fd|fd|fd|fd|fd|fd|fd|	fg	S )Nc                   @   rP   )z1CookieTest.get_handlers.<locals>.SetCookieHandlerc                 S   (   |  dd |  dd |  dd d S )Nstrasdfunicodeqwerbytess   zxcvri   r?   r7   r7   r8   rW     s   z5CookieTest.get_handlers.<locals>.SetCookieHandler.getNrY   r7   r7   r7   r8   SetCookieHandler  rZ   r   c                   @   rP   )z1CookieTest.get_handlers.<locals>.GetCookieHandlerc                 S   s&   |  dd}|d usJ | | d S )Nrm   default)rf   rV   )r@   r   r7   r7   r8   rW     s   z5CookieTest.get_handlers.<locals>.GetCookieHandler.getNrY   r7   r7   r7   r8   GetCookieHandler  rZ   r   c                   @   rP   )z7CookieTest.get_handlers.<locals>.SetCookieDomainHandlerc                 S      | j ddddd d S )NZunicode_argsZblahzfoo.com/foo)domainr2   r   r?   r7   r7   r8   rW      s   z;CookieTest.get_handlers.<locals>.SetCookieDomainHandler.getNrY   r7   r7   r7   r8   SetCookieDomainHandler  rZ   r   c                   @   rP   )z<CookieTest.get_handlers.<locals>.SetCookieSpecialCharHandlerc                 S   r   )Nequalsa=b	semicolona;bquotea"br   r?   r7   r7   r8   rW   &  s   z@CookieTest.get_handlers.<locals>.SetCookieSpecialCharHandler.getNrY   r7   r7   r7   r8   SetCookieSpecialCharHandler%  rZ   r   c                   @   rP   )z:CookieTest.get_handlers.<locals>.SetCookieOverwriteHandlerc                 S   s0   | j dddd | j dddd |  dd d S )Nr6   bzexample.com)r   cder   r?   r7   r7   r8   rW   ,  s   z>CookieTest.get_handlers.<locals>.SetCookieOverwriteHandler.getNrY   r7   r7   r7   r8   SetCookieOverwriteHandler+  rZ   r   c                   @   rP   )z7CookieTest.get_handlers.<locals>.SetCookieMaxAgeHandlerc                 S      | j dddd d S )Nrm   bar
   )max_ager   r?   r7   r7   r8   rW   4     z;CookieTest.get_handlers.<locals>.SetCookieMaxAgeHandler.getNrY   r7   r7   r7   r8   SetCookieMaxAgeHandler3  rZ   r   c                   @   rP   )z<CookieTest.get_handlers.<locals>.SetCookieExpiresDaysHandlerc                 S   r   )Nrm   r   r   )rh   r   r?   r7   r7   r8   rW   8  r   z@CookieTest.get_handlers.<locals>.SetCookieExpiresDaysHandler.getNrY   r7   r7   r7   r8   SetCookieExpiresDaysHandler7  rZ   r   c                   @   rP   )z4CookieTest.get_handlers.<locals>.SetCookieFalsyFlagsc                 S   sD   | j dddd | j dddd | j dddd | j d	ddd d S )
Nr6   1T)securer   Fr   )httponlyr   r   r?   r7   r7   r8   rW   <  s   z8CookieTest.get_handlers.<locals>.SetCookieFalsyFlags.getNrY   r7   r7   r7   r8   SetCookieFalsyFlags;  rZ   r   c                   @   rP   )z8CookieTest.get_handlers.<locals>.SetCookieDeprecatedArgsc                 S   r   )Nr6   r   Tr   )HttpOnlyZpATHr   r?   r7   r7   r8   rW   C  s   z<CookieTest.get_handlers.<locals>.SetCookieDeprecatedArgs.getNrY   r7   r7   r7   r8   SetCookieDeprecatedArgsB  rZ   r   /set/get/set_domain/special_char/set_overwrite/set_max_age/set_expires_days/set_falsy_flags/set_deprecatedr   )
r@   r   r   r   r   r   r   r   r   r   r7   r7   r8   r<     s&   zCookieTest.get_handlersc                 C   s*   |  d}| t|jdg d d S )Nr   
Set-Cookie)zbytes=zxcv; Path=/zstr=asdf; Path=/zunicode=qwer; Path=/)r   rv   sortedheadersget_listr   r7   r7   r8   test_set_cookieS  s
   
zCookieTest.test_set_cookiec                 C   sd   | j dddid}| |jd | j dddid}| |jd | j dddid}| |jd d S )	Nr   Cookiefoo=barr   rn   z	foo="bar"z/=exception;   defaultr   rv   r   r   r7   r7   r8   test_get_cookieZ  s   zCookieTest.test_get_cookiec                 C   s$   |  d}| |jddg d S )Nr   r   z,unicode_args=blah; Domain=foo.com; Path=/foor   rv   r   r   r   r7   r7   r8   test_set_cookie_domaind  s
   

z!CookieTest.test_set_cookie_domainc                 C   s   |  d}t|jd}| t|d | |d d | |d d | |d d	v |d  g d
}|D ]\}}td| | j dd|id}| |j	t
| q7d S )Nr   r      r   zequals="a=b"; Path=/ro   zquote="a\"b"; Path=/r|   )zsemicolon="a;b"; Path=/zsemicolon="a\073b"; Path=/))zfoo=a=br   )z	foo="a=b"r   )z	foo="a;b"z"a)z
foo=a\073bza\073b)zfoo="a\073b"r   )z
foo="a\"b"r   z	trying %rr   r   r   )r   r   r   r   rv   lenr   loggingdebugr   r   )r@   r   r   dataheaderexpectedr7   r7   r8   test_cookie_special_chark  s   

z#CookieTest.test_cookie_special_charc                 C   s.   |  d}|jd}| t|ddg d S )Nr   r   za=e; Path=/zc=d; Domain=example.com; Path=/r   r   r   rv   r   r@   r   r   r7   r7   r8   test_set_cookie_overwrite  s
   
z$CookieTest.test_set_cookie_overwritec                 C   s,   |  d}|jd}| t|dg d S )Nr   r   zfoo=bar; Max-Age=10; Path=/r  r  r7   r7   r8   test_set_cookie_max_age  s   
z"CookieTest.test_set_cookie_max_agec                 C   s   |  d}|jd}|d usJ td|}|d usJ tjtjjtj	dd }t
j| d }| t||  dk  d S )Nr   r   z(foo=bar; expires=(?P<expires>.+); Path=/r   daysexpires)r   r   rW   r   r   datetimenowtimezoneutc	timedeltaemailutilsparsedate_to_datetime	groupdictr   abstotal_secondsr@   r   r   r   r  Zheader_expiresr7   r7   r8   test_set_cookie_expires_days  s   
z'CookieTest.test_set_cookie_expires_daysc                 C   sn   |  d}t|jd}| |d  d | |d  d | |d  d | |d	  d
 d S )Nr   r   r   za=1; path=/; securero   zb=1; path=/r|   zc=1; httponly; path=/r   zd=1; path=/)r   r   r   r   rv   lowerr  r7   r7   r8   test_set_cookie_false_flags  s   
z&CookieTest.test_set_cookie_false_flagsc                 C   sL   t   | d}W d    n1 sw   Y  |jd}| |d d S )Nr   r   za=b; HttpOnly; Path=/foo)r   r   r   rW   rv   )r@   r   r   r7   r7   r8   test_set_cookie_deprecated  s
   z%CookieTest.test_set_cookie_deprecatedN)rG   rH   rI   r<   r   r   r   r  r  r  r  r  r  r7   r7   r7   r8   r     s    C

r   c                   @   s(   e Zd Zdd Zdd Zedd ZdS )AuthRedirectRequestHandlerc                 C   
   || _ d S r0   	login_url)r@   r  r7   r7   r8   
initialize  r   z%AuthRedirectRequestHandler.initializec                 C      | j S r0   r  r?   r7   r7   r8   get_login_url  rE   z(AuthRedirectRequestHandler.get_login_urlc                 C   rR   )N  )
send_errorr?   r7   r7   r8   rW        zAuthRedirectRequestHandler.getN)rG   rH   rI   r  r  r#   rW   r7   r7   r7   r8   r    s
    r  c                   @   rj   )AuthRedirectTestc                 C   s    dt tddfdt tddfgS )N	/relativez/loginr  	/absolutezhttp://example.com/login)r  rb   r?   r7   r7   r8   r<     s   zAuthRedirectTest.get_handlersc                 C   s8   | j | ddd}| |jd | |jd d d S )Nr$  FZfollow_redirects.  Locationz/login?next=%2Frelative)r   r   rv   r   r   r   r7   r7   r8   test_relative_auth_redirect  s   z,AuthRedirectTest.test_relative_auth_redirectc                 C   sF   | j | ddd}| |jd | td|jd |jd  d S )Nr%  Fr&  r'  zIhttp://example.com/login\?next=http%3A%2F%2F127.0.0.1%3A[0-9]+%2Fabsoluter(  )r   r   rv   r   r   r   r   r   r   r7   r7   r8   test_absolute_auth_redirect  s   z,AuthRedirectTest.test_absolute_auth_redirectN)rG   rH   rI   r<   r)  r*  r7   r7   r7   r8   r#    s    
r#  c                   @   s*   e Zd Zdd Zejdd Zdd ZdS )ConnectionCloseHandlerc                 C   r  r0   r   r@   r   r7   r7   r8   r    r   z!ConnectionCloseHandler.initializec                 c   s    | j   | j j V  d S r0   )r   on_handler_waitingcleanup_eventwaitr?   r7   r7   r8   rW     s   
zConnectionCloseHandler.getc                 C   s   | j   d S r0   )r   on_connection_closer?   r7   r7   r8   r0    rX   z*ConnectionCloseHandler.on_connection_closeN)rG   rH   rI   r  r   r   rW   r0  r7   r7   r7   r8   r+    s
    
r+  c                   @   ,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ConnectionCloseTestc                 C   s   t  | _dtt| dfgS )NrL   r   )r   r.  r+  rb   r?   r7   r7   r8   r<     s   z ConnectionCloseTest.get_handlersc                 C   s`   t  t jt jd}|d|  f t|| _| jd |   | j	
  | jdd  d S )Nr   	127.0.0.1s   GET / HTTP/1.0

c                   S   s
   t dS Nr   )r   sleepr7   r7   r7   r8   <lambda>  s   
 z;ConnectionCloseTest.test_connection_close.<locals>.<lambda>)socketAF_INETSOCK_STREAMconnectget_http_portr   streamrV   r/  r.  setZio_loopZrun_sync)r@   sr7   r7   r8   test_connection_close  s   

z)ConnectionCloseTest.test_connection_closec                 C   s   t d | j  d S )Nzhandler waiting)r   r   r<  closer?   r7   r7   r8   r-       
z&ConnectionCloseTest.on_handler_waitingc                 C   s   t d |   d S )Nzconnection closed)r   r   stopr?   r7   r7   r8   r0       
z'ConnectionCloseTest.on_connection_closeN)rG   rH   rI   r<   r?  r-  r0  r7   r7   r7   r8   r2    s
    
r2  c                   @   rP   )EchoHandlerc                 G   s   | j jD ]=}t|tkrtdt| | j j| D ]}t|tkr*tdt| q| |D ]}t|tkr@tdt| q0q|D ]}t|tkrTtdt| qD| t	| j j
|t| j jd d S )Nzincorrect type for key: %rzincorrect type for value: %rzincorrect type for path arg: %rr2   	path_argsargs)request	argumentstyper   	Exceptionr   get_argumentsr   rV   rb   r2   r   )r@   rF  keyZbvalueZsvalueargr7   r7   r8   rW     s.   
zEchoHandler.getNrY   r7   r7   r7   r8   rD    rZ   rD  c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )RequestEncodingTestc                 C   s   dt fdt fgS )Nz/group/(.*)z/slashes/([^/]*)/([^/]*))rD  r?   r7   r7   r8   r<        z RequestEncodingTest.get_handlersc                 C   s   t | |jS r0   )r   r   r   r   r7   r7   r8   
fetch_json  rP  zRequestEncodingTest.fetch_jsonc                 C   sF   |  | dtddgi d |  | dtddgddgid d S )Nz
/group/%3F?rE  z/group/%3F?%3F=%3Frv   rQ  rb   r?   r7   r7   r8   test_group_question_mark  s   z,RequestEncodingTest.test_group_question_markc                 C   s&   |  | dddgddgid d S )Nz/group/%C3%A9?arg=%C3%A9z/group/%C3%A9   érN  rE  rv   rQ  r?   r7   r7   r8   test_group_encoding)  s   z'RequestEncodingTest.test_group_encodingc                 C   sD   |  | dtdddgi d |  | dtdddgi d d S )Nz/slashes/foo/barrm   r   rE  z/slashes/a%2Fb/c%2Fdza/bzc/drS  r?   r7   r7   r8   test_slashes4  s   z RequestEncodingTest.test_slashesc                 C   :   t td | d W d    d S 1 sw   Y  d S )Nz.*Invalid unicodez/group/?arg=%25%e9)r   r   r   r?   r7   r7   r8   
test_error@     "zRequestEncodingTest.test_errorN)	rG   rH   rI   r<   rQ  rT  rW  rX  rZ  r7   r7   r7   r8   rO    s    rO  c                   @   r1  )
TypeCheckHandlerc                 C   s  i | _ | d|  t | d| dt | dt| j d t	 | dt| j
 d jt	 t| j dgkrFtd| j  | d	| dt | d
| dt	 | d| jt | d|  t	 | d| ddt	 | d|  t	 d S )Nstatusargumentrm   Z
cookie_keyr   cookie_valuer   z%unexpected values for cookie keys: %rrw   rf   
xsrf_tokenxsrf_form_htmlreverse_url	typecheckZrequest_summary)errors
check_typeZ
get_statusintget_argumentr   listcookieskeysr   valuesrg   rK  rw   r   rf   r`  ra  rb  _request_summaryr?   r7   r7   r8   prepareH  s   zTypeCheckHandler.preparec                 C      |  d|t | | j d S Npath_componentre  r   rV   rd  r@   rp  r7   r7   r8   rW   c  s   zTypeCheckHandler.getc                 C   rn  ro  rq  rr  r7   r7   r8   r   i  s   zTypeCheckHandler.postc                 C   s*   t |}||krd||f | j|< d S d S )Nzexpected %s, got %s)rJ  rd  )r@   re   objexpected_typeZactual_typer7   r7   r8   re  m  s   zTypeCheckHandler.check_typeN)rG   rH   rI   rm  rW   r   re  r7   r7   r7   r8   r\  G  s
    r\  c                   @   s   e Zd ZdddZdd ZdS )DecodeArgHandlerNc                 C   sF   t |tkrtdt | d| jjv r!|t| jjd d S |S )Nzunexpected type for value: %rencodingr   )rJ  r   rK  rH  rI  decoder   )r@   rg   re   r7   r7   r8   decode_argumentt  s
   z DecodeArgHandler.decode_argumentc                 C   s*   dd }|  |||| dd d S )Nc                 S   s:   t | tkrdtt| gS t | tkrd| gS td)Nr   r   zunknown type)rJ  r   r   r~   b2a_hexr   rK  )r>  r7   r7   r8   describe~  s
   z&DecodeArgHandler.get.<locals>.describerm   r2   query)rV   rg  )r@   rN  rz  r7   r7   r8   rW   }  s   "zDecodeArgHandler.getr0   )rG   rH   rI   rx  rW   r7   r7   r7   r8   ru  s  s    
	ru  c                   @   rP   )LinkifyHandlerc                 C   s   | j ddd d S )Nlinkify.htmlzhttp://example.com)messager   r?   r7   r7   r8   rW        zLinkifyHandler.getNrY   r7   r7   r7   r8   r}    rZ   r}  c                   @   rP   )UIModuleResourceHandlerc                 C   s   | j dddgd d S )N	page.htmlro   r|   )entriesr  r?   r7   r7   r8   rW     s   zUIModuleResourceHandler.getNrY   r7   r7   r7   r8   r    rZ   r  c                   @   rP   )OptionalPathHandlerc                 C   s   |  d|i d S )Nr2   rU   r   r7   r7   r8   rW     r  zOptionalPathHandler.getNrY   r7   r7   r7   r8   r    rZ   r  c                   @   rP   )MultiHeaderHandlerc                 C   s4   |  dd |  dd | dd | dd d S )	Nx-overwriter   zX-Overwriter|   x-multir   zX-Multi4)
set_header
add_headerr?   r7   r7   r8   rW     s   zMultiHeaderHandler.getNrY   r7   r7   r7   r8   r    rZ   r  c                   @   rP   )r   c                 C   sd   |  dd d ur| jdtt|  dd d S |  dd d ur.| jdt|  dd d S td)N	permanentrL   )r  r]  )r]  z(didn't get permanent or status arguments)rg  redirectboolrf  rK  r?   r7   r7   r8   rW     s
    zRedirectHandler.getNrY   r7   r7   r7   r8   r     rZ   r   c                   @      e Zd Zejdd ZdS )EmptyFlushCallbackHandlerc                 c   sB    |   V  |   V  | d |   V  |   V  | d d S )Nok)r   rV   r   r?   r7   r7   r8   rW     s   




zEmptyFlushCallbackHandler.getN)rG   rH   rI   r   r   rW   r7   r7   r7   r8   r        r  c                   @   rP   )HeaderInjectionHandlerc              
   C   sV   z
|  dd td ty* } zdt|v r| d n W Y d }~d S d }~ww )NzX-Foozfoo
X-Bar: bazzDidn't get expected exceptionzUnsafe header value   ok)r  rK  
ValueErrorr   r   r@   r   r7   r7   r8   rW     s   zHeaderInjectionHandler.getNrY   r7   r7   r7   r8   r    rZ   r  c                   @   rP   )GetArgumentHandlerc                 C   sJ   |  dd dkr| j}n|  dd dkr| j}n| j }| |dd d S )Nsourcer|  r   rm   r   )rg  Zget_query_argumentZget_body_argumentr   r@   r   r7   r7   r8   rm    s   zGetArgumentHandler.prepareNrG   rH   rI   rm  r7   r7   r7   r8   r    rZ   r  c                   @   rP   )GetArgumentsHandlerc                 C   s*   |  t| d| d| dd d S )Nrm   r   r|  r   )r   rb   rL  Zget_query_argumentsZget_body_argumentsr?   r7   r7   r8   rm    s   zGetArgumentsHandler.prepareNr  r7   r7   r7   r8   r    rZ   r  c                       s   e Zd ZdZdd Z fddZdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Z  ZS ),WSGISafeWebTestzWebTest.COOKIE_SECRETc                 C   s    t dddd}t|d| jdS )Nz{% module linkify(message) %}zv<html><head></head><body>
{% for e in entries %}
{% module Template("entry.html", entry=e) %}
{% end %}
</body></html>aY  {{ set_resources(embedded_css=".entry { margin-bottom: 1em; }",
                 embedded_javascript="js_embed()",
                 css_files=["/base.css", "/foo.css"],
                 javascript_files="/common.js",
                 html_head="<meta>",
                 html_body='<script src="/analytics.js"/>') }}
<div class="entry">...</div>)r~  r  z
entry.htmlZxhtml_escape)template_loaderZ
autoescaper]   )r   rb   COOKIE_SECRET)r@   loaderr7   r7   r8   r=     s   zWSGISafeWebTest.get_app_kwargsc                       t    tj  d S r0   supertearDownr   Z_template_loadersclearr?   	__class__r7   r8   r    rA  zWSGISafeWebTest.tearDownc                 C   s   t dtdd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ddit dtdddt dtddit dt	t dt
t dtg}|S )Nz/typecheck/(.*)rc  )re   z/decode_arg/(.*)
decode_argz/decode_arg_kw/(?P<arg>.*)/linkify/uimodule_resourcesz/optional_path/(.+)?/multi_headerz	/redirect/web_redirect_permanentr$   /web_redirect_newpath/web_redirectF)r$   r  //web_redirect_double_slash/header_injection/get_argumentz/get_arguments)r$   r\  ru  r}  r  r  r  r   WebRedirectHandlerr  r  r  )r@   urlsr7   r7   r8   r<     s8   zWSGISafeWebTest.get_handlersc                 O   s"   | j |i |}|  t|jS r0   )r   rethrowr   r   )r@   rG  kwargsr   r7   r7   r8   rQ    s   
zWSGISafeWebTest.fetch_jsonc                 C   s\   t t| jdd}| jddd| id}t|j}| |i  | jdddd| idd	}d S )
Nr   r   z/typecheck/asdf?foo=barr   zasdf=r   r   r   r   r   r   )r   r&   r  r   r   r   rv   )r@   r_  r   r   r7   r7   r8   
test_types  s   


zWSGISafeWebTest.test_typesc                 C   s   g d}|D ]}|  |}|  t|j}| |ddgddgd q|  d}|  t|j}| |ddgddgd d S )N)z,/decode_arg/%C3%A9?foo=%C3%A9&encoding=utf-8z'/decode_arg/%E9?foo=%E9&encoding=latin1z*/decode_arg_kw/%E9?foo=%E9&encoding=latin1r   rU  r{  z/decode_arg/%C3%A9?foo=%C3%A9r   Zc3a9r   r  r   r   rv   r@   r  Zreq_urlr   r   r7   r7   r8   test_decode_argument0  s   



z$WSGISafeWebTest.test_decode_argumentc                 C   s`   t td! | d}| |jd | d}| |jd W d    d S 1 s)w   Y  d S )Nz.*Invalid unicode.*z/typecheck/invalid%FFi  z/typecheck/invalid?foo=%FFr   r   r   rv   r   r   r7   r7   r8   $test_decode_argument_invalid_unicodeE  s   

"z4WSGISafeWebTest.test_decode_argument_invalid_unicodec                 C   sL   ddg}|D ]}|  |}|  t|j}| |ddgddgd qd S )Nz6/decode_arg/1%20%2B%201?foo=1%20%2B%201&encoding=utf-8z0/decode_arg/1%20+%201?foo=1+%2B+1&encoding=utf-8r   1 + 1r{  r  r  r7   r7   r8   test_decode_argument_plusM  s   

z)WSGISafeWebTest.test_decode_argument_plusc                 C   sr   |  | jddd |  | jddd |  | jddd |  | jddd	 |  | jdd
d d S )Nr  rm   z/decode_arg/foo*   z/decode_arg/42r   z/decode_arg/%E9rU  z/decode_arg/%C3%A9r  z/decode_arg/1%20%2B%201)rv   r>   rb  r?   r7   r7   r8   test_reverse_url\  s   z WSGISafeWebTest.test_reverse_urlc                 C      |  d}| |jd d S )Nr  s3   <a href="http://example.com">http://example.com</a>r   r   r7   r7   r8   test_uimodule_unescapedg  s   
z'WSGISafeWebTest.test_uimodule_unescapedc                 C   r  )Nr  s  <html><head><link href="/base.css" type="text/css" rel="stylesheet"/><link href="/foo.css" type="text/css" rel="stylesheet"/>
<style type="text/css">
.entry { margin-bottom: 1em; }
</style>
<meta>
</head><body>


<div class="entry">...</div>


<div class="entry">...</div>

<script src="/common.js" type="text/javascript"></script>
<script type="text/javascript">
//<![CDATA[
js_embed()
//]]>
</script>
<script src="/analytics.js"/>
</body></html>r   r   r7   r7   r8   test_uimodule_resourcesm  
   
z'WSGISafeWebTest.test_uimodule_resourcesc                 C   s0   |  | dddi |  | ddd i d S )Nz/optional_path/foor2   rm   z/optional_path/rV  r?   r7   r7   r8   test_optional_path     z"WSGISafeWebTest.test_optional_pathc                 C   s8   |  d}| |jd d | |jdddg d S )Nr  r  2r  3r  r   r   r7   r7   r8   test_multi_header  s   
z!WSGISafeWebTest.test_multi_headerc                 C   sX   | j ddd}| |jd | j ddd}| |jd | j ddd}| |jd d S )	Nz/redirect?permanent=1Fr&  -  z/redirect?permanent=0r'  z/redirect?status=307i3  r   rv   r   r   r7   r7   r8   test_redirect  s   zWSGISafeWebTest.test_redirectc                 C   s`   | j ddd}| |jd | |jd d | j ddd}| |jd | |jd d d S )	Nr  Fr&  r  r(  r  r  r'  r   rv   r   r   r   r7   r7   r8   test_web_redirect  s   z!WSGISafeWebTest.test_web_redirectc                 C   2   | j ddd}| |jd | |jd d d S )Nr  Fr&  r  r(  r  r  r   r7   r7   r8   test_web_redirect_double_slash     z.WSGISafeWebTest.test_web_redirect_double_slashc                 C   r  )Nr  r  r   r   r7   r7   r8   test_header_injection     
z%WSGISafeWebTest.test_header_injectionc                 C   s   |  d}| |jd |  d}| |jd |  d}| |jd tjtdd}| j dd	|d
}| |jd | j dd	|d
}| t|jtddgdgdgd d S )Nz/get_argument?foo=barrn   z/get_argument?foo=r   r  r   rT   rm   r   r      helloz/get_arguments?foo=barr   r  )r   rv   r   urllibparse	urlencoderb   r   )r@   r   r   r7   r7   r8   test_get_argument  s   


z!WSGISafeWebTest.test_get_argumentc                 C   sp   t jtdd}| jdd|d}| |jd | jdd|d}| |jd | jd	d|d}| |jd
 d S )NrT   r  z"/get_argument?source=query&foo=barr   r   rn   z/get_argument?source=query&foo=r   z/get_argument?source=queryr   r  r  r  rb   r   rv   r   r@   r   r   r7   r7   r8   test_get_query_arguments  s   z(WSGISafeWebTest.test_get_query_argumentsc                 C   s   t jtdd}| jdd|d}| |jd t jtdd}| jdd|d}| |jd t jt }| jdd|d}| |jd	 d S )
Nr   r  z#/get_argument?source=body&foo=hellor   r   rn    r   r   r  r  r7   r7   r8   test_get_body_arguments  s   z'WSGISafeWebTest.test_get_body_argumentsc                 C   s:   |  d}| d|jdd | d|jdd d S )Nr  Accept-EncodingVaryr  gzipContent-Encoding)r   assertNotInr   rW   r   r7   r7   r8   test_no_gzip  s   
zWSGISafeWebTest.test_no_gzip)rG   rH   rI   r  r=   r  r<   rQ  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  __classcell__r7   r7   r  r8   r    s.    r  c                   @      e Zd Zdd Zdd ZdS )NonWSGIWebTestsc                 C   
   dt fgS )N/empty_flush)r  r?   r7   r7   r8   r<     r   zNonWSGIWebTests.get_handlersc                 C   r  )Nr  r  r   r   r7   r7   r8   test_empty_flush  r  z NonWSGIWebTests.test_empty_flushN)rG   rH   rI   r<   r  r7   r7   r7   r8   r        r  c                   @   r1  )
ErrorResponseTestc                 C   sL   G dd dt }G dd dt }G dd dt }td|td|td	|gS )
Nc                   @   rP   )z6ErrorResponseTest.get_handlers.<locals>.DefaultHandlerc                 S   s*   |  dd rtt|  ddd  d S Nr]  ro   r   )rg  r    rf  r?   r7   r7   r8   rW     s   z:ErrorResponseTest.get_handlers.<locals>.DefaultHandler.getNrY   r7   r7   r7   r8   DefaultHandler  rZ   r  c                   @   r  )z9ErrorResponseTest.get_handlers.<locals>.WriteErrorHandlerc                 S   s0   |  dd r| t|  d d S dd  d S r  )rg  r!  rf  r?   r7   r7   r8   rW     s   z=ErrorResponseTest.get_handlers.<locals>.WriteErrorHandler.getc                 [   sB   |  dd d|v r| d|d d j  d S | d|  d S )NContent-Type
text/plainexc_infozException: %sr   z
Status: %d)r  rV   rG   r@   status_coder  r7   r7   r8   write_error  s   zEErrorResponseTest.get_handlers.<locals>.WriteErrorHandler.write_errorNrG   rH   rI   rW   r  r7   r7   r7   r8   WriteErrorHandler  s    r  c                   @   r  )z?ErrorResponseTest.get_handlers.<locals>.FailedWriteErrorHandlerc                 S      dd  d S Nro   r   r7   r?   r7   r7   r8   rW     rO   zCErrorResponseTest.get_handlers.<locals>.FailedWriteErrorHandler.getc                 [      t d)Nzexception in write_errorrK  r  r7   r7   r8   r  
     zKErrorResponseTest.get_handlers.<locals>.FailedWriteErrorHandler.write_errorNr  r7   r7   r7   r8   FailedWriteErrorHandler  r  r  /default/write_error/failed_write_error)r   r$   )r@   r  r  r  r7   r7   r8   r<     s   zErrorResponseTest.get_handlersc                 C   s   t tdE | d}| |jd | d|jv  | d}| |jd | d|jv  | d}| |jd	 | d
|jv  W d    d S 1 sMw   Y  d S )NUncaught exceptionr  r   s   500: Internal Server Errorz/default?status=503  s   503: Service Unavailablez/default?status=435i  s   435: Unknown)r   r   r   rv   r   r   r   r   r7   r7   r8   test_default  s   


"zErrorResponseTest.test_defaultc                 C   s|   t td/ | d}| |jd | d|j | d}| |jd | d|j W d    d S 1 s7w   Y  d S )Nr  r  r   s   Exception: ZeroDivisionErrorz/write_error?status=503r  s   Status: 503r   r   r   rv   r   r   r   r7   r7   r8   test_write_error!  s   

"z"ErrorResponseTest.test_write_errorc                 C   sV   t td | d}| |jd | d|j W d    d S 1 s$w   Y  d S )Nr  r   r   r   r  r   r7   r7   r8   test_failed_write_error+  s
   
"z)ErrorResponseTest.test_failed_write_errorN)rG   rH   rI   r<   r  r  r  r7   r7   r7   r8   r    s
    "
r  c                   @   sP  e Zd ZdZejeje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d)d* Zd+d, Zd-d. Zd/d0 Z d1d2 Z!d3d4 Z"d5d6 Z#d7d8 Z$d9d: Z%d;d< Z&d=d> Z'd?d@ Z(dAdB Z)dCdD Z*dEdF Z+e,-ej.dGkdHdIdJ Z/dKS )LStaticFileTests   63a36e950e134b5217e33c763e88840c10a07d80e6057d92b9ac97508de7fb1fa6f0e9b7531e169657165ea764e8963399cb6d921ffe6078425aaafe54c04563staticc                 C   sT   G dd dt }G dd d|}G dd dt }d|fd|fd	|fd
ttddfgS )Nc                   @   rP   )z5StaticFileTest.get_handlers.<locals>.StaticUrlHandlerc                 S   s(   t | dd}| | j||d d S )Ninclude_versionr   )r	  )rf  rg  rV   
static_url)r@   r2   Zwith_vr7   r7   r8   rW   =  s   z9StaticFileTest.get_handlers.<locals>.StaticUrlHandler.getNrY   r7   r7   r7   r8   StaticUrlHandler<  rZ   r  c                   @   s   e Zd ZdZdS )z=StaticFileTest.get_handlers.<locals>.AbsoluteStaticUrlHandlerTN)rG   rH   rI   include_hostr7   r7   r7   r8   AbsoluteStaticUrlHandlerA  s    r  c                   @   rP   )z=StaticFileTest.get_handlers.<locals>.OverrideStaticUrlHandlerc           
      S   s   t | d}| | _| |}| j||d}||kr"| tdS | jjd }t|}|	|d|}|	|d|}|rE|dkoC|dk}	n|dkoL|dk}	| t|	 d S )Nr  )r  Fz://r   )
r  rg  r  r
  rV   r   rH  protocolr   find)
r@   r2   Z
do_includeZregular_urlZoverride_urlr  Zprotocol_lengthZcheck_regularZcheck_overrideresultr7   r7   r8   rW   E  s   
zAStaticFileTest.get_handlers.<locals>.OverrideStaticUrlHandler.getNrY   r7   r7   r7   r8   OverrideStaticUrlHandlerD  rZ   r  /static_url/(.*)z/abs_static_url/(.*)z/override_static_url/(.*)z/root_static/(.*)rL   )r2   )r   r   rb   )r@   r  r  r  r7   r7   r8   r<   ;  s   zStaticFileTest.get_handlersc                 C   s   t tddS )Nr  )static_pathrb   r9   r?   r7   r7   r8   r=   `  rX   zStaticFileTest.get_app_kwargsc                 C   sL   |  d}| d|jv  |  d}| d|jv  | |jdd d S )N/robots.txt   Disallow: //static/robots.txtr  r  )r   r   r   rv   r   rW   r   r7   r7   r8   test_static_filesc  s
   

z StaticFileTest.test_static_filesc                 C   s:   |  d}| d|jv  | d|j | d|j d S )Nz/robots.txt?v=12345r  zCache-ControlZExpires)r   r   r   assertInr   r   r7   r7   r8   test_static_files_cacheablek  s   
z*StaticFileTest.test_static_files_cacheablec                 C   sd   |  d}| |jdd |  d}| |jdd |  d}| |jdtdv  d S )Nz/static/sample.xml.gzr  zapplication/gzipz/static/sample.xml.bz2zapplication/octet-streamz/static/sample.xml)ztext/xmlzapplication/xml)r   rv   r   rW   r   r=  r   r7   r7   r8   test_static_compressed_filest  s   


z+StaticFileTest.test_static_compressed_filesc                 C   s"   |  d}| |jd| j  d S )Nz/static_url/robots.txts   /static/robots.txt?v=)r   rv   r   robots_txt_hashr   r7   r7   r8   test_static_url  s   
zStaticFileTest.test_static_urlc                 C   s0   |  d}| |jt| dd | j  d S )Nz/abs_static_url/robots.txtrL   s   static/robots.txt?v=)r   rv   r   r   r   r  r   r7   r7   r8   test_absolute_static_url  s
   
z'StaticFileTest.test_absolute_static_urlc                 C   r  )Nz(/static_url/robots.txt?include_version=0s   /static/robots.txtr   r   r7   r7   r8   test_relative_version_exclusion  r  z.StaticFileTest.test_relative_version_exclusionc                 C   s*   |  d}| |jt| dd  d S )Nz,/abs_static_url/robots.txt?include_version=0rL   static/robots.txt)r   rv   r   r   r   r   r7   r7   r8   test_absolute_version_exclusion  s   
 z.StaticFileTest.test_absolute_version_exclusionc                 C   s   |  d |  d d S )NFT)_trigger_include_host_checkr?   r7   r7   r8   test_include_host_override  rA  z)StaticFileTest.test_include_host_overridec                 C   s0   d}|  |t| }| |jttd d S )Nz//override_static_url/robots.txt?include_host=%sT)r   rf  rv   r   r   r   )r@   r  r2   r   r7   r7   r8   r#    s   z*StaticFileTest._trigger_include_host_checkc                 O   s   | j |ddi|}| j |ddi|}t }t|j|jD ]}|dr+|| q|D ]}| |j||j|d||j||j|f  q.|S )zPerforms a GET and HEAD request and returns the GET response.

        Fails if any ``Content-*`` headers returned by the two requests
        differ.
        r   HEADGETzContent-z)%s differs between GET (%s) and HEAD (%s))	r   r=  	itertoolschainr   
startswithaddrv   rW   )r@   rG  r  Zhead_responseZget_responseZcontent_headershr7   r7   r8   get_and_head  s    



zStaticFileTest.get_and_headc                 C   sD   |  d}| j dd|jd id}| |jd | d|jv d S )Nr  If-Modified-SinceLast-Modifiedr   0  Content-Length)r,  r   rv   r   r   r@   Z	response1Z	response2r7   r7   r8   !test_static_304_if_modified_since  s   
z0StaticFileTest.test_static_304_if_modified_sincec                 C   s4   |  d}| j dd|jd id}| |jd d S )Nr  If-None-MatchEtagr   r/  r,  r   rv   r   r1  r7   r7   r8   test_static_304_if_none_match  s
   
z,StaticFileTest.test_static_304_if_none_matchc                 C   s6   |  d}| j dd|jd dd}| |jd d S )Nr  z
"MISMATCH"r.  )r3  r-  r   r   r5  r1  r7   r7   r8   !test_static_304_etag_modified_bug  s   
z0StaticFileTest.test_static_304_etag_modified_bugc                 C   $   | j dddid}| |jd d S )Nr  r-  zFri, 01 Jan 1960 00:00:00 GMTr   r   r,  rv   r   r   r7   r7   r8   'test_static_if_modified_since_pre_epoch  s
   z6StaticFileTest.test_static_if_modified_since_pre_epochc                 C   sf   t td}| jddt|jd id}| |jd | jddt|jd id}| |jd d S )Nr!  r  r-  ro   r   r   r/  )r1   statr9   r,  r   st_mtimerv   r   )r@   r;  r   r7   r7   r8   'test_static_if_modified_since_time_zone  s   z6StaticFileTest.test_static_if_modified_since_time_zonec                 C   s0   |  d}| t|jdd| j d  d S )Nr  r4     ")r,  rv   r   r   rW   r  r   r7   r7   r8   test_static_etag  s   
zStaticFileTest.test_static_etagc                 C   s|   | j dddid}| |jd | |jd | t|jdd| j d  | |jd	d
 | |jdd d S )Nr  Rangez	bytes=0-9r      s
   User-agentr4  r>  r0  10Content-Rangezbytes 0-9/26)r,  rv   r   r   r   r   rW   r  r   r7   r7   r8   test_static_with_range  s   z%StaticFileTest.test_static_with_rangec                 C      | j dddid}| |jd tj| jd}t|dd}| |jt	|
  W d    n1 s4w   Y  | |jd	d
 | |jdd  d S )Nr  r@  zbytes=0-r   r   
robots.txtutf-8rv  r0  26rC  r,  rv   r   r1   r2   r3   
static_diropenr   r   readr   rW   r@   r   Zrobots_file_pathfr7   r7   r8    test_static_with_range_full_file  s   z/StaticFileTest.test_static_with_range_full_filec                 C   rE  )Nr  r@  zbytes=0-10000000r   r   rF  rG  rH  r0  rI  rC  rJ  rN  r7   r7   r8   $test_static_with_range_full_past_end     z3StaticFileTest.test_static_with_range_full_past_endc                 C   s   | j dddid}| |jd tj| jd}t|dd}| |jt	|
 d	d   W d    n1 s8w   Y  | |jd
d | |jdd d S )Nr  r@  zbytes=1-10000000r   rA  rF  rG  rH  ro   r0  Z25rC  zbytes 1-25/26rJ  rN  r7   r7   r8   'test_static_with_range_partial_past_end  s    z6StaticFileTest.test_static_with_range_partial_past_endc                 C   L   | j dddid}| |jd | |jdd | |jdd	 d S )
Nr  r@  z	bytes=22-r      : /
r0  r  rC  bytes 22-25/26r,  rv   r   r   rW   r   r7   r7   r8   test_static_with_range_end_edge     z.StaticFileTest.test_static_with_range_end_edgec                 C   rT  )
Nr  r@  zbytes=-4r   rU  r0  r  rC  rV  rW  r   r7   r7   r8   test_static_with_range_neg_end&  rY  z-StaticFileTest.test_static_with_range_neg_endc                 C   rE  )Nr  r@  zbytes=-1000000r   r   rF  rG  rH  r0  rI  rC  rJ  rN  r7   r7   r8   %test_static_with_range_neg_past_start.  rR  z4StaticFileTest.test_static_with_range_neg_past_startc                 C   r8  )Nr  r@  r   r   r   r9  r   r7   r7   r8   test_static_invalid_range9  s   z(StaticFileTest.test_static_invalid_rangec                 C   s8   | j dddid}| |jdd | |jd d S )Nr  r@  zbytes=-0r   rC  
bytes */26  )r,  rv   r   rW   r   r   r7   r7   r8   +test_static_unsatisfiable_range_zero_suffix=  s
   z:StaticFileTest.test_static_unsatisfiable_range_zero_suffixc                 C   8   | j dddid}| |jd | |jdd d S )Nr  r@  zbytes=26r   r^  rC  r]  r,  rv   r   r   rW   r   r7   r7   r8   -test_static_unsatisfiable_range_invalid_startD  
   z<StaticFileTest.test_static_unsatisfiable_range_invalid_startc                 C   r`  )Nr  r@  z
bytes=10-3r   r^  rC  r]  ra  r   r7   r7   r8   3test_static_unsatisfiable_range_end_less_than_startK  rc  zBStaticFileTest.test_static_unsatisfiable_range_end_less_than_startc                 C   s`   | j ddd}| |jd | |jd | |jd d | t|jd d	| j d	  d S )
Nr  r%  r   r   r   r0  rI  r4  r>  r   rv   r   r   r   r   r  r   r7   r7   r8   test_static_headR  s   zStaticFileTest.test_static_headc                 C   sf   | j ddddid}| |jd | |jd | |jd d	 | t|jd
 d| j d  d S )Nr  r%  r@  	bytes=1-4)r   r   rA  r   r0  r  r4  r>  rf  r   r7   r7   r8   test_static_head_range\  s   
z%StaticFileTest.test_static_head_rangec                 C   sn   | j ddd| j d dd}| |jd | |jd | d|jv | t|jd	 d| j d  d S )
Nr  rh  r>  )r@  r3  r   r/  r   r0  r4  )r,  r  rv   r   r   r   r   r   r   r7   r7   r8   test_static_range_if_none_matchg  s   z.StaticFileTest.test_static_range_if_none_matchc                 C   r  )Nz/static/blarg  r9  r   r7   r7   r8   test_static_404v  r  zStaticFileTest.test_static_404c                 C   sX   | j   t | _ ttd | d}W d    n1 sw   Y  | |jd d S )Nz.*not in root static directoryz/static/../static_foo.txt  )http_clientr@  r   r   r   r,  rv   r   r   r7   r7   r8   test_path_traversal_protectionz  s   
z-StaticFileTest.test_path_traversal_protectionposixznon-posix OSc                 C   sF   t jt jt jtd}| dtj	| }| 
|jd d S )Nr!  z/root_staticr   )r1   r2   r3   r4   abspathr5   r,  r  r  r   rv   r   )r@   r2   r   r7   r7   r8   test_root_static_path  s
   z$StaticFileTest.test_root_static_pathN)0rG   rH   rI   r  r1   r2   r3   r4   r5   rK  r<   r=   r  r  r  r  r  r   r"  r$  r#  r,  r2  r6  r7  r:  r=  r?  rD  rP  rQ  rS  rX  rZ  r[  r\  r_  rb  rd  rg  ri  rj  rl  ro  unittestZskipIfre   rr  r7   r7   r7   r8   r  2  sP    %		

r  c                   @   r1  )
StaticDefaultFilenameTestc                 C      t tdt dddS Nr  
index.htmldefault_filename)r  static_handler_argsr  r?   r7   r7   r8   r=        z(StaticDefaultFilenameTest.get_app_kwargsc                 C      g S r0   r7   r?   r7   r7   r8   r<     rF   z&StaticDefaultFilenameTest.get_handlersc                 C   s.   | j ddd}| |jd | d|j d S )N/static/dir/Fr&  r   s   this is the index
r   rv   r   r   r   r7   r7   r8   test_static_default_filename  s   z6StaticDefaultFilenameTest.test_static_default_filenamec                 C   s6   | j ddd}| |jd | |jd d d S )N/static/dirFr&  r  r(  r}  )r   rv   r   r   r   endswithr   r7   r7   r8   test_static_default_redirect  s   z6StaticDefaultFilenameTest.test_static_default_redirectN)rG   rH   rI   r=   r<   r  r  r7   r7   r7   r8   rt    s
    rt  c                   @   r1  )
StaticDefaultFilenameRootTestc                 C   s    t tjtdt ddddS )Nr  rw  rx  rL   )r  rz  Zstatic_url_prefix)rb   r1   r2   rq  r9   r?   r7   r7   r8   r=     s
   z,StaticDefaultFilenameRootTest.get_app_kwargsc                 C   r|  r0   r7   r?   r7   r7   r8   r<     rF   z*StaticDefaultFilenameRootTest.get_handlersc                 C      t  S r0   r   r?   r7   r7   r8   get_http_client  s   z-StaticDefaultFilenameRootTest.get_http_clientc                 C   s   t jt}t j|\}}t jdkr| || n|}ttd | j	d| ddd}W d    n1 s7w   Y  | |j
d d S )Nrp  z/.*cannot redirect path with two initial slashesz//evil.com/../r  Fr&  rm  )r1   r2   r4   r5   
splitdrivere   rv   r   r   r   r   )r@   Ztest_dirdrivetailr   r7   r7   r8   test_no_open_redirect  s   

z3StaticDefaultFilenameRootTest.test_no_open_redirectN)rG   rH   rI   r=   r<   r  r  r7   r7   r7   r8   r    s
    r  c                   @   rj   )StaticFileWithPathTestc                 C   ru  rv  r  r?   r7   r7   r8   r=     r{  z%StaticFileWithPathTest.get_app_kwargsc                 C   s   dt dtdifgS )Nz	/foo/(.*)r2   z
templates/)r   r9   r?   r7   r7   r8   r<     r   z#StaticFileWithPathTest.get_handlersc                 C   r  )Nz/foo/utf8.htmls   Héllo
r   r   r7   r7   r8   
test_serve  r  z!StaticFileWithPathTest.test_serveN)rG   rH   rI   r=   r<   r  r7   r7   r7   r8   r    s    r  c                   @   r1  )
CustomStaticFileTestc                 C   s0   G dd dt }G dd dt}|| _d|fgS )Nc                   @   s^   e Zd Zedd Zdd Zedd Zdd Zedd
dZdd Z	dd Z
edd Zd	S )z>CustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandlerc                 S   s@   |  ||}|d}|d | }||d d  }d|||f S )N.ro   z/static/%s.%s.%s)get_versionrindex)clsr^   r2   Zversion_hashextension_indexZbefore_versionZafter_versionr7   r7   r8   make_static_url  s   
zNCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.make_static_urlc                 S   s4   | d}| dd|}d|d | ||d  f S )Nr  r   z%s%s)r  )r@   Zurl_pathr  Zversion_indexr7   r7   r8   parse_url_path  s   
zMCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.parse_url_pathc                 S   s   d| S )NzCustomStaticFileTest:r7   r  r^   r2   r7   r7   r8   get_absolute_path  s   zPCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_absolute_pathc                 S   s   |S r0   r7   )r@   rootabsolute_pathr7   r7   r8   validate_absolute_path  rF   zUCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.validate_absolute_pathNc                 S   s,   |d u r|d u s
J |dkrdS t d| )NCustomStaticFileTest:foo.txtrn   unexpected path %rr  )r@   r2   startendr7   r7   r8   get_content  s   zJCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_contentc                 S   s   | j dkrdS td| j  )Nr  r   r  )r  rK  r?   r7   r7   r8   get_content_size  s   
zOCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_content_sizec                 S      d S r0   r7   r?   r7   r7   r8   get_modified_time  rF   zPCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_modified_timec                 S      dS )N42r7   r  r7   r7   r8   r       zJCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_versionNN)rG   rH   rI   classmethodr  r  r  r  r  r  r  r  r7   r7   r7   r8   MyStaticFileHandler  s    

r  c                   @   rP   )z;CustomStaticFileTest.get_handlers.<locals>.StaticUrlHandlerc                 S   s   |  | | d S r0   )rV   r
  r   r7   r7   r8   rW     r   z?CustomStaticFileTest.get_handlers.<locals>.StaticUrlHandler.getNrY   r7   r7   r7   r8   r    rZ   r  r  )r   r   static_handler_class)r@   r  r  r7   r7   r8   r<     s   ,
z!CustomStaticFileTest.get_handlersc                 C   s   t d| jdS )Ndummy)r  r  )rb   r  r?   r7   r7   r8   r=     rX   z#CustomStaticFileTest.get_app_kwargsc                 C   r  )Nz/static/foo.42.txtrn   r   r   r7   r7   r8   r    r  zCustomStaticFileTest.test_servec                 C   sL   t tddd | d}| |jd W d    d S 1 sw   Y  d S )NzCould not open static fileF)requiredz/static_url/foo.txts   /static/foo.42.txt)r   r   r   rv   r   r   r7   r7   r8   r    s   
"z$CustomStaticFileTest.test_static_urlN)rG   rH   rI   r<   r=   r  r  r7   r7   r7   r8   r    s
    5r  c                   @   ,   e Zd ZG dd deZdd Zdd ZdS )HostMatchingTestc                   @   r  )zHostMatchingTest.Handlerc                 C   r  r0   )reply)r@   r  r7   r7   r8   r  "  r   z#HostMatchingTest.Handler.initializec                 C      |  | j d S r0   )rV   r  r?   r7   r7   r8   rW   %  rP  zHostMatchingTest.Handler.getN)rG   rH   rI   r  rW   r7   r7   r7   r8   rN   !  r  rN   c                 C   s   dt jddifgS )Nr   r  Zwildcard)r  rN   r?   r7   r7   r8   r<   (  r  zHostMatchingTest.get_handlersc                 C   s<  | j ddtjddifg | j ddtjddifg | j ddtjdd	ifg | j d
dtjddifg | d}| |jd | d}| |jd | d}| |jd | jdddid}| |jd | jdddid}| |jd | jdddid}| |jd | jdddid}| |jd d S )Nwww.example.comr   r  [0]www\.example\.com/bar[1]/baz[2]zwww.e.*e.comz[3]s   wildcardrk  Hostr      [0]   [1]   [2]zwww.exe.coms   [3])r>   add_handlersr  rN   r   rv   r   r   r   r7   r7   r8   test_host_matching+  s4   


z#HostMatchingTest.test_host_matchingN)rG   rH   rI   r   rN   r<   r  r7   r7   r7   r8   r     s    r  c                   @   rj   )DefaultHostMatchingTestc                 C   r|  r0   r7   r?   r7   r7   r8   r<   K  rF   z$DefaultHostMatchingTest.get_handlersc                 C   s   ddiS )Ndefault_hostr  r7   r?   r7   r7   r8   r=   N  r  z&DefaultHostMatchingTest.get_app_kwargsc                 C   s   | j ddtjddifg | j ddtjddifg | j dd	tjdd
ifg | d}| |jd | d}| |jd | d	}| |jd | jdddid}| |jd d| j _| d	}| |jd d S )Nr  r   r  r  r  r  r  zwww.test.comr  r  r  r  rk  z	X-Real-Ipr3  r   r  )	r>   r  r  rN   r   rv   r   r   r  r   r7   r7   r8   test_default_host_matchingQ  s(   



z2DefaultHostMatchingTest.test_default_host_matchingN)rG   rH   rI   r<   r=   r  r7   r7   r7   r8   r  J  s    r  c                   @   r  )NamedURLSpecGroupsTestc                 C   s    G dd dt }d|fd|fgS )Nc                   @   rP   )z8NamedURLSpecGroupsTest.get_handlers.<locals>.EchoHandlerc                 S      |  | d S r0   rU   r   r7   r7   r8   rW   o  rX   z<NamedURLSpecGroupsTest.get_handlers.<locals>.EchoHandler.getNrY   r7   r7   r7   r8   rD  n  rZ   rD  z/str/(?P<path>.*)z/unicode/(?P<path>.*)r   )r@   rD  r7   r7   r8   r<   m  s   z#NamedURLSpecGroupsTest.get_handlersc                 C   s4   |  d}| |jd |  d}| |jd d S )Nz/str/foos   fooz/unicode/barrn   r   r   r7   r7   r8   test_named_urlspec_groupsw  s   

z0NamedURLSpecGroupsTest.test_named_urlspec_groupsN)rG   rH   rI   r<   r  r7   r7   r7   r8   r  l  s    
r  c                   @   $   e Zd ZG dd deZdd ZdS )ClearHeaderTestc                   @   rP   )zClearHeaderTest.Handlerc                 C   s0   |  dd |  dd | d | d d S )Nh1rm   h2r   Znonexistent)r  Zclear_headerr?   r7   r7   r8   rW     s   
zClearHeaderTest.Handler.getNrY   r7   r7   r7   r8   rN     rZ   rN   c                 C   s0   |  d}| d|jv | |jd d d S )NrL   r  r  r   )r   r   r   rv   r   r7   r7   r8   test_clear_header  s   
z!ClearHeaderTest.test_clear_headerN)rG   rH   rI   r   rN   r  r7   r7   r7   r8   r        r  c                   @   r  )Header204Testc                   @   rP   )zHeader204Test.Handlerc                 C   s   |  d |   d S )N   )
set_statusr   r?   r7   r7   r8   rW     rC  zHeader204Test.Handler.getNrY   r7   r7   r7   r8   rN     rZ   rN   c                 C   s8   |  d}| |jd | d|j | d|j d S )NrL   r  r0  Transfer-Encoding)r   rv   r   r  r   r   r7   r7   r8   test_204_headers     
zHeader204Test.test_204_headersN)rG   rH   rI   r   rN   r  r7   r7   r7   r8   r        r  c                   @   r  )Header304Testc                   @   rP   )zHeader304Test.Handlerc                 C   s   |  dd | d d S )NContent-Languageen_USrT   )r  rV   r?   r7   r7   r8   rW     s   zHeader304Test.Handler.getNrY   r7   r7   r7   r8   rN     rZ   rN   c                 C   s   |  d}| |jd d | |jd d | j dd|jd id}| |jd	 | d|jv | d|jv | d
|jv d S )NrL   r0  5r  r  r3  r4  r   r/  r  )r   rv   r   r   r   r1  r7   r7   r8   test_304_headers  s   
zHeader304Test.test_304_headersN)rG   rH   rI   r   rN   r  r7   r7   r7   r8   r    r  r  c                   @   r  )StatusReasonTestc                   @   rP   )zStatusReasonTest.Handlerc                 C   s<   | j jdg }| jt| d|rt|d nd d d S )Nreasonr   r   r  )rH  rI  rW   r  rf  rg  r   )r@   r  r7   r7   r8   rW     s
   
zStatusReasonTest.Handler.getNrY   r7   r7   r7   r8   rN     rZ   rN   c                 C   r  r0   r   r?   r7   r7   r8   r       z StatusReasonTest.get_http_clientc                 C   s   |  d}| |jd | |jd |  d}| |jd | |jd |  d}| |jd | |jd |  d	}| |jd | |jd
 d S )Nz
/?code=304r/  zNot Modifiedz/?code=304&reason=FooFooz/?code=682&reason=Bar  ZBarz
/?code=682Unknown)r   rv   r   r  r   r7   r7   r8   test_status  s   



zStatusReasonTest.test_statusN)rG   rH   rI   r   rN   r  r  r7   r7   r7   r8   r    s    r  c                   @   r  )DateHeaderTestc                   @   rP   )zDateHeaderTest.Handlerc                 C   rR   rS   rU   r?   r7   r7   r8   rW     rX   zDateHeaderTest.Handler.getNrY   r7   r7   r7   r8   rN     rZ   rN   c                 C   sF   |  d}tj|jd }| |tjtjj	 tj
ddk  d S )NrL   Dater|   )seconds)r   r  r  r  r   r   r	  r
  r  r  r  )r@   r   Zheader_dater7   r7   r8   test_date_header  s   

zDateHeaderTest.test_date_headerN)rG   rH   rI   r   rN   r  r7   r7   r7   r8   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 )RaiseWithReasonTestc                   @   rP   )zRaiseWithReasonTest.Handlerc                 C   s   t ddd)Nr  r  r  r    r?   r7   r7   r8   rW     rO   zRaiseWithReasonTest.Handler.getNrY   r7   r7   r7   r8   rN     rZ   rN   c                 C   r  r0   r   r?   r7   r7   r8   r    r  z#RaiseWithReasonTest.get_http_clientc                 C   s8   |  d}| |jd | |jd | d|j d S )NrL   r  r  s   682: Foo)r   rv   r   r  r  r   r   r7   r7   r8   test_raise_with_reason  r  z*RaiseWithReasonTest.test_raise_with_reasonc                 C   s   |  ttdddd d S )Nr  r  r  zHTTP 682: Foorv   r   r    r?   r7   r7   r8   test_httperror_str  r:   z&RaiseWithReasonTest.test_httperror_strc                 C   s   |  ttdd d S )Nr  zHTTP 682: Unknownr  r?   r7   r7   r8    test_httperror_str_from_httputil  s   z4RaiseWithReasonTest.test_httperror_str_from_httputilN)	rG   rH   rI   r   rN   r  r  r  r  r7   r7   r7   r8   r    s    r  c                   @   r1  )
ErrorHandlerXSRFTestc                 C   s   dt tddfgS )N/error  r  )r"   rb   r?   r7   r7   r8   r<     s   z!ErrorHandlerXSRFTest.get_handlersc                 C   r   NT)xsrf_cookiesr   r?   r7   r7   r8   r=     r   z#ErrorHandlerXSRFTest.get_app_kwargsc                 C   "   | j dddd}| |jd d S )Nr  r   r  r   r  r  r   r7   r7   r8   test_error_xsrf     z$ErrorHandlerXSRFTest.test_error_xsrfc                 C   r  )Nz/404r   r  r   rk  r  r   r7   r7   r8   test_404_xsrf  r  z"ErrorHandlerXSRFTest.test_404_xsrfN)rG   rH   rI   r<   r=   r  r  r7   r7   r7   r8   r    s
    r  c                   @   sT   e Z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 )GzipTestCasec                   @   rP   )zGzipTestCase.Handlerc                 C   s4   |  dD ]}| d| q| ddtj   d S )Nvaryr  zhello world!)rL  r  rV   r.   Z
MIN_LENGTH)r@   vr7   r7   r8   rW     s   zGzipTestCase.Handler.getNrY   r7   r7   r7   r8   rN     rZ   rN   c                 C   s   t dtjtjtddS )NTr  )r  r  )rb   r1   r2   r3   r4   r5   r?   r7   r7   r8   r=   
  s   zGzipTestCase.get_app_kwargsc                 C   s"   |  |jd|jdd d S )Nr  zX-Consumed-Content-Encodingr  )rv   r   rW   r   r7   r7   r8   assert_compressed  s   zGzipTestCase.assert_compressedc                 C   *   |  d}| | | |jd d d S )NrL   r  r  r   r  rv   r   r   r7   r7   r8   	test_gzip  s   

zGzipTestCase.test_gzipc                 C   r  )Nr  r  r  r  r   r7   r7   r8   test_gzip_static  s   

zGzipTestCase.test_gzip_staticc                 C   s2   | j ddd}| d|j | |jd d d S )NrL   F)Zuse_gzipr  r  r  )r   r  r   rv   r   r7   r7   r8   test_gzip_not_requested%  r  z$GzipTestCase.test_gzip_not_requestedc                 C   s>   |  d}| | | dd |jd dD ddg d S )Nz/?vary=Accept-Languagec                 S      g | ]}|  qS r7   strip.0r>  r7   r7   r8   
<listcomp>.      z:GzipTestCase.test_vary_already_present.<locals>.<listcomp>r  ,Accept-Languager  r   r  rv   r   splitr   r7   r7   r8   test_vary_already_present*  s   

z&GzipTestCase.test_vary_already_presentc                 C   s>   |  d}| | | dd |jd dD g d d S )Nz"/?vary=Accept-Language&vary=Cookiec                 S   r  r7   r  r  r7   r7   r8   r  7  r  zCGzipTestCase.test_vary_already_present_multiple.<locals>.<listcomp>r  r   )r  r   r  r  r   r7   r7   r8   "test_vary_already_present_multiple2  s   

z/GzipTestCase.test_vary_already_present_multipleN)rG   rH   rI   r   rN   r=   r  r  r  r  r  r  r7   r7   r7   r8   r    s    
r  c                   @   4   e Zd ZG dd deZdd Zdd Zdd Zd	S )
PathArgsInPrepareTestc                   @   r  )zPathArgsInPrepareTest.Handlerc                 C   s   |  t| j| jd d S )NrG  r  )rV   rb   rF  Zpath_kwargsr?   r7   r7   r8   rm  >  s   z%PathArgsInPrepareTest.Handler.preparec                 C   s   |dksJ |    d S )Nrm   r   r   r7   r7   r8   rW   A  s   z!PathArgsInPrepareTest.Handler.getNrG   rH   rI   rm  rW   r7   r7   r7   r8   rN   =  r  rN   c                 C   s   d| j fd| j fgS )Nz	/pos/(.*)z/kw/(?P<path>.*)rM   r?   r7   r7   r8   r<   E  r   z"PathArgsInPrepareTest.get_handlersc                 C   s4   |  d}|  t|j}| |dgi d d S )Nz/pos/foorm   r  r  r@   r   r   r7   r7   r8   test_posH  s   

zPathArgsInPrepareTest.test_posc                 C   s6   |  d}|  t|j}| |g ddid d S )Nz/kw/foor2   rm   r  r  r  r7   r7   r8   test_kwN  s   

zPathArgsInPrepareTest.test_kwN)rG   rH   rI   r   rN   r<   r  r  r7   r7   r7   r8   r  <  s
    r  c                   @   r  )ClearAllCookiesTestc                   @   rP   )zClearAllCookiesTest.Handlerc                 C   s   |    | d d S Nok)Zclear_all_cookiesrV   r?   r7   r7   r8   rW   W  s   zClearAllCookiesTest.Handler.getNrY   r7   r7   r7   r8   rN   V  rZ   rN   c                 C   sj   | j dddid}t|jd}| |d dp |d d | |d	 d
p1|d	 d d S )NrL   r   zfoo=bar; baz=xyzzyr   r   r   zbaz=;zbaz="";ro   zfoo=;zfoo="";)r   r   r   r   r   r)  )r@   r   Zset_cookiesr7   r7   r8   test_clear_all_cookies[  s   z*ClearAllCookiesTest.test_clear_all_cookiesN)rG   rH   rI   r   rN   r  r7   r7   r7   r8   r  U  r  r  c                   @      e Zd ZdS )PermissionErrorNrG   rH   rI   r7   r7   r7   r8   r  g      r  c                   @   r  )
ExceptionHandlerTestc                   @   rj   )zExceptionHandlerTest.Handlerc                 C   sD   |  d}|dkrtdd|dkrdd  d S |dkr td	d S )
Nexchttp  zno longer herezeroro   r   Z
permissionznot allowed)rg  r    r  )r@   r  r7   r7   r8   rW   m  s   

z ExceptionHandlerTest.Handler.getc                 K   sP   d|v r|d \}}}t |tr| d | d d S tj| |fi | d S )Nr  rm  r  )
isinstancer  r  rV   r   r  )r@   r  r  typrg   tbr7   r7   r8   r  v  s   


z(ExceptionHandlerTest.Handler.write_errorc                 C   s4   t |trtd|jd  d S t| ||| d S )Nz&custom logging for PermissionError: %sr   )r  r  r   warningrG  r   log_exceptionr@   r  rg   r  r7   r7   r8   r    s   
z*ExceptionHandlerTest.Handler.log_exceptionN)rG   rH   rI   rW   r  r  r7   r7   r7   r8   rN   l  s    		rN   c                 C   H   t td | d}| |jd W d    d S 1 sw   Y  d S )Nz.*no longer herez
/?exc=httpr  r  r   r7   r7   r8   test_http_error     
"z$ExceptionHandlerTest.test_http_errorc                 C   r!  )Nr  z
/?exc=zeror   r   r   r   rv   r   r   r7   r7   r8   test_unknown_error  s   
"z'ExceptionHandlerTest.test_unknown_errorc                 C   r!  )Nz/custom logging for PermissionError: not allowedz/?exc=permissionrm  r$  r   r7   r7   r8   test_known_error  r#  z%ExceptionHandlerTest.test_known_errorN)rG   rH   rI   r   rN   r"  r%  r&  r7   r7   r7   r8   r  k  s
    r  c                   @   r  )BuggyLoggingTestc                   @   r  )zBuggyLoggingTest.Handlerc                 C   r  r  r7   r?   r7   r7   r8   rW     rO   zBuggyLoggingTest.Handler.getc                 C   r  r  r7   r   r7   r7   r8   r    rO   z&BuggyLoggingTest.Handler.log_exceptionN)rG   rH   rI   rW   r  r7   r7   r7   r8   rN     r  rN   c                 C   rY  )Nz.*rL   )r   r   r   r?   r7   r7   r8   test_buggy_log_exception  r[  z)BuggyLoggingTest.test_buggy_log_exceptionN)rG   rH   rI   r   rN   r(  r7   r7   r7   r8   r'    r  r'  c                       s@   e Zd ZdZG dd deZdd Z fddZdd	 Z  Z	S )
UIMethodUIModuleTestz`Test that UI methods and modules are created correctly and
    associated with the handler.
    c                   @   r  )zUIMethodUIModuleTest.Handlerc                 C   rR   r   r  r?   r7   r7   r8   rW     rX   z UIMethodUIModuleTest.Handler.getc                 C   s
   |  dS )Nrg   )rg  r?   r7   r7   r8   rg     r   z"UIMethodUIModuleTest.Handler.valueN)rG   rH   rI   rW   rg   r7   r7   r7   r8   rN     r  rN   c                 C   s:   dd }G dd dt }tddi}t|d|id|idS )	Nc                 S   s   d||   f S )Nz*In my_ui_method(%s) with handler value %s.)rg   )ry   xr7   r7   r8   my_ui_method  rP  z9UIMethodUIModuleTest.get_app_kwargs.<locals>.my_ui_methodc                   @   rP   )z5UIMethodUIModuleTest.get_app_kwargs.<locals>.MyModulec                 S   s   d|t tj| j f S )Nz&In MyModule(%s) with handler value %s.)typingcastr)  rN   ry   rg   )r@   r*  r7   r7   r8   r     s   z<UIMethodUIModuleTest.get_app_kwargs.<locals>.MyModule.renderNrG   rH   rI   r   r7   r7   r7   r8   MyModule  rZ   r/  r   z1{{ my_ui_method(42) }} {% module MyModule(123) %}r+  )r  Z
ui_methods
ui_modulesr)   r   rb   )r@   r+  r/  r  r7   r7   r8   r=     s   z#UIMethodUIModuleTest.get_app_kwargsc                    r  r0   r  r?   r  r7   r8   r    s   
zUIMethodUIModuleTest.tearDownc                 C   r  )Nz/?value=asdfsV   In my_ui_method(42) with handler value asdf. In MyModule(123) with handler value asdf.r   r   r7   r7   r8   test_ui_method  r  z#UIMethodUIModuleTest.test_ui_method)
rG   rH   rI   rJ   r   rN   r=   r  r2  r  r7   r7   r  r8   r)    s    r)  c                   @   r  )GetArgumentErrorTestc                   @   rP   )zGetArgumentErrorTest.Handlerc              
   C   sV   z|  d | i  W d S  ty* } z| |j|jd W Y d }~d S d }~ww )Nrm   arg_namelog_message)rg  rV   r!   r5  r6  r  r7   r7   r8   rW     s   
"z GetArgumentErrorTest.Handler.getNrY   r7   r7   r7   r8   rN     rZ   rN   c                 C   s&   |  d}| t|jddd d S )NrL   rm   zMissing argument foor4  )r   rv   r   r   r   r7   r7   r8   test_catch_error  s
   
z%GetArgumentErrorTest.test_catch_errorN)rG   rH   rI   r   rN   r7  r7   r7   r7   r8   r3        r3  c                   @   r  )SetLazyPropertiesTestc                   @   r1  )
zSetLazyPropertiesTest.Handlerc                 C   s   d| _ td| _d S )NZBenr  )current_userr   rW   r?   r7   r7   r8   rm    s   z%SetLazyPropertiesTest.Handler.preparec                 C   rB   r0   rC   r?   r7   r7   r8   get_user_locale  rE   z-SetLazyPropertiesTest.Handler.get_user_localec                 C   rB   r0   rC   r?   r7   r7   r8   get_current_user  rE   z.SetLazyPropertiesTest.Handler.get_current_userc                 C   s   |  d| j| jjf  d S )NzHello %s (%s))rV   r:  r   r   r?   r7   r7   r8   rW     r:   z!SetLazyPropertiesTest.Handler.getN)rG   rH   rI   rm  r;  r<  rW   r7   r7   r7   r8   rN     s
    rN   c                 C   r  )NrL   s   Hello Ben (en_US)r   r   r7   r7   r8   test_set_properties     
z)SetLazyPropertiesTest.test_set_propertiesN)rG   rH   rI   r   rN   r=  r7   r7   r7   r8   r9        r9  c                       sV   e Zd Zdd Z fddZdd Zeddd	 Zd
d Z	dd Z
dd Z  ZS )GetCurrentUserTestc                 C   sD   G dd dt }G dd dt }tddddd	}t|||d
dS )Nc                   @   rP   )z<GetCurrentUserTest.get_app_kwargs.<locals>.WithoutUserModulec                 S   r  )Nr  r7   r?   r7   r7   r8   r     rF   zCGetCurrentUserTest.get_app_kwargs.<locals>.WithoutUserModule.renderNr.  r7   r7   r7   r8   WithoutUserModule   rZ   rA  c                   @   rP   )z9GetCurrentUserTest.get_app_kwargs.<locals>.WithUserModulec                 S   s
   t | jS r0   )r   r:  r?   r7   r7   r8   r     r   z@GetCurrentUserTest.get_app_kwargs.<locals>.WithUserModule.renderNr.  r7   r7   r7   r8   WithUserModule  rZ   rB  r  z{{ current_user }}z {% module WithoutUserModule() %}z{% module WithUserModule() %})without_user.htmlwith_user.htmlwithout_user_module.htmlwith_user_module.html)rB  rA  )r  r0  r1  )r@   rA  rB  r  r7   r7   r8   r=     s   z!GetCurrentUserTest.get_app_kwargsc                    r  r0   r  r?   r  r7   r8   r    rA  zGetCurrentUserTest.tearDownc                 C   s|   G dd dt }G dd d|}G dd d|}G dd d|}G d	d
 d
|}G dd d|}d|fd|fd|fd|fgS )Nc                   @   r  )z;GetCurrentUserTest.get_handlers.<locals>.CurrentUserHandlerc                 S   s
   d| _ d S )NFhas_loaded_current_userr?   r7   r7   r8   rm    r   zCGetCurrentUserTest.get_handlers.<locals>.CurrentUserHandler.preparec                 S   s
   d| _ dS )NTr  rG  r?   r7   r7   r8   r<  !  s   zLGetCurrentUserTest.get_handlers.<locals>.CurrentUserHandler.get_current_userN)rG   rH   rI   rm  r<  r7   r7   r7   r8   CurrentUserHandler  r  rI  c                   @   rP   )z;GetCurrentUserTest.get_handlers.<locals>.WithoutUserHandlerc                 S      |  d | t| j d S )NrC  Zrender_stringr   r   rH  r?   r7   r7   r8   rW   &     
z?GetCurrentUserTest.get_handlers.<locals>.WithoutUserHandler.getNrY   r7   r7   r7   r8   WithoutUserHandler%  rZ   rM  c                   @   rP   )z8GetCurrentUserTest.get_handlers.<locals>.WithUserHandlerc                 S   rJ  )NrD  rK  r?   r7   r7   r8   rW   +  rL  z<GetCurrentUserTest.get_handlers.<locals>.WithUserHandler.getNrY   r7   r7   r7   r8   WithUserHandler*  rZ   rN  c                   @   rP   )zAGetCurrentUserTest.get_handlers.<locals>.CurrentUserModuleHandlerc                 S   r  r0   )Zuir?   r7   r7   r8   get_template_namespace0  s   zXGetCurrentUserTest.get_handlers.<locals>.CurrentUserModuleHandler.get_template_namespaceN)rG   rH   rI   rO  r7   r7   r7   r8   CurrentUserModuleHandler/  rZ   rP  c                   @   rP   )zAGetCurrentUserTest.get_handlers.<locals>.WithoutUserModuleHandlerc                 S   rJ  )NrE  rK  r?   r7   r7   r8   rW   7  rL  zEGetCurrentUserTest.get_handlers.<locals>.WithoutUserModuleHandler.getNrY   r7   r7   r7   r8   WithoutUserModuleHandler6  rZ   rQ  c                   @   rP   )z>GetCurrentUserTest.get_handlers.<locals>.WithUserModuleHandlerc                 S   rJ  )NrF  rK  r?   r7   r7   r8   rW   <  rL  zBGetCurrentUserTest.get_handlers.<locals>.WithUserModuleHandler.getNrY   r7   r7   r7   r8   WithUserModuleHandler;  rZ   rR  /without_user
/with_user/without_user_module/with_user_moduler   )r@   rI  rM  rN  rP  rQ  rR  r7   r7   r8   r<     s   zGetCurrentUserTest.get_handlersz	needs fixc                 C   r  )NrS     Falser   r   r7   r7   r8   test_get_current_user_is_lazyG  r>  z0GetCurrentUserTest.test_get_current_user_is_lazyc                 C   r  )NrT     Truer   r   r7   r7   r8   test_get_current_user_worksM  r  z.GetCurrentUserTest.test_get_current_user_worksc                 C   r  )NrU  rW  r   r   r7   r7   r8   ,test_get_current_user_from_ui_module_is_lazyQ  r  z?GetCurrentUserTest.test_get_current_user_from_ui_module_is_lazyc                 C   r  )NrV  rY  r   r   r7   r7   r8   *test_get_current_user_from_ui_module_worksU  r  z=GetCurrentUserTest.test_get_current_user_from_ui_module_works)rG   rH   rI   r=   r  r<   rs  skiprX  rZ  r[  r\  r  r7   r7   r  r8   r@    s    +
r@  c                   @   r  )UnimplementedHTTPMethodsTestc                   @   r  )z$UnimplementedHTTPMethodsTest.HandlerNr  r7   r7   r7   r8   rN   [  r  rN   c                 C   sR   dD ]}| j d|d}| |jd qdD ]}| j d|dd}| |jd qd S )N)r%  r&  DELETEOPTIONSrL   re    r   PUTr   r   r  )r@   r   r   r7   r7   r8   #test_unimplemented_standard_methods^  s   z@UnimplementedHTTPMethodsTest.test_unimplemented_standard_methodsN)rG   rH   rI   r   rN   rd  r7   r7   r7   r8   r^  Z  s    r^  c                   @   r  )#UnimplementedNonStandardMethodsTestc                   @   rP   )z+UnimplementedNonStandardMethodsTest.Handlerc                 C   rR   NotherrU   r?   r7   r7   r8   rg  i  r"  z1UnimplementedNonStandardMethodsTest.Handler.otherN)rG   rH   rI   rg  r7   r7   r7   r8   rN   h  rZ   rN   c                 C   r  )NrL   PATCHr   r   ra  r  r   r7   r7   r8   test_unimplemented_patchn  s   z<UnimplementedNonStandardMethodsTest.test_unimplemented_patchc                 C   r  )NrL   OTHERTr   Zallow_nonstandard_methodsra  r  r   r7   r7   r8   test_unimplemented_othert  r  z<UnimplementedNonStandardMethodsTest.test_unimplemented_otherN)rG   rH   rI   r   rN   ri  rl  r7   r7   r7   r8   re  g  s    re  c                   @   r  )AllHTTPMethodsTestc                   @   s(   e Zd Zdd Ze Z Z Z ZZdS )zAllHTTPMethodsTest.Handlerc                 C   s"   | j jd usJ | | j j d S r0   )rH  r   rV   r?   r7   r7   r8   r   {  r  z!AllHTTPMethodsTest.Handler.methodN)	rG   rH   rI   r   rW   deleteoptionsr   putr7   r7   r7   r8   rN   z  s    rN   c                 C   sv   | j ddd}| |jd dD ]}| j d|d}| |jt| qdD ]}| j d|dd}| |jt| q%d S )NrL   r%  re  r   )r&  r_  r`  rb  r   )r   rv   r   r   )r@   r   r   r7   r7   r8   test_standard_methods  s   z(AllHTTPMethodsTest.test_standard_methodsN)rG   rH   rI   r   rN   rq  r7   r7   r7   r8   rm  y  r  rm  c                   @   r  )PatchMethodTestc                   @   s&   e Zd Zejd Zdd Zdd ZdS )zPatchMethodTest.Handler)rj  c                 C   rR   )NpatchrU   r?   r7   r7   r8   rs    rX   zPatchMethodTest.Handler.patchc                 C   rR   rf  rU   r?   r7   r7   r8   rg    rX   zPatchMethodTest.Handler.otherN)rG   rH   rI   r   ZSUPPORTED_METHODSrs  rg  r7   r7   r7   r8   rN     s    
rN   c                 C   r  )NrL   rh  r   r   s   patchr   r   r7   r7   r8   
test_patch  r  zPatchMethodTest.test_patchc                 C   r  )NrL   rj  Trk  s   otherr   r   r7   r7   r8   
test_other  r  zPatchMethodTest.test_otherN)rG   rH   rI   r   rN   rt  ru  r7   r7   r7   r8   rr    s    rr  c                   @   r  )FinishInPrepareTestc                   @   r  )zFinishInPrepareTest.Handlerc                 C   rR   )Nr   r	  r?   r7   r7   r8   rm    rX   z#FinishInPrepareTest.Handler.preparec                 C   r  )Nzshould not reach this methodr  r?   r7   r7   r8   rW     s   zFinishInPrepareTest.Handler.getNr
  r7   r7   r7   r8   rN     r  rN   c                 C   r  )NrL   s   doner   r   r7   r7   r8   test_finish_in_prepare  r  z*FinishInPrepareTest.test_finish_in_prepareN)rG   rH   rI   r   rN   rw  r7   r7   r7   r8   rv        
rv  c                   @   r  )Default404Testc                 C   r  Nr   r   r?   r7   r7   r8   r<     s   
zDefault404Test.get_handlersc                 C   *   |  d}| |jd | |jd d S )NrL   rk  sE   <html><title>404: Not Found</title><body>404: Not Found</body></html>r~  r   r7   r7   r8   test_404  s   
zDefault404Test.test_404N)rG   rH   rI   r<   r|  r7   r7   r7   r8   ry    s    ry  c                   @   rj   )Custom404Testc                 C   r  rz  r   r?   r7   r7   r8   r<     r   zCustom404Test.get_handlersc                 C   s   G dd dt }t|dS )Nc                   @   rP   )z6Custom404Test.get_app_kwargs.<locals>.Custom404Handlerc                 S   s   |  d | d d S )Nrk  zcustom 404 response)r  rV   r?   r7   r7   r8   rW     rA  z:Custom404Test.get_app_kwargs.<locals>.Custom404Handler.getNrY   r7   r7   r7   r8   Custom404Handler  rZ   r~  )default_handler_class)r   rb   )r@   r~  r7   r7   r8   r=     s   
zCustom404Test.get_app_kwargsc                 C   r{  )NrL   rk  s   custom 404 responser~  r   r7   r7   r8   r|    s   
zCustom404Test.test_404N)rG   rH   rI   r<   r=   r|  r7   r7   r7   r8   r}    s    r}  c                   @   rj   )DefaultHandlerArgumentsTestc                 C   r  rz  r   r?   r7   r7   r8   r<     r   z(DefaultHandlerArgumentsTest.get_handlersc                 C   s   t tt dddS )Nrm  r  )r  Zdefault_handler_args)rb   r"   r?   r7   r7   r8   r=     s   z*DefaultHandlerArgumentsTest.get_app_kwargsc                 C   r  )NrL   rm  r  r   r7   r7   r8   test_403  r  z$DefaultHandlerArgumentsTest.test_403N)rG   rH   rI   r<   r=   r  r7   r7   r7   r8   r    s    r  c                   @   r  )HandlerByNameTestc                 C   s   dt fdtddgS )N/hello1)/hello2"tornado.test.web_test.HelloHandler/hello3r  )rQ   r$   r?   r7   r7   r8   r<     s   zHandlerByNameTest.get_handlersc                 C   sL   |  d}| |jd |  d}| |jd |  d}| |jd d S )Nr  r  r  r  r   r@   respr7   r7   r8   test_handler_by_name  s   


z&HandlerByNameTest.test_handler_by_nameN)rG   rH   rI   r<   r  r7   r7   r7   r8   r    s    r  c                   @   sL   e Zd Zdd Zdd Zedd Zedd Zed	d
 Zedd Z	dS )StreamingRequestBodyTestc                 C   sb   t G dd dt}t G dd dt}t G dd dt}d|t| dfd	|fd
|t| dfgS )Nc                   @   r1  )
zCStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandlerc                 S   r  r0   r   r,  r7   r7   r8   r    r   zNStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.initializec                 S   s   | j jd  d S r0   )r   prepared
set_resultr?   r7   r7   r8   rm    r  zKStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.preparec                 S   s   | j j| d S r0   )r   r   r  r@   r   r7   r7   r8   data_received  r  zQStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.data_receivedc                 S   s   | j jd  | i  d S r0   )r   finishedr  rV   r?   r7   r7   r8   rW    	  s   zGStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.getN)rG   rH   rI   r  rm  r  rW   r7   r7   r7   r8   StreamingBodyHandler  s
    r  c                   @   rP   )zAStreamingRequestBodyTest.get_handlers.<locals>.EarlyReturnHandlerc                 S   r  )N  r  r?   r7   r7   r8   rm  	  s   zIStreamingRequestBodyTest.get_handlers.<locals>.EarlyReturnHandler.prepareNr  r7   r7   r7   r8   EarlyReturnHandler	  s    r  c                       s$   e Zd Zdd Z fddZ  ZS )zDStreamingRequestBodyTest.get_handlers.<locals>.CloseDetectionHandlerc                 S   r  r0   r   r,  r7   r7   r8   r  	  r   zOStreamingRequestBodyTest.get_handlers.<locals>.CloseDetectionHandler.initializec                    s   t    | jjd  d S r0   )r  r0  r   close_futurer  r?   r  r7   r8   r0  	  r  zXStreamingRequestBodyTest.get_handlers.<locals>.CloseDetectionHandler.on_connection_close)rG   rH   rI   r  r0  r  r7   r7   r  r8   CloseDetectionHandler	  s    r  z/stream_bodyr   z/early_returnz/close_detection)r+   r   rb   )r@   r  r  r  r7   r7   r8   r<     s   	z%StreamingRequestBodyTest.get_handlersc                 C   sZ   t  t jt jd}|d|  f t|}|d| d  |r&|d |d |S )Nr   r3  s   GET s    HTTP/1.1
s   Connection: close
s   Transfer-Encoding: chunked

)r7  r8  r9  r:  r;  r   rV   )r@   r$   connection_closer>  r<  r7   r7   r8   r:  	  s   

z StreamingRequestBodyTest.connectc                 c   s    t  | _t  | _t  | _| jddd}| jV  |d | jV }| |d t  | _|d | jV }| |d |d | jV  | V }| |	d	 |
  d S )
Ns   /stream_bodyTr  	   4
asdf
s   asdfs	   4
qwer
s   qwers   0

s   {})r   r  r   r  r:  rV   rv   read_until_closer   r  r@  r@   r<  r   r7   r7   r8   test_streaming_body%	  s$   



z,StreamingRequestBodyTest.test_streaming_bodyc                 c   s.    | j ddd}| V }| |d d S )N   /early_returnFr     HTTP/1.1 401)r:  r  r   r)  r  r7   r7   r8   test_early_return<	  s   
z*StreamingRequestBodyTest.test_early_returnc                 c   s8    | j ddd}|d | V }| |d d S )Nr  Fr  r  r  )r:  rV   r  r   r)  r  r7   r7   r8   test_early_return_with_dataB	  s
   

z4StreamingRequestBodyTest.test_early_return_with_datac                 c   s,    t  | _| jddd}|  | jV  d S )Ns   /close_detectionFr  )r   r  r:  r@  )r@   r<  r7   r7   r8   test_close_during_uploadI	  s
   z1StreamingRequestBodyTest.test_close_during_uploadN)
rG   rH   rI   r<   r:  r   r  r  r  r  r7   r7   r7   r8   r    s    &


r  c                   @   s>   e Zd Zdd Zejdd Zejdd Z	ejdd Z
d	S )
BaseFlowControlHandlerc                 C   s   || _ d | _g | _d S r0   )r   r   methodsr,  r7   r7   r8   r  W	  s   
z!BaseFlowControlHandler.initializec                 c   sP    | j d ur| jd|| j f  || _ | j| z	d V  W d | _ d S d | _ w )Nzentered method %s while in %s)r   r   failr  appendr  r7   r7   r8   	in_method\	  s   
z BaseFlowControlHandler.in_methodc                 c   s    | j d tjV  d S )Nrm  )r  r  r   momentr?   r7   r7   r8   rm  g	  s   zBaseFlowControlHandler.preparec                 c   sJ    |  d tjV  W d    n1 sw   Y  | t| jd d S )Nr   r  )r  r   r  rV   rb   r  r?   r7   r7   r8   r   n	  s
   
zBaseFlowControlHandler.postN)rG   rH   rI   r  
contextlibcontextmanagerr  r   r   rm  r   r7   r7   r7   r8   r  U	  s    


r  c                   @   sL   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S )#BaseStreamingRequestFlowControlTestc                 C   s   t dddS )Nr   T)
chunk_sizeZdecompress_requestr   r?   r7   r7   r8   get_httpserver_optionsv	  s   z:BaseStreamingRequestFlowControlTest.get_httpserver_optionsc                 C   r  r0   r   r?   r7   r7   r8   r  {	  r  z3BaseStreamingRequestFlowControlTest.get_http_clientr@   c                 C   s8   | j dddd}|  | t|jtg dd d S )NrL   abcdefghijklmnopqrstuvwxyzr   )r   r   rm  r  r  r  r   r  )r   r  rv   r   r   rb   r   r7   r7   r8   test_flow_control_fixed_body	  s   z@BaseStreamingRequestFlowControlTest.test_flow_control_fixed_bodyc                    sR   g d t j fdd}| jd|dd}|  | t|jtg dd d S )	N)s   abcds   efghs   ijklc                 3   s     D ]}| |V  qd S r0   r7   )rV   ichunksr7   r8   body_producer	  s   zYBaseStreamingRequestFlowControlTest.test_flow_control_chunked_body.<locals>.body_producerrL   r   )r  r   r  r  )r   r   r   r  rv   r   r   rb   )r@   r  r   r7   r  r8   test_flow_control_chunked_body	  s   zBBaseStreamingRequestFlowControlTest.test_flow_control_chunked_bodyc                 C   sl   t  }tjd|d}|d |  | }| jd|dddid}|  | t	|j
tg d	d
 d S )Nw)modefileobjs   abcdefghijklmnopqrstuvwxyzrL   r   r  r  )r   r   r   r  r  )r/   r  GzipFilerV   r@  getvaluer   r  rv   r   r   rb   )r@   ZbytesioZ	gzip_fileZcompressed_bodyr   r7   r7   r8   !test_flow_control_compressed_body	  s$   
zEBaseStreamingRequestFlowControlTest.test_flow_control_compressed_bodyN)
rG   rH   rI   r  r  r,  Anyr  r  r  r7   r7   r7   r8   r  u	  s    r  c                   @   rP   )(DecoratedStreamingRequestFlowControlTestc                 C   "   G dd dt }d|t| dfgS )Nc                   @   r  )zZDecoratedStreamingRequestFlowControlTest.get_handlers.<locals>.DecoratedFlowControlHandlerc                 s   s:    |  d tjV  W d    d S 1 sw   Y  d S )Nr  )r  r   r  r  r7   r7   r8   r  	  s   
"zhDecoratedStreamingRequestFlowControlTest.get_handlers.<locals>.DecoratedFlowControlHandler.data_receivedN)rG   rH   rI   r   r   r  r7   r7   r7   r8   DecoratedFlowControlHandler	  r  r  rL   r   r  rb   )r@   r  r7   r7   r8   r<   	  s   z5DecoratedStreamingRequestFlowControlTest.get_handlersNrG   rH   rI   r<   r7   r7   r7   r8   r  	      r  c                   @   rP   )%NativeStreamingRequestFlowControlTestc                 C   r  )Nc                   @   rP   )zTNativeStreamingRequestFlowControlTest.get_handlers.<locals>.NativeFlowControlHandlerc                    sJ   |  d dd l}|dI d H  W d    d S 1 sw   Y  d S )Nr  r   )r  asyncior5  )r@   r   r  r7   r7   r8   r  	  s
   "zbNativeStreamingRequestFlowControlTest.get_handlers.<locals>.NativeFlowControlHandler.data_receivedN)rG   rH   rI   r  r7   r7   r7   r8   NativeFlowControlHandler	  rZ   r  rL   r   r  )r@   r  r7   r7   r8   r<   	  s   z2NativeStreamingRequestFlowControlTest.get_handlersNr  r7   r7   r7   r8   r  	  r  r  c                   @   rj   )IncorrectContentLengthTestc                    sB   |  d | _ G  fdddt}G  fdddt}d|fd|fgS )Nc                          e Zd Z fddZdS )z8IncorrectContentLengthTest.get_handlers.<locals>.TooHighc              
      >   |  dd z| d W d S  ty } z| _ d }~ww )Nr0  r  r  r  r   rK  server_errorr  r   r7   r8   rW   	     z<IncorrectContentLengthTest.get_handlers.<locals>.TooHigh.getNrY   r7   r   r7   r8   TooHigh	      r  c                       r  )z7IncorrectContentLengthTest.get_handlers.<locals>.TooLowc              
      r  )Nr0  r  rT   r  r  r   r7   r8   rW   	  r  z;IncorrectContentLengthTest.get_handlers.<locals>.TooLow.getNrY   r7   r   r7   r8   TooLow	  r  r  /high/low)r  r   )r@   r  r  r7   r   r8   r<   	  s
   		z'IncorrectContentLengthTest.get_handlersc              
   C      t td9 t td$ | t | jddd W d    n1 s#w   Y  W d    n1 s2w   Y  W d    n1 sAw   Y  | t| jd d S )N*(Uncaught exception|Exception in callback)S(Cannot send error response after headers written|Failed to flush partial response)r  TZraise_errorz0Tried to write 40 bytes less than Content-Length	r   r   r   assertRaisesr
   r   rv   r   r  r?   r7   r7   r8   test_content_length_too_high	     
z7IncorrectContentLengthTest.test_content_length_too_highc              
   C   r  )Nr  r  r  Tr  z,Tried to write more data than Content-Lengthr  r?   r7   r7   r8   test_content_length_too_low
  r  z6IncorrectContentLengthTest.test_content_length_too_lowN)rG   rH   rI   r<   r  r  r7   r7   r7   r8   r  	  s    r  c                   @   r  )ClientCloseTestc                   @   rP   )zClientCloseTest.Handlerc                 C   s8   | j jdr| j jj  | d d S | d d S )NzHTTP/1rT   requires HTTP/1.x)rH  rq   r)  
connectionr<  r@  rV   r?   r7   r7   r8   rW   
  s   zClientCloseTest.Handler.getNrY   r7   r7   r7   r8   rN   
  rZ   rN   c                 C   sf   |  ttjf! | jddd}|jdkr| d | |jd W d    d S 1 s,w   Y  d S )NrL   Tr  s   requires HTTP/1.xr  iW  )	r  r
   rs  ZSkipTestr   r   ZskipTestrv   r   r   r7   r7   r8   test_client_close'
  s   

"z!ClientCloseTest.test_client_closeN)rG   rH   rI   r   rN   r  r7   r7   r7   r8   r  
  r?  r  c                   @   s|   e Zd ZdZdd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S )SignedValueTestzIt's a secret to everybodyZ	asdfbasdfZ12312312Z2342342)r   ro   r|   c                 C   s   |   d S )Ni 0* )presentr?   r7   r7   r8   past3
  rO   zSignedValueTest.pastc                 C   r  )Ni m|Mr7   r?   r7   r7   r8   r  6
  rF   zSignedValueTest.presentc                 C   s   t tjddd| jd}| |d t tjddd| jd}| |d t tjdd| jd}| || ttjd|d| jd	}| |d
 ttjd|d| jd	}| |d
 d S )NrM  rg   ro   )rq   clocks<   dmFsdWU=|1300000000|31c934969f53e48164c50768b40cbd7e2daaaa4fr|   se   2|1:0|10:1300000000|3:key|8:dmFsdWU=|3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e152r  )rs   r     value)r&   r  SECRETr  rv   r'   )r@   Z	signed_v1Z	signed_v2Zsigned_defaultZ
decoded_v1Z
decoded_v2r7   r7   r8   test_known_values9
  s2   z!SignedValueTest.test_known_valuesc                 C   sl   t tjdd| jd}t tjdd| jd}ttjd|| jd}| |d  ttjd|| jd}| |d  d S )Nkey1rg   r  key2)r&   r  r  r  r'   assertIs)r@   Zsigned1Zsigned2Zdecoded1Zdecoded2r7   r7   r8   test_name_swapY
  s   zSignedValueTest.test_name_swapc                 C   sX   t tjdd| jd}ttjd|| jd}| |d ttjd|| jd}| |d  d S )Nr  rg   r  r  )r&   r  r  r  r'   rv   r  r  )r@   signedZdecoded_pastZdecoded_presentr7   r7   r8   test_expiredj
  s   zSignedValueTest.test_expiredc                    sN   d fdd}  |d  |d  |d  |d d S )N@3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e152c                    s   dt tjd|   jdkS Nr  rM  r  r'   r  r  r  )prefixr@   r   r7   r8   validate{
     z8SignedValueTest.test_payload_tampering.<locals>.validate%2|1:0|10:1300000000|3:key|8:dmFsdWU=|z%2|1:1|10:1300000000|3:key|8:dmFsdWU=|z$2|1:0|10:130000000|3:key|8:dmFsdWU=|z&2|1:0|10:1300000000|3:keey|8:dmFsdWU=|r   ZassertFalser@   r  r7   r  r8   test_payload_tamperingw
  s   z&SignedValueTest.test_payload_tamperingc                    sj   d  fdd} |d |d |d |d |d |d	 d S )
Nr  c                    s   dt tjd |  jdkS r  r  )r   r  r@   r7   r8   r  
  r  z:SignedValueTest.test_signature_tampering.<locals>.validater  Z 00000000000000000000000000000000Z@4d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e152Z@3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e153Z?3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e15ZA3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e1538r  r  r7   r  r8   test_signature_tampering
  s(   z(SignedValueTest.test_signature_tamperingc                 C   s<   d}t tjd|| jd}ttjd|| jd}| || d S )Nr   rM  r  )r&   r  r  r  r'   rv   r@   rg   r  decodedr7   r7   r8   test_non_ascii
  s   zSignedValueTest.test_non_asciic                 C   >   d}t tjd|| jdd}ttjd|| jd}| || d S Nr   rM  r   r  r`   r  r&   r  SECRET_DICTr  r'   rv   r  r7   r7   r8   *test_key_versioning_read_write_default_key
     z:SignedValueTest.test_key_versioning_read_write_default_keyc                 C   r  )Nr   rM  ro   r  r  r  r  r7   r7   r8   .test_key_versioning_read_write_non_default_key
  r   z>SignedValueTest.test_key_versioning_read_write_non_default_keyc                 C   sP   d}t tjd|| jdd}tj }|d t|d|| jd}| d | d S r  )r&   r  r  r  r   r   r'   rv   )r@   rg   r  Znewkeysr  r7   r7   r8   test_key_versioning_invalid_key
  s   

z/SignedValueTest.test_key_versioning_invalid_keyc                 C   s2   d}t tjd|| jdd}t|}| d| d S )Nr   rM  ro   r  )r&   r  r  r  r(   rv   )r@   rg   r  r`   r7   r7   r8   test_key_version_retrieval
  s   z*SignedValueTest.test_key_version_retrievalN)rG   rH   rI   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r7   r7   r7   r8   r  /
  s      



r  c                       s   e Zd ZG dd deZdd Z fddZd(dd	Zd)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  ZS )*XSRFTestc                   @   r  )zXSRFTest.Handlerc                 C   s*   t | dd}|| jd< | | j d S )Nrq   r  Zxsrf_cookie_version)rf  rg  r^   rV   r`  )r@   rq   r7   r7   r8   rW   
  s   
zXSRFTest.Handler.getc                 C   rR   r  rU   r?   r7   r7   r8   r   
  rX   zXSRFTest.Handler.postNrG   rH   rI   rW   r   r7   r7   r7   r8   rN   
  s    rN   c                 C   r   r  r   r?   r7   r7   r8   r=   
  r   zXSRFTest.get_app_kwargsc                       t    |  | _d S r0   r  setUp	get_tokenr`  r?   r  r7   r8   r  
  rA  zXSRFTest.setUpNc                 C   sH   |d ur
|  |}nd }| j|d u rdnd| |d}|  t|jS )NrL   z/?version=%dr   cookie_headersr   r  r   r   )r@   	old_tokenrq   r   r   r7   r7   r8   r	  
  s   
zXSRFTest.get_tokenc                 C      |d u r| j }dd| iS )Nr   z_xsrf=r`  r@   tokenr7   r7   r8   r  
     zXSRFTest.cookie_headersc                 C   L   t td | jdddd}W d    n1 sw   Y  | |jd d S N.*'_xsrf' argument missingrL   r   r   r   rm  r  r   r7   r7   r8   test_xsrf_fail_no_token
     z XSRFTest.test_xsrf_fail_no_tokenc              	   C   \   t td | jddtjt| jdd}W d    n1 s w   Y  | |j	d d S N!.*XSRF cookie does not match POSTrL   r   Z_xsrfr   rm  
r   r   r   r  r  r  rb   r`  rv   r   r   r7   r7   r8   test_xsrf_fail_body_no_cookie     z&XSRFTest.test_xsrf_fail_body_no_cookiec              
   C   s`   t td | jdd|  tjtddd}W d    n1 s"w   Y  | |j	d d S )Nz%.*'_xsrf' argument has invalid formatrL   r   3|r  r  rm  )
r   r   r   r  r  r  r  rb   rv   r   r   r7   r7   r8   &test_xsrf_fail_argument_invalid_format
  s   z/XSRFTest.test_xsrf_fail_argument_invalid_formatc              
   C   sf   t td | jdd| jddtjt| jdd}W d    n1 s%w   Y  | 	|j
d d S )	Nr  rL   r   r  r  r  r  rm  )r   r   r   r  r  r  r  rb   r`  rv   r   r   r7   r7   r8   $test_xsrf_fail_cookie_invalid_format  s   
z-XSRFTest.test_xsrf_fail_cookie_invalid_formatc                 C   sR   t td | jddd|  d}W d    n1 sw   Y  | |jd d S )Nr  rL   r   r   r   r   r   rm  )r   r   r   r  rv   r   r   r7   r7   r8   test_xsrf_fail_cookie_no_body  s   z&XSRFTest.test_xsrf_fail_cookie_no_bodyc                 C   :   | j ddtjtdd| jddd}| |jd d S )NrL   r   Zdeadbeefr  r   r"  r   r   r  r  r  rb   r  rv   r   r   r7   r7   r8   test_xsrf_success_short_token%     
z&XSRFTest.test_xsrf_success_short_tokenc                 C   r$  )NrL   r   Zxoxor  r   r"  r   r%  r   r7   r7   r8   test_xsrf_success_non_hex_token.  r'  z(XSRFTest.test_xsrf_success_non_hex_tokenc                 C   8   | j ddtjt| jd|  d}| |jd d S NrL   r   r  r"  r   	r   r  r  r  rb   r`  r  rv   r   r   r7   r7   r8   test_xsrf_success_post_body7  s   z$XSRFTest.test_xsrf_success_post_bodyc                 C   s<   | j dtjt| jd dd|  d}| |jd d S )Nz/?r  r   r   r"  r   r+  r   r7   r7   r8   test_xsrf_success_query_string@  s   z'XSRFTest.test_xsrf_success_query_stringc              	   C   s:   | j dddtd| jifi |  d}| |jd d S )NrL   r   r   zX-Xsrftokenr"  r   )r   rb   r`  r  rv   r   r   r7   r7   r8   test_xsrf_success_headerI  s   	z!XSRFTest.test_xsrf_success_headerc                 C   s:   d}t  }t|D ]	}||   q	| t|| d S )Nr   )r=  ranger*  r	  rv   r   )r@   Z
NUM_TOKENStokensr  r7   r7   r8   test_distinct_tokensU  s
   zXSRFTest.test_distinct_tokensc              
   C   s   |   }| j|fD ]}| jddtjt|d| |d}| |j	d q	| j|f|| jffD ]3\}}t
td | jddtjt|d| |d}W d    n1 sWw   Y  | |j	d q0d S )NrL   r   r  r"  r   r  rm  )r	  r`  r   r  r  r  rb   r  rv   r   r   r   )r@   Ztoken2r  r   cookie_token
body_tokenr7   r7   r8   test_cross_user]  s,   zXSRFTest.test_cross_userc              	   C   s|   | j }t|g}tdD ]'}| |}|| | jddtjt	| j d| 
|d}| |jd q| t|d d S )N   rL   r   r  r"  r      )r`  r=  r/  r	  r*  r   r  r  r  rb   r  rv   r   r   )r@   r  Ztokens_seenr  r   r7   r7   r8   test_refresh_tokenv  s   


zXSRFTest.test_refresh_tokenc              	   C   s   |  | jdd| jdd | jdd}tdD ]}| | j|dd| q| |}|  || |  || | ||f||ffD ]\}}| jddtjt|d| 	|d}| |j
d qBd S )	Nro   rp   r5  rL   r   r  r"  r   )ZassertNotEqualr	  r/  rv   r   r  r  r  rb   r  r   )r@   Zv1_tokenr  Zv2_tokenr2  r3  r   r7   r7   r8   test_versioning  s    
zXSRFTest.test_versioningr  r0   )rG   rH   rI   r   rN   r=   r  r	  r  r  r  r  r!  r#  r&  r(  r,  r-  r.  r1  r4  r7  r8  r  r7   r7   r  r8   r  
  s(    

	

				r  c                       s`   e Zd ZG dd deZdd Z fddZddd	Zdd
dZdd Z	dd Z
dd Z  ZS )XSRFCookieNameTestc                   @   r  )zXSRFCookieNameTest.Handlerc                 C   r  r0   rV   r`  r?   r7   r7   r8   rW     rP  zXSRFCookieNameTest.Handler.getc                 C   rR   r  rU   r?   r7   r7   r8   r     rX   zXSRFCookieNameTest.Handler.postNr  r7   r7   r7   r8   rN     r  rN   c                 C   s   t ddddidS )NTz__Host-xsrfr   )r  Zxsrf_cookie_namexsrf_cookie_kwargsr   r?   r7   r7   r8   r=     s
   z!XSRFCookieNameTest.get_app_kwargsc                    r  r0   r  r?   r  r7   r8   r    rA  zXSRFCookieNameTest.setUpNc                 C   s8   |d ur
|  |}nd }| jd|d}|  t|jS )NrL   r   r
  )r@   r  r   r   r7   r7   r8   r	    s   
zXSRFCookieNameTest.get_tokenc                 C   r  )Nr   z__Host-xsrf=r  r  r7   r7   r8   r    r  z!XSRFCookieNameTest.cookie_headersc                 C   r  r  r  r   r7   r7   r8   r    r  z*XSRFCookieNameTest.test_xsrf_fail_no_tokenc              	   C   r  r  r  r   r7   r7   r8   r    r  z0XSRFCookieNameTest.test_xsrf_fail_body_no_cookiec                 C   r)  r*  r+  r   r7   r7   r8   r,    s   z.XSRFCookieNameTest.test_xsrf_success_post_bodyr0   )rG   rH   rI   r   rN   r=   r  r	  r  r  r  r,  r  r7   r7   r  r8   r9    s    

		r9  c                   @   r  )XSRFCookieKwargsTestc                   @   rP   )zXSRFCookieKwargsTest.Handlerc                 C   r  r0   r:  r?   r7   r7   r8   rW     rP  z XSRFCookieKwargsTest.Handler.getNrY   r7   r7   r7   r8   rN     rZ   rN   c                 C   s   t dt ddddS )NTr|   )r   rh   )r  r;  r   r?   r7   r7   r8   r=     s   z#XSRFCookieKwargsTest.get_app_kwargsc                 C   s   |  d}| d|jd   | d|jd   |jd}|d us'J td|}|d us3J tjtj	j
tjdd }tj| d }|jd u rX|jtj	j
d	}| t||  d
k  d S )NrL   z	httponly;r   zexpires=z.*; expires=(?P<expires>.+);.*r|   r  r  )tzinfor   )r   r  r   r  rW   r   r   r	  r
  r  r  r  r  r  r  r  r=  replacer   r  r  r  r7   r7   r8   test_xsrf_httponly  s   

z'XSRFCookieKwargsTest.test_xsrf_httponlyN)rG   rH   rI   r   rN   r=   r?  r7   r7   r7   r8   r<    s    r<  c                   @   r  )FinishExceptionTestc                   @   rP   )zFinishExceptionTest.Handlerc                 C   s:   |  d | dd | ddrtd| d t )Nr  WWW-AuthenticateBasic realm="something"Zfinish_valuer  zauthentication required)r  r  rg  r*   rV   r?   r7   r7   r8   rW     s   

zFinishExceptionTest.Handler.getNrY   r7   r7   r7   r8   rN     rZ   rN   c                 C   sH   dD ]}|  |}| |jd | d|jd | d|j qd S )N)rL   z/?finish_value=1r  rB  rA  s   authentication required)r   rv   r   r   rW   r   )r@   ur   r7   r7   r8   test_finish_exception  s   
z)FinishExceptionTest.test_finish_exceptionN)rG   rH   rI   r   rN   rD  r7   r7   r7   r8   r@    rx  r@  c                   @   rj   )DecoratorTestc                 C   s0   G dd dt }G dd dt }d|fd|fgS )Nc                   @      e Zd Zedd ZdS )z6DecoratorTest.get_handlers.<locals>.RemoveSlashHandlerc                 S   r  r0   r7   r?   r7   r7   r8   rW     r  z:DecoratorTest.get_handlers.<locals>.RemoveSlashHandler.getN)rG   rH   rI   r,   rW   r7   r7   r7   r8   RemoveSlashHandler      rG  c                   @   rF  )z3DecoratorTest.get_handlers.<locals>.AddSlashHandlerc                 S   r  r0   r7   r?   r7   r7   r8   rW     r  z7DecoratorTest.get_handlers.<locals>.AddSlashHandler.getN)rG   rH   rI   r-   rW   r7   r7   r7   r8   AddSlashHandler  rH  rI  /removeslash/	/addslashr   )r@   rG  rI  r7   r7   r8   r<     s   zDecoratorTest.get_handlersc                 C   `   | j ddd}| |jd | |jd d | j ddd}| |jd | |jd d d S )	NrJ  Fr&  r  r(  z/removeslashz/removeslash/?foo=barz/removeslash?foo=barr  r   r7   r7   r8   test_removeslash     zDecoratorTest.test_removeslashc                 C   rL  )	NrK  Fr&  r  r(  z
/addslash/z/addslash?foo=barz/addslash/?foo=barr  r   r7   r7   r8   test_addslash'  rN  zDecoratorTest.test_addslashN)rG   rH   rI   r<   rM  rO  r7   r7   r7   r8   rE    s    	rE  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d Z
dd Zdd Zdd ZdS )	CacheTestc                 C   s   G dd dt }d|fgS )Nc                   @   r  )z+CacheTest.get_handlers.<locals>.EtagHandlerc                 S   r  r0   rU   )r@   computed_etagr7   r7   r8   rW   4  rX   z/CacheTest.get_handlers.<locals>.EtagHandler.getc                 S   s
   | j d S r4  )_write_bufferr?   r7   r7   r8   compute_etag7  r   z8CacheTest.get_handlers.<locals>.EtagHandler.compute_etagN)rG   rH   rI   rW   rS  r7   r7   r7   r8   EtagHandler3  r  rT  z
/etag/(.*)r   )r@   rT  r7   r7   r8   r<   2  s   
zCacheTest.get_handlersc                 C      d}d}|  ||d d S )N"xyzzy"*r/  
_test_etagr@   rQ  etagsr7   r7   r8   test_wildcard_etag<     zCacheTest.test_wildcard_etagc                 C   s   d}d}|  ||d d S )NrV  r/  rX  rZ  r7   r7   r8   test_strong_etag_matchA  r]  z CacheTest.test_strong_etag_matchc                 C   rU  )N"xyzzy1""xyzzy1", "xyzzy2"r/  rX  rZ  r7   r7   r8   test_multiple_strong_etag_matchF  r]  z)CacheTest.test_multiple_strong_etag_matchc                 C   rU  )NrV  r_  r   rX  rZ  r7   r7   r8   test_strong_etag_not_matchK  r]  z$CacheTest.test_strong_etag_not_matchc                 C   rU  )NrV  r`  r   rX  rZ  r7   r7   r8   #test_multiple_strong_etag_not_matchP  r]  z-CacheTest.test_multiple_strong_etag_not_matchc                 C   rU  )Nr_  
W/"xyzzy1"r/  rX  rZ  r7   r7   r8   test_weak_etag_matchU  r]  zCacheTest.test_weak_etag_matchc                 C   rU  )N"xyzzy2"W/"xyzzy1", W/"xyzzy2"r/  rX  rZ  r7   r7   r8   test_multiple_weak_etag_matchZ  r]  z'CacheTest.test_multiple_weak_etag_matchc                 C   rU  )Nrf  rd  r   rX  rZ  r7   r7   r8   test_weak_etag_not_match_  r]  z"CacheTest.test_weak_etag_not_matchc                 C   rU  )Nz"xyzzy3"rg  r   rX  rZ  r7   r7   r8   !test_multiple_weak_etag_not_matchd  r]  z+CacheTest.test_multiple_weak_etag_not_matchc                 C   s(   | j d| d|id}| |j| d S )Nz/etag/r3  r   r  )r@   rQ  r[  r  r   r7   r7   r8   rY  i  s   zCacheTest._test_etagN)rG   rH   rI   r<   r\  r^  ra  rb  rc  re  rh  ri  rj  rY  r7   r7   r7   r8   rP  1  s    
rP  c                   @   r  )RequestSummaryTestc                   @   rP   )zRequestSummaryTest.Handlerc                 C   s   d | j _| |   d S r0   )rH  Z	remote_ipr   rl  r?   r7   r7   r8   rW   r  s   zRequestSummaryTest.Handler.getNrY   r7   r7   r7   r8   rN   q  rZ   rN   c                 C   r  )NrL   s   GET / (None)r   r  r7   r7   r8   test_missing_remote_ipy  r  z)RequestSummaryTest.test_missing_remote_ipN)rG   rH   rI   r   rN   rl  r7   r7   r7   r8   rk  p  r8  rk  c                   @   rP   )HTTPErrorTestc                 C   sF   t ddd}t|}| || | |j|j | |j|j d S )Nrm  zGo awayr  )r    r   ZassertIsNotrv   r  r  )r@   r   e2r7   r7   r8   	test_copy  s
   
zHTTPErrorTest.test_copyN)rG   rH   rI   ro  r7   r7   r7   r8   rm  ~  rZ   rm  c                   @   rP   )ApplicationTestc                 C   s"   t g }|jddd}|  d S )Nr   r3  )address)r   listenrB  )r@   r>   serverr7   r7   r8   test_listen  s   zApplicationTest.test_listenN)rG   rH   rI   rt  r7   r7   r7   r8   rp    rZ   rp  c                   @   rj   )URLSpecReverseTestc                 C   s0   |  dtdd   |  dtdd   d S )Nz/favicon.icoz/favicon\.icoz^/favicon\.ico$rv   r$   reverser?   r7   r7   r8   test_reverse  r  zURLSpecReverseTest.test_reversec              	   C   sN   dg}|D ]}t |d }z| }| d||f  W q ty$   Y qw d S )Nz^/api/v\d+/foo/(\w+)$z<did not get expected exception when reversing %s. result: %s)r$   rw  r  r  )r@   pathsr2   Zurl_specr  r7   r7   r8   test_non_reversible  s   
z&URLSpecReverseTest.test_non_reversiblec                 C   s4   |  dtdd d |  dtdd d d S )Nz/api/v1/foo/barz^/api/v1/foo/(\w+)$r   z/api.v1/foo/5/icon.pngz/api\.v1/foo/([0-9]+)/icon\.pngr5  rv  r?   r7   r7   r8   test_reverse_arguments  s   z)URLSpecReverseTest.test_reverse_argumentsN)rG   rH   rI   rx  rz  r{  r7   r7   r7   r8   ru    s    ru  c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )RedirectHandlerTestc                 C   s(   dt ddifdt ddifdt ddifgS )N/srcr$   /dstz/src2z/dst2?foo=barz/(.*?)/(.*?)/(.*)z/{1}/{0}/{2})r  r?   r7   r7   r8   r<     s   z RedirectHandlerTest.get_handlersc                 C   r  )Nr}  Fr&  r  r(  r~  r  r   r7   r7   r8   test_basic_redirect  r  z'RedirectHandlerTest.test_basic_redirectc                 C   r  )Nz/src?foo=barFr&  r  r(  z/dst?foo=barr  r   r7   r7   r8   test_redirect_with_argument  r  z/RedirectHandlerTest.test_redirect_with_argumentc                 C   r  )Nz/src2?foo2=bar2Fr&  r  r(  z/dst2?foo=bar&foo2=bar2r  r   r7   r7   r8   %test_redirect_with_appending_argument  r  z9RedirectHandlerTest.test_redirect_with_appending_argumentc                 C   r  )Nz/a/b/cFr&  r  r(  z/b/a/cr  r   r7   r7   r8   test_redirect_pattern  r  z)RedirectHandlerTest.test_redirect_patternN)rG   rH   rI   r<   r  r  r  r  r7   r7   r7   r8   r|    s    r|  c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )AcceptLanguageTestz)Test evaluation of Accept-Language headerc                 C   s8   t tjtjtdd G dd dt}d|fgS )NZgettext_translationsZtornado_testc                   @   rP   )z>AcceptLanguageTest.get_handlers.<locals>.AcceptLanguageHandlerc                 S   s(   |  d|  jdd | d d S )Nr  _-r   )r  Zget_browser_localer   r>  r   r?   r7   r7   r8   rW     s   zBAcceptLanguageTest.get_handlers.<locals>.AcceptLanguageHandler.getNrY   r7   r7   r7   r8   AcceptLanguageHandler  rZ   r  rL   )r   Zload_gettext_translationsr1   r2   r3   r4   r5   r   )r@   r  r7   r7   r8   r<     s   zAcceptLanguageTest.get_handlersc                 C   sL   | j dddid}| |jd d | j dddid}| |jd d d S )NrL   r  zfr-FR;q=0.9r   r  zfr-FRzfr-FR; q=0.9r   rv   r   r   r7   r7   r8   test_accept_language  s   z'AcceptLanguageTest.test_accept_languagec                 C   (   | j dddid}| |jd d d S )NrL   r  z	fr-FR;q=0r   r  en-USr  r   r7   r7   r8   test_accept_language_ignore     z.AcceptLanguageTest.test_accept_language_ignorec                 C   r  )NrL   r  z
fr-FR;q=-1r   r  r  r  r   r7   r7   r8   test_accept_language_invalid  r  z/AcceptLanguageTest.test_accept_language_invalidN)rG   rH   rI   rJ   r<   r  r  r  r7   r7   r7   r8   r    s    r  )Ztornado.concurrentr   tornador   Ztornado.escaper   r   r   r   r   r	   Ztornado.httpclientr
   Ztornado.httputilr   Ztornado.iostreamr   r   Ztornado.locksr   Ztornado.logr   r   Ztornado.simple_httpclientr   Ztornado.templater   Ztornado.testingr   r   r   r   Ztornado.test.utilr   Ztornado.utilr   r   Ztornado.webr   r   r   r   r  r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r~   r  r   r	  email.utilsr  r  ior/   r'  r   r1   r   r7  r,  rs  urllib.parser  r9   r;   rK   rQ   r[   ZTestCaserk   r   r   r   r  r#  r+  r2  rD  rO  r\  ru  r}  r  r  r  r  r  r  r  r  r  r  r  rt  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rK  r  r  r'  r)  r3  r9  r@  r^  re  rm  rr  rv  ry  r}  r  r  r  r  objectr  r  r  r  r  r  r  r9  r<  r@  rE  rP  rk  rm  rp  ru  r|  r  r7   r7   r7   r8   <module>   s     T5/1  0,
  	B  d%C*":/.\b
M
; + M:!?	!