o
    h.                    @   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   I/var/www/vscode/kcb/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]   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 )SecureCookieV2Testajklasdf0ojaisdf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   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,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   )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 )Nunicode_args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   )HttpOnly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  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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/  Fr0  r2  zIhttp://example.com/login\?next=http%3A%2F%2F127.0.0.1%3A[0-9]+%2Fabsoluter3  )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<   r4  r5  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   r;    rX   z*ConnectionCloseHandler.on_connection_closeN)rG   rH   rI   r'  r   r   rW   r;  r7   r7   r7   r8   r6    s
    
r6  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   r9  r6  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:  r9  setio_loop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  rG  closer?   r7   r7   r8   r8       
z&ConnectionCloseTest.on_handler_waitingc                 C   s   t d |   d S )Nzconnection closed)r  r  stopr?   r7   r7   r8   r;       
z'ConnectionCloseTest.on_connection_closeN)rG   rH   rI   r<   rL  r8  r;  r7   r7   r7   r8   r=    s
    
r=  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@   rS  keybvaluesvalueargr7   r7   r8   rW     s.   
zEchoHandler.getNrY   r7   r7   r7   r8   rQ    rZ   rQ  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/([^/]*)/([^/]*))rQ  r?   r7   r7   r8   r<        z RequestEncodingTest.get_handlersc                 C   s   t | |jS r0   )r   r   r   r   r7   r7   r8   
fetch_json  r_  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?rR  z/group/%3F?%3F=%3Frv   r`  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   ér]  rR  rv   r`  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   rR  z/slashes/a%2Fb/c%2Fdza/bzc/drb  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<   r`  rc  rf  rg  ri  r7   r7   r7   r8   r^    s    r^  c                   @   r<  )
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   
cookie_keyr   cookie_valuer   z%unexpected values for cookie keys: %rrw   rf   
xsrf_tokenxsrf_form_htmlreverse_url	typecheckrequest_summary)errors
check_type
get_statusintget_argumentr   listcookieskeysr   valuesrg   rX  rw   r   rf   rp  rq  rr  _request_summaryr?   r7   r7   r8   prepareH  s   zTypeCheckHandler.preparec                 C      |  d|t | | j d S Npath_componentrv  r   rV   ru  r@   r  r7   r7   r8   rW   c  s   zTypeCheckHandler.getc                 C   r  r  r  r  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)rW  ru  )r@   re   objexpected_typeactual_typer7   r7   r8   rv  m  s   zTypeCheckHandler.check_typeN)rG   rH   rI   r  rW   r   rv  r7   r7   r7   r8   rk  G  s
    rk  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   )rW  r   rX  rU  rV  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)rW  r   r   r   b2a_hexr   rX  )rK  r7   r7   r8   describe~  s
   z&DecodeArgHandler.get.<locals>.describerm   r2   query)rV   ry  )r@   r]  r  r7   r7   r8   rW   }  s   "zDecodeArgHandler.getr0   )rG   rH   rI   r  rW   r7   r7   r7   r8   r  s  s    
	r  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  rl  )rl  z(didn't get permanent or status arguments)ry  redirectboolrx  rX  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  rX  
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   )ry  get_query_argumentget_body_argumentr   r@   r   r7   r7   r8   r    s   zGetArgumentHandler.prepareNrG   rH   rI   r  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   rY  get_query_argumentsget_body_argumentsr?   r7   r7   r8   r    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.htmlxhtml_escape)template_loader
autoescaper]   )r   rb   COOKIE_SECRET)r@   loaderr7   r7   r8   r=     s   zWSGISafeWebTest.get_app_kwargsc                       t    tj  d S r0   supertearDownr   _template_loadersclearr?   	__class__r7   r8   r    rN  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/(.*)rs  )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$   rk  r  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@   rT  kwargsr   r7   r7   r8   r`    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@   ro  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   rd  r  z/decode_arg/%C3%A9?foo=%C3%A9r   c3a9r   r  r   r   rv   r@   r  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/%E9rd  z/decode_arg/%C3%A9r  z/decode_arg/1%20%2B%201)rv   r>   rr  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/re  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=1Fr0  -  z/redirect?permanent=0r2  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  Fr0  r  r3  r  r  r2  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  Fr0  r  r3  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<   r`  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                   @   r<  )
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 Nrl  ro   r   )ry  r    rx  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
  )ry  r+  rx  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rX  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%  )rx  ry  rV   
static_url)r@   r2   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  ry  r)  r&  rV   r   rU  protocolr  find)
r@   r2   
do_includeregular_urloverride_urlr,  protocol_lengthcheck_regularcheck_overrideresultr7   r7   r8   rW   E  s   
zAStaticFileTest.get_handlers.<locals>.OverrideStaticUrlHandler.getNrY   r7   r7   r7   r8   OverrideStaticUrlHandlerD  rZ   r5  /static_url/(.*)z/abs_static_url/(.*)z/override_static_url/(.*)z/root_static/(.*)rL   )r2   )r   r   rb   )r@   r(  r*  r5  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-Control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   rH  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   rA  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  rN  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   rx  rv   r   r   r   )r@   r)  r2   r   r7   r7   r8   rG    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   rH  	itertoolschainr   
startswithaddrv   rW   )r@   rT  r  head_responseget_response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)rS  r   rv   r   r   r@   	response1	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   rV  rS  r   rv   r   rX  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"rU  )r\  rT  r   r   r^  rX  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;  rT  zFri, 01 Jan 1960 00:00:00 GMTr   r   rS  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 )NrE  r;  rT  ro   r   r   rV  )r1   statr9   rS  r   st_mtimerv   r   )r@   rd  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;  r]     ")rS  rv   r   r   rW   rA  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-agentr]  rg  rW  10Content-Rangezbytes 0-9/26)rS  rv   r   r   r   r   rW   rA  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;  ri  zbytes=0-r   r   
robots.txtutf-8r  rW  26rl  rS  rv   r   r1   r2   r3   
static_diropenr   r   readr   rW   r@   r   robots_file_pathfr7   r7   r8    test_static_with_range_full_file  s   z/StaticFileTest.test_static_with_range_full_filec                 C   rn  )Nr;  ri  zbytes=0-10000000r   r   ro  rp  rq  rW  rr  rl  rs  rw  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;  ri  zbytes=1-10000000r   rj  ro  rp  rq  ro   rW  25rl  zbytes 1-25/26rs  rw  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;  ri  z	bytes=22-r      : /
rW  r  rl  bytes 22-25/26rS  rv   r   r   rW   r   r7   r7   r8   test_static_with_range_end_edge     z.StaticFileTest.test_static_with_range_end_edgec                 C   r  )
Nr;  ri  zbytes=-4r   r  rW  r  rl  r  r  r   r7   r7   r8   test_static_with_range_neg_end&  r  z-StaticFileTest.test_static_with_range_neg_endc                 C   rn  )Nr;  ri  zbytes=-1000000r   r   ro  rp  rq  rW  rr  rl  rs  rw  r7   r7   r8   %test_static_with_range_neg_past_start.  r|  z4StaticFileTest.test_static_with_range_neg_past_startc                 C   ra  )Nr;  ri  r   r   r   rb  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;  ri  zbytes=-0r   rl  
bytes */26  )rS  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;  ri  zbytes=26r   r  rl  r  rS  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;  ri  z
bytes=10-3r   r  rl  r  r  r   r7   r7   r8   3test_static_unsatisfiable_range_end_less_than_startK  r  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;  rI  r   r   r   rW  rr  r]  rg  r   rv   r   r   r   r   rA  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;  rI  ri  	bytes=1-4)r   r   rj  r   rW  r  r]  rg  r  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;  r  rg  )ri  r\  r   rV  r   rW  r]  )rS  rA  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  rb  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_clientrM  r   r   r   rS  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 )NrE  z/root_staticr   )r1   r2   r3   r4   abspathr5   rS  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   rA  r1   r2   r3   r4   r5   rt  r<   r=   r<  r?  r@  rB  rC  rD  rF  rH  rG  rS  r[  r_  r`  rc  rf  rh  rm  rz  r{  r~  r  r  r  r  r  r  r  r  r  r  r  r  unittestskipIfre   r  r7   r7   r7   r8   r#  2  sP    %		

r#  c                   @   r<  )
StaticDefaultFilenameTestc                 C      t tdt dddS Nr$  
index.htmldefault_filename)r7  static_handler_argsr8  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/Fr0  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/dirFr0  r  r3  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   r    s
    r  c                   @   r<  )
StaticDefaultFilenameRootTestc                 C   s    t tjtdt ddddS )Nr$  r  r  rL   )r7  r  static_url_prefix)rb   r1   r2   r  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 )Nr  z/.*cannot redirect path with two initial slashesz//evil.com/../r  Fr0  r  )r1   r2   r4   r5   
splitdrivere   rv   r   r   r   r   )r@   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   r  r  r8  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                   @   r<  )
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   version_hashextension_indexbefore_version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@   url_pathr  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  rX  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(  r6  )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)r7  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   rB    s   
"z$CustomStaticFileTest.test_static_urlN)rG   rH   rI   r<   r=   r  rB  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   %  r_  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  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   wildcardr  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  r  z	X-Real-Ipr>  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   rQ  n  rZ   rQ  z/str/(?P<path>.*)z/unicode/(?P<path>.*)r   )r@   rQ  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   nonexistent)r  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     rP  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  rW  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   rW  5r  r  r\  r]  r   rV  r   )r   rv   r   r   r   rX  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
  )rU  rV  rW   r  rx  ry  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=304rV  zNot Modifiedz/?code=304&reason=FooFooz/?code=682&reason=Bar  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   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                   @   r<  )
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   r  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!)rY  r  rV   r.   
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  r7  )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-  )Nr9  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)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.0rK  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   r3  r7   r4  r6  r7   r7   r8   r8  7  r9  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/  r0  r2  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rT  r  )rV   rb   rS  path_kwargsr?   r7   r7   r8   r  >  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   r  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   rB  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   rB  r  rF  r7   r7   r8   test_kwN  s   

zPathArgsInPrepareTest.test_kwN)rG   rH   rI   r   rN   r<   rG  rH  r7   r7   r7   r8   rA  <  s
    rA  c                   @   r  )ClearAllCookiesTestc                   @   rP   )zClearAllCookiesTest.Handlerc                 C   s   |    | d d S Nok)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   rM  )r@   r   set_cookiesr7   r7   r8   test_clear_all_cookies[  s   z*ClearAllCookiesTest.test_clear_all_cookiesN)rG   rH   rI   r   rN   rN  r7   r7   r7   r8   rI  U  r  rI  c                   @      e Zd ZdS )PermissionErrorNrG   rH   rI   r7   r7   r7   r8   rP  g      rP  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   
permissionznot allowed)ry  r    rP  )r@   rT  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  r  rP  )
isinstancerP  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   )rY  rP  r   warningrT  r   log_exceptionr@   rZ  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=httprV  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=permissionr  rb  r   r7   r7   r8   test_known_error  ra  z%ExceptionHandlerTest.test_known_errorN)rG   rH   rI   r   rN   r`  rc  rd  r7   r7   r7   r8   rS  k  s
    rS  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   rh  )Nz.*rL   )r   r   r   r?   r7   r7   r8   test_buggy_log_exception  rj  z)BuggyLoggingTest.test_buggy_log_exceptionN)rG   rH   rI   r   rN   rf  r7   r7   r7   r8   re    r  re  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   )ry  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  r_  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castrg  rN   ry   rg   )r@   rh  r7   r7   r8   r     s   z<UIMethodUIModuleTest.get_app_kwargs.<locals>.MyModule.renderNrG   rH   rI   r   r7   r7   r7   r8   MyModule  rZ   rm  r   z1{{ my_ui_method(42) }} {% module MyModule(123) %}ri  )r  
ui_methods
ui_modulesr)   r   rb   )r@   ri  rm  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  rq  r  r7   r7   r  r8   rg    s    rg  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)ry  rV   r!   rt  ru  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 foors  )r   rv   r   r   r   r7   r7   r8   test_catch_error  s
   
z%GetArgumentErrorTest.test_catch_errorN)rG   rH   rI   r   rN   rv  r7   r7   r7   r8   rr        rr  c                   @   r  )SetLazyPropertiesTestc                   @   r<  )
zSetLazyPropertiesTest.Handlerc                 C   s   d| _ td| _d S )NBenr  )current_userr   rW   r?   r7   r7   r8   r    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   rz  r   r   r?   r7   r7   r8   rW     r:   z!SetLazyPropertiesTest.Handler.getN)rG   rH   rI   r  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   rx        rx  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.renderNrl  r7   r7   r7   r8   WithoutUserModule   rZ   r  c                   @   rP   )z9GetCurrentUserTest.get_app_kwargs.<locals>.WithUserModulec                 S   s
   t | jS r0   )r   rz  r?   r7   r7   r8   r     r   z@GetCurrentUserTest.get_app_kwargs.<locals>.WithUserModule.renderNrl  r7   r7   r7   r8   WithUserModule  rZ   r  r  z{{ current_user }}z {% module WithoutUserModule() %}z{% module WithUserModule() %})without_user.htmlwith_user.htmlwithout_user_module.htmlwith_user_module.html)r  r  )r  ro  rp  )r@   r  r  r  r7   r7   r8   r=     s   z!GetCurrentUserTest.get_app_kwargsc                    r  r0   r  r?   r  r7   r8   r    rN  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   r    r   zCGetCurrentUserTest.get_handlers.<locals>.CurrentUserHandler.preparec                 S   s
   d| _ dS )NTr  r  r?   r7   r7   r8   r|  !  s   zLGetCurrentUserTest.get_handlers.<locals>.CurrentUserHandler.get_current_userN)rG   rH   rI   r  r|  r7   r7   r7   r8   CurrentUserHandler  r  r  c                   @   rP   )z;GetCurrentUserTest.get_handlers.<locals>.WithoutUserHandlerc                 S      |  d | t| j d S )Nr  render_stringr   r   r  r?   r7   r7   r8   rW   &     
z?GetCurrentUserTest.get_handlers.<locals>.WithoutUserHandler.getNrY   r7   r7   r7   r8   WithoutUserHandler%  rZ   r  c                   @   rP   )z8GetCurrentUserTest.get_handlers.<locals>.WithUserHandlerc                 S   r  )Nr  r  r?   r7   r7   r8   rW   +  r  z<GetCurrentUserTest.get_handlers.<locals>.WithUserHandler.getNrY   r7   r7   r7   r8   WithUserHandler*  rZ   r  c                   @   rP   )zAGetCurrentUserTest.get_handlers.<locals>.CurrentUserModuleHandlerc                 S   r(  r0   )uir?   r7   r7   r8   get_template_namespace0  s   zXGetCurrentUserTest.get_handlers.<locals>.CurrentUserModuleHandler.get_template_namespaceN)rG   rH   rI   r  r7   r7   r7   r8   CurrentUserModuleHandler/  rZ   r  c                   @   rP   )zAGetCurrentUserTest.get_handlers.<locals>.WithoutUserModuleHandlerc                 S   r  )Nr  r  r?   r7   r7   r8   rW   7  r  zEGetCurrentUserTest.get_handlers.<locals>.WithoutUserModuleHandler.getNrY   r7   r7   r7   r8   WithoutUserModuleHandler6  rZ   r  c                   @   rP   )z>GetCurrentUserTest.get_handlers.<locals>.WithUserModuleHandlerc                 S   r  )Nr  r  r?   r7   r7   r8   rW   <  r  zBGetCurrentUserTest.get_handlers.<locals>.WithUserModuleHandler.getNrY   r7   r7   r7   r8   WithUserModuleHandler;  rZ   r  /without_user
/with_user/without_user_module/with_user_moduler   )r@   r  r  r  r  r  r  r7   r7   r8   r<     s   zGetCurrentUserTest.get_handlersz	needs fixc                 C   r  )Nr     Falser   r   r7   r7   r8   test_get_current_user_is_lazyG  r~  z0GetCurrentUserTest.test_get_current_user_is_lazyc                 C   r  )Nr     Truer   r   r7   r7   r8   test_get_current_user_worksM  r  z.GetCurrentUserTest.test_get_current_user_worksc                 C   r  )Nr  r  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  )Nr  r  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<   r  skipr  r  r  r  r  r7   r7   r  r8   r    s    +
r  c                   @   r  )UnimplementedHTTPMethodsTestc                   @   rO  )z$UnimplementedHTTPMethodsTest.HandlerNrQ  r7   r7   r7   r8   rN   [  rR  rN   c                 C   sR   dD ]}| j d|d}| |jd qdD ]}| j d|dd}| |jd qd S )N)rI  rJ  DELETEOPTIONSrL   r    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   r  r7   r7   r7   r8   r  Z  s    r  c                   @   r  )#UnimplementedNonStandardMethodsTestc                   @   rP   )z+UnimplementedNonStandardMethodsTest.Handlerc                 C   rR   NotherrU   r?   r7   r7   r8   r  i  r,  z1UnimplementedNonStandardMethodsTest.Handler.otherN)rG   rH   rI   r  r7   r7   r7   r8   rN   h  rZ   rN   c                 C   r#  )NrL   PATCHr   r   r  r  r   r7   r7   r8   test_unimplemented_patchn  s   z<UnimplementedNonStandardMethodsTest.test_unimplemented_patchc                 C   r#  )NrL   OTHERTr   allow_nonstandard_methodsr  r  r   r7   r7   r8   test_unimplemented_othert  r%  z<UnimplementedNonStandardMethodsTest.test_unimplemented_otherN)rG   rH   rI   r   rN   r  r  r7   r7   r7   r8   r  g  s    r  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   )rU  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   rI  r  r   )rJ  r  r  r  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   r  r7   r7   r7   r8   r  y  r  r  c                   @   r  )PatchMethodTestc                   @   s&   e Zd Zejd Zdd Zdd ZdS )zPatchMethodTest.Handler)r  c                 C   rR   )NpatchrU   r?   r7   r7   r8   r    rX   zPatchMethodTest.Handler.patchc                 C   rR   r  rU   r?   r7   r7   r8   r    rX   zPatchMethodTest.Handler.otherN)rG   rH   rI   r   SUPPORTED_METHODSr  r  r7   r7   r7   r8   rN     s    
rN   c                 C   r#  )NrL   r  r   r   s   patchr   r   r7   r7   r8   
test_patch  r%  zPatchMethodTest.test_patchc                 C   r#  )NrL   r  Tr  s   otherr   r   r7   r7   r8   
test_other  r%  zPatchMethodTest.test_otherN)rG   rH   rI   r   rN   r  r  r7   r7   r7   r8   r    s    r  c                   @   r  )FinishInPrepareTestc                   @   r  )zFinishInPrepareTest.Handlerc                 C   rR   )Nr   rD  r?   r7   r7   r8   r    rX   z#FinishInPrepareTest.Handler.preparec                 C   r  )Nzshould not reach this methodr  r?   r7   r7   r8   rW     s   zFinishInPrepareTest.Handler.getNrE  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   r  r7   r7   r7   r8   r        
r  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   r  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   r    s    r  c                   @   rj   )Custom404Testc                 C   r  r  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 )Nr  zcustom 404 response)r  rV   r?   r7   r7   r8   rW     rN  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   r  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  r  r   r?   r7   r7   r8   r<     r   z(DefaultHandlerArgumentsTest.get_handlersc                 C   s   t tt dddS )Nr  r   )r  default_handler_args)rb   r"   r?   r7   r7   r8   r=     s   z*DefaultHandlerArgumentsTest.get_app_kwargsc                 C   r  )NrL   r  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                   @   r<  )
zCStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandlerc                 S   r$  r0   r   r7  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   r    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'  r  r  rW   r7   r7   r7   r8   StreamingBodyHandler  s
    r  c                   @   rP   )zAStreamingRequestBodyTest.get_handlers.<locals>.EarlyReturnHandlerc                 S   r  )N  r  r?   r7   r7   r8   r  	  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   r7  r7   r7   r8   r'  	  r   zOStreamingRequestBodyTest.get_handlers.<locals>.CloseDetectionHandler.initializec                    s   t    | jjd  d S r0   )r  r;  r   close_futurer  r?   r  r7   r8   r;  	  r  zXStreamingRequestBodyTest.get_handlers.<locals>.CloseDetectionHandler.on_connection_close)rG   rH   rI   r'  r;  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   r>  s   GET s    HTTP/1.1
s   Connection: close
s   Transfer-Encoding: chunked

)rB  rC  rD  rE  rF  r   rV   )r@   r$   connection_closerK  rG  r7   r7   r8   rE  	  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  rE  rV   rv   read_until_closer   r  rM  r@   rG  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)rE  r  r   rM  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  )rE  rV   r  r   rM  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  rE  rM  )r@   rG  r7   r7   r8   test_close_during_uploadI	  s
   z1StreamingRequestBodyTest.test_close_during_uploadN)
rG   rH   rI   r<   rE  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   methodsr7  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 )Nr  )r  r  r   momentr?   r7   r7   r8   r  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   r  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_size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   r  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   rM  getvaluer   r  rv   r   r   rb   )r@   bytesio	gzip_filecompressed_bodyr   r7   r7   r8   !test_flow_control_compressed_body	  s$   
zEBaseStreamingRequestFlowControlTest.test_flow_control_compressed_bodyN)
rG   rH   rI   r  r  rj  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  asyncior@  )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 )NrW  r  rK  r  r   rX  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  )NrW  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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)rU  rq   rM  
connectionrG  rM  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
   r  SkipTestr   r   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 everybody	asdfbasdf12312312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 )NrZ  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@   	signed_v1	signed_v2signed_default
decoded_v1
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(  r1  r,  r'   assertIs)r@   signed1signed2decoded1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 )Nr8  rg   r/  r0  )r&   r(  r1  r-  r'   rv   r,  r:  )r@   signeddecoded_past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 Nr0  rZ  r/  r'   r(  r1  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   assertFalser@   rI  r7   rH  r8   test_payload_tamperingw
  s   z&SignedValueTest.test_payload_tamperingc                    sj   d  fdd} |d |d |d |d |d |d	 d S )
NrK  c                    s   dt tjd |  jdkS rE  rF  )r   rG  r@   r7   r8   rI  
  rJ  z:SignedValueTest.test_signature_tampering.<locals>.validaterD   00000000000000000000000000000000@4d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e152@3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e153?3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e15A3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e1538rL  rN  r7   rP  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   rZ  r/  )r&   r(  r1  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   rZ  r   r.  r`   r/  r&   r(  SECRET_DICTr,  r'   rv   rW  r7   r7   r8   *test_key_versioning_read_write_default_key
     z:SignedValueTest.test_key_versioning_read_write_default_keyc                 C   rZ  )Nr   rZ  ro   r\  r/  r]  rW  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@  newkeysrX  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   rZ  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   r1  r^  r-  r,  r7  r?  rC  rO  rV  rY  r_  ra  rc  rd  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  xsrf_cookie_version)rx  ry  r^   rV   rp  )r@   rq   r7   r7   r8   rW   
  s   
zXSRFTest.Handler.getc                 C   rR   rJ  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_tokenrp  r?   r  r7   r8   rj  
  rN  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   rk  
  s   
zXSRFTest.get_tokenc                 C      |d u r| j }dd| iS )Nr   z_xsrf=rp  r@   tokenr7   r7   r8   rm  
     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   r  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   _xsrfr   r  
r   r   r   r  r  r  rb   rp  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  r  )
r   r   r   rm  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  rr  r|  r  r  )r   r   r   rm  r  r  r  rb   rp  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 )Nrv  rL   r   r   r   r   r   r  )r   r   r   rm  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   deadbeefr|  r  r  r   r   r  r  r  rb   rm  rv   r   r   r7   r7   r8   test_xsrf_success_short_token%     
z&XSRFTest.test_xsrf_success_short_tokenc                 C   r  )NrL   r   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   rp  rm  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   rp  rm  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   )rH  rangerN  rk  rv   r  )r@   
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{  r  )rk  rp  r   r  r  r  rb   rm  rv   r   r   r   )r@   token2rr  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      )rp  rH  r  rk  rN  r   r  r  r  rb   rm  rv   r   r  )r@   rr  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   r  rL   r   r|  r  r   )assertNotEqualrk  r  rv   r   r  r  r  rb   rm  r   )r@   v1_tokenr  v2_tokenr  r  r   r7   r7   r8   test_versioning  s    
zXSRFTest.test_versioningr  r0   )rG   rH   rI   r   rN   r=   rj  rk  rm  rw  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r7   r7   r  r8   re  
  s(    

	

				re  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   rp  r?   r7   r7   r8   rW     r_  zXSRFCookieNameTest.Handler.getc                 C   rR   rJ  rU   r?   r7   r7   r8   r     rX   zXSRFCookieNameTest.Handler.postNrg  r7   r7   r7   r8   rN     r  rN   c                 C   s   t ddddidS )NTz__Host-xsrfr   )r"  xsrf_cookie_namexsrf_cookie_kwargsr   r?   r7   r7   r8   r=     s
   z!XSRFCookieNameTest.get_app_kwargsc                    rh  r0   ri  r?   r  r7   r8   rj    rN  zXSRFCookieNameTest.setUpNc                 C   s8   |d ur
|  |}nd }| jd|d}|  t|jS )NrL   r   rl  )r@   rn  r   r   r7   r7   r8   rk    s   
zXSRFCookieNameTest.get_tokenc                 C   ro  )Nr   z__Host-xsrf=rp  rq  r7   r7   r8   rm    rs  z!XSRFCookieNameTest.cookie_headersc                 C   rt  ru  r  r   r7   r7   r8   rw    rx  z*XSRFCookieNameTest.test_xsrf_fail_no_tokenc              	   C   ry  rz  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=   rj  rk  rm  rw  r  r  r  r7   r7   r  r8   r    s    

		r  c                   @   r  )XSRFCookieKwargsTestc                   @   rP   )zXSRFCookieKwargsTest.Handlerc                 C   r  r0   r  r?   r7   r7   r8   rW     r_  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"finish_valuer  zauthentication required)r  r  ry  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  r  r  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   r  r7   r7   r7   r8   r    r  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      r  c                   @   r  )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  r  r  /removeslash/	/addslashr   )r@   r  r  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 )	Nr  Fr0  r  r3  z/removeslashz/removeslash/?foo=barz/removeslash?foo=barr  r   r7   r7   r8   test_removeslash     zDecoratorTest.test_removeslashc                 C   r  )	Nr  Fr0  r  r3  z
/addslash/z/addslash?foo=barz/addslash/?foo=barr  r   r7   r7   r8   test_addslash'  r  zDecoratorTest.test_addslashN)rG   rH   rI   r<   r  r  r7   r7   r7   r8   r    s    	r  c                   @   sd   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	d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 r?  )_write_bufferr?   r7   r7   r8   compute_etag7  r   z8CacheTest.get_handlers.<locals>.EtagHandler.compute_etagN)rG   rH   rI   rW   r  r7   r7   r7   r8   EtagHandler3  r  r  z
/etag/(.*)r   )r@   r  r7   r7   r8   r<   2  s   
zCacheTest.get_handlersc                 C      d}d}|  ||d d S )N"xyzzy"*rV  
_test_etagr@   r  etagsr7   r7   r8   test_wildcard_etag<     zCacheTest.test_wildcard_etagc                 C   s   d}d}|  ||d d S )Nr  rV  r  r  r7   r7   r8   test_strong_etag_matchA  r  z CacheTest.test_strong_etag_matchc                 C   r  )N"xyzzy1""xyzzy1", "xyzzy2"rV  r  r  r7   r7   r8   test_multiple_strong_etag_matchF  r  z)CacheTest.test_multiple_strong_etag_matchc                 C   r  )Nr  r  r   r  r  r7   r7   r8   test_strong_etag_not_matchK  r  z$CacheTest.test_strong_etag_not_matchc                 C   r  )Nr  r  r   r  r  r7   r7   r8   #test_multiple_strong_etag_not_matchP  r  z-CacheTest.test_multiple_strong_etag_not_matchc                 C   r  )Nr  
W/"xyzzy1"rV  r  r  r7   r7   r8   test_weak_etag_matchU  r  zCacheTest.test_weak_etag_matchc                 C   r  )N"xyzzy2"W/"xyzzy1", W/"xyzzy2"rV  r  r  r7   r7   r8   test_multiple_weak_etag_matchZ  r  z'CacheTest.test_multiple_weak_etag_matchc                 C   r  )Nr  r  r   r  r  r7   r7   r8   test_weak_etag_not_match_  r  z"CacheTest.test_weak_etag_not_matchc                 C   r  )Nz"xyzzy3"r  r   r  r  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/r\  r   r  )r@   r  r  r  r   r7   r7   r8   r  i  s   zCacheTest._test_etagN)rG   rH   rI   r<   r  r  r  r  r  r  r  r  r  r  r7   r7   r7   r8   r  1  s    
r  c                   @   r  )RequestSummaryTestc                   @   rP   )zRequestSummaryTest.Handlerc                 C   s   d | j _| |   d S r0   )rU  	remote_ipr   r~  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   r  r7   r7   r7   r8   r  p  rw  r  c                   @   rP   )HTTPErrorTestc                 C   sF   t ddd}t|}| || | |j|j | |j|j d S )Nr  zGo awayr  )r    r   assertIsNotrv   r  r
  )r@   r   e2r7   r7   r8   	test_copy  s
   
zHTTPErrorTest.test_copyN)rG   rH   rI   r  r7   r7   r7   r8   r  ~  rZ   r  c                   @   rP   )ApplicationTestc                 C   s"   t g }|jddd}|  d S )Nr   r>  )address)r   listenrO  )r@   r>   serverr7   r7   r8   test_listen  s   zApplicationTest.test_listenN)rG   rH   rI   r  r7   r7   r7   r8   r    rZ   r  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$   r  r  r  )r@   pathsr2   url_specr4  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\.pngr  r  r?   r7   r7   r8   test_reverse_arguments  s   z)URLSpecReverseTest.test_reverse_argumentsN)rG   rH   rI   r  r  r  r7   r7   r7   r8   r    s    r  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  Fr0  r  r3  r  r  r   r7   r7   r8   test_basic_redirect  r  z'RedirectHandlerTest.test_basic_redirectc                 C   r  )Nz/src?foo=barFr0  r  r3  z/dst?foo=barr  r   r7   r7   r8   test_redirect_with_argument  r  z/RedirectHandlerTest.test_redirect_with_argumentc                 C   r  )Nz/src2?foo2=bar2Fr0  r  r3  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/cFr0  r  r3  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 )Ngettext_translationstornado_testc                   @   rP   )z>AcceptLanguageTest.get_handlers.<locals>.AcceptLanguageHandlerc                 S   s(   |  d|  jdd | d d S )Nr  _-r   )r  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   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  )tornado.concurrentr   tornador   tornado.escaper   r   r   r   r   r	   tornado.httpclientr
   tornado.httputilr   tornado.iostreamr   r   tornado.locksr   tornado.logr   r   tornado.simple_httpclientr   tornado.templater   tornado.testingr   r   r   r   tornado.test.utilr   tornado.utilr   r   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/   rK  r  r1   r   rB  rj  r  urllib.parser  r9   r;   rK   rQ   r[   TestCaserk   r   r   r   r#  r-  r6  r=  rQ  r^  rk  r  r  r  r  r  r  r  r  r  r  r  r	  r#  r  r  r  r  r  r  r  r  r  r  r	  r  r  r  r'  rA  rI  rX  rP  rS  re  rg  rr  rx  r  r  r  r  r  r  r  r  r  r  r  r  objectr  r  r
  r  r"  r(  re  r  r  r  r  r  r  r  r  r  r  r  r7   r7   r7   r8   <module>   s     T5/1  0,
  	B  d%C*":/.\b
M
; + M:!?	!