HEX
Server: LiteSpeed
System: Linux php-prod-1.spaceapp.ru 5.15.0-157-generic #167-Ubuntu SMP Wed Sep 17 21:35:53 UTC 2025 x86_64
User: sport3497 (1034)
PHP: 8.1.33
Disabled: NONE
Upload Files
File: //usr/local/CyberCP/lib/python3.10/site-packages/tornado/test/__pycache__/web_test.cpython-310.pyc
o

�h.��@s�ddlmZddlmZddlmZmZmZmZm	Z	m
Z
ddlmZddl
mZddlmZddlmZddlmZdd	lmZmZdd
lmZddlmZddlmZmZmZmZdd
l m!Z!ddl"m#Z#m$Z$ddl%m&Z&m'Z'm(Z(m)Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9ddl:Z:ddl;Z;ddl<Z<ddl=Z=ddl>Z?ddl@Z@ddlAmBZBddlCZCddlDZDddlEZEddlFZFddlGZGddlHZHddlIZIddlJZKdd�ZLGdd�de�ZMGdd�deM�ZNGdd�de'�ZOGdd�de'�ZPGdd�deIjQ�ZRGdd�deIjQ�ZSGd d!�d!eM�ZTGd"d#�d#eM�ZUGd$d%�d%e'�ZVGd&d'�d'eM�ZWGd(d)�d)e'�ZXGd*d+�d+eM�ZYGd,d-�d-e'�ZZGd.d/�d/eM�Z[Gd0d1�d1e'�Z\Gd2d3�d3e'�Z]Gd4d5�d5e'�Z^Gd6d7�d7e'�Z_Gd8d9�d9e'�Z`Gd:d;�d;e'�ZaGd<d=�d=e'�Z)Gd>d?�d?e'�ZbGd@dA�dAe'�ZcGdBdC�dCe'�ZdGdDdE�dEe'�ZeGdFdG�dGeM�ZfGdHdI�dIeM�ZgGdJdK�dKeM�ZhGdLdM�dMeM�ZiGdNdO�dOeM�ZjGdPdQ�dQeM�ZkGdRdS�dSeM�ZlGdTdU�dUeM�ZmGdVdW�dWeM�ZnGdXdY�dYeM�ZoGdZd[�d[eM�ZpGd\d]�d]eN�ZqGd^d_�d_eN�ZrGd`da�daeN�ZsGdbdc�dceN�ZtGddde�deeN�ZuGdfdg�dgeN�ZvGdhdi�dieM�ZwGdjdk�dkeN�ZxGdldm�dmeM�ZyGdndo�doeN�ZzGdpdq�dqe{�Z|Gdrds�dseN�Z}Gdtdu�dueN�Z~Gdvdw�dweN�ZGdxdy�dyeN�Z�Gdzd{�d{eN�Z�Gd|d}�d}eM�Z�Gd~d�deN�Z�Gd�d��d�eN�Z�Gd�d��d�eN�Z�Gd�d��d�eN�Z�Gd�d��d�eN�Z�Gd�d��d�eM�Z�Gd�d��d�eM�Z�Gd�d��d�eM�Z�Gd�d��d�eM�Z�Gd�d��d�eM�Z�e6Gd�d��d�e'��Z�Gd�d��d�e��Z�Gd�d��d�e�eM�Z�Gd�d��d�e�eM�Z�Gd�d��d�eN�Z�Gd�d��d�eN�Z�Gd�d��d�eIjQ�Z�Gd�d��d�eN�Z�Gd�d��d�eN�Z�Gd�d��d�eN�Z�Gd�d��d�eN�Z�Gd�d��d�eM�Z�Gd�d��d�eM�Z�Gd�d��d�eN�Z�Gd�d��d�eIjQ�Z�Gd�d��d�e�Z�Gd�d��d�eIjQ�Z�Gd�d��d�eM�Z�Gd�d��d�eM�Z�dS)��)�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)�BytesIOcGstjjtj�t�g|�R�S�N)�os�path�join�dirname�__file__)�a�r7�H/usr/local/CyberCP/lib/python3.10/site-packages/tornado/test/web_test.py�relpath=�r9c@s(eZdZdZdd�Zdd�Zdd�ZdS)	�WebTestCasez�Base 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.
    cCs t|��fi|����|_|jSr0)r�get_handlers�get_app_kwargs�app��selfr7r7r8�get_appHszWebTestCase.get_appcC�t��r0��NotImplementedErrorr?r7r7r8r<L�zWebTestCase.get_handlerscCsiSr0r7r?r7r7r8r=O�zWebTestCase.get_app_kwargsN)�__name__�
__module__�__qualname__�__doc__rAr<r=r7r7r7r8r;As
r;c@seZdZdZdZdd�ZdS)�SimpleHandlerTestCasez�Simplified base class for tests that work with a single handler class.

    To use, define a nested class named ``Handler``.
    NcCsd|jfgS)N�/��Handlerr?r7r7r8r<[�z"SimpleHandlerTestCase.get_handlers)rGrHrIrJrNr<r7r7r7r8rKSsrKc@�eZdZdd�ZdS)�HelloHandlercC�|�d�dS�N�hello��writer?r7r7r8�get`�zHelloHandler.getN�rGrHrIrWr7r7r7r8rQ_�rQc@s(eZdZd	dd�Zdd�Zd
dd�ZdS)�CookieTestRequestHandler�
0123456789NcCs<i|_|durtt|d�d�|_dStt||d�d�|_dS)N)�
cookie_secret)�settings�r]�key_version)�_cookiesr�dict�application)r@r]r`r7r7r8�__init__fs�
�z!CookieTestRequestHandler.__init__cCs|j�|�Sr0)rarW)r@�namer7r7r8�
get_cookierrOz#CookieTestRequestHandler.get_cookiecCs||j|<dSr0)ra)r@re�value�expires_daysr7r7r8�
set_cookieurXz#CookieTestRequestHandler.set_cookie)r\Nr0)rGrHrIrdrfrir7r7r7r8r[ds
r[c@�$eZdZdd�Zdd�Zdd�ZdS)�SecureCookieV1TestcC�0t�}|jdddd�|�|jddd�d�dS)N�foo�bar���version��min_version�r[�set_signed_cookie�assertEqual�get_signed_cookie�r@�handlerr7r7r8�test_round_trip{�z"SecureCookieV1Test.test_round_tripcCs�t�}|jdt�d�dd�|jd}t�d|�}|dusJ�|�d�}|�d�}|�t	|j
jddd|�|�|�t	|j
jddd	d
|�|�tdt
|�t
|�f�|jd<ttd��|�|jddd
�du�Wd�dS1suwYdS)Nrmsd76df8e7aefcrorps12345678\|([0-9]+)\|([0-9a-f]+)�r]�12345678�1234s5678z1234|5678%s|%szCookie timestamp in futurerr)r[ru�binascii�a2b_hexra�re�match�grouprvr%rcr^rr	rr�
assertTruerw)r@ry�cookier��	timestamp�sigr7r7r8�&test_cookie_tampering_future_timestamp�s>



��
��

�"�z9SecureCookieV1Test.test_cookie_tampering_future_timestampcCrl)Nrm��rorprrrtrxr7r7r8�test_arbitrary_bytes�sz'SecureCookieV1Test.test_arbitrary_bytesN)rGrHrIrzr�r�r7r7r7r8rkzs&rkc@s>eZdZddd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�ZdS)�SecureCookieV2Test�ajklasdf0ojaisdf�aslkjasaolwkjsdf)rrocCrl)Nrmrnr|rprrrtrxr7r7r8rz�r{z"SecureCookieV2Test.test_round_tripcC�0t|jdd�}|�dd�|�|�d�d�dS)Nrr_rmrn�r[�KEY_VERSIONSrurvrwrxr7r7r8�test_key_version_roundtrip��
�z-SecureCookieV2Test.test_key_version_roundtripcCr�)Nror_rmrnr�rxr7r7r8�,test_key_version_roundtrip_differing_version�r�z?SecureCookieV2Test.test_key_version_roundtrip_differing_versioncCsFt|jdd�}|�dd�t|jdd�}|j|_|�|�d�d�dS�Nrr_rmrnro)r[r�rurarvrw)r@ry�new_handlerr7r7r8�"test_key_version_increment_version�s��z5SecureCookieV2Test.test_key_version_increment_versioncCsXt|jdd�}|�dd�|j��}|�d�t|dd�}|j|_|�|�d�d�dSr�)r[r�ru�copy�poprarvrw)r@ry�new_key_versionsr�r7r7r8�#test_key_version_invalidate_version�s�

�z6SecureCookieV2Test.test_key_version_invalidate_versionN)	rGrHrIr�rzr�r�r�r�r7r7r7r8r��s
r�c@s0eZdZdZdd�Zdd�Zdd�Zdd	�ZdS)
�FinalReturnTestNcs<|�G�fdd�dt�}G�fdd�dt�}d|fd|fgS)Ncs0eZdZej�fdd��Zej�fdd��ZdS)z3FinalReturnTest.get_handlers.<locals>.FinishHandlerc3s�|���_�jVdSr0)�finish�final_returnr?��testr7r8rW�s�
z7FinalReturnTest.get_handlers.<locals>.FinishHandler.getc3s.�|�d�|��V|�d��_�jVdS)Nzhello,�world)rV�flushr�r�r?r�r7r8�post�s
�

z8FinalReturnTest.get_handlers.<locals>.FinishHandler.postN)rGrHrIr�	coroutinerWr�r7r�r7r8�
FinishHandler�s
r�cs&eZdZdd�Zej�fdd��ZdS)z3FinalReturnTest.get_handlers.<locals>.RenderHandlercSstddi�S)N�foo.html�hir�r@r2r7r7r8�create_template_loader�rOzJFinalReturnTest.get_handlers.<locals>.RenderHandler.create_template_loadercs|�d��_dS�Nr�)�renderr�r?r�r7r8rW�sz7FinalReturnTest.get_handlers.<locals>.RenderHandler.getN)rGrHrIr�rr�rWr7r�r7r8�
RenderHandler�sr��/finish�/render�r)r@r�r�r7r�r8r<�s
zFinalReturnTest.get_handlerscC�
tdd�S)Nr�)�
template_path�rbr?r7r7r8r=��
zFinalReturnTest.get_app_kwargscCs�|�|�d��}|�|jd�|�|jt�|�|j���|j|�d�ddd�}|�|jd�|�|jt�|�|j���dS)Nr����POST���method�body)	�fetch�get_urlrv�code�assertIsInstancer�rr��done�r@�responser7r7r8� test_finish_method_return_future�sz0FinalReturnTest.test_finish_method_return_futurecCs0|�|�d��}|�|jd�|�|jt�dS)Nr�r�)r�r�rvr�r�r�rr�r7r7r8� test_render_method_return_future	sz0FinalReturnTest.test_render_method_return_future)rGrHrIr�r<r=r�r�r7r7r7r8r��sr�c@s\eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�ZdS)�
CookieTestc

Cs�Gdd�dt�}Gdd�dt�}Gdd�dt�}Gdd�dt�}Gd	d
�d
t�}Gdd�dt�}Gd
d�dt�}Gdd�dt�}Gdd�dt�}	d|fd|fd|fd|fd|fd|fd|fd|fd|	fg	S)Nc@rP)z1CookieTest.get_handlers.<locals>.SetCookieHandlercS�(|�dd�|�dd�|�dd�dS)N�str�asdf�unicode�qwer�bytesszxcv�rir?r7r7r8rWsz5CookieTest.get_handlers.<locals>.SetCookieHandler.getNrYr7r7r7r8�SetCookieHandlerrZr�c@rP)z1CookieTest.get_handlers.<locals>.GetCookieHandlercSs&|�dd�}|dusJ�|�|�dS)Nrm�default)rfrV)r@r�r7r7r8rWsz5CookieTest.get_handlers.<locals>.GetCookieHandler.getNrYr7r7r7r8�GetCookieHandlerrZr�c@rP)z7CookieTest.get_handlers.<locals>.SetCookieDomainHandlercS�|jddddd�dS)N�unicode_args�blahzfoo.com�/foo)�domainr2r�r?r7r7r8rW sz;CookieTest.get_handlers.<locals>.SetCookieDomainHandler.getNrYr7r7r7r8�SetCookieDomainHandlerrZr�c@rP)z<CookieTest.get_handlers.<locals>.SetCookieSpecialCharHandlercSr�)N�equals�a=b�	semicolon�a;b�quote�a"br�r?r7r7r8rW&sz@CookieTest.get_handlers.<locals>.SetCookieSpecialCharHandler.getNrYr7r7r7r8�SetCookieSpecialCharHandler%rZr�c@rP)z:CookieTest.get_handlers.<locals>.SetCookieOverwriteHandlercSs0|jdddd�|jdddd�|�dd�dS)Nr6�bzexample.com)r��c�d�er�r?r7r7r8rW,sz>CookieTest.get_handlers.<locals>.SetCookieOverwriteHandler.getNrYr7r7r7r8�SetCookieOverwriteHandler+rZr�c@rP)z7CookieTest.get_handlers.<locals>.SetCookieMaxAgeHandlercS�|jdddd�dS)Nrm�bar�
)�max_ager�r?r7r7r8rW4�z;CookieTest.get_handlers.<locals>.SetCookieMaxAgeHandler.getNrYr7r7r7r8�SetCookieMaxAgeHandler3rZr�c@rP)z<CookieTest.get_handlers.<locals>.SetCookieExpiresDaysHandlercSr�)Nrmr�r�)rhr�r?r7r7r8rW8r�z@CookieTest.get_handlers.<locals>.SetCookieExpiresDaysHandler.getNrYr7r7r7r8�SetCookieExpiresDaysHandler7rZr�c@rP)z4CookieTest.get_handlers.<locals>.SetCookieFalsyFlagscSsD|jdddd�|jdddd�|jdddd�|jd	ddd�dS)
Nr6�1T)�securer�Fr�)�httponlyr�r�r?r7r7r8rW<sz8CookieTest.get_handlers.<locals>.SetCookieFalsyFlags.getNrYr7r7r7r8�SetCookieFalsyFlags;rZr�c@rP)z8CookieTest.get_handlers.<locals>.SetCookieDeprecatedArgscSr�)Nr6r�Tr�)�HttpOnly�pATHr�r?r7r7r8rWCsz<CookieTest.get_handlers.<locals>.SetCookieDeprecatedArgs.getNrYr7r7r7r8�SetCookieDeprecatedArgsBrZr��/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�r7r7r8r<s&�zCookieTest.get_handlerscCs*|�d�}|�t|j�d��gd��dS)Nr��
Set-Cookie)zbytes=zxcv; Path=/zstr=asdf; Path=/zunicode=qwer; Path=/)r�rv�sorted�headers�get_listr�r7r7r8�test_set_cookieSs

�zCookieTest.test_set_cookiecCsd|jdddid�}|�|jd�|jdddid�}|�|jd�|jdddid�}|�|jd�dS)	Nr��Cookie�foo=bar�r�rnz	foo="bar"z/=exception;�default�r�rvr�r�r7r7r8�test_get_cookieZszCookieTest.test_get_cookiecCs$|�d�}|�|j�d�dg�dS)Nr�r�z,unicode_args=blah; Domain=foo.com; Path=/foo�r�rvr�r�r�r7r7r8�test_set_cookie_domainds


�z!CookieTest.test_set_cookie_domaincCs�|�d�}t|j�d��}|�t|�d�|�|dd�|�|dd�|�|dd	v|d�gd
�}|D]\}}t�d|�|jdd
|id�}|�|j	t
|��q7dS)Nr�r��rzequals="a=b"; Path=/rozquote="a\"b"; Path=/r|)zsemicolon="a;b"; Path=/zsemicolon="a\073b"; Path=/))zfoo=a=br�)z	foo="a=b"r�)z	foo="a;b"z"a)z
foo=a\073bza\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�expectedr7r7r8�test_cookie_special_charks

��z#CookieTest.test_cookie_special_charcCs.|�d�}|j�d�}|�t|�ddg�dS)Nr�r�za=e; Path=/zc=d; Domain=example.com; Path=/�r�r�r�rvr��r@r�r�r7r7r8�test_set_cookie_overwrite�s

�z$CookieTest.test_set_cookie_overwritecCs,|�d�}|j�d�}|�t|�dg�dS)Nr�r�zfoo=bar; Max-Age=10; Path=/rrr7r7r8�test_set_cookie_max_age�s
z"CookieTest.test_set_cookie_max_agecCs�|�d�}|j�d�}|dusJ�t�d|�}|dusJ�tj�tjj�tj	dd�}t
j�|�
�d�}|�t||���dk�dS)Nr�r�z(foo=bar; expires=(?P<expires>.+); Path=/r���days�expires)r�r�rWr�r��datetime�now�timezone�utc�	timedelta�email�utils�parsedate_to_datetime�	groupdictr��abs�
total_seconds�r@r�rr�r�header_expiresr7r7r8�test_set_cookie_expires_days�s
�z'CookieTest.test_set_cookie_expires_dayscCsn|�d�}t|j�d��}|�|d��d�|�|d��d�|�|d��d�|�|d	��d
�dS)Nr�r�rza=1; path=/; securerozb=1; path=/r|zc=1; httponly; path=/rzd=1; path=/)r�r�r�r�rv�lowerrr7r7r8�test_set_cookie_false_flags�s
z&CookieTest.test_set_cookie_false_flagscCsLt��
|�d�}Wd�n1swY|j�d�}|�|d�dS)Nr�r�za=b; HttpOnly; Path=/foo)rr�r�rWrv)r@r�rr7r7r8�test_set_cookie_deprecated�s
�z%CookieTest.test_set_cookie_deprecatedN)
rGrHrIr<r�rrr
r
rrr!r"r7r7r7r8r�sC


r�c@s(eZdZdd�Zdd�Zedd��ZdS)�AuthRedirectRequestHandlercC�
||_dSr0��	login_url)r@r&r7r7r8�
initialize�r�z%AuthRedirectRequestHandler.initializecC�|jSr0r%r?r7r7r8�
get_login_url�rEz(AuthRedirectRequestHandler.get_login_urlcCrR)N��)�
send_errorr?r7r7r8rW��zAuthRedirectRequestHandler.getN)rGrHrIr'r)r#rWr7r7r7r8r#�s
r#c@rj)�AuthRedirectTestcCs dttdd�fdttdd�fgS)N�	/relativez/loginr%�	/absolutezhttp://example.com/login)r#rbr?r7r7r8r<�s��zAuthRedirectTest.get_handlerscCs8|j|�d�dd�}|�|jd�|�|jdd�dS)Nr.F��follow_redirects�.�Locationz/login?next=%2Frelative)r�r�rvr�r�r�r7r7r8�test_relative_auth_redirect�sz,AuthRedirectTest.test_relative_auth_redirectcCsF|j|�d�dd�}|�|jd�|�t�d|jd�|jd�dS)Nr/Fr0r2zIhttp://example.com/login\?next=http%3A%2F%2F127.0.0.1%3A[0-9]+%2Fabsoluter3)r�r�rvr�r�r�r�r�r�r7r7r8�test_absolute_auth_redirect�s��z,AuthRedirectTest.test_absolute_auth_redirectN)rGrHrIr<r4r5r7r7r7r8r-�s
r-c@s*eZdZdd�Zejdd��Zdd�ZdS)�ConnectionCloseHandlercCr$r0r��r@r�r7r7r8r'�r�z!ConnectionCloseHandler.initializeccs�|j��|jj��VdSr0)r��on_handler_waiting�
cleanup_event�waitr?r7r7r8rW�s�
zConnectionCloseHandler.getcCs|j��dSr0)r��on_connection_closer?r7r7r8r;�rXz*ConnectionCloseHandler.on_connection_closeN)rGrHrIr'rr�rWr;r7r7r7r8r6�s

r6c@�,eZdZdd�Zdd�Zdd�Zdd�Zd	S)
�ConnectionCloseTestcCst�|_dtt|d�fgS)NrLr�)rr9r6rbr?r7r7r8r<�sz ConnectionCloseTest.get_handlerscCs`t�tjtjd�}|�d|��f�t|�|_|j�d�|��|j	�
�|j�dd��dS)Nr�	127.0.0.1sGET / HTTP/1.0

cSs
t�d�S�Nr)r�sleepr7r7r7r8�<lambda>�s
z;ConnectionCloseTest.test_connection_close.<locals>.<lambda>)
�socket�AF_INET�SOCK_STREAM�connect�
get_http_portr�streamrVr:r9�set�io_loop�run_sync)r@�sr7r7r8�test_connection_close�s

z)ConnectionCloseTest.test_connection_closecCst�d�|j��dS)Nzhandler waiting)rrrG�closer?r7r7r8r8��
z&ConnectionCloseTest.on_handler_waitingcCst�d�|��dS)Nzconnection closed)rr�stopr?r7r7r8r;��
z'ConnectionCloseTest.on_connection_closeN)rGrHrIr<rLr8r;r7r7r7r8r=�s

r=c@rP)�EchoHandlercGs�|jjD]=}t|�tkrtdt|���|jj|D]}t|�tkr*tdt|���q|�|�D]}t|�tkr@tdt|���q0q|D]}t|�tkrTtdt|���qD|�t	|jj
|t|jj�d��dS)Nzincorrect type for key: %rzincorrect type for value: %rzincorrect type for path arg: %r�r2�	path_args�args)�request�	arguments�typer��	Exceptionr��
get_argumentsrrVrbr2r)r@rS�key�bvalue�svalue�argr7r7r8rW�s.����
��zEchoHandler.getNrYr7r7r7r8rQ�rZrQc@s<eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
S)�RequestEncodingTestcCsdtfdtfgS)Nz/group/(.*)z/slashes/([^/]*)/([^/]*))rQr?r7r7r8r<�z RequestEncodingTest.get_handlerscCst|�|�j�Sr0)rr�r�r�r7r7r8�
fetch_jsonr_zRequestEncodingTest.fetch_jsoncCsF|�|�d�tddgid��|�|�d�tddgddgid��dS)Nz
/group/%3F�?rRz/group/%3F?%3F=%3F�rvr`rbr?r7r7r8�test_group_question_marks��z,RequestEncodingTest.test_group_question_markcCs&|�|�d�ddgddgid��dS)Nz/group/%C3%A9?arg=%C3%A9z
/group/%C3%A9�ér]rR�rvr`r?r7r7r8�test_group_encoding)s��z'RequestEncodingTest.test_group_encodingcCsD|�|�d�tdddgid��|�|�d�tdddgid��dS)Nz/slashes/foo/barrmr�rRz/slashes/a%2Fb/c%2Fdza/bzc/drbr?r7r7r8�test_slashes4s��z RequestEncodingTest.test_slashescC�:ttd��|�d�Wd�dS1swYdS)Nz.*Invalid unicodez/group/?arg=%25%e9)rrr�r?r7r7r8�
test_error@�"�zRequestEncodingTest.test_errorN)	rGrHrIr<r`rcrfrgrir7r7r7r8r^sr^c@r<)
�TypeCheckHandlercCsi|_|�d|��t�|�d|�d�t�|�dt|j���dt	�|�dt|j�
��djt	�t|j���dgkrFtd|j����|�d	|�
d�t�|�d
|�d�t	�|�d|jt�|�d|��t	�|�d
|�dd�t	�|�d|��t	�dS)N�status�argumentrm�
cookie_keyr�cookie_valuer�z%unexpected values for cookie keys: %rrwrf�
xsrf_token�xsrf_form_html�reverse_url�	typecheck�request_summary)�errors�
check_type�
get_status�int�get_argumentr�list�cookies�keysr��valuesrgrXrwr�rfrprqrr�_request_summaryr?r7r7r8�prepareHs�zTypeCheckHandler.preparecC�|�d|t�|�|j�dS�N�path_component�rvrrVru�r@r�r7r7r8rWcszTypeCheckHandler.getcCr�r�r�r�r7r7r8r�iszTypeCheckHandler.postcCs*t|�}||krd||f|j|<dSdS)Nzexpected %s, got %s)rWru)r@re�obj�
expected_type�actual_typer7r7r8rvms�zTypeCheckHandler.check_typeN)rGrHrIrrWr�rvr7r7r7r8rkGs
rkc@seZdZddd�Zdd�ZdS)�DecodeArgHandlerNcCsFt|�tkrtdt|���d|jjvr!|�t|jjdd��S|S)Nzunexpected type for value: %r�encodingr)rWr�rXrUrV�decoder)r@rgrer7r7r8�decode_argumentts
z DecodeArgHandler.decode_argumentcCs*dd�}|�||�||�d��d��dS)NcSs:t|�tkrdtt�|��gSt|�tkrd|gStd��)Nr�r�zunknown type)rWr�rr�b2a_hexrrX)rKr7r7r8�describe~s
z&DecodeArgHandler.get.<locals>.describerm�r2�query)rVry)r@r]r�r7r7r8rW}s"zDecodeArgHandler.getr0)rGrHrIr�rWr7r7r7r8r�ss
	r�c@rP)�LinkifyHandlercCs|jddd�dS)N�linkify.htmlzhttp://example.com)�message�r�r?r7r7r8rW��zLinkifyHandler.getNrYr7r7r7r8r��rZr�c@rP)�UIModuleResourceHandlercCs|jdddgd�dS)N�	page.htmlror|)�entriesr�r?r7r7r8rW�szUIModuleResourceHandler.getNrYr7r7r7r8r��rZr�c@rP)�OptionalPathHandlercCs|�d|i�dS)Nr2rUr�r7r7r8rW�r�zOptionalPathHandler.getNrYr7r7r7r8r��rZr�c@rP)�MultiHeaderHandlercCs4|�dd�|�dd�|�dd�|�dd�dS)	N�x-overwriter�zX-Overwriter|�x-multirzX-Multi�4)�
set_header�
add_headerr?r7r7r8rW�szMultiHeaderHandler.getNrYr7r7r7r8r��rZr�c@rP)rcCsd|�dd�dur|jdtt|�d���d�dS|�dd�dur.|jdt|�d��d�dStd��)N�	permanentrL)r�rl)rlz(didn't get permanent or status arguments)ry�redirect�boolrxrXr?r7r7r8rW�s
 zRedirectHandler.getNrYr7r7r7r8r�rZrc@�eZdZejdd��ZdS)�EmptyFlushCallbackHandlerccsB�|��V|��V|�d�|��V|��V|�d�dS)N�o�k)r�rVr�r?r7r7r8rW�s�




zEmptyFlushCallbackHandler.getN)rGrHrIrr�rWr7r7r7r8r���r�c@rP)�HeaderInjectionHandlerc
CsVz
|�dd�td��ty*}zdt|�vr|�d�n�WYd}~dSd}~ww)NzX-Foozfoo
X-Bar: bazzDidn't get expected exceptionzUnsafe header value�ok)r�rX�
ValueErrorr�r��r@r�r7r7r8rW�s���zHeaderInjectionHandler.getNrYr7r7r7r8r��rZr�c@rP)�GetArgumentHandlercCsJ|�dd�dkr|j}n|�dd�dkr|j}n|j}|�|dd��dS)N�sourcer�r�rmr�)ry�get_query_argument�get_body_argumentr��r@r�r7r7r8r�szGetArgumentHandler.prepareN�rGrHrIrr7r7r7r8r��rZr�c@rP)�GetArgumentsHandlercCs*|�t|�d�|�d�|�d�d��dS)Nrm�r�r�r�)r�rbrY�get_query_arguments�get_body_argumentsr?r7r7r8r�s��zGetArgumentsHandler.prepareNr�r7r7r7r8r��rZr�cs�eZdZdZdd�Z�fdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zd*d+�Z�ZS),�WSGISafeWebTestzWebTest.COOKIE_SECRETcCs tdddd��}t|d|jd�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])rrb�
COOKIE_SECRET)r@�loaderr7r7r8r=�s���zWSGISafeWebTest.get_app_kwargsc�t���tj��dSr0��super�tearDownr�_template_loaders�clearr?��	__class__r7r8r��rNzWSGISafeWebTest.tearDowncCs�tdtdd�tdtdd�tdt�tdt�tdt�td	t�td
t�tdt�tdtd
di�tdtddd��tdtd
di�tdt	�tdt
�tdt�g}|S)Nz/typecheck/(.*)rs)rez/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$rkr�r�r�r�r�r�WebRedirectHandlerr�r�r�)r@�urlsr7r7r8r<�s8����zWSGISafeWebTest.get_handlerscOs"|j|i|��}|��t|j�Sr0)r��rethrowrr�)r@rT�kwargsr�r7r7r8r`s
zWSGISafeWebTest.fetch_jsoncCs\tt|jdd��}|jddd|id�}t|j�}|�|i�|jdddd|idd	�}dS)
Nr�r�z/typecheck/asdf?foo=barr�zasdf=r�r�r��r�r�r�)rr&r�r�rr�rv)r@ror�rr7r7r8�
test_typess��


�zWSGISafeWebTest.test_typescCs�gd�}|D]}|�|�}|��t|j�}|�|ddgddgd��q|�d�}|��t|j�}|�|ddgddgd��dS)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�rdr�z/decode_arg/%C3%A9?foo=%C3%A9r��c3a9�r�r�rr�rv�r@r��req_urlr�rr7r7r8�test_decode_argument0s

�

z$WSGISafeWebTest.test_decode_argumentcCs`ttd��!|�d�}|�|jd�|�d�}|�|jd�Wd�dS1s)wYdS)Nz.*Invalid unicode.*z/typecheck/invalid%FFi�z/typecheck/invalid?foo=%FF�rrr�rvr�r�r7r7r8�$test_decode_argument_invalid_unicodeEs

"�z4WSGISafeWebTest.test_decode_argument_invalid_unicodecCsLddg}|D]}|�|�}|��t|j�}|�|ddgddgd��qdS)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�r7r7r8�test_decode_argument_plusMs�

��z)WSGISafeWebTest.test_decode_argument_pluscCsr|�|j�dd�d�|�|j�dd�d�|�|j�dd�d�|�|j�dd�d	�|�|j�dd
�d�dS)Nr�rmz/decode_arg/foo�*z/decode_arg/42r�z/decode_arg/%E9rdz/decode_arg/%C3%A9r�z/decode_arg/1%20%2B%201)rvr>rrr?r7r7r8�test_reverse_url\s��z WSGISafeWebTest.test_reverse_urlcC�|�d�}|�|jd�dS)Nr�s3<a href="http://example.com">http://example.com</a>r�r�r7r7r8�test_uimodule_unescapedgs
�z'WSGISafeWebTest.test_uimodule_unescapedcCr�)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�r7r7r8�test_uimodule_resourcesm�

�z'WSGISafeWebTest.test_uimodule_resourcescCs0|�|�d�ddi�|�|�d�ddi�dS)Nz/optional_path/foor2rmz/optional_path/rer?r7r7r8�test_optional_path��z"WSGISafeWebTest.test_optional_pathcCs8|�d�}|�|jdd�|�|j�d�ddg�dS)Nr�r��2r��3r�rr�r7r7r8�test_multi_header�s
z!WSGISafeWebTest.test_multi_headercCsX|jddd�}|�|jd�|jddd�}|�|jd�|jddd�}|�|jd�dS)	Nz/redirect?permanent=1Fr0�-z/redirect?permanent=0r2z/redirect?status=307i3�r�rvr�r�r7r7r8�
test_redirect�szWSGISafeWebTest.test_redirectcCs`|jddd�}|�|jd�|�|jdd�|jddd�}|�|jd�|�|jdd�dS)	Nr�Fr0r�r3r�r�r2�r�rvr�r�r�r7r7r8�test_web_redirect�sz!WSGISafeWebTest.test_web_redirectcC�2|jddd�}|�|jd�|�|jdd�dS)Nr�Fr0r�r3r�r�r�r7r7r8�test_web_redirect_double_slash��z.WSGISafeWebTest.test_web_redirect_double_slashcCr�)Nr�r�r�r�r7r7r8�test_header_injection��
z%WSGISafeWebTest.test_header_injectioncCs�|�d�}|�|jd�|�d�}|�|jd�|�d�}|�|jd�tj�tdd��}|jdd	|d
�}|�|jd�|jdd	|d
�}|�t|j�td
dgd
gdgd��dS)Nz/get_argument?foo=barrnz/get_argument?foo=r�r�r�rT�rmr�r��helloz/get_arguments?foo=barr�r�)r�rvr��urllib�parse�	urlencoderbr)r@r�r�r7r7r8�test_get_argument�s


�z!WSGISafeWebTest.test_get_argumentcCsptj�tdd��}|jdd|d�}|�|jd�|jdd|d�}|�|jd�|jd	d|d�}|�|jd
�dS)NrTr�z"/get_argument?source=query&foo=barr�r�rnz/get_argument?source=query&foo=r�z/get_argument?source=queryr��r�r�r�rbr�rvr��r@r�r�r7r7r8�test_get_query_arguments�s��z(WSGISafeWebTest.test_get_query_argumentscCs�tj�tdd��}|jdd|d�}|�|jd�tj�tdd��}|jdd|d�}|�|jd�tj�t��}|jdd|d�}|�|jd	�dS)
Nr�r�z#/get_argument?source=body&foo=hellor�r�rn�r�r�r�r�r7r7r8�test_get_body_arguments�s���z'WSGISafeWebTest.test_get_body_argumentscCs:|�d�}|�d|j�dd��|�d|j�dd��dS)Nr��Accept-Encoding�Varyr��gzip�Content-Encoding)r��assertNotInr�rWr�r7r7r8�test_no_gzip�s
zWSGISafeWebTest.test_no_gzip)rGrHrIr�r=r�r<r`r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�
__classcell__r7r7r�r8r��s.r�c@�eZdZdd�Zdd�ZdS)�NonWSGIWebTestscC�
dtfgS)N�/empty_flush)r�r?r7r7r8r<�r�zNonWSGIWebTests.get_handlerscCr�)Nrr�r�r�r7r7r8�test_empty_flush�r�z NonWSGIWebTests.test_empty_flushN)rGrHrIr<rr7r7r7r8r��rc@r<)
�ErrorResponseTestcCsLGdd�dt�}Gdd�dt�}Gdd�dt�}td|�td|�td	|�gS)
Nc@rP)z6ErrorResponseTest.get_handlers.<locals>.DefaultHandlercSs*|�dd�rtt|�d����dddS�Nrlror)ryr rxr?r7r7r8rW�sz:ErrorResponseTest.get_handlers.<locals>.DefaultHandler.getNrYr7r7r7r8�DefaultHandler�rZrc@r)z9ErrorResponseTest.get_handlers.<locals>.WriteErrorHandlercSs0|�dd�r|�t|�d���dSdddSr
)ryr+rxr?r7r7r8rW�sz=ErrorResponseTest.get_handlers.<locals>.WriteErrorHandler.getc[sB|�dd�d|vr|�d|ddj�dS|�d|�dS)N�Content-Type�
text/plain�exc_infoz
Exception: %srz
Status: %d)r�rVrG�r@�status_coder�r7r7r8�write_error�szEErrorResponseTest.get_handlers.<locals>.WriteErrorHandler.write_errorN�rGrHrIrWrr7r7r7r8�WriteErrorHandler�src@r)z?ErrorResponseTest.get_handlers.<locals>.FailedWriteErrorHandlercS�dddS�Nrorr7r?r7r7r8rWrOzCErrorResponseTest.get_handlers.<locals>.FailedWriteErrorHandler.getc[�td��)Nzexception in write_error�rXrr7r7r8r
�zKErrorResponseTest.get_handlers.<locals>.FailedWriteErrorHandler.write_errorNrr7r7r7r8�FailedWriteErrorHandlerrr�/default�/write_error�/failed_write_error)rr$)r@rrrr7r7r8r<�s�zErrorResponseTest.get_handlerscCs�ttd��E|�d�}|�|jd�|�d|jv�|�d�}|�|jd�|�d|jv�|�d�}|�|jd	�|�d
|jv�Wd�dS1sMwYdS)N�Uncaught exceptionrr*s500: Internal Server Errorz/default?status=503�s503: Service Unavailablez/default?status=435i�s435: Unknown)rrr�rvr�r�r�r�r7r7r8�test_defaults


"�zErrorResponseTest.test_defaultcCs|ttd��/|�d�}|�|jd�|�d|j�|�d�}|�|jd�|�d|j�Wd�dS1s7wYdS)Nrrr*sException: ZeroDivisionErrorz/write_error?status=503rsStatus: 503�rrr�rvr�r�r�r7r7r8�test_write_error!s

"�z"ErrorResponseTest.test_write_errorcCsVttd��|�d�}|�|jd�|�d|j�Wd�dS1s$wYdS)Nrrr*r�r r�r7r7r8�test_failed_write_error+s

"�z)ErrorResponseTest.test_failed_write_errorN)rGrHrIr<rr!r"r7r7r7r8r	�s
"
r	c@sPeZdZdZej�ej�e�d�Z	dd�Z
dd�Zdd�Zd	d
�Z
dd�Zd
d�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Zd-d.�Zd/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,�-ej.dGkdH�dIdJ��Z/dKS)L�StaticFileTests�63a36e950e134b5217e33c763e88840c10a07d80e6057d92b9ac97508de7fb1fa6f0e9b7531e169657165ea764e8963399cb6d921ffe6078425aaafe54c04563�staticcCsTGdd�dt�}Gdd�d|�}Gdd�dt�}d|fd|fd	|fd
ttdd�fgS)
Nc@rP)z5StaticFileTest.get_handlers.<locals>.StaticUrlHandlercSs(t|�dd��}|�|j||d��dS)N�include_versionr�)r%)rxryrV�
static_url)r@r2�with_vr7r7r8rW=sz9StaticFileTest.get_handlers.<locals>.StaticUrlHandler.getNrYr7r7r7r8�StaticUrlHandler<rZr(c@seZdZdZdS)z=StaticFileTest.get_handlers.<locals>.AbsoluteStaticUrlHandlerTN)rGrHrI�include_hostr7r7r7r8�AbsoluteStaticUrlHandlerAsr*c@rP)z=StaticFileTest.get_handlers.<locals>.OverrideStaticUrlHandlerc
Ss�t|�d��}||_|�|�}|j||d�}||kr"|�td��S|jjd}t|�}|�	|d|�}|�	|d|�}|rE|dkoC|dk}	n|dkoL|dk}	|�t|	��dS)Nr))r)Fz://r���)
r�ryr)r&rVr�rU�protocolr�find)
r@r2�
do_include�regular_url�override_urlr,�protocol_length�
check_regular�check_override�resultr7r7r8rWEs
zAStaticFileTest.get_handlers.<locals>.OverrideStaticUrlHandler.getNrYr7r7r7r8�OverrideStaticUrlHandlerDrZr5�/static_url/(.*)z/abs_static_url/(.*)z/override_static_url/(.*)z/root_static/(.*)rL)r2)rrrb)r@r(r*r5r7r7r8r<;s�zStaticFileTest.get_handlerscCsttd�d�S)Nr$)�static_path�rbr9r?r7r7r8r=`rXzStaticFileTest.get_app_kwargscCsL|�d�}|�d|jv�|�d�}|�d|jv�|�|j�d�d�dS)N�/robots.txt�Disallow: /�/static/robots.txtrr
)r�r�r�rvr�rWr�r7r7r8�test_static_filescs


z StaticFileTest.test_static_filescCs:|�d�}|�d|jv�|�d|j�|�d|j�dS)Nz/robots.txt?v=12345r:z
Cache-Control�Expires)r�r�r��assertInr�r�r7r7r8�test_static_files_cacheableks
z*StaticFileTest.test_static_files_cacheablecCsd|�d�}|�|j�d�d�|�d�}|�|j�d�d�|�d�}|�|j�d�td�v�dS)Nz/static/sample.xml.gzrzapplication/gzipz/static/sample.xml.bz2zapplication/octet-streamz/static/sample.xml)ztext/xmlzapplication/xml)r�rvr�rWr�rHr�r7r7r8�test_static_compressed_filests

�
�z+StaticFileTest.test_static_compressed_filescCs"|�d�}|�|jd|j�dS)Nz/static_url/robots.txts/static/robots.txt?v=)r�rvr��robots_txt_hashr�r7r7r8�test_static_url�s
zStaticFileTest.test_static_urlcCs0|�d�}|�|jt|�d��d|j�dS)Nz/abs_static_url/robots.txtrLsstatic/robots.txt?v=)r�rvr�rr�rAr�r7r7r8�test_absolute_static_url�s

�z'StaticFileTest.test_absolute_static_urlcCr�)Nz(/static_url/robots.txt?include_version=0s/static/robots.txtr�r�r7r7r8�test_relative_version_exclusion�r�z.StaticFileTest.test_relative_version_exclusioncCs*|�d�}|�|jt|�d�d��dS)Nz,/abs_static_url/robots.txt?include_version=0rL�static/robots.txt)r�rvr�rr�r�r7r7r8�test_absolute_version_exclusion�s
 z.StaticFileTest.test_absolute_version_exclusioncCs|�d�|�d�dS)NFT)�_trigger_include_host_checkr?r7r7r8�test_include_host_override�rNz)StaticFileTest.test_include_host_overridecCs0d}|�|t|��}|�|jttd���dS)Nz//override_static_url/robots.txt?include_host=%sT)r�rxrvr�rr�)r@r)r2r�r7r7r8rG�sz*StaticFileTest._trigger_include_host_checkcOs�|j|ddi|��}|j|ddi|��}t�}t�|j|j�D]}|�d�r+|�|�q|D]}|�|j�|�|j�|�d||j�|�|j�|�f�q.|S)z�Performs a GET and HEAD request and returns the GET response.

        Fails if any ``Content-*`` headers returned by the two requests
        differ.
        r��HEAD�GETzContent-z)%s differs between GET (%s) and HEAD (%s))	r�rH�	itertools�chainr��
startswith�addrvrW)r@rTr��
head_response�get_response�content_headers�hr7r7r8�get_and_head�s 

�

��zStaticFileTest.get_and_headcCsD|�d�}|jdd|jdid�}|�|jd�|�d|jv�dS)Nr;�If-Modified-Since�
Last-Modifiedr��0�Content-Length)rSr�rvr�r��r@�	response1�	response2r7r7r8�!test_static_304_if_modified_since�s
�z0StaticFileTest.test_static_304_if_modified_sincecCs4|�d�}|jdd|jdid�}|�|jd�dS)Nr;�
If-None-Match�Etagr�rV�rSr�rvr�rXr7r7r8�test_static_304_if_none_match�s

�z,StaticFileTest.test_static_304_if_none_matchcCs6|�d�}|jdd|jdd�d�}|�|jd�dS)Nr;z
"MISMATCH"rU)r\rTr�r�r^rXr7r7r8�!test_static_304_etag_modified_bug�s
��z0StaticFileTest.test_static_304_etag_modified_bugcC�$|jdddid�}|�|jd�dS)Nr;rTzFri, 01 Jan 1960 00:00:00 GMTr�r��rSrvr�r�r7r7r8�'test_static_if_modified_since_pre_epoch�s
�z6StaticFileTest.test_static_if_modified_since_pre_epochcCsft�td��}|jddt|jd�id�}|�|jd�|jddt|jd�id�}|�|jd�dS)NrEr;rTror�r�rV)r1�statr9rSr�st_mtimervr�)r@rdr�r7r7r8�'test_static_if_modified_since_time_zone�s��z6StaticFileTest.test_static_if_modified_since_time_zonecCs0|�d�}|�t|j�d��d|jd�dS)Nr;r]�")rSrvrr�rWrAr�r7r7r8�test_static_etag�s
�zStaticFileTest.test_static_etagcCs||jdddid�}|�|jd�|�|jd�|�t|j�d��d|jd�|�|j�d	�d
�|�|j�d�d�dS)
Nr;�Rangez	bytes=0-9r���s
User-agentr]rgrW�10�
Content-Rangezbytes 0-9/26)rSrvr�r�rr�rWrAr�r7r7r8�test_static_with_range�s��z%StaticFileTest.test_static_with_rangecC�|jdddid�}|�|jd�tj�|jd�}t|dd��}|�|jt	|�
���Wd�n1s4wY|�|j�d	�d
�|�|j�d�d�dS)Nr;rizbytes=0-r�r��
robots.txt�utf-8�r�rW�26rl�
rSrvr�r1r2r3�
static_dir�openr�r�readr�rW�r@r��robots_file_path�fr7r7r8� test_static_with_range_full_file�s��z/StaticFileTest.test_static_with_range_full_filecCrn)Nr;rizbytes=0-10000000r�r�rorprqrWrrrlrsrwr7r7r8�$test_static_with_range_full_past_end���z3StaticFileTest.test_static_with_range_full_past_endcCs�|jdddid�}|�|jd�tj�|jd�}t|dd��}|�|jt	|�
�d	d���Wd�n1s8wY|�|j�d
�d�|�|j�d�d
�dS)Nr;rizbytes=1-10000000r�rjrorprqrorW�25rlz
bytes 1-25/26rsrwr7r7r8�'test_static_with_range_partial_past_ends� �z6StaticFileTest.test_static_with_range_partial_past_endcC�L|jdddid�}|�|jd�|�|j�d�d�|�|j�d�d	�dS)
Nr;riz	bytes=22-r��: /
rWr�rl�bytes 22-25/26�rSrvr�r�rWr�r7r7r8�test_static_with_range_end_edge��z.StaticFileTest.test_static_with_range_end_edgecCr)
Nr;rizbytes=-4r�r�rWr�rlr�r�r�r7r7r8�test_static_with_range_neg_end&r�z-StaticFileTest.test_static_with_range_neg_endcCrn)Nr;rizbytes=-1000000r�r�rorprqrWrrrlrsrwr7r7r8�%test_static_with_range_neg_past_start.r|z4StaticFileTest.test_static_with_range_neg_past_startcCra)Nr;rir�r�r�rbr�r7r7r8�test_static_invalid_range9sz(StaticFileTest.test_static_invalid_rangecCs8|jdddid�}|�|j�d�d�|�|jd�dS)Nr;rizbytes=-0r�rl�
bytes */26�)rSrvr�rWr�r�r7r7r8�+test_static_unsatisfiable_range_zero_suffix=s
�z:StaticFileTest.test_static_unsatisfiable_range_zero_suffixcC�8|jdddid�}|�|jd�|�|j�d�d�dS)Nr;rizbytes=26r�r�rlr��rSrvr�r�rWr�r7r7r8�-test_static_unsatisfiable_range_invalid_startD�
�z<StaticFileTest.test_static_unsatisfiable_range_invalid_startcCr�)Nr;riz
bytes=10-3r�r�rlr�r�r�r7r7r8�3test_static_unsatisfiable_range_end_less_than_startKr�zBStaticFileTest.test_static_unsatisfiable_range_end_less_than_startcCs`|jddd�}|�|jd�|�|jd�|�|jdd�|�t|jd�d	|jd	�dS)
Nr;rI�r�r�r�rWrrr]rg�r�rvr�r�r�rrAr�r7r7r8�test_static_headRs�zStaticFileTest.test_static_headcCsf|jddddid�}|�|jd�|�|jd�|�|jdd	�|�t|jd
�d|jd�dS)Nr;rIri�	bytes=1-4)r�r�rjr�rWr�r]rgr�r�r7r7r8�test_static_head_range\s
��z%StaticFileTest.test_static_head_rangecCsn|jddd|jdd�d�}|�|jd�|�|jd�|�d|jv�|�t|jd	�d|jd�dS)
Nr;r�rg)rir\r�rVr�rWr])rSrArvr�r�r�r�rr�r7r7r8�test_static_range_if_none_matchgs���z.StaticFileTest.test_static_range_if_none_matchcCr�)Nz
/static/blarg�rbr�r7r7r8�test_static_404vr�zStaticFileTest.test_static_404cCsX|j��t�|_ttd��
|�d�}Wd�n1swY|�|jd�dS)Nz.*not in root static directoryz/static/../static_foo.txt�)�http_clientrMrrrrSrvr�r�r7r7r8�test_path_traversal_protectionzs
�z-StaticFileTest.test_path_traversal_protection�posixznon-posix OScCsFtj�tj�tj�t��d�}|�dtj�	|��}|�
|jd�dS)NrEz/root_staticr�)r1r2r3r4�abspathr5rSr�r�r�rvr�)r@r2r�r7r7r8�test_root_static_path�s
�z$StaticFileTest.test_root_static_pathN)0rGrHrIrAr1r2r3r4r5rtr<r=r<r?r@rBrCrDrFrHrGrSr[r_r`rcrfrhrmrzr{r~r�r�r�r�r�r�r�r�r�r�r�r��unittest�skipIfrer�r7r7r7r8r#2sP�%	
	



r#c@r<)
�StaticDefaultFilenameTestcC�ttd�tdd�d�S�Nr$�
index.html��default_filename)r7�static_handler_argsr8r?r7r7r8r=���z(StaticDefaultFilenameTest.get_app_kwargscC�gSr0r7r?r7r7r8r<�rFz&StaticDefaultFilenameTest.get_handlerscCs.|jddd�}|�|jd�|�d|j�dS)N�/static/dir/Fr0r�sthis is the index
�r�rvr�r�r�r7r7r8�test_static_default_filename�sz6StaticDefaultFilenameTest.test_static_default_filenamecCs6|jddd�}|�|jd�|�|jd�d��dS)N�/static/dirFr0r�r3r�)r�rvr�r�r��endswithr�r7r7r8�test_static_default_redirect�sz6StaticDefaultFilenameTest.test_static_default_redirectN)rGrHrIr=r<r�r�r7r7r7r8r��s
r�c@r<)
�StaticDefaultFilenameRootTestcCs ttj�td��tdd�dd�S)Nr$r�r�rL)r7r��static_url_prefix)rbr1r2r�r9r?r7r7r8r=�s
�z,StaticDefaultFilenameRootTest.get_app_kwargscCr�r0r7r?r7r7r8r<�rFz*StaticDefaultFilenameRootTest.get_handlerscC�t�Sr0rr?r7r7r8�get_http_client�sz-StaticDefaultFilenameRootTest.get_http_clientcCs�tj�t�}tj�|�\}}tjdkr|�||�n|}ttd��|j	d|�d�dd�}Wd�n1s7wY|�|j
d�dS)Nr�z/.*cannot redirect path with two initial slashesz//evil.com/../r�Fr0r�)r1r2r4r5�
splitdriverervrrr�r�)r@�test_dir�drive�tailr�r7r7r8�test_no_open_redirect�s

��z3StaticDefaultFilenameRootTest.test_no_open_redirectN)rGrHrIr=r<r�r�r7r7r7r8r��s
r�c@rj)�StaticFileWithPathTestcCr�r�r8r?r7r7r8r=�r�z%StaticFileWithPathTest.get_app_kwargscCsdtdtd�ifgS)Nz	/foo/(.*)r2z
templates/)rr9r?r7r7r8r<�r�z#StaticFileWithPathTest.get_handlerscCr�)Nz/foo/utf8.htmlsHéllo
r�r�r7r7r8�
test_serve�r�z!StaticFileWithPathTest.test_serveN)rGrHrIr=r<r�r7r7r7r8r��sr�c@r<)
�CustomStaticFileTestcCs0Gdd�dt�}Gdd�dt�}||_d|fgS)Nc@s^eZdZedd��Zdd�Zedd��Zdd�Zedd
d��Zdd
�Z	dd�Z
edd��Zd	S)z>CustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandlercSs@|�||�}|�d�}|d|�}||dd�}d|||fS)N�.roz/static/%s.%s.%s)�get_version�rindex)�clsr^r2�version_hash�extension_index�before_version�
after_versionr7r7r8�make_static_url�s
�zNCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.make_static_urlcSs4|�d�}|�dd|�}d|d|�||d�fS)Nr�rz%s%s)r�)r@�url_pathr��
version_indexr7r7r8�parse_url_path�s
zMCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.parse_url_pathcSsd|S)NzCustomStaticFileTest:r7�r�r^r2r7r7r8�get_absolute_path�szPCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_absolute_pathcSs|Sr0r7)r@�root�
absolute_pathr7r7r8�validate_absolute_path�rFzUCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.validate_absolute_pathNcSs,|dur|dus
J�|dkrdStd|��)N�CustomStaticFileTest:foo.txtrn�unexpected path %rr)r@r2�start�endr7r7r8�get_content�szJCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_contentcSs|jdkrdStd|j��)Nr�rr�)r�rXr?r7r7r8�get_content_size�s
zOCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_content_sizecS�dSr0r7r?r7r7r8�get_modified_timerFzPCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_modified_timecS�dS)N�42r7r�r7r7r8r��zJCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_version�NN)rGrHrI�classmethodr�r�r�r�r�r�r�r�r7r7r7r8�MyStaticFileHandler�s

r�c@rP)z;CustomStaticFileTest.get_handlers.<locals>.StaticUrlHandlercSs|�|�|��dSr0)rVr&r�r7r7r8rWr�z?CustomStaticFileTest.get_handlers.<locals>.StaticUrlHandler.getNrYr7r7r7r8r(rZr(r6)rr�static_handler_class)r@r�r(r7r7r8r<�s,
z!CustomStaticFileTest.get_handlerscCstd|jd�S)N�dummy)r7r�)rbr�r?r7r7r8r=rXz#CustomStaticFileTest.get_app_kwargscCr�)Nz/static/foo.42.txtrnr�r�r7r7r8r�r�zCustomStaticFileTest.test_servecCsLttddd��|�d�}|�|jd�Wd�dS1swYdS)NzCould not open static fileF)�requiredz/static_url/foo.txts/static/foo.42.txt)rrr�rvr�r�r7r7r8rBs
"�z$CustomStaticFileTest.test_static_urlN)rGrHrIr<r=r�rBr7r7r7r8r��s
5r�c@�,eZdZGdd�de�Zdd�Zdd�ZdS)�HostMatchingTestc@r)zHostMatchingTest.HandlercCr$r0)�reply)r@r�r7r7r8r'"r�z#HostMatchingTest.Handler.initializecC�|�|j�dSr0)rVr�r?r7r7r8rW%r_zHostMatchingTest.Handler.getN)rGrHrIr'rWr7r7r7r8rN!rrNcCsdtjddifgS)Nr�r��wildcard)r�rNr?r7r7r8r<(r�zHostMatchingTest.get_handlerscCs<|j�ddtjddifg�|j�ddtjddifg�|j�ddtjdd	ifg�|j�d
dtjddifg�|�d�}|�|jd�|�d�}|�|jd
�|�d�}|�|jd
�|jdddid�}|�|jd�|jdddid�}|�|jd�|jdddid�}|�|jd�|jdddid�}|�|jd�dS)N�www.example.comr�r��[0]�www\.example\.com�/bar�[1]�/baz�[2]zwww.e.*e.comz[3]swildcardr��Hostr��[0]�[1]�[2]zwww.exe.coms[3])r>�add_handlersr�rNr�rvr�r�r�r7r7r8�test_host_matching+s4����


z#HostMatchingTest.test_host_matchingN)rGrHrIrrNr<r�r7r7r7r8r� sr�c@rj)�DefaultHostMatchingTestcCr�r0r7r?r7r7r8r<KrFz$DefaultHostMatchingTest.get_handlerscCsddiS)N�default_hostr�r7r?r7r7r8r=Nrz&DefaultHostMatchingTest.get_app_kwargscCs�|j�ddtjddifg�|j�ddtjddifg�|j�dd	tjdd
ifg�|�d�}|�|jd�|�d�}|�|jd�|�d	�}|�|jd
�|jdddid�}|�|jd
�d|j_|�d	�}|�|jd�dS)Nr�r�r�r�r�r�r�zwww.test.comr�r�r�r�r�z	X-Real-Ipr>r�r�)	r>r�r�rNr�rvr�r�r�r�r7r7r8�test_default_host_matchingQs(���



z2DefaultHostMatchingTest.test_default_host_matchingN)rGrHrIr<r=r�r7r7r7r8r�Jsr�c@r)�NamedURLSpecGroupsTestcCs Gdd�dt�}d|fd|fgS)Nc@rP)z8NamedURLSpecGroupsTest.get_handlers.<locals>.EchoHandlercS�|�|�dSr0rUr�r7r7r8rWorXz<NamedURLSpecGroupsTest.get_handlers.<locals>.EchoHandler.getNrYr7r7r7r8rQnrZrQz/str/(?P<path>.*)z/unicode/(?P<path>.*)r�)r@rQr7r7r8r<ms�z#NamedURLSpecGroupsTest.get_handlerscCs4|�d�}|�|jd�|�d�}|�|jd�dS)Nz/str/foosfooz/unicode/barrnr�r�r7r7r8�test_named_urlspec_groupsws

z0NamedURLSpecGroupsTest.test_named_urlspec_groupsN)rGrHrIr<r�r7r7r7r8r�ls
r�c@�$eZdZGdd�de�Zdd�ZdS)�ClearHeaderTestc@rP)zClearHeaderTest.HandlercCs0|�dd�|�dd�|�d�|�d�dS)N�h1rm�h2r��nonexistent)r��clear_headerr?r7r7r8rW�s
zClearHeaderTest.Handler.getNrYr7r7r7r8rN�rZrNcCs0|�d�}|�d|jv�|�|jdd�dS)NrLr�r�r�)r�r�r�rvr�r7r7r8�test_clear_header�s
z!ClearHeaderTest.test_clear_headerN)rGrHrIrrNr�r7r7r7r8r��r�c@r�)�
Header204Testc@rP)zHeader204Test.HandlercCs|�d�|��dS)N��)�
set_statusr�r?r7r7r8rW�rPzHeader204Test.Handler.getNrYr7r7r7r8rN�rZrNcCs8|�d�}|�|jd�|�d|j�|�d|j�dS)NrLr�rW�Transfer-Encoding)r�rvr�rr�r�r7r7r8�test_204_headers��
zHeader204Test.test_204_headersN)rGrHrIrrNrr7r7r7r8r���r�c@r�)�
Header304Testc@rP)zHeader304Test.HandlercCs|�dd�|�d�dS)N�Content-Language�en_USrT)r�rVr?r7r7r8rW�szHeader304Test.Handler.getNrYr7r7r7r8rN�rZrNcCs�|�d�}|�|jdd�|�|jdd�|jdd|jdid�}|�|jd	�|�d|jv�|�d|jv�|�d
|jv�dS)NrLrW�5rrr\r]r�rVr)r�rvr�r�r�rXr7r7r8�test_304_headers�s
�zHeader304Test.test_304_headersN)rGrHrIrrNrr7r7r7r8r�rrc@r�)�StatusReasonTestc@rP)zStatusReasonTest.HandlercCs<|jj�dg�}|jt|�d��|rt|d�ndd�dS)N�reasonr�r�r
)rUrVrWr�rxryr)r@r
r7r7r8rW�s

�zStatusReasonTest.Handler.getNrYr7r7r7r8rN�rZrNcCr�r0rr?r7r7r8r���z StatusReasonTest.get_http_clientcCs�|�d�}|�|jd�|�|jd�|�d�}|�|jd�|�|jd�|�d�}|�|jd�|�|jd�|�d	�}|�|jd�|�|jd
�dS)Nz
/?code=304rVzNot Modifiedz/?code=304&reason=Foo�Fooz/?code=682&reason=Bar��Barz
/?code=682�Unknown)r�rvr�r
r�r7r7r8�test_status�s



zStatusReasonTest.test_statusN)rGrHrIrrNr�rr7r7r7r8r	�sr	c@r�)�DateHeaderTestc@rP)zDateHeaderTest.HandlercCrRrSrUr?r7r7r8rW�rXzDateHeaderTest.Handler.getNrYr7r7r7r8rN�rZrNcCsF|�d�}tj�|jd�}|�|tj�tjj	�tj
dd�k�dS)NrL�Dater|)�seconds)r�rrrr�r�rrrrr)r@r��header_dater7r7r8�test_date_header�s

��zDateHeaderTest.test_date_headerN)rGrHrIrrNrr7r7r7r8r�src@s<eZdZGdd�de�Zdd�Zdd�Zdd�Zd	d
�ZdS)�RaiseWithReasonTestc@rP)zRaiseWithReasonTest.HandlercCstddd��)Nrr
r�r r?r7r7r8rW�rOzRaiseWithReasonTest.Handler.getNrYr7r7r7r8rN�rZrNcCr�r0rr?r7r7r8r��rz#RaiseWithReasonTest.get_http_clientcCs8|�d�}|�|jd�|�|jd�|�d|j�dS)NrLrr
s682: Foo)r�rvr�r
r>r�r�r7r7r8�test_raise_with_reason�rz*RaiseWithReasonTest.test_raise_with_reasoncCs|�ttddd��d�dS)Nrr
rz
HTTP 682: Foo�rvr�r r?r7r7r8�test_httperror_str�r:z&RaiseWithReasonTest.test_httperror_strcCs|�ttd��d�dS)NrzHTTP 682: Unknownrr?r7r7r8� test_httperror_str_from_httputil�sz4RaiseWithReasonTest.test_httperror_str_from_httputilN)	rGrHrIrrNr�rrrr7r7r7r8r�src@r<)
�ErrorHandlerXSRFTestcCsdttdd�fgS)N�/error��r)r"rbr?r7r7r8r<�sz!ErrorHandlerXSRFTest.get_handlerscCr��NT)�xsrf_cookiesr�r?r7r7r8r=�r�z#ErrorHandlerXSRFTest.get_app_kwargscC�"|jdddd�}|�|jd�dS)Nrr�r�r�rr�r�r7r7r8�test_error_xsrf��z$ErrorHandlerXSRFTest.test_error_xsrfcCr#)Nz/404r�r�r�r�r�r�r7r7r8�
test_404_xsrf�r%z"ErrorHandlerXSRFTest.test_404_xsrfN)rGrHrIr<r=r$r&r7r7r7r8r�s
rc@sTeZdZGdd�de�Zdd�Zdd�Zdd�Zd	d
�Zdd�Z	d
d�Z
dd�ZdS)�GzipTestCasec@rP)zGzipTestCase.HandlercCs4|�d�D]}|�d|�q|�ddtj�dS)N�varyr�zhello world�!)rYr�rVr.�
MIN_LENGTH)r@�vr7r7r8rWszGzipTestCase.Handler.getNrYr7r7r7r8rNrZrNcCstdtj�tj�t�d�d�S)NTr$)r�r7)rbr1r2r3r4r5r?r7r7r8r=
s�zGzipTestCase.get_app_kwargscCs"|�|j�d|j�d��d�dS)Nr�zX-Consumed-Content-Encodingr�)rvr�rWr�r7r7r8�assert_compresseds��zGzipTestCase.assert_compressedcC�*|�d�}|�|�|�|jdd�dS)NrLr�r��r�r,rvr�r�r7r7r8�	test_gzips

zGzipTestCase.test_gzipcCr-)Nr9r�r�r.r�r7r7r8�test_gzip_statics

zGzipTestCase.test_gzip_staticcCs2|jddd�}|�d|j�|�|jdd�dS)NrLF)�use_gzipr�r�r�)r�rr�rvr�r7r7r8�test_gzip_not_requested%r�z$GzipTestCase.test_gzip_not_requestedcCs>|�d�}|�|�|�dd�|jd�d�D�ddg�dS)Nz/?vary=Accept-LanguagecS�g|]}|���qSr7��strip��.0rKr7r7r8�
<listcomp>.�z:GzipTestCase.test_vary_already_present.<locals>.<listcomp>r��,�Accept-Languager��r�r,rvr��splitr�r7r7r8�test_vary_already_present*s

�z&GzipTestCase.test_vary_already_presentcCs>|�d�}|�|�|�dd�|jd�d�D�gd��dS)Nz"/?vary=Accept-Language&vary=CookiecSr3r7r4r6r7r7r8r87r9zCGzipTestCase.test_vary_already_present_multiple.<locals>.<listcomp>r�r:)r;r�r�r<r�r7r7r8�"test_vary_already_present_multiple2s

�z/GzipTestCase.test_vary_already_present_multipleN)rGrHrIrrNr=r,r/r0r2r>r?r7r7r7r8r's
r'c@�4eZdZGdd�de�Zdd�Zdd�Zdd�Zd	S)
�PathArgsInPrepareTestc@r)zPathArgsInPrepareTest.HandlercCs|�t|j|jd��dS)N�rTr�)rVrbrS�path_kwargsr?r7r7r8r>sz%PathArgsInPrepareTest.Handler.preparecCs|dksJ�|��dS)Nrm�r�r�r7r7r8rWAsz!PathArgsInPrepareTest.Handler.getN�rGrHrIrrWr7r7r7r8rN=rrNcCsd|jfd|jfgS)Nz	/pos/(.*)z/kw/(?P<path>.*)rMr?r7r7r8r<Er�z"PathArgsInPrepareTest.get_handlerscCs4|�d�}|��t|j�}|�|dgid��dS)Nz/pos/foormrBr��r@r�rr7r7r8�test_posHs

zPathArgsInPrepareTest.test_poscCs6|�d�}|��t|j�}|�|gddid��dS)Nz/kw/foor2rmrBr�rFr7r7r8�test_kwNs

zPathArgsInPrepareTest.test_kwN)rGrHrIrrNr<rGrHr7r7r7r8rA<s
rAc@r�)�ClearAllCookiesTestc@rP)zClearAllCookiesTest.HandlercCs|��|�d�dS�N�ok)�clear_all_cookiesrVr?r7r7r8rWWszClearAllCookiesTest.Handler.getNrYr7r7r7r8rNVrZrNcCsj|jdddid�}t|j�d��}|�|d�d�p |d�d��|�|d	�d
�p1|d	�d��dS)NrLr�zfoo=bar; baz=xyzzyr�r�rzbaz=;zbaz="";rozfoo=;zfoo="";)r�r�r�r�r�rM)r@r��set_cookiesr7r7r8�test_clear_all_cookies[s��z*ClearAllCookiesTest.test_clear_all_cookiesN)rGrHrIrrNrNr7r7r7r8rIUrrIc@�eZdZdS)�PermissionErrorN�rGrHrIr7r7r7r8rPg�rPc@r@)
�ExceptionHandlerTestc@rj)zExceptionHandlerTest.HandlercCsD|�d�}|dkrtdd��|dkrdddS|dkr td	��dS)
N�exc�http�zno longer here�zeroror�
permissionznot allowed)ryr rP)r@rTr7r7r8rWms

�z ExceptionHandlerTest.Handler.getcKsPd|vr|d\}}}t|t�r|�d�|�d�dStj||fi|��dS)Nrr�rP)�
isinstancerPr�rVrr)r@rr��typrg�tbr7r7r8rvs


z(ExceptionHandlerTest.Handler.write_errorcCs4t|t�rt�d|jd�dSt�||||�dS)Nz&custom logging for PermissionError: %sr)rYrPr�warningrTr�
log_exception�r@rZrgr[r7r7r8r]s
z*ExceptionHandlerTest.Handler.log_exceptionN)rGrHrIrWrr]r7r7r7r8rNls		rNcC�Httd��|�d�}|�|jd�Wd�dS1swYdS)Nz.*no longer herez
/?exc=httprVr�r�r7r7r8�test_http_error��
"�z$ExceptionHandlerTest.test_http_errorcCr_)Nrz
/?exc=zeror*�rrr�rvr�r�r7r7r8�test_unknown_error�s
"�z'ExceptionHandlerTest.test_unknown_errorcCr_)Nz/custom logging for PermissionError: not allowedz/?exc=permissionr�rbr�r7r7r8�test_known_error�raz%ExceptionHandlerTest.test_known_errorN)rGrHrIrrNr`rcrdr7r7r7r8rSks
rSc@r�)�BuggyLoggingTestc@r)zBuggyLoggingTest.HandlercCrrr7r?r7r7r8rW�rOzBuggyLoggingTest.Handler.getcCrrr7r^r7r7r8r]�rOz&BuggyLoggingTest.Handler.log_exceptionN)rGrHrIrWr]r7r7r7r8rN�rrNcCrh)Nz.*rL)rrr�r?r7r7r8�test_buggy_log_exception�rjz)BuggyLoggingTest.test_buggy_log_exceptionN)rGrHrIrrNrfr7r7r7r8re�r�recs@eZdZdZGdd�de�Zdd�Z�fdd�Zdd	�Z�Z	S)
�UIMethodUIModuleTestz`Test that UI methods and modules are created correctly and
    associated with the handler.
    c@r)zUIMethodUIModuleTest.HandlercCrRr�r�r?r7r7r8rW�rXz UIMethodUIModuleTest.Handler.getcCs
|�d�S)Nrg)ryr?r7r7r8rg�r�z"UIMethodUIModuleTest.Handler.valueN)rGrHrIrWrgr7r7r7r8rN�rrNcCs:dd�}Gdd�dt�}tddi�}t|d|id|id�S)	NcSsd||��fS)Nz*In my_ui_method(%s) with handler value %s.)rg)ry�xr7r7r8�my_ui_method�r_z9UIMethodUIModuleTest.get_app_kwargs.<locals>.my_ui_methodc@rP)z5UIMethodUIModuleTest.get_app_kwargs.<locals>.MyModulecSsd|t�tj|j���fS)Nz&In MyModule(%s) with handler value %s.)�typing�castrgrNryrg)r@rhr7r7r8r��s�z<UIMethodUIModuleTest.get_app_kwargs.<locals>.MyModule.renderN�rGrHrIr�r7r7r7r8�MyModule�rZrmr�z1{{ my_ui_method(42) }} {% module MyModule(123) %}ri)r��
ui_methods�
ui_modules�r)rrb)r@rirmr�r7r7r8r=�s��z#UIMethodUIModuleTest.get_app_kwargscr�r0r�r?r�r7r8r��s
zUIMethodUIModuleTest.tearDowncCr�)Nz/?value=asdfsVIn my_ui_method(42) with handler value asdf. In MyModule(123) with handler value asdf.r�r�r7r7r8�test_ui_method�r�z#UIMethodUIModuleTest.test_ui_method)
rGrHrIrJrrNr=r�rqrr7r7r�r8rg�srgc@r�)�GetArgumentErrorTestc@rP)zGetArgumentErrorTest.Handlerc
CsVz
|�d�|�i�WdSty*}z|�|j|jd��WYd}~dSd}~ww)Nrm��arg_name�log_message)ryrVr!rtrur�r7r7r8rW�s
"��z GetArgumentErrorTest.Handler.getNrYr7r7r7r8rN�rZrNcCs&|�d�}|�t|j�ddd��dS)NrLrmzMissing argument foors)r�rvrr�r�r7r7r8�test_catch_error�s

�z%GetArgumentErrorTest.test_catch_errorN)rGrHrIrrNrvr7r7r7r8rr��rrc@r�)�SetLazyPropertiesTestc@r<)
zSetLazyPropertiesTest.HandlercCsd|_t�d�|_dS)N�Benr)�current_userr
rWr?r7r7r8r�sz%SetLazyPropertiesTest.Handler.preparecCrBr0rCr?r7r7r8�get_user_locale�rEz-SetLazyPropertiesTest.Handler.get_user_localecCrBr0rCr?r7r7r8�get_current_user�rEz.SetLazyPropertiesTest.Handler.get_current_usercCs|�d|j|jjf�dS)Nz
Hello %s (%s))rVrzr
r�r?r7r7r8rW�r:z!SetLazyPropertiesTest.Handler.getN)rGrHrIrr{r|rWr7r7r7r8rN�s
rNcCr�)NrLsHello Ben (en_US)r�r�r7r7r8�test_set_properties��
z)SetLazyPropertiesTest.test_set_propertiesN)rGrHrIrrNr}r7r7r7r8rx��rxcsVeZdZdd�Z�fdd�Zdd�Ze�d�dd	��Zd
d�Z	dd
�Z
dd�Z�ZS)�GetCurrentUserTestcCsDGdd�dt�}Gdd�dt�}tddddd	��}t|||d
�d�S)Nc@rP)z<GetCurrentUserTest.get_app_kwargs.<locals>.WithoutUserModulecSr�)Nr�r7r?r7r7r8r�rFzCGetCurrentUserTest.get_app_kwargs.<locals>.WithoutUserModule.renderNrlr7r7r7r8�WithoutUserModulerZr�c@rP)z9GetCurrentUserTest.get_app_kwargs.<locals>.WithUserModulecSs
t|j�Sr0)r�rzr?r7r7r8r�r�z@GetCurrentUserTest.get_app_kwargs.<locals>.WithUserModule.renderNrlr7r7r7r8�WithUserModulerZr�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�rorp)r@r�r�r�r7r7r8r=�s����z!GetCurrentUserTest.get_app_kwargscr�r0r�r?r�r7r8r�rNzGetCurrentUserTest.tearDowncCs|Gdd�dt�}Gdd�d|�}Gdd�d|�}Gdd�d|�}Gd	d
�d
|�}Gdd�d|�}d
|fd|fd|fd|fgS)Nc@r)z;GetCurrentUserTest.get_handlers.<locals>.CurrentUserHandlercSs
d|_dS)NF��has_loaded_current_userr?r7r7r8rr�zCGetCurrentUserTest.get_handlers.<locals>.CurrentUserHandler.preparecSs
d|_dS)NTr�r�r?r7r7r8r|!szLGetCurrentUserTest.get_handlers.<locals>.CurrentUserHandler.get_current_userN)rGrHrIrr|r7r7r7r8�CurrentUserHandlerrr�c@rP)z;GetCurrentUserTest.get_handlers.<locals>.WithoutUserHandlercS�|�d�|�t|j��dS)Nr���
render_stringr�r�r�r?r7r7r8rW&�
z?GetCurrentUserTest.get_handlers.<locals>.WithoutUserHandler.getNrYr7r7r7r8�WithoutUserHandler%rZr�c@rP)z8GetCurrentUserTest.get_handlers.<locals>.WithUserHandlercSr�)Nr�r�r?r7r7r8rW+r�z<GetCurrentUserTest.get_handlers.<locals>.WithUserHandler.getNrYr7r7r7r8�WithUserHandler*rZr�c@rP)zAGetCurrentUserTest.get_handlers.<locals>.CurrentUserModuleHandlercSr(r0)�uir?r7r7r8�get_template_namespace0szXGetCurrentUserTest.get_handlers.<locals>.CurrentUserModuleHandler.get_template_namespaceN)rGrHrIr�r7r7r7r8�CurrentUserModuleHandler/rZr�c@rP)zAGetCurrentUserTest.get_handlers.<locals>.WithoutUserModuleHandlercSr�)Nr�r�r?r7r7r8rW7r�zEGetCurrentUserTest.get_handlers.<locals>.WithoutUserModuleHandler.getNrYr7r7r7r8�WithoutUserModuleHandler6rZr�c@rP)z>GetCurrentUserTest.get_handlers.<locals>.WithUserModuleHandlercSr�)Nr�r�r?r7r7r8rW<r�zBGetCurrentUserTest.get_handlers.<locals>.WithUserModuleHandler.getNrYr7r7r7r8�WithUserModuleHandler;rZr��
/without_user�
/with_user�/without_user_module�/with_user_moduler�)r@r�r�r�r�r�r�r7r7r8r<s�zGetCurrentUserTest.get_handlersz	needs fixcCr�)Nr��Falser�r�r7r7r8�test_get_current_user_is_lazyGr~z0GetCurrentUserTest.test_get_current_user_is_lazycCr�)Nr��Truer�r�r7r7r8�test_get_current_user_worksMr�z.GetCurrentUserTest.test_get_current_user_workscCr�)Nr�r�r�r�r7r7r8�,test_get_current_user_from_ui_module_is_lazyQr�z?GetCurrentUserTest.test_get_current_user_from_ui_module_is_lazycCr�)Nr�r�r�r�r7r7r8�*test_get_current_user_from_ui_module_worksUr�z=GetCurrentUserTest.test_get_current_user_from_ui_module_works)
rGrHrIr=r�r<r��skipr�r�r�r�rr7r7r�r8r��s+
r�c@r�)�UnimplementedHTTPMethodsTestc@rO)z$UnimplementedHTTPMethodsTest.HandlerNrQr7r7r7r8rN[rRrNcCsRdD]}|jd|d�}|�|jd�qdD]}|jd|dd�}|�|jd�qdS)N)rIrJ�DELETE�OPTIONSrLr���r��PUTr�r�r�)r@r�r�r7r7r8�#test_unimplemented_standard_methods^s�z@UnimplementedHTTPMethodsTest.test_unimplemented_standard_methodsN)rGrHrIrrNr�r7r7r7r8r�Zsr�c@r�)�#UnimplementedNonStandardMethodsTestc@rP)z+UnimplementedNonStandardMethodsTest.HandlercCrR�N�otherrUr?r7r7r8r�ir,z1UnimplementedNonStandardMethodsTest.Handler.otherN)rGrHrIr�r7r7r7r8rNhrZrNcCr#)NrL�PATCHr�r�r�r�r�r7r7r8�test_unimplemented_patchnsz<UnimplementedNonStandardMethodsTest.test_unimplemented_patchcCr#)NrL�OTHERT�r��allow_nonstandard_methodsr�r�r�r7r7r8�test_unimplemented_othertr%z<UnimplementedNonStandardMethodsTest.test_unimplemented_otherN)rGrHrIrrNr�r�r7r7r7r8r�gsr�c@r�)�AllHTTPMethodsTestc@s(eZdZdd�ZeZZZZZdS)zAllHTTPMethodsTest.HandlercCs"|jjdusJ�|�|jj�dSr0)rUr�rVr?r7r7r8r�{r%z!AllHTTPMethodsTest.Handler.methodN)	rGrHrIr�rW�delete�optionsr��putr7r7r7r8rNzsrNcCsv|jddd�}|�|jd�dD]}|jd|d�}|�|jt|��qdD]}|jd|dd�}|�|jt|��q%dS)NrLrIr�r�)rJr�r�r�r�)r�rvr�r)r@r�r�r7r7r8�test_standard_methods�s�z(AllHTTPMethodsTest.test_standard_methodsN)rGrHrIrrNr�r7r7r7r8r�yr�r�c@r�)�PatchMethodTestc@s&eZdZejdZdd�Zdd�ZdS)zPatchMethodTest.Handler)r�cCrR)N�patchrUr?r7r7r8r��rXzPatchMethodTest.Handler.patchcCrRr�rUr?r7r7r8r��rXzPatchMethodTest.Handler.otherN)rGrHrIr�SUPPORTED_METHODSr�r�r7r7r7r8rN�s
rNcCr#)NrLr�r�r�spatchr�r�r7r7r8�
test_patch�r%zPatchMethodTest.test_patchcCr#)NrLr�Tr�sotherr�r�r7r7r8�
test_other�r%zPatchMethodTest.test_otherN)rGrHrIrrNr�r�r7r7r7r8r��sr�c@r�)�FinishInPrepareTestc@r)zFinishInPrepareTest.HandlercCrR)Nr�rDr?r7r7r8r�rXz#FinishInPrepareTest.Handler.preparecCr)Nzshould not reach this methodrr?r7r7r8rW�szFinishInPrepareTest.Handler.getNrEr7r7r7r8rN�rrNcCr�)NrLsdoner�r�r7r7r8�test_finish_in_prepare�r�z*FinishInPrepareTest.test_finish_in_prepareN)rGrHrIrrNr�r7r7r7r8r���
r�c@r)�Default404TestcCr�Nr�r�r?r7r7r8r<�s
zDefault404Test.get_handlerscC�*|�d�}|�|jd�|�|jd�dS)NrLr�sE<html><title>404: Not Found</title><body>404: Not Found</body></html>r�r�r7r7r8�test_404�s
�zDefault404Test.test_404N)rGrHrIr<r�r7r7r7r8r��sr�c@rj)�
Custom404TestcCrr�r�r?r7r7r8r<�r�zCustom404Test.get_handlerscCsGdd�dt�}t|d�S)Nc@rP)z6Custom404Test.get_app_kwargs.<locals>.Custom404HandlercSs|�d�|�d�dS)Nr�zcustom 404 response)r�rVr?r7r7r8rW�rNz:Custom404Test.get_app_kwargs.<locals>.Custom404Handler.getNrYr7r7r7r8�Custom404Handler�rZr�)�default_handler_class)rrb)r@r�r7r7r8r=�s
zCustom404Test.get_app_kwargscCr�)NrLr�scustom 404 responser�r�r7r7r8r��s
zCustom404Test.test_404N)rGrHrIr<r=r�r7r7r7r8r��sr�c@rj)�DefaultHandlerArgumentsTestcCrr�r�r?r7r7r8r<�r�z(DefaultHandlerArgumentsTest.get_handlerscCstttdd�d�S)Nr�r )r��default_handler_args)rbr"r?r7r7r8r=�s�z*DefaultHandlerArgumentsTest.get_app_kwargscCr�)NrLr�r�r�r7r7r8�test_403�r�z$DefaultHandlerArgumentsTest.test_403N)rGrHrIr<r=r�r7r7r7r8r��sr�c@r)�HandlerByNameTestcCsdtfdtdd�gS)N�/hello1)�/hello2�"tornado.test.web_test.HelloHandler�/hello3r�)rQr$r?r7r7r8r<�s�zHandlerByNameTest.get_handlerscCsL|�d�}|�|jd�|�d�}|�|jd�|�d�}|�|jd�dS)Nr�r�r�r�r��r@�respr7r7r8�test_handler_by_name�s


z&HandlerByNameTest.test_handler_by_nameN)rGrHrIr<r�r7r7r7r8r��sr�c@sLeZdZdd�Zdd�Zedd��Zedd��Zed	d
��Zedd��Z	d
S)�StreamingRequestBodyTestcCsbtGdd�dt��}tGdd�dt��}tGdd�dt��}d|t|d�fd	|fd
|t|d�fgS)Nc@r<)
zCStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandlercSr$r0r�r7r7r7r8r'�r�zNStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.initializecSs|jj�d�dSr0)r��prepared�
set_resultr?r7r7r8r�r�zKStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.preparecSs|jj�|�dSr0)r�rr��r@rr7r7r8�
data_received�r�zQStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.data_receivedcSs|jj�d�|�i�dSr0)r��finishedr�rVr?r7r7r8rW	szGStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.getN)rGrHrIr'rr�rWr7r7r7r8�StreamingBodyHandler�s
r�c@rP)zAStreamingRequestBodyTest.get_handlers.<locals>.EarlyReturnHandlercSr)N�rr?r7r7r8r	szIStreamingRequestBodyTest.get_handlers.<locals>.EarlyReturnHandler.prepareNr�r7r7r7r8�EarlyReturnHandler	sr�cs$eZdZdd�Z�fdd�Z�ZS)zDStreamingRequestBodyTest.get_handlers.<locals>.CloseDetectionHandlercSr$r0r�r7r7r7r8r'
	r�zOStreamingRequestBodyTest.get_handlers.<locals>.CloseDetectionHandler.initializecst���|jj�d�dSr0)r�r;r��close_futurer�r?r�r7r8r;	r�zXStreamingRequestBodyTest.get_handlers.<locals>.CloseDetectionHandler.on_connection_close)rGrHrIr'r;rr7r7r�r8�CloseDetectionHandler	sr�z/stream_bodyr�z
/early_returnz/close_detection)r+rrb)r@r�r�r�r7r7r8r<�s	�z%StreamingRequestBodyTest.get_handlerscCsZt�tjtjd�}|�d|��f�t|�}|�d|d�|r&|�d�|�d�|S)Nrr>sGET s HTTP/1.1
sConnection: close
sTransfer-Encoding: chunked

)rBrCrDrErFrrV)r@r$�connection_closerKrGr7r7r8rE	s

z StreamingRequestBodyTest.connectccs��t�|_t�|_t�|_|jddd�}|jV|�d�|jV}|�|d�t�|_|�d�|jV}|�|d�|�d�|jV|��V}|�|�	d	��|�
�dS)
Ns/stream_bodyT�r��	4
asdf
sasdfs	4
qwer
sqwers0

s{})rr�rr�rErVrv�read_until_closer�r�rM�r@rGrr7r7r8�test_streaming_body%	s$�



z,StreamingRequestBodyTest.test_streaming_bodyccs.�|jddd�}|��V}|�|�d��dS)N�
/early_returnFr��HTTP/1.1 401)rEr�r�rMr�r7r7r8�test_early_return<	s�
z*StreamingRequestBodyTest.test_early_returnccs8�|jddd�}|�d�|��V}|�|�d��dS)Nr�Fr�r�r�)rErVr�r�rMr�r7r7r8�test_early_return_with_dataB	s
�

z4StreamingRequestBodyTest.test_early_return_with_dataccs,�t�|_|jddd�}|��|jVdS)Ns/close_detectionFr�)rr�rErM)r@rGr7r7r8�test_close_during_uploadI	s
�z1StreamingRequestBodyTest.test_close_during_uploadN)
rGrHrIr<rErr�r�r�r�r7r7r7r8r��s&


r�c@s>eZdZdd�Zejdd��Zejdd��Z	ejdd��Z
d	S)
�BaseFlowControlHandlercCs||_d|_g|_dSr0)r�r��methodsr7r7r7r8r'W	s
z!BaseFlowControlHandler.initializeccsP�|jdur|j�d||jf�||_|j�|�z	dVWd|_dSd|_w)Nzentered method %s while in %s)r�r��failr��appendr�r7r7r8�	in_method\	s�
z BaseFlowControlHandler.in_methodccs�|j�d�tjVdS)Nr)r�r�r�momentr?r7r7r8rg	s�zBaseFlowControlHandler.prepareccsJ�|�d��tjVWd�n1swY|�t|jd��dS)Nr��r�)r�rr�rVrbr�r?r7r7r8r�n	s
�
�zBaseFlowControlHandler.postN)rGrHrIr'�
contextlib�contextmanagerr�rr�rr�r7r7r7r8r�U	s


r�c@sLeZdZdd�Zdd�Zdejfdd�Zdejfdd	�Zdejfd
d�Z	dS)
�#BaseStreamingRequestFlowControlTestcCstddd�S)Nr�T)�
chunk_size�decompress_requestr�r?r7r7r8�get_httpserver_optionsv	sz:BaseStreamingRequestFlowControlTest.get_httpserver_optionscCr�r0rr?r7r7r8r�{	rz3BaseStreamingRequestFlowControlTest.get_http_clientr@cCs8|jdddd�}|��|�t|j�tgd�d��dS)NrL�abcdefghijklmnopqrstuvwxyzr�)r�r��rr�r�r�r�r�)r�r�rvrr�rbr�r7r7r8�test_flow_control_fixed_body�	s��z@BaseStreamingRequestFlowControlTest.test_flow_control_fixed_bodycsRgd��tj�fdd��}|jd|dd�}|��|�t|j�tgd�d��dS)	N)sabcdsefghsijklc3s��D]}||�VqdSr0r7)rV�i��chunksr7r8�
body_producer�	s��zYBaseStreamingRequestFlowControlTest.test_flow_control_chunked_body.<locals>.body_producerrLr�)r�r�r�r�)rr�r�r�rvrr�rb)r@r�r�r7r�r8�test_flow_control_chunked_body�	s��zBBaseStreamingRequestFlowControlTest.test_flow_control_chunked_bodycCslt�}tjd|d�}|�d�|��|��}|jd|dddid�}|��|�t	|j
�tgd	�d
��dS)N�w)�mode�fileobjsabcdefghijklmnopqrstuvwxyzrLr�r�r�)r�r�r�r�r�)r/r��GzipFilerVrM�getvaluer�r�rvrr�rb)r@�bytesio�	gzip_file�compressed_bodyr�r7r7r8�!test_flow_control_compressed_body�	s$
���zEBaseStreamingRequestFlowControlTest.test_flow_control_compressed_bodyN)
rGrHrIr�r�rj�Anyr�r�rr7r7r7r8r�u	sr�c@rP)�(DecoratedStreamingRequestFlowControlTestcC�"Gdd�dt�}d|t|d�fgS)Nc@r�)zZDecoratedStreamingRequestFlowControlTest.get_handlers.<locals>.DecoratedFlowControlHandlercss:�|�d��
tjVWd�dS1swYdS)Nr�)r�rr�r�r7r7r8r��	s�
"�zhDecoratedStreamingRequestFlowControlTest.get_handlers.<locals>.DecoratedFlowControlHandler.data_receivedN)rGrHrIrr�r�r7r7r7r8�DecoratedFlowControlHandler�	r�rrLr��r�rb)r@rr7r7r8r<�	sz5DecoratedStreamingRequestFlowControlTest.get_handlersN�rGrHrIr<r7r7r7r8r�	�rc@rP)�%NativeStreamingRequestFlowControlTestcCr)Nc@rP)zTNativeStreamingRequestFlowControlTest.get_handlers.<locals>.NativeFlowControlHandlerc�sJ�|�d��ddl}|�d�IdHWd�dS1swYdS)Nr�r)r��asyncior@)r@rrr7r7r8r��	s
�"�zbNativeStreamingRequestFlowControlTest.get_handlers.<locals>.NativeFlowControlHandler.data_receivedN)rGrHrIr�r7r7r7r8�NativeFlowControlHandler�	rZrrLr�r)r@rr7r7r8r<�	sz2NativeStreamingRequestFlowControlTest.get_handlersNrr7r7r7r8r
�	r	r
c@rj)�IncorrectContentLengthTestcsB|�d|_G�fdd�dt�}G�fdd�dt�}d|fd|fgS)Nc�eZdZ�fdd�ZdS)z8IncorrectContentLengthTest.get_handlers.<locals>.TooHighc
�>|�dd�z|�d�WdSty}z|�_�d}~ww)NrWr�rK�r�r�rX�server_errorr�r�r7r8rW�	���z<IncorrectContentLengthTest.get_handlers.<locals>.TooHigh.getNrYr7r�r7r8�TooHigh�	�rcr)z7IncorrectContentLengthTest.get_handlers.<locals>.TooLowc
r)NrWr�rTrr�r�r7r8rW�	rz;IncorrectContentLengthTest.get_handlers.<locals>.TooLow.getNrYr7r�r7r8�TooLow�	rr�/high�/low)rr)r@rrr7r�r8r<�	s
		z'IncorrectContentLengthTest.get_handlersc
C�ttd��9ttd��$|�t��|jddd�Wd�n1s#wYWd�n1s2wYWd�n1sAwY|�t|j�d�dS)N�*(Uncaught exception|Exception in callback)�S(Cannot send error response after headers written|Failed to flush partial response)rT��raise_errorz0Tried to write 40 bytes less than Content-Length�	rrr�assertRaisesr
r�rvr�rr?r7r7r8�test_content_length_too_high�	�������
�z7IncorrectContentLengthTest.test_content_length_too_highc
Cr)NrrrTrz,Tried to write more data than Content-Lengthrr?r7r7r8�test_content_length_too_low
r z6IncorrectContentLengthTest.test_content_length_too_lowN)rGrHrIr<rr!r7r7r7r8r
�	sr
c@r�)�ClientCloseTestc@rP)zClientCloseTest.HandlercCs8|jj�d�r|jjj��|�d�dS|�d�dS)NzHTTP/1rT�requires HTTP/1.x)rUrqrM�
connectionrGrMrVr?r7r7r8rW
szClientCloseTest.Handler.getNrYr7r7r7r8rN
rZrNcCsf|�ttjf��!|jddd�}|jdkr|�d�|�|jd�Wd�dS1s,wYdS)NrLTrsrequires HTTP/1.xr#iW)	rr
r��SkipTestr�r��skipTestrvr�r�r7r7r8�test_client_close'
s

"�z!ClientCloseTest.test_client_closeN)rGrHrIrrNr'r7r7r7r8r"
rr"c@s|eZdZdZdddd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�ZdS)�SignedValueTestzIt's a secret to everybody�	asdfbasdf�12312312�2342342)rror|cCs|��dS)Ni0*)�presentr?r7r7r8�past3
rOzSignedValueTest.pastcCr�)Nim|Mr7r?r7r7r8r,6
rFzSignedValueTest.presentcCs�ttjddd|jd�}|�|d�ttjddd|jd�}|�|d�ttjdd|jd�}|�||�ttjd|d|jd	�}|�|d
�ttjd|d|jd	�}|�|d
�dS)NrZrgro)rq�clocks<dmFsdWU=|1300000000|31c934969f53e48164c50768b40cbd7e2daaaa4fr|se2|1:0|10:1300000000|3:key|8:dmFsdWU=|3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e152�r.)rsr.�value)r&r(�SECRETr,rvr')r@�	signed_v1�	signed_v2�signed_default�
decoded_v1�
decoded_v2r7r7r8�test_known_values9
s2�������z!SignedValueTest.test_known_valuescCslttjdd|jd�}ttjdd|jd�}ttjd||jd�}|�|d�ttjd||jd�}|�|d�dS)N�key1rgr/�key2)r&r(r1r,r'�assertIs)r@�signed1�signed2�decoded1�decoded2r7r7r8�test_name_swapY
s����zSignedValueTest.test_name_swapcCsXttjdd|jd�}ttjd||jd�}|�|d�ttjd||jd�}|�|d�dS)Nr8rgr/r0)r&r(r1r-r'rvr,r:)r@�signed�decoded_past�decoded_presentr7r7r8�test_expiredj
s���zSignedValueTest.test_expiredcsNd���fdd�}��|d����|d����|d����|d��dS)N�@3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e152csdttjd|��jd�kS�Nr0rZr/�r'r(r1r,)�prefix�r@r�r7r8�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@rIr7rHr8�test_payload_tamperingw
sz&SignedValueTest.test_payload_tamperingcsjd���fdd�}��|d����|d����|d����|d����|d����|d	��dS)
NrKcsdttjd�|�jd�kSrErF)r��rGr@r7r8rI�
rJz:SignedValueTest.test_signature_tampering.<locals>.validaterD� 00000000000000000000000000000000�@4d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e152�@3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e153�?3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e15�A3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e1538rLrNr7rPr8�test_signature_tampering�
s(������z(SignedValueTest.test_signature_tamperingcCs<d}ttjd||jd�}ttjd||jd�}|�||�dS)Nr�rZr/)r&r(r1r,r'rv�r@rgr@�decodedr7r7r8�test_non_ascii�
s��zSignedValueTest.test_non_asciicC�>d}ttjd||jdd�}ttjd||jd�}|�||�dS�Nr�rZr�r.r`r/�r&r(�SECRET_DICTr,r'rvrWr7r7r8�*test_key_versioning_read_write_default_key�
���z:SignedValueTest.test_key_versioning_read_write_default_keycCrZ)Nr�rZror\r/r]rWr7r7r8�.test_key_versioning_read_write_non_default_key�
r`z>SignedValueTest.test_key_versioning_read_write_non_default_keycCsPd}ttjd||jdd�}tj��}|�d�t|d||jd�}|�d|�dSr[)r&r(r^r,r�r�r'rv)r@rgr@�newkeysrXr7r7r8�test_key_versioning_invalid_key�
s�

z/SignedValueTest.test_key_versioning_invalid_keycCs2d}ttjd||jdd�}t|�}|�d|�dS)Nr�rZror\)r&r(r^r,r(rv)r@rgr@r`r7r7r8�test_key_version_retrieval�
s�z*SignedValueTest.test_key_version_retrievalN)rGrHrIr1r^r-r,r7r?rCrOrVrYr_rarcrdr7r7r7r8r(/
s 
 



r(cs�eZdZGdd�de�Zdd�Z�fdd�Zd(dd	�Zd)d
d�Zdd
�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Z�ZS)*�XSRFTestc@r)zXSRFTest.HandlercCs*t|�dd��}||jd<|�|j�dS)Nrqr��xsrf_cookie_version)rxryr^rVrp)r@rqr7r7r8rW�
s
zXSRFTest.Handler.getcCrRrJrUr?r7r7r8r��
rXzXSRFTest.Handler.postN�rGrHrIrWr�r7r7r7r8rN�
srNcCr�r!r�r?r7r7r8r=�
r�zXSRFTest.get_app_kwargsc�t���|��|_dSr0�r��setUp�	get_tokenrpr?r�r7r8rj�
rNzXSRFTest.setUpNcCsH|dur
|�|�}nd}|j|durdnd||d�}|��t|j�S)NrLz/?version=%dr���cookie_headersr�r�rr�)r@�	old_tokenrqr�r�r7r7r8rk�
s�
zXSRFTest.get_tokencC�|dur|j}dd|iS)Nr�z_xsrf=�rp�r@�tokenr7r7r8rm�
�zXSRFTest.cookie_headerscC�Lttd��|jdddd�}Wd�n1swY|�|jd�dS�N�.*'_xsrf' argument missingrLr�r�r�r�r�r�r7r7r8�test_xsrf_fail_no_token�
��z XSRFTest.test_xsrf_fail_no_tokenc	C�\ttd��|jddtj�t|jd��d�}Wd�n1s wY|�|j	d�dS�N�!.*XSRF cookie does not match POSTrLr���_xsrfr�r��
rrr�r�r�r�rbrprvr�r�r7r7r8�test_xsrf_fail_body_no_cookie���z&XSRFTest.test_xsrf_fail_body_no_cookiec
Cs`ttd��|jdd|��tj�tdd��d�}Wd�n1s"wY|�|j	d�dS)Nz%.*'_xsrf' argument has invalid formatrLr��3|r|r�r�)
rrr�rmr�r�r�rbrvr�r�r7r7r8�&test_xsrf_fail_argument_invalid_format
s��z/XSRFTest.test_xsrf_fail_argument_invalid_formatc
Csfttd��|jdd|jdd�tj�t|jd��d�}Wd�n1s%wY|�	|j
d�dS)	Nr{rLr�r��rrr|r�r�)rrr�rmr�r�r�rbrprvr�r�r7r7r8�$test_xsrf_fail_cookie_invalid_formats
��z-XSRFTest.test_xsrf_fail_cookie_invalid_formatcCsRttd��|jddd|��d�}Wd�n1swY|�|jd�dS)NrvrLr�r��r�r�r�r�)rrr�rmrvr�r�r7r7r8�test_xsrf_fail_cookie_no_bodys��z&XSRFTest.test_xsrf_fail_cookie_no_bodycC�:|jddtj�tdd��|jdd�d�}|�|jd�dS)NrLr��deadbeefr|r�r�r��r�r�r�r�rbrmrvr�r�r7r7r8�test_xsrf_success_short_token%�
�z&XSRFTest.test_xsrf_success_short_tokencCr�)NrLr��xoxor|r�r�r�r�r�r7r7r8�test_xsrf_success_non_hex_token.r�z(XSRFTest.test_xsrf_success_non_hex_tokencC�8|jddtj�t|jd��|��d�}|�|jd�dS�NrLr�r|r�r��	r�r�r�r�rbrprmrvr�r�r7r7r8�test_xsrf_success_post_body7s�z$XSRFTest.test_xsrf_success_post_bodycCs<|jdtj�t|jd��dd|��d�}|�|jd�dS)Nz/?r|r�r�r�r�r�r�r7r7r8�test_xsrf_success_query_string@s�z'XSRFTest.test_xsrf_success_query_stringc	Cs:|jdddtd|jifi|����d�}|�|jd�dS)NrLr�r�zX-Xsrftokenr�r�)r�rbrprmrvr�r�r7r7r8�test_xsrf_success_headerIs���	z!XSRFTest.test_xsrf_success_headercCs:d}t�}t|�D]	}|�|���q	|�t|�|�dS)Nr�)rH�rangerNrkrvr)r@�
NUM_TOKENS�tokensr�r7r7r8�test_distinct_tokensUs
zXSRFTest.test_distinct_tokensc
Cs�|��}|j|fD]}|jddtj�t|d��|�|�d�}|�|j	d�q	|j|f||jffD]3\}}t
td��|jddtj�t|d��|�|�d�}Wd�n1sWwY|�|j	d�q0dS)NrLr�r|r�r�r{r�)rkrpr�r�r�r�rbrmrvr�rr)r@�token2rrr��cookie_token�
body_tokenr7r7r8�test_cross_user]s,�����zXSRFTest.test_cross_userc	Cs||j}t|g�}td�D]'}|�|�}|�|�|jddtj�t	|jd��|�
|�d�}|�|jd�q|�t
|�d�dS)N�rLr�r|r�r��)rprHr�rkrNr�r�r�r�rbrmrvr�r)r@rr�tokens_seenr�r�r7r7r8�test_refresh_tokenvs


�zXSRFTest.test_refresh_tokenc	Cs�|�|jdd�|jdd��|jdd�}td�D]
}|�|j|dd�|�q|�|�}|�||�|�||�|��||f||ffD]\}}|jddtj�t|d��|�	|�d�}|�|j
d�qBdS)	Nrorpr�rLr�r|r�r�)�assertNotEqualrkr�rvr�r�r�r�rbrmr�)r@�v1_tokenr��v2_tokenr�r�r�r7r7r8�test_versioning�s 
��zXSRFTest.test_versioningr�r0)rGrHrIrrNr=rjrkrmrwrr�r�r�r�r�r�r�r�r�r�r�r�rr7r7r�r8re�
s(

	

				recs`eZdZGdd�de�Zdd�Z�fdd�Zddd	�Zdd
d�Zdd
�Z	dd�Z
dd�Z�ZS)�XSRFCookieNameTestc@r)zXSRFCookieNameTest.HandlercCr�r0�rVrpr?r7r7r8rW�r_zXSRFCookieNameTest.Handler.getcCrRrJrUr?r7r7r8r��rXzXSRFCookieNameTest.Handler.postNrgr7r7r7r8rN�rrNcCstddddid�S)NTz__Host-xsrfr�)r"�xsrf_cookie_name�xsrf_cookie_kwargsr�r?r7r7r8r=�s
�z!XSRFCookieNameTest.get_app_kwargscrhr0rir?r�r7r8rj�rNzXSRFCookieNameTest.setUpNcCs8|dur
|�|�}nd}|jd|d�}|��t|j�S)NrLr�rl)r@rnr�r�r7r7r8rk�s
zXSRFCookieNameTest.get_tokencCro)Nr�z__Host-xsrf=rprqr7r7r8rm�rsz!XSRFCookieNameTest.cookie_headerscCrtrur�r�r7r7r8rw�rxz*XSRFCookieNameTest.test_xsrf_fail_no_tokenc	Cryrzr~r�r7r7r8r�r�z0XSRFCookieNameTest.test_xsrf_fail_body_no_cookiecCr�r�r�r�r7r7r8r��s�z.XSRFCookieNameTest.test_xsrf_success_post_bodyr0)
rGrHrIrrNr=rjrkrmrwrr�rr7r7r�r8r��s

		r�c@r�)�XSRFCookieKwargsTestc@rP)zXSRFCookieKwargsTest.HandlercCr�r0r�r?r7r7r8rW�r_z XSRFCookieKwargsTest.Handler.getNrYr7r7r7r8rN�rZrNcCstdtddd�d�S)NTr|)r�rh)r"r�r�r?r7r7r8r=�s�z#XSRFCookieKwargsTest.get_app_kwargscCs�|�d�}|�d|jd���|�d|jd���|j�d�}|dus'J�t�d|�}|dus3J�tj�tj	j
�tjdd�}tj
�|��d�}|jdurX|jtj	j
d	�}|�t||���d
k�dS)NrLz	httponly;r�zexpires=z.*; expires=(?P<expires>.+);.*r|rr)�tzinfor�)r�r>r�r rWr�r�rrrrrrrrrr��replacer�rrrr7r7r8�test_xsrf_httponly�s
�
z'XSRFCookieKwargsTest.test_xsrf_httponlyN)rGrHrIrrNr=r�r7r7r7r8r��sr�c@r�)�FinishExceptionTestc@rP)zFinishExceptionTest.HandlercCs:|�d�|�dd�|�dd�rtd��|�d�t��)Nr��WWW-Authenticate�Basic realm="something"�finish_valuer�zauthentication required)r�r�ryr*rVr?r7r7r8rW�s

zFinishExceptionTest.Handler.getNrYr7r7r7r8rN�rZrNcCsHdD]}|�|�}|�|jd�|�d|j�d��|�d|j�qdS)N)rLz/?finish_value=1r�r�r�sauthentication required)r�rvr�r�rWr�)r@�ur�r7r7r8�test_finish_exceptions
��z)FinishExceptionTest.test_finish_exceptionN)rGrHrIrrNr�r7r7r7r8r��r�r�c@rj)�
DecoratorTestcCs0Gdd�dt�}Gdd�dt�}d|fd|fgS)Nc@�eZdZedd��ZdS)z6DecoratorTest.get_handlers.<locals>.RemoveSlashHandlercSr�r0r7r?r7r7r8rWr�z:DecoratorTest.get_handlers.<locals>.RemoveSlashHandler.getN)rGrHrIr,rWr7r7r7r8�RemoveSlashHandler�r�c@r�)z3DecoratorTest.get_handlers.<locals>.AddSlashHandlercSr�r0r7r?r7r7r8rWr�z7DecoratorTest.get_handlers.<locals>.AddSlashHandler.getN)rGrHrIr-rWr7r7r7r8�AddSlashHandlerr�r��
/removeslash/�	/addslashr�)r@r�r�r7r7r8r<szDecoratorTest.get_handlerscC�`|jddd�}|�|jd�|�|jdd�|jddd�}|�|jd�|�|jdd�dS)	Nr�Fr0r�r3z/removeslashz/removeslash/?foo=barz/removeslash?foo=barr�r�r7r7r8�test_removeslash�zDecoratorTest.test_removeslashcCr�)	Nr�Fr0r�r3z
/addslash/z/addslash?foo=barz/addslash/?foo=barr�r�r7r7r8�
test_addslash'r�zDecoratorTest.test_addslashN)rGrHrIr<r�r�r7r7r7r8r�s
	r�c@sdeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dS)�	CacheTestcCsGdd�dt�}d|fgS)Nc@r)z+CacheTest.get_handlers.<locals>.EtagHandlercSr�r0rU)r@�
computed_etagr7r7r8rW4rXz/CacheTest.get_handlers.<locals>.EtagHandler.getcSs
|jdSr?)�
_write_bufferr?r7r7r8�compute_etag7r�z8CacheTest.get_handlers.<locals>.EtagHandler.compute_etagN)rGrHrIrWr�r7r7r7r8�EtagHandler3rr�z
/etag/(.*)r�)r@r�r7r7r8r<2s
zCacheTest.get_handlerscC�d}d}|�||d�dS)N�"xyzzy"�*rV��
_test_etag�r@r��etagsr7r7r8�test_wildcard_etag<�zCacheTest.test_wildcard_etagcCsd}d}|�||d�dS)Nr�rVr�r�r7r7r8�test_strong_etag_matchAr�z CacheTest.test_strong_etag_matchcCr�)N�"xyzzy1"�"xyzzy1", "xyzzy2"rVr�r�r7r7r8�test_multiple_strong_etag_matchFr�z)CacheTest.test_multiple_strong_etag_matchcCr�)Nr�r�r�r�r�r7r7r8�test_strong_etag_not_matchKr�z$CacheTest.test_strong_etag_not_matchcCr�)Nr�r�r�r�r�r7r7r8�#test_multiple_strong_etag_not_matchPr�z-CacheTest.test_multiple_strong_etag_not_matchcCr�)Nr��
W/"xyzzy1"rVr�r�r7r7r8�test_weak_etag_matchUr�zCacheTest.test_weak_etag_matchcCr�)N�"xyzzy2"�W/"xyzzy1", W/"xyzzy2"rVr�r�r7r7r8�test_multiple_weak_etag_matchZr�z'CacheTest.test_multiple_weak_etag_matchcCr�)Nr�r�r�r�r�r7r7r8�test_weak_etag_not_match_r�z"CacheTest.test_weak_etag_not_matchcCr�)Nz"xyzzy3"r�r�r�r�r7r7r8�!test_multiple_weak_etag_not_matchdr�z+CacheTest.test_multiple_weak_etag_not_matchcCs(|jd|d|id�}|�|j|�dS)Nz/etag/r\r�r�)r@r�r�rr�r7r7r8r�is�zCacheTest._test_etagN)rGrHrIr<r�r�r�r�r�r�r�r�r�r�r7r7r7r8r�1s
r�c@r�)�RequestSummaryTestc@rP)zRequestSummaryTest.HandlercCsd|j_|�|���dSr0)rU�	remote_ipr�r~r?r7r7r8rWrszRequestSummaryTest.Handler.getNrYr7r7r7r8rNqrZrNcCr�)NrLsGET / (None)r�r�r7r7r8�test_missing_remote_ipyr�z)RequestSummaryTest.test_missing_remote_ipN)rGrHrIrrNr�r7r7r7r8r�prwr�c@rP)�
HTTPErrorTestcCsFtddd�}t�|�}|�||�|�|j|j�|�|j|j�dS)Nr�zGo awayr)r r��assertIsNotrvrr
)r@r��e2r7r7r8�	test_copys

zHTTPErrorTest.test_copyN)rGrHrIr�r7r7r7r8r�~rZr�c@rP)�ApplicationTestcCs"tg�}|jddd�}|��dS)Nrr>)�address)r�listenrO)r@r>�serverr7r7r8�test_listen�szApplicationTest.test_listenN)rGrHrIr�r7r7r7r8r��rZr�c@rj)�URLSpecReverseTestcCs0|�dtdd����|�dtdd����dS)Nz/favicon.icoz
/favicon\.icoz^/favicon\.ico$�rvr$�reverser?r7r7r8�test_reverse�r�zURLSpecReverseTest.test_reversec	CsNdg}|D]}t|d�}z|��}|�d||f�Wqty$YqwdS)Nz^/api/v\d+/foo/(\w+)$z<did not get expected exception when reversing %s. result: %s)r$r�r�r�)r@�pathsr2�url_specr4r7r7r8�test_non_reversible�s
����z&URLSpecReverseTest.test_non_reversiblecCs4|�dtdd��d��|�dtdd��d��dS)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?r7r7r8�test_reverse_arguments�s��z)URLSpecReverseTest.test_reverse_argumentsN)rGrHrIr�r�r�r7r7r7r8r��sr�c@s4eZdZdd�Zdd�Zdd�Zdd�Zd	d
�ZdS)�RedirectHandlerTestcCs(dtddifdtddifdtddifgS)N�/srcr$�/dstz/src2z
/dst2?foo=barz/(.*?)/(.*?)/(.*)z/{1}/{0}/{2})r�r?r7r7r8r<�s�z RedirectHandlerTest.get_handlerscCr�)Nr�Fr0r�r3r�r�r�r7r7r8�test_basic_redirect�r�z'RedirectHandlerTest.test_basic_redirectcCr�)Nz/src?foo=barFr0r�r3z/dst?foo=barr�r�r7r7r8�test_redirect_with_argument�r�z/RedirectHandlerTest.test_redirect_with_argumentcCr�)Nz/src2?foo2=bar2Fr0r�r3z/dst2?foo=bar&foo2=bar2r�r�r7r7r8�%test_redirect_with_appending_argument�r�z9RedirectHandlerTest.test_redirect_with_appending_argumentcCr�)Nz/a/b/cFr0r�r3z/b/a/cr�r�r7r7r8�test_redirect_pattern�r�z)RedirectHandlerTest.test_redirect_patternN)rGrHrIr<r�r�r�r�r7r7r7r8r��sr�c@s0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)�AcceptLanguageTestz)Test evaluation of Accept-Language headercCs8t�tj�tj�t�d�d�Gdd�dt�}d|fgS)N�gettext_translations�tornado_testc@rP)z>AcceptLanguageTest.get_handlers.<locals>.AcceptLanguageHandlercSs(|�d|��j�dd��|�d�dS)Nr�_�-r�)r��get_browser_localer�r�r�r?r7r7r8rW�s�zBAcceptLanguageTest.get_handlers.<locals>.AcceptLanguageHandler.getNrYr7r7r7r8�AcceptLanguageHandler�rZr�rL)r
�load_gettext_translationsr1r2r3r4r5r)r@r�r7r7r8r<�s��zAcceptLanguageTest.get_handlerscCsL|jdddid�}|�|jdd�|jdddid�}|�|jdd�dS)NrLr;zfr-FR;q=0.9r�rzfr-FRzfr-FR; q=0.9�r�rvr�r�r7r7r8�test_accept_language�sz'AcceptLanguageTest.test_accept_languagecC�(|jdddid�}|�|jdd�dS)NrLr;z	fr-FR;q=0r�r�en-USr�r�r7r7r8�test_accept_language_ignore��z.AcceptLanguageTest.test_accept_language_ignorecCr�)NrLr;z
fr-FR;q=-1r�rr�r�r�r7r7r8�test_accept_language_invalid�rz/AcceptLanguageTest.test_accept_language_invalidN)rGrHrIrJr<r�r�rr7r7r7r8r��sr�)��tornado.concurrentr�tornador�tornado.escaperrrrrr	�tornado.httpclientr
�tornado.httputilr�tornado.iostreamrr
�
tornado.locksr�tornado.logrr�tornado.simple_httpclientr�tornado.templater�tornado.testingrrrr�tornado.test.utilr�tornado.utilrr�tornado.webrrrrr�r r!r"r#r$r%r&r'r(r)r*r+r,r-r.rr�r�r�email.utilsrr��ior/rKrr1r�rBrjr��urllib.parser�r9r;rKrQr[�TestCaserkr�r�r�r#r-r6r=rQr^rkr�r�r�r�r�r�r�r�r�r�rr	r#r�r�r�r�r�r�r�r�r�rr	rrrr'rArIrXrPrSrergrrrxr�r�r�r�r�r�r�r�r�r�r�r��objectr�rr
r
r"r(rer�r�r�r�r�r�r�r�r�r�r�r7r7r7r8�<module>s� T5/1 

0,
	Bd%C*"
:/.\
b
M�

�;+M:!?	!