a
    Šxd,Ó ã                   @   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[eNƒZpG d\d]„ d]eNƒZqG d^d_„ d_eNƒZrG d`da„ daeNƒZsG dbdc„ dceNƒZtG ddde„ deeNƒZuG dfdg„ dgeMƒZvG dhdi„ dieNƒZwG djdk„ dkeMƒZxG dldm„ dmeNƒZyG dndo„ doezƒZ{G dpdq„ dqeNƒZ|G drds„ dseNƒZ}G dtdu„ dueNƒZ~G dvdw„ dweNƒZG dxdy„ dyeNƒZ€G dzd{„ d{eMƒZG d|d}„ d}eNƒZ‚G d~d„ deNƒZƒG d€d„ deNƒZ„G d‚dƒ„ dƒeNƒZ…G d„d…„ d…eNƒZ†G d†d‡„ d‡eMƒZ‡G dˆd‰„ d‰eMƒZˆG dŠd‹„ d‹eMƒZ‰G dŒd„ deMƒZŠG dŽd„ deMƒZ‹e6G dd‘„ d‘e'ƒƒZŒG d’d“„ d“eƒZŽG d”d•„ d•eŽeMƒZG d–d—„ d—eŽeMƒZG d˜d™„ d™eNƒZ‘G dšd›„ d›eNƒZ’G dœd„ deIjQƒZ“G dždŸ„ dŸeNƒZ”G d d¡„ d¡eNƒZ•G d¢d£„ d£eNƒZ–G d¤d¥„ d¥eNƒZ—G d¦d§„ d§eMƒZ˜G d¨d©„ d©eMƒZ™G dªd«„ d«eNƒZšG d¬d­„ d­eIjQƒZ›G d®d¯„ d¯eƒZœG d°d±„ d±eIjQƒZG d²d³„ d³eMƒZžG d´dµ„ dµeMƒZŸd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   úM/var/www/html/Ranjet/env/lib/python3.9/site-packages/tornado/test/web_test.pyÚrelpath=   s    r9   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	Ú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.
    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   s
   t ƒ ‚d S r0   ©ÚNotImplementedErrorr>   r7   r7   r8   r;   L   s    zWebTestCase.get_handlersc                 C   s   i S r0   r7   r>   r7   r7   r8   r<   O   s    zWebTestCase.get_app_kwargsN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r@   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;   [   s    z"SimpleHandlerTestCase.get_handlers)rC   rD   rE   rF   rJ   r;   r7   r7   r7   r8   rG   S   s   rG   c                   @   s   e Zd Zdd„ ZdS )ÚHelloHandlerc                 C   s   |   d¡ d S ©NÚhello©Úwriter>   r7   r7   r8   Úget`   s    zHelloHandler.getN©rC   rD   rE   rP   r7   r7   r7   r8   rK   _   s   rK   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| _ntt||dd| _d S )N)Úcookie_secret)Úsettings©rT   Úkey_version)Ú_cookiesr   ÚdictÚapplication)r?   rT   rW   r7   r7   r8   Ú__init__f   s    ÿ

ÿz!CookieTestRequestHandler.__init__c                 C   s   | j  |¡S r0   )rX   rP   )r?   Únamer7   r7   r8   Ú
get_cookier   s    z#CookieTestRequestHandler.get_cookiec                 C   s   || j |< d S r0   )rX   )r?   r\   ÚvalueÚexpires_daysr7   r7   r8   Ú
set_cookieu   s    z#CookieTestRequestHandler.set_cookie)rS   N)N)rC   rD   rE   r[   r]   r`   r7   r7   r7   r8   rR   d   s   
rR   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚSecureCookieV1Testc                 C   s0   t ƒ }|jdddd |  |jdddd¡ d S )NÚfooó   baré   ©Úversion©Úmin_version©rR   Úset_signed_cookieÚassertEqualÚget_signed_cookie©r?   Úhandlerr7   r7   r8   Útest_round_trip{   s    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   ƒ n1 sè0    Y  d S )Nrb   s   d76df8e7aefcrd   re   s   12345678\|([0-9]+)\|([0-9a-f]+)é   rT   Z12345678Z1234s   5678z1234|5678%s|%szCookie timestamp in futurerg   )rR   rj   ÚbinasciiÚa2b_hexrX   ÚreÚmatchÚgrouprk   r%   rZ   rU   r   r	   r   r   Ú
assertTruerl   )r?   rn   Úcookiert   Ú	timestampÚsigr7   r7   r8   Ú&test_cookie_tampering_future_timestamp€   s<    



üù
üù
ÿ
z9SecureCookieV1Test.test_cookie_tampering_future_timestampc                 C   s0   t ƒ }|jdddd |  |jdddd¡ d S )Nrb   ó   érd   re   rg   ri   rm   r7   r7   r8   Útest_arbitrary_bytes¦   s    z'SecureCookieV1Test.test_arbitrary_bytesN)rC   rD   rE   ro   rz   r|   r7   r7   r7   r8   ra   z   s   &ra   c                   @   s>   e Zd ZdddœZdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ ZdS )ÚSecureCookieV2TestZajklasdf0ojaisdfZaslkjasaolwkjsdf)r   rd   c                 C   s0   t ƒ }|jdddd |  |jdddd¡ d S )Nrb   rc   rp   re   rg   ri   rm   r7   r7   r8   ro   ²   s    z"SecureCookieV2Test.test_round_tripc                 C   s0   t | jdd}| dd¡ |  | d¡d¡ d S )Nr   rV   rb   rc   ©rR   ÚKEY_VERSIONSrj   rk   rl   rm   r7   r7   r8   Útest_key_version_roundtrip·   s
    ÿz-SecureCookieV2Test.test_key_version_roundtripc                 C   s0   t | jdd}| dd¡ |  | d¡d¡ d S )Nrd   rV   rb   rc   r~   rm   r7   r7   r8   Ú,test_key_version_roundtrip_differing_version¾   s
    ÿ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   rV   rb   rc   rd   )rR   r   rj   rX   rk   rl   )r?   rn   Ú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‚   )rR   r   rj   ÚcopyÚpoprX   rk   rl   )r?   rn   Znew_key_versionsrƒ   r7   r7   r8   Ú#test_key_version_invalidate_versionÐ   s    ÿ

ÿz6SecureCookieV2Test.test_key_version_invalidate_versionN)	rC   rD   rE   r   ro   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   rP   å   s    
z7FinalReturnTest.get_handlers.<locals>.FinishHandler.getc                 3   s,   |   d¡ |  ¡ V  |  d¡ˆ _ˆ jV  d S )Nzhello,Zworld)rO   Úflushr‰   rŠ   r>   r‹   r7   r8   Úpostê   s    

z8FinalReturnTest.get_handlers.<locals>.FinishHandler.postN)rC   rD   rE   r   Ú	coroutinerP   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ò   s    zJFinalReturnTest.get_handlers.<locals>.RenderHandler.create_template_loaderc                    s   |   d¡ˆ _d S ©Nr‘   )ÚrenderrŠ   r>   r‹   r7   r8   rP   õ   s    z7FinalReturnTest.get_handlers.<locals>.RenderHandler.getN)rC   rD   rE   r”   r   r   rP   r7   r‹   r7   r8   ÚRenderHandlerñ   s   r—   ú/finishú/render©r   )r?   r   r—   r7   r‹   r8   r;   á   s    zFinalReturnTest.get_handlersc                 C   s
   t ddS )Nrˆ   )Ztemplate_path©rY   r>   r7   r7   r8   r<   û   s    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_urlrk   ÚcodeÚassertIsInstancerŠ   r   rv   Ú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£   rk   r¤   r¥   rŠ   r   r§   r7   r7   r8   Ú test_render_method_return_future	  s    z0FinalReturnTest.test_render_method_return_future)rC   rD   rE   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                   @   s   e Zd Zdd„ ZdS )z1CookieTest.get_handlers.<locals>.SetCookieHandlerc                 S   s(   |   dd¡ |   dd¡ |   dd¡ d S )NÚstrÚasdfÚunicodeÚqwerÚbytess   zxcv©r`   r>   r7   r7   r8   rP     s    z5CookieTest.get_handlers.<locals>.SetCookieHandler.getNrQ   r7   r7   r7   r8   ÚSetCookieHandler  s   r²   c                   @   s   e Zd Zdd„ ZdS )z1CookieTest.get_handlers.<locals>.GetCookieHandlerc                 S   s&   |   dd¡}|d usJ ‚|  |¡ d S )Nrb   Údefault)r]   rO   )r?   rw   r7   r7   r8   rP     s    z5CookieTest.get_handlers.<locals>.GetCookieHandler.getNrQ   r7   r7   r7   r8   ÚGetCookieHandler  s   r´   c                   @   s   e Zd Zdd„ ZdS )z7CookieTest.get_handlers.<locals>.SetCookieDomainHandlerc                 S   s   | j ddddd d S )NZunicode_argsZblahzfoo.comú/foo)Údomainr2   r±   r>   r7   r7   r8   rP      s    z;CookieTest.get_handlers.<locals>.SetCookieDomainHandler.getNrQ   r7   r7   r7   r8   ÚSetCookieDomainHandler  s   r·   c                   @   s   e Zd Zdd„ ZdS )z<CookieTest.get_handlers.<locals>.SetCookieSpecialCharHandlerc                 S   s(   |   dd¡ |   dd¡ |   dd¡ d S )NÚequalsúa=bZ	semicolonúa;bÚquoteúa"br±   r>   r7   r7   r8   rP   &  s    z@CookieTest.get_handlers.<locals>.SetCookieSpecialCharHandler.getNrQ   r7   r7   r7   r8   ÚSetCookieSpecialCharHandler%  s   r½   c                   @   s   e Zd Zdd„ ZdS )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   rP   ,  s    z>CookieTest.get_handlers.<locals>.SetCookieOverwriteHandler.getNrQ   r7   r7   r7   r8   ÚSetCookieOverwriteHandler+  s   rÂ   c                   @   s   e Zd Zdd„ ZdS )z7CookieTest.get_handlers.<locals>.SetCookieMaxAgeHandlerc                 S   s   | j dddd d S )Nrb   Úbaré
   )Zmax_ager±   r>   r7   r7   r8   rP   4  s    z;CookieTest.get_handlers.<locals>.SetCookieMaxAgeHandler.getNrQ   r7   r7   r7   r8   ÚSetCookieMaxAgeHandler3  s   rÅ   c                   @   s   e Zd Zdd„ ZdS )z<CookieTest.get_handlers.<locals>.SetCookieExpiresDaysHandlerc                 S   s   | j dddd d S )Nrb   rÃ   rÄ   )r_   r±   r>   r7   r7   r8   rP   8  s    z@CookieTest.get_handlers.<locals>.SetCookieExpiresDaysHandler.getNrQ   r7   r7   r7   r8   ÚSetCookieExpiresDaysHandler7  s   rÆ   c                   @   s   e Zd Zdd„ ZdS )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   rP   <  s    z8CookieTest.get_handlers.<locals>.SetCookieFalsyFlags.getNrQ   r7   r7   r7   r8   ÚSetCookieFalsyFlags;  s   rÊ   c                   @   s   e Zd Zdd„ ZdS )z8CookieTest.get_handlers.<locals>.SetCookieDeprecatedArgsc                 S   s   | j ddddd d S )Nr6   r¾   Trµ   )ÚHttpOnlyZpATHr±   r>   r7   r7   r8   rP   C  s    z<CookieTest.get_handlers.<locals>.SetCookieDeprecatedArgs.getNrQ   r7   r7   r7   r8   ÚSetCookieDeprecatedArgsB  s   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¢   rk   Ú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Ø   rc   z	foo="bar"z/=exception;ó   default©r¢   rk   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¢   rk   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 ]8\}}t d|¡ | j dd|id}|  |j	t
|ƒ¡ qnd S )NrÐ   rÖ   é   r   zequals="a=b"; Path=/rd   zquote="a\"b"; Path=/rp   )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Ù   rk   Úlenrv   Ú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Ù   rk   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dd }tj	 
| ¡ d ¡}|d uspJ ‚tj|d d… Ž }|  t||  ¡ ƒdk ¡ d S )NrÓ   rÖ   z(foo=bar; expires=(?P<expires>.+); Path=/rÄ   ©ÚdaysÚexpiresé   )r¢   rØ   rP   rs   rt   ÚdatetimeÚutcnowÚ	timedeltaÚemailÚutilsÚ	parsedateÚ	groupdictrv   ÚabsÚtotal_seconds©r?   r¨   rè   rt   rñ   ÚparsedZ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=/; securerd   zb=1; path=/rp   zc=1; httponly; path=/rã   zd=1; path=/)r¢   r×   rØ   rÙ   rk   Ú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&0    Y  |j d¡}|  |d¡ d S )NrÕ   rÖ   za=b; HttpOnly; Path=/foo)r   r¢   rØ   rP   rk   )r?   r¨   rè   r7   r7   r8   Útest_set_cookie_deprecated§  s    (z%CookieTest.test_set_cookie_deprecatedN)rC   rD   rE   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   s
   || _ d S r0   ©Ú	login_url)r?   r  r7   r7   r8   Ú
initialize¯  s    z%AuthRedirectRequestHandler.initializec                 C   s   | j S r0   r  r>   r7   r7   r8   Úget_login_url²  s    z(AuthRedirectRequestHandler.get_login_urlc                 C   s   |   d¡ d S )Néô  )Ú
send_errorr>   r7   r7   r8   rP   µ  s    zAuthRedirectRequestHandler.getN)rC   rD   rE   r  r  r#   rP   r7   r7   r7   r8   r  ®  s   r  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )Ú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  rY   r>   r7   r7   r8   r;   ¼  s    ýþzAuthRedirectTest.get_handlersc                 C   s8   | j |  d¡dd}|  |jd¡ |  |jd d¡ d S )Nr
  F©Zfollow_redirectsé.  ÚLocationz/login?next=%2Frelative)r¢   r£   rk   r¤   rØ   r§   r7   r7   r8   Útest_relative_auth_redirectÆ  s    z,AuthRedirectTest.test_relative_auth_redirectc                 C   sF   | j |  d¡dd}|  |jd¡ |  t d|jd ¡|jd ¡ d S )Nr  Fr  r  zIhttp://example.com/login\?next=http%3A%2F%2F127.0.0.1%3A[0-9]+%2Fabsoluter  )r¢   r£   rk   r¤   rv   rs   rt   rØ   r§   r7   r7   r8   Útest_absolute_auth_redirectË  s    þûz,AuthRedirectTest.test_absolute_auth_redirectN)rC   rD   rE   r;   r  r  r7   r7   r7   r8   r	  »  s   
r	  c                   @   s*   e Zd Zdd„ Zejdd„ ƒZdd„ ZdS )ÚConnectionCloseHandlerc                 C   s
   || _ d S r0   r‹   ©r?   rŒ   r7   r7   r8   r  Ø  s    z!ConnectionCloseHandler.initializec                 c   s   | j  ¡  | j j ¡ V  d S r0   )rŒ   Úon_handler_waitingÚcleanup_eventÚwaitr>   r7   r7   r8   rP   Û  s    
zConnectionCloseHandler.getc                 C   s   | j  ¡  d S r0   )rŒ   Úon_connection_closer>   r7   r7   r8   r  à  s    z*ConnectionCloseHandler.on_connection_closeN)rC   rD   rE   r  r   r   rP   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	S )
ÚConnectionCloseTestc                 C   s   t ƒ | _dtt| dfgS )NrH   r‹   )r   r  r  rY   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>ñ  rž   z;ConnectionCloseTest.test_connection_close.<locals>.<lambda>)ÚsocketÚAF_INETÚSOCK_STREAMÚconnectÚget_http_portr   ÚstreamrO   r  r  ÚsetZio_loopZrun_sync)r?   Úsr7   r7   r8   Útest_connection_closeé  s    

z)ConnectionCloseTest.test_connection_closec                 C   s   t  d¡ | j ¡  d S )Nzhandler waiting)rå   ræ   r!  Úcloser>   r7   r7   r8   r  ó  s    
z&ConnectionCloseTest.on_handler_waitingc                 C   s   t  d¡ |  ¡  d S )Nzconnection closed)rå   ræ   Ústopr>   r7   r7   r8   r  ÷  s    
z'ConnectionCloseTest.on_connection_closeN)rC   rD   rE   r;   r$  r  r  r7   r7   r7   r8   r  ä  s   
r  c                   @   s   e Zd Zdd„ ZdS )ÚEchoHandlerc                 G   sÎ   | j jD ]z}t|ƒtkr(tdt|ƒ ƒ‚| j j| D ] }t|ƒtkr4tdt|ƒ ƒ‚q4|  |¡D ] }t|ƒtkr`tdt|ƒ ƒ‚q`q|D ] }t|ƒtkrˆtdt|ƒ ƒ‚qˆ|  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   rO   rY   r2   r   )r?   r)  ÚkeyZbvalueZsvalueÚargr7   r7   r8   rP   ý  s&    
ýÿzEchoHandler.getNrQ   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S )ÚRequestEncodingTestc                 C   s   dt fdt fgS )Nz/group/(.*)z/slashes/([^/]*)/([^/]*))r'  r>   r7   r7   r8   r;     s    z RequestEncodingTest.get_handlersc                 C   s   t |  |¡jƒS r0   )r   r¢   r¡   r“   r7   r7   r8   Ú
fetch_json  s    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ú?r(  z/group/%3F?%3F=%3F©rk   r3  rY   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õ   Ã©r1  r(  ©rk   r3  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/barrb   rÃ   r(  z/slashes/a%2Fb/c%2Fdza/bzc/dr5  r>   r7   r7   r8   Útest_slashes4  s    þþz RequestEncodingTest.test_slashesc                 C   s8   t tdƒ |  d¡ W d   ƒ n1 s*0    Y  d S )Nz.*Invalid unicodez/group/?arg=%25%e9)r   r   r¢   r>   r7   r7   r8   Ú
test_error@  s    zRequestEncodingTest.test_errorN)	rC   rD   rE   r;   r3  r6  r9  r:  r;  r7   r7   r7   r8   r2    s   r2  c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
Ú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rŒtd| j ¡  ƒ‚|  d	|  d¡t¡ |  d
|  d¡t	¡ |  d| jt¡ |  d|  ¡ t	¡ |  d|  dd¡t	¡ |  d|  ¡ t	¡ d S )NÚstatusÚargumentrb   Z
cookie_keyr   Úcookie_valuer­   z%unexpected values for cookie keys: %rrl   r]   Ú
xsrf_tokenÚxsrf_form_htmlÚreverse_urlÚ	typecheckZrequest_summary)ÚerrorsÚ
check_typeZ
get_statusÚintÚget_argumentr   ÚlistÚcookiesÚkeysr¬   Úvaluesr^   r.  rl   r°   r]   r@  rA  rB  Ú_request_summaryr>   r7   r7   r8   ÚprepareH  s    ÿzTypeCheckHandler.preparec                 C   s   |   d|t¡ |  | j¡ d S ©NÚpath_component©rE  r   rO   rD  ©r?   rO  r7   r7   r8   rP   c  s    zTypeCheckHandler.getc                 C   s   |   d|t¡ |  | j¡ d S rN  rP  rQ  r7   r7   r8   rŽ   i  s    zTypeCheckHandler.postc                 C   s&   t |ƒ}||kr"d||f | j|< d S )Nzexpected %s, got %s)r-  rD  )r?   r\   ÚobjÚexpected_typeZactual_typer7   r7   r8   rE  m  s    zTypeCheckHandler.check_typeN)rC   rD   rE   rM  rP   rŽ   rE  r7   r7   r7   r8   r<  G  s   r<  c                   @   s   e Zd Zddd„Zdd„ ZdS )ÚDecodeArgHandlerNc                 C   sJ   t |ƒtkrtdt |ƒ ƒ‚d| jjv rB| t| jjd d ƒ¡S |S d S )Nzunexpected type for value: %rÚencodingr   )r-  r°   r.  r+  r,  Údecoder   )r?   r^   r\   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r2d| gS tdƒ‚d S )Nr°   r®   zunknown type)r-  r°   r   rq   Úb2a_hexr   r.  )r#  r7   r7   r8   Údescribe~  s
    z&DecodeArgHandler.get.<locals>.describerb   ©r2   Úquery)rO   rG  )r?   r1  rY  r7   r7   r8   rP   }  s    zDecodeArgHandler.get)N)rC   rD   rE   rW  rP   r7   r7   r7   r8   rT  s  s   
	rT  c                   @   s   e Zd Zdd„ ZdS )ÚLinkifyHandlerc                 C   s   | j ddd d S )Núlinkify.htmlzhttp://example.com)Úmessage©r–   r>   r7   r7   r8   rP   ‰  s    zLinkifyHandler.getNrQ   r7   r7   r7   r8   r\  ˆ  s   r\  c                   @   s   e Zd Zdd„ ZdS )ÚUIModuleResourceHandlerc                 C   s   | j dddgd d S )Nú	page.htmlrd   rp   )Úentriesr_  r>   r7   r7   r8   rP   Ž  s    zUIModuleResourceHandler.getNrQ   r7   r7   r7   r8   r`    s   r`  c                   @   s   e Zd Zdd„ ZdS )ÚOptionalPathHandlerc                 C   s   |   d|i¡ d S )Nr2   rN   r“   r7   r7   r8   rP   “  s    zOptionalPathHandler.getNrQ   r7   r7   r7   r8   rc  ’  s   rc  c                   @   s   e Zd Zdd„ ZdS )ÚMultiHeaderHandlerc                 C   s4   |   dd¡ |   dd¡ |  dd¡ |  dd¡ d S )	Núx-overwriterÇ   zX-Overwriterp   úx-multirã   zX-MultiÚ4)Ú
set_headerÚ
add_headerr>   r7   r7   r8   rP   ˜  s    zMultiHeaderHandler.getNrQ   r7   r7   r7   r8   rd  —  s   rd  c                   @   s   e Zd Zdd„ ZdS )r   c                 C   sd   |   dd ¡d ur.| jdtt|   d¡ƒƒd n2|   dd ¡d urX| jdt|   d¡ƒd ntdƒ‚d S )NÚ	permanentrH   )rj  r=  )r=  z(didn't get permanent or status arguments)rG  ÚredirectÚboolrF  r.  r>   r7   r7   r8   rP      s
    zRedirectHandler.getNrQ   r7   r7   r7   r8   r   Ÿ  s   r   c                   @   s   e Zd Zejdd„ ƒZdS )ÚEmptyFlushCallbackHandlerc                 c   s@   |   ¡ V  |   ¡ V  |  d¡ |   ¡ V  |   ¡ V  |  d¡ d S )NÚoÚk)r   rO   r‰   r>   r7   r7   r8   rP   ª  s    




zEmptyFlushCallbackHandler.getN)rC   rD   rE   r   r   rP   r7   r7   r7   r8   rm  ©  s   rm  c                   @   s   e Zd Zdd„ ZdS )ÚHeaderInjectionHandlerc              
   C   s\   z|   dd¡ tdƒ‚W n> tyV } z&dt|ƒv r@|  d¡ n‚ W Y d }~n
d }~0 0 d S )NzX-Foozfoo
X-Bar: bazzDidn't get expected exceptionzUnsafe header valueó   ok)rh  r.  Ú
ValueErrorr¬   r‰   ©r?   rÁ   r7   r7   r8   rP   ¸  s    zHeaderInjectionHandler.getNrQ   r7   r7   r7   r8   rp  ·  s   rp  c                   @   s   e Zd Zdd„ ZdS )ÚGetArgumentHandlerc                 C   sJ   |   dd ¡dkr| j}n|   dd ¡dkr0| j}n| j }|  |ddƒ¡ d S )NÚsourcer[  r¡   rb   r³   )rG  Zget_query_argumentZget_body_argumentr‰   ©r?   r    r7   r7   r8   rM  Ä  s    zGetArgumentHandler.prepareN©rC   rD   rE   rM  r7   r7   r7   r8   rt  Ã  s   rt  c                   @   s   e Zd Zdd„ ZdS )ÚGetArgumentsHandlerc                 C   s*   |   t|  d¡|  d¡|  d¡d¡ d S )Nrb   ©r³   r[  r¡   )r‰   rY   r/  Zget_query_argumentsZget_body_argumentsr>   r7   r7   r8   rM  Ï  s    ýÿzGetArgumentsHandler.prepareNrw  r7   r7   r7   r8   rx  Î  s   rx  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]  ra  z
entry.htmlZxhtml_escape)Útemplate_loaderZ
autoescaperT   )r   rY   ÚCOOKIE_SECRET)r?   Úloaderr7   r7   r8   r<   Ý  s    øÿýzWSGISafeWebTest.get_app_kwargsc                    s   t ƒ  ¡  tj ¡  d S r0   ©ÚsuperÚtearDownr   Z_template_loadersÚclearr>   ©Ú	__class__r7   r8   r€  ÷  s    
zWSGISafeWebTest.tearDownc                 C   s”   t dtddt dtddt dtƒt dtƒt dtƒt d	tƒt d
tƒt dtƒt dtddiƒt dtdddœƒt dtddiƒt dt	ƒt dt
ƒt dtƒg}|S )Nz/typecheck/(.*)rC  )r\   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$   rj  ú//web_redirect_double_slashú/header_injectionú/get_argumentz/get_arguments)r$   r<  rT  r\  r`  rc  rd  r   ÚWebRedirectHandlerrp  rt  rx  )r?   Úurlsr7   r7   r8   r;   û  s8    ýýýæzWSGISafeWebTest.get_handlersc                 O   s"   | j |i |¤Ž}| ¡  t|jƒS r0   )r¢   Úrethrowr   r¡   )r?   r*  Úkwargsr¨   r7   r7   r8   r3    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¡   rk   )r?   r?  r¨   rç   r7   r7   r8   Ú
test_types  s    ÿÿ

üzWSGISafeWebTest.test_typesc                 C   s‚   g d¢}|D ]:}|   |¡}| ¡  t|jƒ}|  |ddgddgdœ¡ q|   d¡}| ¡  t|jƒ}|  |ddgddgdœ¡ d S )N)z,/decode_arg/%C3%A9?foo=%C3%A9&encoding=utf-8z'/decode_arg/%E9?foo=%E9&encoding=latin1z*/decode_arg_kw/%E9?foo=%E9&encoding=latin1r®   r7  rZ  z/decode_arg/%C3%A9?foo=%C3%A9r°   Zc3a9©r¢   r  r   r¡   rk   ©r?   r  Zreq_urlr¨   rç   r7   r7   r8   Útest_decode_argument0  s    

þ

z$WSGISafeWebTest.test_decode_argumentc                 C   s^   t tdƒ@ |  d¡}|  |jd¡ |  d¡}|  |jd¡ W d   ƒ n1 sP0    Y  d S )Nz.*Invalid unicode.*z/typecheck/invalid%FFi  z/typecheck/invalid?foo=%FF©r   r   r¢   rk   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 + 1rZ  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„  rb   z/decode_arg/fooé*   z/decode_arg/42r{   z/decode_arg/%E9r7  z/decode_arg/%C3%A9r™  z/decode_arg/1%20%2B%201)rk   r=   rB  r>   r7   r7   r8   Útest_reverse_url\  s    ÿÿz WSGISafeWebTest.test_reverse_urlc                 C   s   |   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   s   |   d¡}|  |jd¡ d S )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  s
    
þz'WSGISafeWebTest.test_uimodule_resourcesc                 C   s0   |   |  d¡ddi¡ |   |  d¡dd i¡ d S )Nz/optional_path/foor2   rb   z/optional_path/r8  r>   r7   r7   r8   Útest_optional_path‰  s    z"WSGISafeWebTest.test_optional_pathc                 C   s8   |   d¡}|  |jd d¡ |  |j d¡ddg¡ d S )Nr‡  re  Ú2rf  Ú3rg  rá   r§   r7   r7   r8   Útest_multi_header  s    
z!WSGISafeWebTest.test_multi_headerc                 C   sX   | j ddd}|  |jd¡ | j ddd}|  |jd¡ | j ddd}|  |jd¡ d S )	Nz/redirect?permanent=1Fr  é-  z/redirect?permanent=0r  z/redirect?status=307i3  ©r¢   rk   r¤   r§   r7   r7   r8   Útest_redirect’  s    zWSGISafeWebTest.test_redirectc                 C   s`   | j ddd}|  |jd¡ |  |jd d¡ | j ddd}|  |jd¡ |  |jd d¡ d S )	Nrˆ  Fr  r£  r  r‰  rŠ  r  ©r¢   rk   r¤   rØ   r§   r7   r7   r8   Útest_web_redirectš  s    z!WSGISafeWebTest.test_web_redirectc                 C   s2   | j ddd}|  |jd¡ |  |jd d¡ d S )Nr‹  Fr  r£  r  r‰  r¦  r§   r7   r7   r8   Útest_web_redirect_double_slash¢  s    z.WSGISafeWebTest.test_web_redirect_double_slashc                 C   s   |   d¡}|  |jd¡ d S )NrŒ  rq  rß   r§   r7   r7   r8   Útest_header_injection§  s    
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=barrc   z/get_argument?foo=rž   r  rÞ   rM   ©rb   r   rŸ   ó   helloz/get_arguments?foo=barrÃ   ry  )r¢   rk   r¡   ÚurllibÚparseÚ	urlencoderY   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 )NrM   rª  z"/get_argument?source=query&foo=barr   rŸ   rc   z/get_argument?source=query&foo=rž   z/get_argument?source=queryrÞ   ©r¬  r­  r®  rY   r¢   rk   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Ÿ   rc   Ú 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Ø   rP   r§   r7   r7   r8   Útest_no_gzipá  s    
zWSGISafeWebTest.test_no_gzip)rC   rD   rE   r|  r<   r€  r;   r3  r“  r–  r˜  rš  rœ  r  rž  rŸ  r¢  r¥  r§  r¨  r©  r¯  r²  r´  rº  Ú__classcell__r7   r7   r‚  r8   rz  Ú  s,   rz  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚNonWSGIWebTestsc                 C   s
   dt fgS )Nú/empty_flush)rm  r>   r7   r7   r8   r;   è  s    zNonWSGIWebTests.get_handlersc                 C   s   |   d¡}|  |jd¡ d S )Nr½  rq  rß   r§   r7   r7   r8   Útest_empty_flushë  s    
z NonWSGIWebTests.test_empty_flushN)rC   rD   rE   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	S )
Ú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                   @   s   e Zd Zdd„ ZdS )z6ErrorResponseTest.get_handlers.<locals>.DefaultHandlerc                 S   s*   |   dd ¡rtt|   d¡ƒƒ‚dd  d S ©Nr=  rd   r   )rG  r    rF  r>   r7   r7   r8   rP   ó  s    z:ErrorResponseTest.get_handlers.<locals>.DefaultHandler.getNrQ   r7   r7   r7   r8   ÚDefaultHandlerò  s   rÁ  c                   @   s   e Zd Zdd„ Zdd„ ZdS )z9ErrorResponseTest.get_handlers.<locals>.WriteErrorHandlerc                 S   s.   |   dd ¡r"|  t|   d¡ƒ¡ ndd  d S rÀ  )rG  r  rF  r>   r7   r7   r8   rP   ù  s    z=ErrorResponseTest.get_handlers.<locals>.WriteErrorHandler.getc                 [   s@   |   dd¡ d|v r.|  d|d d j ¡ n|  d| ¡ d S )NúContent-Typeú
text/plainÚexc_infozException: %sr   z
Status: %d)rh  rO   rC   ©r?   Ústatus_coder‘  r7   r7   r8   Úwrite_errorÿ  s    zEErrorResponseTest.get_handlers.<locals>.WriteErrorHandler.write_errorN©rC   rD   rE   rP   rÇ  r7   r7   r7   r8   ÚWriteErrorHandlerø  s   rÉ  c                   @   s   e Zd Zdd„ Zdd„ ZdS )z?ErrorResponseTest.get_handlers.<locals>.FailedWriteErrorHandlerc                 S   s   dd  d S ©Nrd   r   r7   r>   r7   r7   r8   rP     s    zCErrorResponseTest.get_handlers.<locals>.FailedWriteErrorHandler.getc                 [   s   t dƒ‚d S )Nzexception in write_error©r.  rÅ  r7   r7   r8   rÇ  
  s    zKErrorResponseTest.get_handlers.<locals>.FailedWriteErrorHandler.write_errorNrÈ  r7   r7   r7   r8   ÚFailedWriteErrorHandler  s   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ƒˆ |  d¡}|  |jd¡ |  d|jv ¡ |  d¡}|  |jd¡ |  d|jv ¡ |  d¡}|  |jd	¡ |  d
|jv ¡ W d   ƒ n1 s˜0    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¢   rk   r¤   rv   r¡   r§   r7   r7   r8   Útest_default  s    


zErrorResponseTest.test_defaultc                 C   sz   t tdƒ\ |  d¡}|  |jd¡ |  d|j¡ |  d¡}|  |jd¡ |  d|j¡ W d   ƒ n1 sl0    Y  d S )NrÐ  rÎ  r  s   Exception: ZeroDivisionErrorz/write_error?status=503rÑ  s   Status: 503©r   r   r¢   rk   r¤   r¡   r§   r7   r7   r8   Útest_write_error!  s    

z"ErrorResponseTest.test_write_errorc                 C   sT   t tdƒ6 |  d¡}|  |jd¡ |  d|j¡ W d   ƒ n1 sF0    Y  d S )NrÐ  rÏ  r  rž   rÓ  r§   r7   r7   r8   Útest_failed_write_error+  s    
z)ErrorResponseTest.test_failed_write_errorN)rC   rD   rE   r;   rÒ  rÔ  rÕ  r7   r7   r7   r8   r¿  ð  s   "
r¿  c                   @   sH  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*e+ ,ej-dEkdF¡dGdH„ ƒZ.dIS )JÚ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                   @   s   e Zd Zdd„ ZdS )z5StaticFileTest.get_handlers.<locals>.StaticUrlHandlerc                 S   s(   t |  dd¡ƒ}|  | j||d¡ d S )NÚinclude_versionrÇ   )rØ  )rF  rG  rO   Ú
static_url)r?   r2   Zwith_vr7   r7   r8   rP   =  s    z9StaticFileTest.get_handlers.<locals>.StaticUrlHandler.getNrQ   r7   r7   r7   r8   ÚStaticUrlHandler<  s   rÚ  c                   @   s   e Zd ZdZdS )z=StaticFileTest.get_handlers.<locals>.AbsoluteStaticUrlHandlerTN)rC   rD   rE   Úinclude_hostr7   r7   r7   r8   ÚAbsoluteStaticUrlHandlerA  s   rÜ  c                   @   s   e Zd Zdd„ ZdS )z=StaticFileTest.get_handlers.<locals>.OverrideStaticUrlHandlerc           
      S   s¬   t |  d¡ƒ}| | _|  |¡}| j||d}||krD|  tdƒ¡S | jjd }t|ƒ}| 	|d|¡}| 	|d|¡}|rŠ|dko†|dk}	n|dko˜|dk}	|  t|	ƒ¡ d S )NrÛ  )rÛ  Fz://r   éÿÿÿÿ)
rl  rG  rÛ  rÙ  rO   r¬   r+  Úprotocolrä   Úfind)
r?   r2   Z
do_includeZregular_urlZoverride_urlrÞ  Zprotocol_lengthZcheck_regularZcheck_overrideÚresultr7   r7   r8   rP   E  s    
zAStaticFileTest.get_handlers.<locals>.OverrideStaticUrlHandler.getNrQ   r7   r7   r7   r8   ÚOverrideStaticUrlHandlerD  s   rá  ú/static_url/(.*)z/abs_static_url/(.*)z/override_static_url/(.*)z/root_static/(.*)rH   )r2   )r   r   rY   )r?   rÚ  rÜ  rá  r7   r7   r8   r;   ;  s    üzStaticFileTest.get_handlersc                 C   s   t tdƒdS )Nr×  )Ústatic_path©rY   r9   r>   r7   r7   r8   r<   `  s    zStaticFileTest.get_app_kwargsc                 C   sL   |   d¡}|  d|jv ¡ |   d¡}|  d|jv ¡ |  |j d¡d¡ d S )Nú/robots.txts   Disallow: /ú/static/robots.txtrÂ  rÃ  )r¢   rv   r¡   rk   rØ   rP   r§   r7   r7   r8   Útest_static_filesc  s
    

z StaticFileTest.test_static_filesc                 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¢   rk   rØ   rP   rv   r"  r§   r7   r7   r8   Útest_static_compressed_filesk  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¢   rk   r¡   Úrobots_txt_hashr§   r7   r7   r8   Útest_static_urlx  s    
zStaticFileTest.test_static_urlc                 C   s0   |   d¡}|  |jt|  d¡ƒd | j ¡ d S )Nz/abs_static_url/robots.txtrH   s   static/robots.txt?v=)r¢   rk   r¡   r   r£   ré  r§   r7   r7   r8   Útest_absolute_static_url|  s
    
þz'StaticFileTest.test_absolute_static_urlc                 C   s   |   d¡}|  |jd¡ d S )Nz(/static_url/robots.txt?include_version=0s   /static/robots.txtrß   r§   r7   r7   r8   Útest_relative_version_exclusionƒ  s    
z.StaticFileTest.test_relative_version_exclusionc                 C   s*   |   d¡}|  |jt|  d¡d ƒ¡ d S )Nz,/abs_static_url/robots.txt?include_version=0rH   ústatic/robots.txt)r¢   rk   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‹  s    
z)StaticFileTest.test_include_host_overridec                 C   s0   d}|   |t|ƒ ¡}|  |jttdƒƒ¡ d S )Nz//override_static_url/robots.txt?include_host=%sT)r¢   rF  rk   r¡   r   r¬   )r?   rÛ  r2   r¨   r7   r7   r8   rï    s    z*StaticFileTest._trigger_include_host_checkc                 O   sž   | j |ddi|¤Ž}| j |ddi|¤Ž}tƒ }t |j|j¡D ]}| d¡r>| |¡ q>|D ]<}|  |j |¡|j |¡d||j |¡|j |¡f ¡ q\|S )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ÚGETzContent-z)%s differs between GET (%s) and HEAD (%s))	r¢   r"  Ú	itertoolsÚchainrØ   Ú
startswithÚaddrk   rP   )r?   r*  r‘  Zhead_responseZget_responseZcontent_headersÚhr7   r7   r8   Úget_and_head”  s    


ÿýzStaticFileTest.get_and_headc                 C   sD   |   d¡}| j dd|jd id}|  |jd¡ |  d|jv¡ d S )Nræ  úIf-Modified-SinceúLast-ModifiedrÝ   é0  úContent-Length)rø  rØ   rk   r¤   rv   ©r?   Z	response1Z	response2r7   r7   r8   Ú!test_static_304_if_modified_since©  s    
þz0StaticFileTest.test_static_304_if_modified_sincec                 C   s4   |   d¡}| j dd|jd id}|  |jd¡ d S )Nræ  úIf-None-MatchÚEtagrÝ   rû  ©rø  rØ   rk   r¤   rý  r7   r7   r8   Útest_static_304_if_none_match²  s
    
ÿz,StaticFileTest.test_static_304_if_none_matchc                 C   s6   |   d¡}| j dd|jd dœd}|  |jd¡ d S )Nræ  z
"MISMATCH"rú  )rÿ  rù  rÝ   rœ   r  rý  r7   r7   r8   Ú!test_static_304_etag_modified_bug¹  s    
þþz0StaticFileTest.test_static_304_etag_modified_bugc                 C   s$   | j dddid}|  |jd¡ d S )Nræ  rù  zFri, 01 Jan 1960 00:00:00 GMTrÝ   rœ   ©rø  rk   r¤   r§   r7   r7   r8   Ú'test_static_if_modified_since_pre_epochÄ  s
    þz6StaticFileTest.test_static_if_modified_since_pre_epochc                 C   sf   t  tdƒ¡}| jddt|jd ƒid}|  |jd¡ | jddt|jd ƒid}|  |jd¡ d S )Nrí  ræ  rù  rd   rÝ   rœ   rû  )r1   Ústatr9   rø  r   Úst_mtimerk   r¤   )r?   r  r¨   r7   r7   r8   Ú'test_static_if_modified_since_time_zoneÎ  s    þþz6StaticFileTest.test_static_if_modified_since_time_zonec                 C   s0   |   d¡}|  t|j d¡ƒd| j d ¡ d S )Nræ  r   ó   ")rø  rk   r   rØ   rP   ré  r§   r7   r7   r8   Útest_static_etagà  s    
ÿzStaticFileTest.test_static_etagc                 C   s|   | j dddid}|  |jd¡ |  |jd¡ |  t|j d¡ƒd| j d ¡ |  |j d	¡d
¡ |  |j d¡d¡ d S )Nræ  ÚRangez	bytes=0-9rÝ   éÎ   s
   User-agentr   r	  rü  Ú10úContent-Rangezbytes 0-9/26)rø  rk   r¤   r¡   r   rØ   rP   ré  r§   r7   r7   r8   Útest_static_with_rangeæ  s    ÿÿz%StaticFileTest.test_static_with_rangec                 C   sš   | j dddid}|  |jd¡ tj | jd¡}t|ƒ&}|  |jt	| 
¡ ƒ¡ W d   ƒ n1 sd0    Y  |  |j d¡d¡ |  |j d	¡d ¡ d S )
Nræ  r  zbytes=0-rÝ   rœ   ú
robots.txtrü  Ú26r  ©rø  rk   r¤   r1   r2   r3   Ú
static_dirÚopenr¡   r   ÚreadrØ   rP   ©r?   r¨   Zrobots_file_pathÚfr7   r7   r8   Ú test_static_with_range_full_fileò  s    ÿ
4z/StaticFileTest.test_static_with_range_full_filec                 C   sš   | j dddid}|  |jd¡ tj | jd¡}t|ƒ&}|  |jt	| 
¡ ƒ¡ W d   ƒ n1 sd0    Y  |  |j d¡d¡ |  |j d	¡d ¡ d S )
Nræ  r  zbytes=0-10000000rÝ   rœ   r  rü  r  r  r  r  r7   r7   r8   Ú$test_static_with_range_full_past_endÿ  s    ÿ
4z3StaticFileTest.test_static_with_range_full_past_endc                 C   s¢   | j dddid}|  |jd¡ tj | jd¡}t|ƒ.}|  |jt	| 
¡ dd … ƒ¡ W d   ƒ n1 sl0    Y  |  |j d¡d	¡ |  |j d
¡d¡ d S )Nræ  r  zbytes=1-10000000rÝ   r  r  rd   rü  Z25r  zbytes 1-25/26r  r  r7   r7   r8   Ú'test_static_with_range_partial_past_end
  s    ÿ
<z6StaticFileTest.test_static_with_range_partial_past_endc                 C   sL   | j dddid}|  |jd¡ |  |j d¡d¡ |  |j d¡d	¡ d S )
Nræ  r  z	bytes=22-rÝ   ó   : /
rü  rg  r  úbytes 22-25/26©rø  rk   r¡   rØ   rP   r§   r7   r7   r8   Útest_static_with_range_end_edge  s    ÿz.StaticFileTest.test_static_with_range_end_edgec                 C   sL   | j dddid}|  |jd¡ |  |j d¡d¡ |  |j d¡d	¡ d S )
Nræ  r  zbytes=-4rÝ   r  rü  rg  r  r  r  r§   r7   r7   r8   Útest_static_with_range_neg_end  s    ÿz-StaticFileTest.test_static_with_range_neg_endc                 C   sš   | j dddid}|  |jd¡ tj | jd¡}t|ƒ&}|  |jt	| 
¡ ƒ¡ W d   ƒ n1 sd0    Y  |  |j d¡d¡ |  |j d	¡d ¡ d S )
Nræ  r  zbytes=-1000000rÝ   rœ   r  rü  r  r  r  r  r7   r7   r8   Ú%test_static_with_range_neg_past_start%  s    ÿ
4z4StaticFileTest.test_static_with_range_neg_past_startc                 C   s$   | j dddid}|  |jd¡ d S )Nræ  r  r­   rÝ   rœ   r  r§   r7   r7   r8   Útest_static_invalid_range0  s    z(StaticFileTest.test_static_invalid_rangec                 C   s8   | j dddid}|  |j d¡d¡ |  |jd¡ d S )Nræ  r  zbytes=-0rÝ   r  ú
bytes */26é   )rø  rk   rØ   rP   r¤   r§   r7   r7   r8   Ú+test_static_unsatisfiable_range_zero_suffix4  s
    ÿz:StaticFileTest.test_static_unsatisfiable_range_zero_suffixc                 C   s8   | j dddid}|  |jd¡ |  |j d¡d¡ d S )Nræ  r  zbytes=26rÝ   r#  r  r"  ©rø  rk   r¤   rØ   rP   r§   r7   r7   r8   Ú-test_static_unsatisfiable_range_invalid_start;  s
    ÿz<StaticFileTest.test_static_unsatisfiable_range_invalid_startc                 C   s8   | j dddid}|  |jd¡ |  |j d¡d¡ d S )Nræ  r  z
bytes=10-3rÝ   r#  r  r"  r%  r§   r7   r7   r8   Ú3test_static_unsatisfiable_range_end_less_than_startB  s
    ÿzBStaticFileTest.test_static_unsatisfiable_range_end_less_than_startc                 C   s`   | j ddd}|  |jd¡ |  |jd¡ |  |jd d¡ |  t|jd ƒd	| j d	 ¡ d S )
Nræ  rñ  ©r    rœ   rž   rü  r  r   r	  ©r¢   rk   r¤   r¡   rØ   r   ré  r§   r7   r7   r8   Útest_static_headI  s    ÿzStaticFileTest.test_static_headc                 C   sf   | j ddddid}|  |jd¡ |  |jd¡ |  |jd d	¡ |  t|jd
 ƒd| j d ¡ d S )Nræ  rñ  r  ú	bytes=1-4)r    rØ   r  rž   rü  rg  r   r	  r)  r§   r7   r7   r8   Útest_static_head_rangeS  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+  r	  )r  rÿ  rÝ   rû  rž   rü  r   )rø  ré  rk   r¤   r¡   rv   rØ   r   r§   r7   r7   r8   Útest_static_range_if_none_match^  s    þþÿz.StaticFileTest.test_static_range_if_none_matchc                 C   s   |   d¡}|  |jd¡ d S )Nz/static/blargé”  r  r§   r7   r7   r8   Útest_static_404m  s    
zStaticFileTest.test_static_404c                 C   sX   | j  ¡  tƒ | _ ttdƒ |  d¡}W d   ƒ n1 s<0    Y  |  |jd¡ d S )Nz.*not in root static directoryz/static/../static_foo.txté“  )Úhttp_clientr%  r   r   r   rø  rk   r¤   r§   r7   r7   r8   Útest_path_traversal_protectionq  s
    
(z-StaticFileTest.test_path_traversal_protectionÚposixznon-posix OSc                 C   sF   t j t j t j t¡¡d¡}|  dtj 	|¡ ¡}|  
|jd¡ d S )Nrí  z/root_staticrœ   )r1   r2   r3   r4   Úabspathr5   rø  r¬  r­  r»   rk   r¤   )r?   r2   r¨   r7   r7   r8   Útest_root_static_path~  s
    ÿz$StaticFileTest.test_root_static_pathN)/rC   rD   rE   ré  r1   r2   r3   r4   r5   r  r;   r<   rç  rè  rê  rë  rì  rî  rð  rï  rø  rþ  r  r  r  r  r
  r  r  r  r  r  r  r   r!  r$  r&  r'  r*  r,  r-  r/  r2  ÚunittestZskipIfr\   r5  r7   r7   r7   r8   rÖ  2  sL   ÿ%	

rÖ  c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚStaticDefaultFilenameTestc                 C   s   t tdƒt dddS ©Nr×  z
index.html)Údefault_filename)rã  Zstatic_handler_argsrä  r>   r7   r7   r8   r<   Œ  s    þz(StaticDefaultFilenameTest.get_app_kwargsc                 C   s   g S r0   r7   r>   r7   r7   r8   r;   ’  s    z&StaticDefaultFilenameTest.get_handlersc                 C   s.   | j ddd}|  |jd¡ |  d|j¡ d S )Nú/static/dir/Fr  rœ   s   this is the index
©r¢   rk   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 )Nz/static/dirFr  r£  r  r:  )r¢   rk   r¤   rv   rØ   Úendswithr§   r7   r7   r8   Útest_static_default_redirectš  s    z6StaticDefaultFilenameTest.test_static_default_redirectN)rC   rD   rE   r<   r;   r<  r>  r7   r7   r7   r8   r7  ‹  s   r7  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚStaticFileWithPathTestc                 C   s   t tdƒt dddS r8  rä  r>   r7   r7   r8   r<   ¡  s    þ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;   §  s    z#StaticFileWithPathTest.get_handlersc                 C   s   |   d¡}|  |jd¡ d S )Nz/foo/utf8.htmls   HÃ©llo
rß   r§   r7   r7   r8   Ú
test_serveª  s    
z!StaticFileWithPathTest.test_serveN)rC   rD   rE   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	S )
Ú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Ú.rd   z/static/%s.%s.%s)Úget_versionÚrindex)ÚclsrU   r2   Zversion_hashÚextension_indexZbefore_versionZafter_versionr7   r7   r8   Úmake_static_url²  s    
ýzNCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.make_static_urlc                 S   s4   |  d¡}|  dd|¡}d|d |… ||d … f S )NrB  r   z%s%s)rD  )r?   Zurl_pathrF  Zversion_indexr7   r7   r8   Úparse_url_path¾  s    
zMCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.parse_url_pathc                 S   s   d| S )NzCustomStaticFileTest:r7   ©rE  rU   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Ç  s    zUCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.validate_absolute_pathNc                 S   s0   |d u r|d u sJ ‚|dkr dS t d| ƒ‚d S )NúCustomStaticFileTest:foo.txtrc   ú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  ƒ‚d S )NrN  rã   rO  )rL  r.  r>   r7   r7   r8   Úget_content_sizeÑ  s    
zOCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_content_sizec                 S   s   d S r0   r7   r>   r7   r7   r8   Úget_modified_timeÖ  s    zPCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_modified_timec                 S   s   dS )NÚ42r7   rI  r7   r7   r8   rC  Ù  s    zJCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_version)NN)rC   rD   rE   ÚclassmethodrG  rH  rJ  rM  rR  rS  rT  rC  r7   r7   r7   r8   ÚMyStaticFileHandler±  s   

rW  c                   @   s   e Zd Zdd„ ZdS )z;CustomStaticFileTest.get_handlers.<locals>.StaticUrlHandlerc                 S   s   |   |  |¡¡ d S r0   )rO   rÙ  r“   r7   r7   r8   rP   Þ  s    z?CustomStaticFileTest.get_handlers.<locals>.StaticUrlHandler.getNrQ   r7   r7   r7   r8   rÚ  Ý  s   rÚ  râ  )r   r   Ústatic_handler_class)r?   rW  rÚ  r7   r7   r8   r;   °  s    ,z!CustomStaticFileTest.get_handlersc                 C   s   t d| jdS )NÚdummy)rã  rX  )rY   rX  r>   r7   r7   r8   r<   å  s    z#CustomStaticFileTest.get_app_kwargsc                 C   s   |   d¡}|  |jd¡ d S )Nz/static/foo.42.txtrc   rß   r§   r7   r7   r8   r@  è  s    
zCustomStaticFileTest.test_servec                 C   sJ   t tddd( |  d¡}|  |jd¡ W d   ƒ n1 s<0    Y  d S )NzCould not open static fileF)Úrequiredz/static_url/foo.txts   /static/foo.42.txt)r   r   r¢   rk   r¡   r§   r7   r7   r8   rê  ì  s    
z$CustomStaticFileTest.test_static_urlN)rC   rD   rE   r;   r<   r@  rê  r7   r7   r7   r8   rA  ¯  s   5rA  c                   @   s,   e Zd ZG dd„ deƒZdd„ Zdd„ ZdS )ÚHostMatchingTestc                   @   s   e Zd Zdd„ Zdd„ ZdS )zHostMatchingTest.Handlerc                 C   s
   || _ d S r0   )Úreply)r?   r\  r7   r7   r8   r  ô  s    z#HostMatchingTest.Handler.initializec                 C   s   |   | j¡ d S r0   )rO   r\  r>   r7   r7   r8   rP   ÷  s    zHostMatchingTest.Handler.getN)rC   rD   rE   r  rP   r7   r7   r7   r8   rJ   ó  s   rJ   c                 C   s   dt jddifgS )Nrµ   r\  Zwildcard)r[  rJ   r>   r7   r7   r8   r;   ú  s    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[  rJ   r¢   rk   r¡   r¤   r§   r7   r7   r8   Útest_host_matchingý  s4    ÿÿÿÿ


z#HostMatchingTest.test_host_matchingN)rC   rD   rE   r   rJ   r;   ri  r7   r7   r7   r8   r[  ò  s   r[  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚDefaultHostMatchingTestc                 C   s   g S r0   r7   r>   r7   r7   r8   r;     s    z$DefaultHostMatchingTest.get_handlersc                 C   s   ddiS )NÚdefault_hostr]  r7   r>   r7   r7   r8   r<      s    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`  ra  zwww.test.comrb  rc  re  rf  r.  z	X-Real-Ipr  rÝ   rg  )	r=   rh  r[  rJ   r¢   rk   r¡   r¤   rk  r§   r7   r7   r8   Útest_default_host_matching#  s(    ÿÿÿ



z2DefaultHostMatchingTest.test_default_host_matchingN)rC   rD   rE   r;   r<   rl  r7   r7   r7   r8   rj    s   rj  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚNamedURLSpecGroupsTestc                 C   s    G dd„ dt ƒ}d|fd|fgS )Nc                   @   s   e Zd Zdd„ ZdS )z8NamedURLSpecGroupsTest.get_handlers.<locals>.EchoHandlerc                 S   s   |   |¡ d S r0   rN   r“   r7   r7   r8   rP   A  s    z<NamedURLSpecGroupsTest.get_handlers.<locals>.EchoHandler.getNrQ   r7   r7   r7   r8   r'  @  s   r'  z/str/(?P<path>.*)z/unicode/(?P<path>.*)rš   )r?   r'  r7   r7   r8   r;   ?  s    þz#NamedURLSpecGroupsTest.get_handlersc                 C   s4   |   d¡}|  |jd¡ |   d¡}|  |jd¡ d S )Nz/str/foos   fooz/unicode/barrc   rß   r§   r7   r7   r8   Útest_named_urlspec_groupsI  s    

z0NamedURLSpecGroupsTest.test_named_urlspec_groupsN)rC   rD   rE   r;   rn  r7   r7   r7   r8   rm  >  s   
rm  c                   @   s$   e Zd ZG dd„ deƒZdd„ ZdS )ÚClearHeaderTestc                   @   s   e Zd Zdd„ ZdS )zClearHeaderTest.Handlerc                 C   s0   |   dd¡ |   dd¡ |  d¡ |  d¡ d S )NÚh1rb   Úh2rÃ   Znonexistent)rh  Zclear_headerr>   r7   r7   r8   rP   S  s    
zClearHeaderTest.Handler.getNrQ   r7   r7   r7   r8   rJ   R  s   rJ   c                 C   s0   |   d¡}|  d|jv¡ |  |jd d¡ d S )NrH   rp  rq  rÃ   )r¢   rv   rØ   rk   r§   r7   r7   r8   Útest_clear_headerY  s    
z!ClearHeaderTest.test_clear_headerN)rC   rD   rE   r   rJ   rr  r7   r7   r7   r8   ro  Q  s   ro  c                   @   s$   e Zd ZG dd„ deƒZdd„ ZdS )ÚHeader204Testc                   @   s   e Zd Zdd„ ZdS )zHeader204Test.Handlerc                 C   s   |   d¡ |  ¡  d S )NéÌ   )Ú
set_statusr‰   r>   r7   r7   r8   rP   a  s    
zHeader204Test.Handler.getNrQ   r7   r7   r7   r8   rJ   `  s   rJ   c                 C   s8   |   d¡}|  |jd¡ |  d|j¡ |  d|j¡ d S )NrH   rt  rü  úTransfer-Encoding)r¢   rk   r¤   r¹  rØ   r§   r7   r7   r8   Útest_204_headerse  s    
zHeader204Test.test_204_headersN)rC   rD   rE   r   rJ   rw  r7   r7   r7   r8   rs  _  s   rs  c                   @   s$   e Zd ZG dd„ deƒZdd„ ZdS )ÚHeader304Testc                   @   s   e Zd Zdd„ ZdS )zHeader304Test.Handlerc                 C   s   |   dd¡ |  d¡ d S )NúContent-LanguageÚen_USrM   )rh  rO   r>   r7   r7   r8   rP   n  s    zHeader304Test.Handler.getNrQ   r7   r7   r7   r8   rJ   m  s   rJ   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 )NrH   rü  Ú5ry  rz  rÿ  r   rÝ   rû  rv  )r¢   rk   rØ   r¤   rv   rý  r7   r7   r8   Útest_304_headersr  s    
ÿzHeader304Test.test_304_headersN)rC   rD   rE   r   rJ   r|  r7   r7   r7   r8   rx  l  s   rx  c                   @   s,   e Zd ZG dd„ deƒZdd„ Zdd„ ZdS )ÚStatusReasonTestc                   @   s   e Zd Zdd„ ZdS )zStatusReasonTest.Handlerc                 C   s<   | j j dg ¡}| jt|  d¡ƒ|r0t|d ƒnd d d S )NÚreasonr¤   r   ©r~  )r+  r,  rP   ru  rF  rG  r   )r?   r~  r7   r7   r8   rP   ƒ  s
    þzStatusReasonTest.Handler.getNrQ   r7   r7   r7   r8   rJ   ‚  s   rJ   c                 C   s   t ƒ S r0   r   r>   r7   r7   r8   Úget_http_clientŠ  s    z StatusReasonTest.get_http_clientc                 C   sœ   |   d¡}|  |jd¡ |  |jd¡ |   d¡}|  |jd¡ |  |jd¡ |   d¡}|  |jd¡ |  |jd¡ |   d	¡}|  |jd¡ |  |jd
¡ d S )Nz
/?code=304rû  zNot Modifiedz/?code=304&reason=FooÚFooz/?code=682&reason=Baréª  ÚBarz
/?code=682ÚUnknown)r¢   rk   r¤   r~  r§   r7   r7   r8   Útest_statusŽ  s    



zStatusReasonTest.test_statusN)rC   rD   rE   r   rJ   r€  r…  r7   r7   r7   r8   r}    s   r}  c                   @   s$   e Zd ZG dd„ deƒZdd„ ZdS )ÚDateHeaderTestc                   @   s   e Zd Zdd„ ZdS )zDateHeaderTest.Handlerc                 C   s   |   d¡ d S rL   rN   r>   r7   r7   r8   rP   Ÿ  s    zDateHeaderTest.Handler.getNrQ   r7   r7   r7   r8   rJ   ž  s   rJ   c                 C   s^   |   d¡}tj |jd ¡}|d us(J ‚tj|d d… Ž }|  |tj ¡  tjddk ¡ d S )NrH   ÚDaterò   rp   )Úseconds)	r¢   rö   r÷   rø   rØ   ró   rv   rô   rõ   )r?   r¨   rý   Zheader_dater7   r7   r8   Útest_date_header¢  s    
ÿzDateHeaderTest.test_date_headerN)rC   rD   rE   r   rJ   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                   @   s   e Zd Zdd„ ZdS )zRaiseWithReasonTest.Handlerc                 C   s   t ddd‚d S )Nr‚  r  r  ©r    r>   r7   r7   r8   rP   ®  s    zRaiseWithReasonTest.Handler.getNrQ   r7   r7   r7   r8   rJ   ­  s   rJ   c                 C   s   t ƒ S r0   r   r>   r7   r7   r8   r€  ±  s    z#RaiseWithReasonTest.get_http_clientc                 C   s8   |   d¡}|  |jd¡ |  |jd¡ |  d|j¡ d S )NrH   r‚  r  s   682: Foo)r¢   rk   r¤   r~  ÚassertInr¡   r§   r7   r7   r8   Útest_raise_with_reasonµ  s    
z*RaiseWithReasonTest.test_raise_with_reasonc                 C   s   |   ttdddƒd¡ d S )Nr‚  r  r  zHTTP 682: Foo©rk   r¬   r    r>   r7   r7   r8   Útest_httperror_str»  s    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)	rC   rD   rE   r   rJ   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	S )
ÚErrorHandlerXSRFTestc                 C   s   dt tddfgS )Nú/erroré¡  ©rÆ  )r"   rY   r>   r7   r7   r8   r;   Ã  s    z!ErrorHandlerXSRFTest.get_handlersc                 C   s
   t ddS ©NT)Úxsrf_cookiesr›   r>   r7   r7   r8   r<   É  s    z#ErrorHandlerXSRFTest.get_app_kwargsc                 C   s"   | j dddd}|  |jd¡ d S )Nr’  r   r³  rŸ   r“  r¤  r§   r7   r7   r8   Útest_error_xsrfÌ  s    z$ErrorHandlerXSRFTest.test_error_xsrfc                 C   s"   | j dddd}|  |jd¡ d S )Nz/404r   r³  rŸ   r.  r¤  r§   r7   r7   r8   Útest_404_xsrfÐ  s    z"ErrorHandlerXSRFTest.test_404_xsrfN)rC   rD   rE   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                   @   s   e Zd Zdd„ ZdS )zGzipTestCase.Handlerc                 C   s4   |   d¡D ]}|  d|¡ q
|  ddtj  ¡ d S )NÚvaryr¶  zhello worldú!)r/  ri  rO   r.   Z
MIN_LENGTH)r?   Úvr7   r7   r8   rP   ×  s    zGzipTestCase.Handler.getNrQ   r7   r7   r7   r8   rJ   Ö  s   rJ   c                 C   s   t dtj tj t¡d¡dS )NTr×  )r·  rã  )rY   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·  )rk   rØ   rP   r§   r7   r7   r8   Úassert_compressedâ  s    ÿüzGzipTestCase.assert_compressedc                 C   s*   |   d¡}|  |¡ |  |jd d¡ d S )NrH   r¶  rµ  ©r¢   r  rk   rØ   r§   r7   r7   r8   Ú	test_gzipì  s    

zGzipTestCase.test_gzipc                 C   s*   |   d¡}|  |¡ |  |jd d¡ d S )Nrå  r¶  rµ  rž  r§   r7   r7   r8   Útest_gzip_staticñ  s    

zGzipTestCase.test_gzip_staticc                 C   s2   | j ddd}|  d|j¡ |  |jd d¡ d S )NrH   F)Zuse_gzipr¸  r¶  rµ  )r¢   r¹  rØ   rk   r§   r7   r7   r8   Útest_gzip_not_requestedø  s    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   s   g | ]}|  ¡ ‘qS r7   ©Ústrip©Ú.0r#  r7   r7   r8   Ú
<listcomp>  rž   z:GzipTestCase.test_vary_already_present.<locals>.<listcomp>r¶  ú,úAccept-Languagerµ  ©r¢   r  rk   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   s   g | ]}|  ¡ ‘qS r7   r¢  r¤  r7   r7   r8   r¦  
  rž   zCGzipTestCase.test_vary_already_present_multiple.<locals>.<listcomp>r¶  r§  )r¨  rÛ   rµ  r©  r§   r7   r7   r8   Ú"test_vary_already_present_multiple  s    

þz/GzipTestCase.test_vary_already_present_multipleN)rC   rD   rE   r   rJ   r<   r  rŸ  r   r¡  r«  r¬  r7   r7   r7   r8   r™  Õ  s   
r™  c                   @   s4   e Zd ZG dd„ deƒZdd„ Zdd„ Zdd„ Zd	S )
ÚPathArgsInPrepareTestc                   @   s   e Zd Zdd„ Zdd„ ZdS )zPathArgsInPrepareTest.Handlerc                 C   s   |   t| j| jd¡ d S )N©r*  r‘  )rO   rY   r)  Zpath_kwargsr>   r7   r7   r8   rM    s    z%PathArgsInPrepareTest.Handler.preparec                 C   s   |dksJ ‚|   ¡  d S )Nrb   ©r‰   r“   r7   r7   r8   rP     s    z!PathArgsInPrepareTest.Handler.getN©rC   rD   rE   rM  rP   r7   r7   r7   r8   rJ     s   rJ   c                 C   s   d| j fd| j fgS )Nz	/pos/(.*)z/kw/(?P<path>.*)rI   r>   r7   r7   r8   r;     s    z"PathArgsInPrepareTest.get_handlersc                 C   s4   |   d¡}| ¡  t|jƒ}|  |dgi dœ¡ d S )Nz/pos/foorb   r®  r”  ©r?   r¨   rç   r7   r7   r8   Útest_pos  s    

zPathArgsInPrepareTest.test_posc                 C   s6   |   d¡}| ¡  t|jƒ}|  |g ddidœ¡ d S )Nz/kw/foor2   rb   r®  r”  r±  r7   r7   r8   Útest_kw!  s    

zPathArgsInPrepareTest.test_kwN)rC   rD   rE   r   rJ   r;   r²  r³  r7   r7   r7   r8   r­    s   r­  c                   @   s$   e Zd ZG dd„ deƒZdd„ ZdS )ÚClearAllCookiesTestc                   @   s   e Zd Zdd„ ZdS )zClearAllCookiesTest.Handlerc                 C   s   |   ¡  |  d¡ d S ©NÚok)Zclear_all_cookiesrO   r>   r7   r7   r8   rP   *  s    zClearAllCookiesTest.Handler.getNrQ   r7   r7   r7   r8   rJ   )  s   rJ   c                 C   sj   | j dddid}t|j d¡ƒ}|  |d  d¡p@|d  d¡¡ |  |d	  d
¡pb|d	  d¡¡ d S )NrH   rÛ   zfoo=bar; baz=xyzzyrÝ   rÖ   r   zbaz=;zbaz="";rd   zfoo=;zfoo="";)r¢   r×   rØ   rÙ   rv   rõ  )r?   r¨   Zset_cookiesr7   r7   r8   Útest_clear_all_cookies.  s    ÿÿz*ClearAllCookiesTest.test_clear_all_cookiesN)rC   rD   rE   r   rJ   r·  r7   r7   r7   r8   r´  (  s   r´  c                   @   s   e Zd ZdS )ÚPermissionErrorN©rC   rD   rE   r7   r7   r7   r8   r¸  :  s   r¸  c                   @   s4   e Zd ZG dd„ deƒZdd„ Zdd„ Zdd„ Zd	S )
ÚExceptionHandlerTestc                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )zExceptionHandlerTest.Handlerc                 C   sD   |   d¡}|dkrtddƒ‚n"|dkr0dd  n|dkr@td	ƒ‚d S )
NÚexcÚhttpéš  zno longer hereZzerord   r   Z
permissionznot allowed)rG  r    r¸  )r?   r»  r7   r7   r8   rP   @  s    

z ExceptionHandlerTest.Handler.getc                 K   sP   d|v r8|d \}}}t |tƒr8|  d¡ |  d¡ d S tj| |fi |¤Ž d S )NrÄ  r0  r¸  )Ú
isinstancer¸  ru  rO   r   rÇ  )r?   rÆ  r‘  Útypr^   Útbr7   r7   r8   rÇ  I  s    


z(ExceptionHandlerTest.Handler.write_errorc                 C   s2   t |tƒrt d|jd ¡ nt | |||¡ d S )Nz&custom logging for PermissionError: %sr   )r¾  r¸  r   Úwarningr*  r   Úlog_exception©r?   r¿  r^   rÀ  r7   r7   r8   rÂ  R  s    
z*ExceptionHandlerTest.Handler.log_exceptionN)rC   rD   rE   rP   rÇ  rÂ  r7   r7   r7   r8   rJ   ?  s   		rJ   c                 C   sF   t tdƒ( |  d¡}|  |jd¡ W d   ƒ n1 s80    Y  d S )Nz.*no longer herez
/?exc=httpr½  r—  r§   r7   r7   r8   Útest_http_errorX  s    
z$ExceptionHandlerTest.test_http_errorc                 C   sF   t tdƒ( |  d¡}|  |jd¡ W d   ƒ n1 s80    Y  d S )NrÐ  z
/?exc=zeror  ©r   r   r¢   rk   r¤   r§   r7   r7   r8   Útest_unknown_error_  s    
z'ExceptionHandlerTest.test_unknown_errorc                 C   sF   t tdƒ( |  d¡}|  |jd¡ W d   ƒ n1 s80    Y  d S )Nz/custom logging for PermissionError: not allowedz/?exc=permissionr0  rÅ  r§   r7   r7   r8   Útest_known_errore  s    
z%ExceptionHandlerTest.test_known_errorN)rC   rD   rE   r   rJ   rÄ  rÆ  rÇ  r7   r7   r7   r8   rº  >  s   rº  c                   @   s$   e Zd ZG dd„ deƒZdd„ ZdS )ÚBuggyLoggingTestc                   @   s   e Zd Zdd„ Zdd„ ZdS )zBuggyLoggingTest.Handlerc                 C   s   dd  d S rÊ  r7   r>   r7   r7   r8   rP   o  s    zBuggyLoggingTest.Handler.getc                 C   s   dd  d S rÊ  r7   rÃ  r7   r7   r8   rÂ  r  s    z&BuggyLoggingTest.Handler.log_exceptionN)rC   rD   rE   rP   rÂ  r7   r7   r7   r8   rJ   n  s   rJ   c                 C   s8   t tdƒ |  d¡ W d   ƒ n1 s*0    Y  d S )Nz.*rH   )r   r   r¢   r>   r7   r7   r8   Útest_buggy_log_exceptionu  s    z)BuggyLoggingTest.test_buggy_log_exceptionN)rC   rD   rE   r   rJ   rÉ  r7   r7   r7   r8   rÈ  m  s   rÈ  c                       s@   e Zd ZdZG dd„ deƒZdd„ Z‡ fdd„Zdd	„ Z‡  Z	S )
ÚUIMethodUIModuleTestz`Test that UI methods and modules are created correctly and
    associated with the handler.
    c                   @   s   e Zd Zdd„ Zdd„ ZdS )zUIMethodUIModuleTest.Handlerc                 C   s   |   d¡ d S r•   r_  r>   r7   r7   r8   rP   ‚  s    z UIMethodUIModuleTest.Handler.getc                 C   s
   |   d¡S )Nr^   )rG  r>   r7   r7   r8   r^   …  s    z"UIMethodUIModuleTest.Handler.valueN)rC   rD   rE   rP   r^   r7   r7   r7   r8   rJ     s   rJ   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.)r^   )rn   Úxr7   r7   r8   Úmy_ui_method‰  s    z9UIMethodUIModuleTest.get_app_kwargs.<locals>.my_ui_methodc                   @   s   e Zd Zdd„ ZdS )z5UIMethodUIModuleTest.get_app_kwargs.<locals>.MyModulec                 S   s   d|t  tj| j¡ ¡ f S )Nz&In MyModule(%s) with handler value %s.)ÚtypingÚcastrÊ  rJ   rn   r^   )r?   rË  r7   r7   r8   r–     s    þz<UIMethodUIModuleTest.get_app_kwargs.<locals>.MyModule.renderN©rC   rD   rE   r–   r7   r7   r7   r8   ÚMyModuleŒ  s   rÐ  r‘   z1{{ my_ui_method(42) }} {% module MyModule(123) %}rÌ  )r{  Z
ui_methodsÚ
ui_modules©r)   r   rY   )r?   rÌ  rÐ  r}  r7   r7   r8   r<   ˆ  s    ÿýz#UIMethodUIModuleTest.get_app_kwargsc                    s   t ƒ  ¡  tj ¡  d S r0   r~  r>   r‚  r7   r8   r€  œ  s    
zUIMethodUIModuleTest.tearDownc                 C   s   |   d¡}|  |jd¡ d S )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¡  s
    
þz#UIMethodUIModuleTest.test_ui_method)
rC   rD   rE   rF   r   rJ   r<   r€  rÓ  r»  r7   r7   r‚  r8   rÊ  |  s
   rÊ  c                   @   s$   e Zd ZG dd„ deƒZdd„ ZdS )ÚGetArgumentErrorTestc                   @   s   e Zd Zdd„ ZdS )zGetArgumentErrorTest.Handlerc              
   C   sV   z|   d¡ |  i ¡ W n8 tyP } z |  |j|jdœ¡ W Y d }~n
d }~0 0 d S )Nrb   ©Úarg_nameÚlog_message)rG  rO   r!   rÖ  r×  rs  r7   r7   r8   rP   ¬  s
    
z GetArgumentErrorTest.Handler.getNrQ   r7   r7   r7   r8   rJ   «  s   rJ   c                 C   s&   |   d¡}|  t|jƒdddœ¡ d S )NrH   rb   zMissing argument foorÕ  )r¢   rk   r   r¡   r§   r7   r7   r8   Útest_catch_error³  s
    
þz%GetArgumentErrorTest.test_catch_errorN)rC   rD   rE   r   rJ   rØ  r7   r7   r7   r8   rÔ  ª  s   rÔ  c                   @   s$   e Zd ZG dd„ deƒZdd„ ZdS )ÚSetLazyPropertiesTestc                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
zSetLazyPropertiesTest.Handlerc                 C   s   d| _ t d¡| _d S )NZBenrz  )Úcurrent_userr   rP   r>   r7   r7   r8   rM  ½  s    z%SetLazyPropertiesTest.Handler.preparec                 C   s
   t ƒ ‚d S r0   rA   r>   r7   r7   r8   Úget_user_localeÁ  s    z-SetLazyPropertiesTest.Handler.get_user_localec                 C   s
   t ƒ ‚d S r0   rA   r>   r7   r7   r8   Úget_current_userÄ  s    z.SetLazyPropertiesTest.Handler.get_current_userc                 C   s   |   d| j| jjf ¡ d S )NzHello %s (%s))rO   rÚ  r   r¤   r>   r7   r7   r8   rP   Ç  s    z!SetLazyPropertiesTest.Handler.getN)rC   rD   rE   rM  rÛ  rÜ  rP   r7   r7   r7   r8   rJ   ¼  s   rJ   c                 C   s   |   d¡}|  |jd¡ d S )NrH   s   Hello Ben (en_US)rß   r§   r7   r7   r8   Útest_set_propertiesÊ  s    
z)SetLazyPropertiesTest.test_set_propertiesN)rC   rD   rE   r   rJ   rÝ  r7   r7   r7   r8   rÙ  »  s   rÙ  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                   @   s   e Zd Zdd„ ZdS )z<GetCurrentUserTest.get_app_kwargs.<locals>.WithoutUserModulec                 S   s   dS )Nr³  r7   r>   r7   r7   r8   r–   Ô  s    zCGetCurrentUserTest.get_app_kwargs.<locals>.WithoutUserModule.renderNrÏ  r7   r7   r7   r8   ÚWithoutUserModuleÓ  s   rß  c                   @   s   e Zd Zdd„ ZdS )z9GetCurrentUserTest.get_app_kwargs.<locals>.WithUserModulec                 S   s
   t | jƒS r0   )r¬   rÚ  r>   r7   r7   r8   r–   Ø  s    z@GetCurrentUserTest.get_app_kwargs.<locals>.WithUserModule.renderNrÏ  r7   r7   r7   r8   ÚWithUserModule×  s   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{  rÑ  rÒ  )r?   rß  rà  r}  r7   r7   r8   r<   Ò  s    üÿþþz!GetCurrentUserTest.get_app_kwargsc                    s   t ƒ  ¡  tj ¡  d S r0   r~  r>   r‚  r7   r8   r€  ë  s    
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                   @   s   e Zd Zdd„ Zdd„ ZdS )z;GetCurrentUserTest.get_handlers.<locals>.CurrentUserHandlerc                 S   s
   d| _ d S )NF©Úhas_loaded_current_userr>   r7   r7   r8   rM  ñ  s    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)rC   rD   rE   rM  rÜ  r7   r7   r7   r8   ÚCurrentUserHandlerð  s   rç  c                   @   s   e Zd Zdd„ ZdS )z;GetCurrentUserTest.get_handlers.<locals>.WithoutUserHandlerc                 S   s   |   d¡ |  t| jƒ¡ d S )Nrá  ©Zrender_stringr‰   r¬   ræ  r>   r7   r7   r8   rP   ù  s    
z?GetCurrentUserTest.get_handlers.<locals>.WithoutUserHandler.getNrQ   r7   r7   r7   r8   ÚWithoutUserHandlerø  s   ré  c                   @   s   e Zd Zdd„ ZdS )z8GetCurrentUserTest.get_handlers.<locals>.WithUserHandlerc                 S   s   |   d¡ |  t| jƒ¡ d S )Nrâ  rè  r>   r7   r7   r8   rP   þ  s    
z<GetCurrentUserTest.get_handlers.<locals>.WithUserHandler.getNrQ   r7   r7   r7   r8   ÚWithUserHandlerý  s   rê  c                   @   s   e Zd Zdd„ ZdS )zAGetCurrentUserTest.get_handlers.<locals>.CurrentUserModuleHandlerc                 S   s   | j S r0   )Zuir>   r7   r7   r8   Úget_template_namespace  s    zXGetCurrentUserTest.get_handlers.<locals>.CurrentUserModuleHandler.get_template_namespaceN)rC   rD   rE   rë  r7   r7   r7   r8   ÚCurrentUserModuleHandler  s   rì  c                   @   s   e Zd Zdd„ ZdS )zAGetCurrentUserTest.get_handlers.<locals>.WithoutUserModuleHandlerc                 S   s   |   d¡ |  t| jƒ¡ d S )Nrã  rè  r>   r7   r7   r8   rP   
  s    
zEGetCurrentUserTest.get_handlers.<locals>.WithoutUserModuleHandler.getNrQ   r7   r7   r7   r8   ÚWithoutUserModuleHandler	  s   rí  c                   @   s   e Zd Zdd„ ZdS )z>GetCurrentUserTest.get_handlers.<locals>.WithUserModuleHandlerc                 S   s   |   d¡ |  t| jƒ¡ d S )Nrä  rè  r>   r7   r7   r8   rP     s    
zBGetCurrentUserTest.get_handlers.<locals>.WithUserModuleHandler.getNrQ   r7   r7   r7   r8   ÚWithUserModuleHandler  s   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   s   |   d¡}|  |jd¡ d S )Nrï  ó   Falserß   r§   r7   r7   r8   Útest_get_current_user_is_lazy  s    
z0GetCurrentUserTest.test_get_current_user_is_lazyc                 C   s   |   d¡}|  |jd¡ d S )Nrð  ó   Truerß   r§   r7   r7   r8   Útest_get_current_user_works   s    
z.GetCurrentUserTest.test_get_current_user_worksc                 C   s   |   d¡}|  |jd¡ d S )Nrñ  ró  rß   r§   r7   r7   r8   Ú,test_get_current_user_from_ui_module_is_lazy$  s    
z?GetCurrentUserTest.test_get_current_user_from_ui_module_is_lazyc                 C   s   |   d¡}|  |jd¡ d S )Nrò  rõ  rß   r§   r7   r7   r8   Ú*test_get_current_user_from_ui_module_works(  s    
z=GetCurrentUserTest.test_get_current_user_from_ui_module_works)rC   rD   rE   r<   r€  r;   r6  Úskiprô  rö  r÷  rø  r»  r7   r7   r‚  r8   rÞ  Ñ  s   +
rÞ  c                   @   s$   e Zd ZG dd„ deƒZdd„ ZdS )ÚUnimplementedHTTPMethodsTestc                   @   s   e Zd ZdS )z$UnimplementedHTTPMethodsTest.HandlerNr¹  r7   r7   r7   r8   rJ   .  s   rJ   c                 C   sR   dD ] }| j d|d}|  |jd¡ qdD ]"}| j d|dd}|  |jd¡ q*d S )N)rñ  rò  ÚDELETEÚOPTIONSrH   r(  é•  ©r   ÚPUTrž   rŸ   r¤  )r?   r    r¨   r7   r7   r8   Ú#test_unimplemented_standard_methods1  s    z@UnimplementedHTTPMethodsTest.test_unimplemented_standard_methodsN)rC   rD   rE   r   rJ   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S )Ú#UnimplementedNonStandardMethodsTestc                   @   s   e Zd Zdd„ ZdS )z+UnimplementedNonStandardMethodsTest.Handlerc                 C   s   |   d¡ d S ©NÚotherrN   r>   r7   r7   r8   r  <  s    z1UnimplementedNonStandardMethodsTest.Handler.otherN)rC   rD   rE   r  r7   r7   r7   r8   rJ   ;  s   rJ   c                 C   s"   | j dddd}|  |jd¡ d S )NrH   ÚPATCHrž   rŸ   rý  r¤  r§   r7   r7   r8   Útest_unimplemented_patchA  s    z<UnimplementedNonStandardMethodsTest.test_unimplemented_patchc                 C   s"   | j dddd}|  |jd¡ d S )NrH   ÚOTHERT©r    Zallow_nonstandard_methodsrý  r¤  r§   r7   r7   r8   Útest_unimplemented_otherG  s    z<UnimplementedNonStandardMethodsTest.test_unimplemented_otherN)rC   rD   rE   r   rJ   r  r  r7   r7   r7   r8   r  :  s   r  c                   @   s$   e Zd ZG dd„ deƒZdd„ ZdS )Ú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   )r+  r    rO   r>   r7   r7   r8   r    N  s    z!AllHTTPMethodsTest.Handler.methodN)	rC   rD   rE   r    rP   ÚdeleteÚoptionsrŽ   Úputr7   r7   r7   r8   rJ   M  s   rJ   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|ƒ¡ qJd S )NrH   rñ  r(  rž   )rò  rû  rü  rþ  rŸ   )r¢   rk   r¡   r   )r?   r¨   r    r7   r7   r8   Útest_standard_methodsT  s    z(AllHTTPMethodsTest.test_standard_methodsN)rC   rD   rE   r   rJ   r  r7   r7   r7   r8   r	  L  s   r	  c                   @   s,   e Zd ZG dd„ deƒZdd„ Zdd„ ZdS )ÚPatchMethodTestc                   @   s&   e Zd Zejd Zdd„ Zdd„ ZdS )zPatchMethodTest.Handler)r  c                 C   s   |   d¡ d S )NÚpatchrN   r>   r7   r7   r8   r  e  s    zPatchMethodTest.Handler.patchc                 C   s   |   d¡ d S r  rN   r>   r7   r7   r8   r  h  s    zPatchMethodTest.Handler.otherN)rC   rD   rE   r   ZSUPPORTED_METHODSr  r  r7   r7   r7   r8   rJ   `  s   
rJ   c                 C   s"   | j dddd}|  |jd¡ d S )NrH   r  rž   rŸ   s   patchrß   r§   r7   r7   r8   Ú
test_patchk  s    zPatchMethodTest.test_patchc                 C   s"   | j dddd}|  |jd¡ d S )NrH   r  Tr  s   otherrß   r§   r7   r7   r8   Ú
test_othero  s    zPatchMethodTest.test_otherN)rC   rD   rE   r   rJ   r  r  r7   r7   r7   r8   r  _  s   r  c                   @   s$   e Zd ZG dd„ deƒZdd„ ZdS )ÚFinishInPrepareTestc                   @   s   e Zd Zdd„ Zdd„ ZdS )zFinishInPrepareTest.Handlerc                 C   s   |   d¡ d S )Nr¦   r¯  r>   r7   r7   r8   rM  v  s    z#FinishInPrepareTest.Handler.preparec                 C   s   t dƒ‚d S )Nzshould not reach this methodrË  r>   r7   r7   r8   rP   y  s    zFinishInPrepareTest.Handler.getNr°  r7   r7   r7   r8   rJ   u  s   rJ   c                 C   s   |   d¡}|  |jd¡ d S )NrH   s   donerß   r§   r7   r7   r8   Útest_finish_in_prepare  s    
z*FinishInPrepareTest.test_finish_in_prepareN)rC   rD   rE   r   rJ   r  r7   r7   r7   r8   r  t  s   
r  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚDefault404Testc                 C   s
   dt fgS ©Nrµ   rš   r>   r7   r7   r8   r;   …  s    zDefault404Test.get_handlersc                 C   s*   |   d¡}|  |jd¡ |  |jd¡ d S )NrH   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)rC   rD   rE   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S )ÚCustom404Testc                 C   s
   dt fgS r  rš   r>   r7   r7   r8   r;   ”  s    zCustom404Test.get_handlersc                 C   s   G dd„ dt ƒ}t|dS )Nc                   @   s   e Zd Zdd„ ZdS )z6Custom404Test.get_app_kwargs.<locals>.Custom404Handlerc                 S   s   |   d¡ |  d¡ d S )Nr.  zcustom 404 response)ru  rO   r>   r7   r7   r8   rP   ™  s    
z:Custom404Test.get_app_kwargs.<locals>.Custom404Handler.getNrQ   r7   r7   r7   r8   ÚCustom404Handler˜  s   r  )Údefault_handler_class)r   rY   )r?   r  r7   r7   r8   r<   —  s    zCustom404Test.get_app_kwargsc                 C   s*   |   d¡}|  |jd¡ |  |jd¡ d S )NrH   r.  s   custom 404 responser;  r§   r7   r7   r8   r  Ÿ  s    
zCustom404Test.test_404N)rC   rD   rE   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S )ÚDefaultHandlerArgumentsTestc                 C   s
   dt fgS r  rš   r>   r7   r7   r8   r;   ¦  s    z(DefaultHandlerArgumentsTest.get_handlersc                 C   s   t tt dddS )Nr0  r”  )r  Zdefault_handler_args)rY   r"   r>   r7   r7   r8   r<   ©  s    þz*DefaultHandlerArgumentsTest.get_app_kwargsc                 C   s   |   d¡}|  |jd¡ d S )NrH   r0  r¤  r§   r7   r7   r8   Útest_403¯  s    
z$DefaultHandlerArgumentsTest.test_403N)rC   rD   rE   r;   r<   r  r7   r7   r7   r8   r  ¥  s   r  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚHandlerByNameTestc                 C   s   dt fdtddƒgS )Nú/hello1)ú/hello2ú"tornado.test.web_test.HelloHandlerú/hello3r  )rK   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)rC   rD   rE   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                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
zCStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandlerc                 S   s
   || _ d S r0   r‹   r  r7   r7   r8   r  Ê  s    zNStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.initializec                 S   s   | j j d ¡ d S r0   )rŒ   ÚpreparedÚ
set_resultr>   r7   r7   r8   rM  Í  s    zKStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.preparec                 S   s   | j j |¡ d S r0   )rŒ   rç   r&  ©r?   rç   r7   r7   r8   Údata_receivedÐ  s    zQStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.data_receivedc                 S   s   | j j d ¡ |  i ¡ d S r0   )rŒ   Úfinishedr&  rO   r>   r7   r7   r8   rP   Ó  s    zGStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.getN)rC   rD   rE   r  rM  r(  rP   r7   r7   r7   r8   ÚStreamingBodyHandlerÈ  s   r*  c                   @   s   e Zd Zdd„ ZdS )zAStreamingRequestBodyTest.get_handlers.<locals>.EarlyReturnHandlerc                 S   s   t dƒ‚d S )Né‘  r‹  r>   r7   r7   r8   rM  Ù  s    zIStreamingRequestBodyTest.get_handlers.<locals>.EarlyReturnHandler.prepareNrw  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   s
   || _ d S r0   r‹   r  r7   r7   r8   r  à  s    zOStreamingRequestBodyTest.get_handlers.<locals>.CloseDetectionHandler.initializec                    s   t ƒ  ¡  | jj d ¡ d S r0   )r  r  rŒ   Úclose_futurer&  r>   r‚  r7   r8   r  ã  s    
zXStreamingRequestBodyTest.get_handlers.<locals>.CloseDetectionHandler.on_connection_close)rC   rD   rE   r  r  r»  r7   r7   r‚  r8   ÚCloseDetectionHandlerÞ  s   r.  z/stream_bodyr‹   z/early_returnz/close_detection)r+   r   rY   )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 ¡ |rL| d¡ | d¡ |S )Nr   r  s   GET s    HTTP/1.1
s   Connection: close
s   Transfer-Encoding: chunked

)r  r  r  r  r   r   rO   )r?   r$   Úconnection_closer#  r!  r7   r7   r8   r  í  s    

z StreamingRequestBodyTest.connectc                 c   sª   t ƒ | _t ƒ | _t ƒ | _| jddd}| jV  | d¡ | jV }|  |d¡ t ƒ | _| d¡ | jV }|  |d¡ | d¡ | jV  | ¡ V }|  | 	d	¡¡ | 
¡  d S )
Ns   /stream_bodyT©r/  ó	   4
asdf
s   asdfs	   4
qwer
s   qwers   0

s   {})r   r%  rç   r)  r  rO   rk   Úread_until_closerv   r=  r%  ©r?   r!  rç   r7   r7   r8   Útest_streaming_bodyø  s"    



z,StreamingRequestBodyTest.test_streaming_bodyc                 c   s,   | j ddd}| ¡ V }|  | d¡¡ d S )Nó   /early_returnFr0  ó   HTTP/1.1 401)r  r2  rv   rõ  r3  r7   r7   r8   Útest_early_return	  s    
z*StreamingRequestBodyTest.test_early_returnc                 c   s6   | j ddd}| d¡ | ¡ V }|  | d¡¡ d S )Nr5  Fr0  r1  r6  )r  rO   r2  rv   rõ  r3  r7   r7   r8   Útest_early_return_with_data	  s    

z4StreamingRequestBodyTest.test_early_return_with_datac                 c   s*   t ƒ | _| jddd}| ¡  | jV  d S )Ns   /close_detectionFr0  )r   r-  r  r%  )r?   r!  r7   r7   r8   Útest_close_during_upload	  s    z1StreamingRequestBodyTest.test_close_during_uploadN)
rC   rD   rE   r;   r  r   r4  r7  r8  r9  r7   r7   r7   r8   r$  Æ  s   &


r$  c                   @   s>   e Zd Zdd„ Zejdd„ ƒZejdd„ ƒZ	ejdd„ ƒZ
d	S )
ÚBaseFlowControlHandlerc                 C   s   || _ d | _g | _d S r0   )rŒ   r    Úmethodsr  r7   r7   r8   r  *	  s    z!BaseFlowControlHandler.initializec                 c   sP   | j d ur | j d|| j f ¡ || _ | j |¡ zd V  W d | _ nd | _ 0 d S )Nzentered method %s while in %s)r    rŒ   Úfailr;  Úappendrv  r7   r7   r8   Ú	in_method/	  s    
z BaseFlowControlHandler.in_methodc                 c   s   | j  d¡ tjV  d S )NrM  )r;  r=  r   Úmomentr>   r7   r7   r8   rM  :	  s    zBaseFlowControlHandler.preparec                 c   sH   |   d¡ tjV  W d   ƒ n1 s(0    Y  |  t| jd¡ d S )NrŽ   ©r;  )r>  r   r?  rO   rY   r;  r>   r7   r7   r8   rŽ   A	  s    &zBaseFlowControlHandler.postN)rC   rD   rE   r  Ú
contextlibÚcontextmanagerr>  r   r   rM  rŽ   r7   r7   r7   r8   r:  (	  s   


r:  c                   @   sL   e Zd Zdd„ Zdd„ Zejdœdd„Zejdœdd	„Zejdœd
d„Z	dS )Ú#BaseStreamingRequestFlowControlTestc                 C   s   t dddS )NrÄ   T)Ú
chunk_sizeZdecompress_requestr›   r>   r7   r7   r8   Úget_httpserver_optionsI	  s    z:BaseStreamingRequestFlowControlTest.get_httpserver_optionsc                 C   s   t ƒ S r0   r   r>   r7   r7   r8   r€  N	  s    z3BaseStreamingRequestFlowControlTest.get_http_clientr>   c                 C   s8   | j dddd}| ¡  |  t|jƒtg d¢d¡ d S )NrH   Úabcdefghijklmnopqrstuvwxyzr   )r¡   r    ©rM  r(  r(  r(  rŽ   r@  )r¢   r  rk   r   r¡   rY   r§   r7   r7   r8   Útest_flow_control_fixed_bodyS	  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   )rO   Úi©Úchunksr7   r8   Úbody_producerf	  s    zYBaseStreamingRequestFlowControlTest.test_flow_control_chunked_body.<locals>.body_producerrH   r   )rL  r    rG  r@  )r   r   r¢   r  rk   r   r¡   rY   )r?   rL  r¨   r7   rJ  r8   Útest_flow_control_chunked_bodyc	  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   abcdefghijklmnopqrstuvwxyzrH   r   r¸  r·  )r¡   r    rØ   rG  r@  )r/   r·  ÚGzipFilerO   r%  Úgetvaluer¢   r  rk   r   r¡   rY   )r?   ZbytesioZ	gzip_fileZcompressed_bodyr¨   r7   r7   r8   Ú!test_flow_control_compressed_bodyz	  s$    
üÿþzEBaseStreamingRequestFlowControlTest.test_flow_control_compressed_bodyN)
rC   rD   rE   rE  r€  rÍ  ÚAnyrH  rM  rS  r7   r7   r7   r8   rC  H	  s
   rC  c                   @   s   e Zd Zdd„ ZdS )Ú(DecoratedStreamingRequestFlowControlTestc                 C   s"   G dd„ dt ƒ}d|t| dfgS )Nc                   @   s   e Zd Zejdd„ ƒZdS )zZDecoratedStreamingRequestFlowControlTest.get_handlers.<locals>.DecoratedFlowControlHandlerc                 s   s6   |   d¡ tjV  W d   ƒ n1 s(0    Y  d S )Nr(  )r>  r   r?  r'  r7   r7   r8   r(  š	  s    zhDecoratedStreamingRequestFlowControlTest.get_handlers.<locals>.DecoratedFlowControlHandler.data_receivedN)rC   rD   rE   r   r   r(  r7   r7   r7   r8   ÚDecoratedFlowControlHandler™	  s   rV  rH   r‹   ©r:  rY   )r?   rV  r7   r7   r8   r;   ˜	  s    z5DecoratedStreamingRequestFlowControlTest.get_handlersN©rC   rD   rE   r;   r7   r7   r7   r8   rU  •	  s   rU  c                   @   s   e Zd Zdd„ ZdS )Ú%NativeStreamingRequestFlowControlTestc                 C   s"   G dd„ dt ƒ}d|t| dfgS )Nc                   @   s   e Zd Zdd„ ZdS )zTNativeStreamingRequestFlowControlTest.get_handlers.<locals>.NativeFlowControlHandlerc                 Ó   sF   |   d¡( dd l}| d¡I d H  W d   ƒ n1 s80    Y  d S )Nr(  r   )r>  Úasyncior  )r?   rç   rZ  r7   r7   r8   r(  §	  s    zbNativeStreamingRequestFlowControlTest.get_handlers.<locals>.NativeFlowControlHandler.data_receivedN)rC   rD   rE   r(  r7   r7   r7   r8   ÚNativeFlowControlHandler¦	  s   r[  rH   r‹   rW  )r?   r[  r7   r7   r8   r;   ¥	  s    z2NativeStreamingRequestFlowControlTest.get_handlersNrX  r7   r7   r7   r8   rY  ¢	  s   rY  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚIncorrectContentLengthTestc                    sB   | ‰ d | _ G ‡ fdd„dtƒ}G ‡ fdd„dtƒ}d|fd|fgS )Nc                       s   e Zd Z‡ fdd„ZdS )z8IncorrectContentLengthTest.get_handlers.<locals>.TooHighc              
      sL   |   dd¡ z|  d¡ W n, tyF } z|ˆ _‚ W Y d }~n
d }~0 0 d S )Nrü  rU  r¶  ©rh  r‰   r.  Úserver_errorrs  r‹   r7   r8   rP   ·	  s    z<IncorrectContentLengthTest.get_handlers.<locals>.TooHigh.getNrQ   r7   r‹   r7   r8   ÚTooHigh¶	  s   r_  c                       s   e Zd Z‡ fdd„ZdS )z7IncorrectContentLengthTest.get_handlers.<locals>.TooLowc              
      sL   |   dd¡ z|  d¡ W n, tyF } z|ˆ _‚ W Y d }~n
d }~0 0 d S )Nrü  r   rM   r]  rs  r‹   r7   r8   rP   À	  s    z;IncorrectContentLengthTest.get_handlers.<locals>.TooLow.getNrQ   r7   r‹   r7   r8   ÚTooLow¿	  s   r`  ú/highú/low)r^  r   )r?   r_  r`  r7   r‹   r8   r;   ±	  s
    		z'IncorrectContentLengthTest.get_handlersc              
   C   s¢   t tdƒr t tdƒH |  t¡ | jddd W d   ƒ n1 sF0    Y  W d   ƒ n1 sd0    Y  W d   ƒ n1 s‚0    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)ra  T©Zraise_errorz0Tried to write 40 bytes less than Content-Length©	r   r   r   ÚassertRaisesr
   r¢   rk   r¬   r^  r>   r7   r7   r8   Útest_content_length_too_highÊ	  s    þh
ÿz7IncorrectContentLengthTest.test_content_length_too_highc              
   C   s¢   t tdƒr t tdƒH |  t¡ | jddd W d   ƒ n1 sF0    Y  W d   ƒ n1 sd0    Y  W d   ƒ n1 s‚0    Y  |  t| jƒd¡ d S )Nrc  rd  rb  Tre  z,Tried to write more data than Content-Lengthrf  r>   r7   r7   r8   Útest_content_length_too_lowÚ	  s    þh
ÿz6IncorrectContentLengthTest.test_content_length_too_lowN)rC   rD   rE   r;   rh  ri  r7   r7   r7   r8   r\  °	  s   r\  c                   @   s$   e Zd ZG dd„ deƒZdd„ ZdS )ÚClientCloseTestc                   @   s   e Zd Zdd„ ZdS )zClientCloseTest.Handlerc                 C   s6   | j j d¡r(| j jj ¡  |  d¡ n
|  d¡ d S )NzHTTP/1rM   úrequires HTTP/1.x)r+  rf   rõ  Ú
connectionr!  r%  rO   r>   r7   r7   r8   rP   í	  s    zClientCloseTest.Handler.getNrQ   r7   r7   r7   r8   rJ   ì	  s   rJ   c                 C   sd   |   ttjf¡@ | jddd}|jdkr4|  d¡ |  |jd¡ W d   ƒ n1 sV0    Y  d S )NrH   Tre  s   requires HTTP/1.xrk  iW  )	rg  r
   r6  ZSkipTestr¢   r¡   ZskipTestrk   r¤   r§   r7   r7   r8   Útest_client_closeú	  s
    

z!ClientCloseTest.test_client_closeN)rC   rD   rE   r   rJ   rm  r7   r7   r7   r8   rj  ë	  s   rj  c                   @   s|   e Zd ZdZddddœZdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚSignedValueTestzIt's a secret to everybodyZ	asdfbasdfZ12312312Z2342342)r   rd   rp   c                 C   s   |   ¡ d S )Ni 0* )Úpresentr>   r7   r7   r8   Úpast
  s    zSignedValueTest.pastc                 C   s   dS )Ni m|Mr7   r>   r7   r7   r8   ro  	
  s    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 )Nr0  r^   rd   )rf   Úclocks<   dmFsdWU=|1300000000|31c934969f53e48164c50768b40cbd7e2daaaa4frp   se   2|1:0|10:1300000000|3:key|8:dmFsdWU=|3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e152©rq  )rh   rq  ó   value)r&   rn  ÚSECRETro  rk   r'   )r?   Z	signed_v1Z	signed_v2Zsigned_defaultZ
decoded_v1Z
decoded_v2r7   r7   r8   Útest_known_values
  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Úkey1r^   rr  Úkey2)r&   rn  rt  ro  r'   ÚassertIs)r?   Zsigned1Zsigned2Zdecoded1Zdecoded2r7   r7   r8   Útest_name_swap,
  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 )Nrv  r^   rr  rs  )r&   rn  rt  rp  r'   rk   ro  rx  )r?   ÚsignedZdecoded_pastZdecoded_presentr7   r7   r8   Útest_expired=
  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 ©Nrs  r0  rr  ©r'   rn  rt  ro  )Úprefix©r?   ry   r7   r8   ÚvalidateN
  s    ÿ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=|©rv   ZassertFalse©r?   r  r7   r€  r8   Útest_payload_tamperingJ
  s    z&SignedValueTest.test_payload_tamperingc                    sj   d‰ ‡ ‡fdd„}ˆ  |dƒ¡ ˆ |dƒ¡ ˆ |dƒ¡ ˆ |dƒ¡ ˆ |dƒ¡ ˆ |d	ƒ¡ d S )
Nr‚  c                    s   dt tjdˆ |  ˆjdkS r}  r~  )ry   ©r  r?   r7   r8   r  ^
  s    ÿz:SignedValueTest.test_signature_tampering.<locals>.validater|  Z 00000000000000000000000000000000Z@4d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e152Z@3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e153Z?3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e15ZA3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e1538rƒ  r„  r7   r†  r8   Útest_signature_tampering[
  s(    ÿÿÿÿÿÿz(SignedValueTest.test_signature_tamperingc                 C   s<   d}t tjd|| jd}ttjd|| jd}|  ||¡ d S )Nr{   r0  rr  )r&   rn  rt  ro  r'   rk   ©r?   r^   rz  Údecodedr7   r7   r8   Útest_non_ascii{
  s    ÿÿzSignedValueTest.test_non_asciic                 C   s>   d}t tjd|| jdd}ttjd|| jd}|  ||¡ d S ©Nr{   r0  r   ©rq  rW   rr  ©r&   rn  ÚSECRET_DICTro  r'   rk   rˆ  r7   r7   r8   Ú*test_key_versioning_read_write_default_key…
  s    ÿÿz:SignedValueTest.test_key_versioning_read_write_default_keyc                 C   s>   d}t tjd|| jdd}ttjd|| jd}|  ||¡ d S )Nr{   r0  rd   rŒ  rr  r  rˆ  r7   r7   r8   Ú.test_key_versioning_read_write_non_default_key
  s    ÿÿ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&   rn  rŽ  ro  r…   r†   r'   rk   )r?   r^   rz  Znewkeysr‰  r7   r7   r8   Útest_key_versioning_invalid_key™
  s    ÿ

z/SignedValueTest.test_key_versioning_invalid_keyc                 C   s2   d}t tjd|| jdd}t|ƒ}|  d|¡ d S )Nr{   r0  rd   rŒ  )r&   rn  rŽ  ro  r(   rk   )r?   r^   rz  rW   r7   r7   r8   Útest_key_version_retrieval£
  s    ÿz*SignedValueTest.test_key_version_retrievalN)rC   rD   rE   rt  rŽ  rp  ro  ru  ry  r{  r…  r‡  rŠ  r  r  r‘  r’  r7   r7   r7   r8   rn  
  s     



rn  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                   @   s   e Zd Zdd„ Zdd„ ZdS )zXSRFTest.Handlerc                 C   s*   t |  dd¡ƒ}|| jd< |  | j¡ d S )Nrf   r   Zxsrf_cookie_version)rF  rG  rU   rO   r@  )r?   rf   r7   r7   r8   rP   ®
  s    
zXSRFTest.Handler.getc                 C   s   |   d¡ d S rµ  rN   r>   r7   r7   r8   rŽ   µ
  s    zXSRFTest.Handler.postN©rC   rD   rE   rP   rŽ   r7   r7   r7   r8   rJ   ­
  s   rJ   c                 C   s
   t ddS r•  r›   r>   r7   r7   r8   r<   ¸
  s    zXSRFTest.get_app_kwargsc                    s   t ƒ  ¡  |  ¡ | _d S r0   ©r  ÚsetUpÚ	get_tokenr@  r>   r‚  r7   r8   r–  »
  s    
zXSRFTest.setUpNc                 C   sH   |d ur|   |¡}nd }| j|d u r(dnd| |d}| ¡  t|jƒS )NrH   z/?version=%drÝ   ©Úcookie_headersr¢   r  r   r¡   )r?   Ú	old_tokenrf   rØ   r¨   r7   r7   r8   r—  ¿
  s    ÿzXSRFTest.get_tokenc                 C   s   |d u r| j }dd| iS )NrÛ   z_xsrf=©r@  ©r?   Útokenr7   r7   r8   r™  Ê
  s    zXSRFTest.cookie_headersc                 C   sL   t tdƒ  | jdddd}W d   ƒ n1 s00    Y  |  |jd¡ d S ©Nú.*'_xsrf' argument missingrH   r   rž   rŸ   r0  r—  r§   r7   r7   r8   Útest_xsrf_fail_no_tokenÏ
  s    .z XSRFTest.test_xsrf_fail_no_tokenc              	   C   s\   t tdƒ0 | jddtj t| jd¡d}W d   ƒ n1 s@0    Y  |  |j	d¡ d S ©Nú!.*XSRF cookie does not match POSTrH   r   ©Z_xsrfrŸ   r0  ©
r   r   r¢   r¬  r­  r®  rY   r@  rk   r¤   r§   r7   r7   r8   Útest_xsrf_fail_body_no_cookieÔ
  s    ý$z&XSRFTest.test_xsrf_fail_body_no_cookiec              
   C   s`   t tdƒ4 | jdd|  ¡ tj tdd¡d}W d   ƒ n1 sD0    Y  |  |j	d¡ d S )Nz%.*'_xsrf' argument has invalid formatrH   r   ú3|r£  r’  r0  )
r   r   r¢   r™  r¬  r­  r®  rY   rk   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 sJ0    Y  |  	|j
d¡ d S )	Nr¢  rH   r   r¦  ©r  r£  r’  r0  )r   r   r¢   r™  r¬  r­  r®  rY   r@  rk   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 s60    Y  |  |jd¡ d S )NrŸ  rH   r   rž   ©r    r¡   rØ   r0  )r   r   r¢   r™  rk   r¤   r§   r7   r7   r8   Útest_xsrf_fail_cookie_no_bodyñ
  s
    ÿ$z&XSRFTest.test_xsrf_fail_cookie_no_bodyc                 C   s:   | j ddtj tdd¡| jddd}|  |jd¡ d S )NrH   r   Zdeadbeefr£  r¨  rª  rœ   ©r¢   r¬  r­  r®  rY   r™  rk   r¤   r§   r7   r7   r8   Útest_xsrf_success_short_tokenø
  s    
üz&XSRFTest.test_xsrf_success_short_tokenc                 C   s:   | j ddtj tdd¡| jddd}|  |jd¡ d S )NrH   r   Zxoxor£  r¨  rª  rœ   r¬  r§   r7   r7   r8   Útest_xsrf_success_non_hex_token  s    
üz(XSRFTest.test_xsrf_success_non_hex_tokenc                 C   s8   | j ddtj t| jd¡|  ¡ d}|  |jd¡ d S ©NrH   r   r£  rª  rœ   ©	r¢   r¬  r­  r®  rY   r@  r™  rk   r¤   r§   r7   r7   r8   Útest_xsrf_success_post_body
  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 )NrH   r   rž   zX-Xsrftokenrª  rœ   )r¢   rY   r@  r™  rk   r¤   r§   r7   r7   r8   Útest_xsrf_success_header  s    ÿþü	z!XSRFTest.test_xsrf_success_headerc                 C   s:   d}t ƒ }t|ƒD ]}| |  ¡ ¡ q|  t|ƒ|¡ d S )NrÄ   )r"  Úrangerö  r—  rk   rä   )r?   Z
NUM_TOKENSÚtokensrI  r7   r7   r8   Útest_distinct_tokens(  s
    zXSRFTest.test_distinct_tokensc              
   C   sÌ   |   ¡ }| j|fD ]8}| jddtj t|d¡|  |¡d}|  |j	d¡ q| j|f|| jffD ]f\}}t
tdƒ6 | jddtj t|d¡|  |¡d}W d   ƒ n1 s®0    Y  |  |j	d¡ q`d S )NrH   r   r£  rª  rœ   r¢  r0  )r—  r@  r¢   r¬  r­  r®  rY   r™  rk   r¤   r   r   )r?   Ztoken2r  r¨   Úcookie_tokenÚ
body_tokenr7   r7   r8   Útest_cross_user0  s(    üþü$zXSRFTest.test_cross_userc              	   C   s|   | j }t|gƒ}tdƒD ]N}|  |¡}| |¡ | jddtj t	| j d¡|  
|¡d}|  |jd¡ q|  t|ƒd¡ d S )Né   rH   r   r£  rª  rœ   rò   )r@  r"  r´  r—  rö  r¢   r¬  r­  r®  rY   r™  rk   r¤   rä   )r?   r  Ztokens_seenrI  r¨   r7   r7   r8   Útest_refresh_tokenI  s    


üzXSRFTest.test_refresh_tokenc              	   C   sÆ   |   | jdd| jdd¡ | jdd}tdƒD ]}|  | j|dd|¡ q0|  |¡}|   ||¡ |   ||  |¡¡ ||f||ffD ]<\}}| jddtj t|d¡|  	|¡d}|  |j
d¡ q„d S )	Nrd   re   rº  rH   r   r£  rª  rœ   )ZassertNotEqualr—  r´  rk   r¢   r¬  r­  r®  rY   r™  r¤   )r?   Zv1_tokenrI  Zv2_tokenr·  r¸  r¨   r7   r7   r8   Útest_versioning]  s    
üzXSRFTest.test_versioning)NN)N)rC   rD   rE   r   rJ   r<   r–  r—  r™  r   r¥  r§  r©  r«  r­  r®  r±  r²  r³  r¶  r¹  r»  r¼  r»  r7   r7   r‚  r8   r“  ¬
  s&   

	

				r“  c                       s`   e Zd ZG dd„ deƒZdd„ Z‡ fdd„Zddd	„Zdd
d„Zdd„ Z	dd„ Z
dd„ Z‡  ZS )ÚXSRFCookieNameTestc                   @   s   e Zd Zdd„ Zdd„ ZdS )zXSRFCookieNameTest.Handlerc                 C   s   |   | j¡ d S r0   ©rO   r@  r>   r7   r7   r8   rP   z  s    zXSRFCookieNameTest.Handler.getc                 C   s   |   d¡ d S rµ  rN   r>   r7   r7   r8   rŽ   }  s    zXSRFCookieNameTest.Handler.postNr”  r7   r7   r7   r8   rJ   y  s   rJ   c                 C   s   t ddddidS )NTz__Host-xsrfrÈ   )r–  Zxsrf_cookie_nameÚxsrf_cookie_kwargsr›   r>   r7   r7   r8   r<   €  s
    ýz!XSRFCookieNameTest.get_app_kwargsc                    s   t ƒ  ¡  |  ¡ | _d S r0   r•  r>   r‚  r7   r8   r–  ‡  s    
zXSRFCookieNameTest.setUpNc                 C   s8   |d ur|   |¡}nd }| jd|d}| ¡  t|jƒS )NrH   rÝ   r˜  )r?   rš  rØ   r¨   r7   r7   r8   r—  ‹  s    zXSRFCookieNameTest.get_tokenc                 C   s   |d u r| j }dd| iS )NrÛ   z__Host-xsrf=r›  rœ  r7   r7   r8   r™  ”  s    z!XSRFCookieNameTest.cookie_headersc                 C   sL   t tdƒ  | jdddd}W d   ƒ n1 s00    Y  |  |jd¡ d S rž  r—  r§   r7   r7   r8   r   ™  s    .z*XSRFCookieNameTest.test_xsrf_fail_no_tokenc              	   C   s\   t tdƒ0 | jddtj t| jd¡d}W d   ƒ n1 s@0    Y  |  |j	d¡ d S r¡  r¤  r§   r7   r7   r8   r¥  ž  s    ý$z0XSRFCookieNameTest.test_xsrf_fail_body_no_cookiec                 C   s8   | j ddtj t| jd¡|  ¡ d}|  |jd¡ d S r¯  r°  r§   r7   r7   r8   r±  §  s    ûz.XSRFCookieNameTest.test_xsrf_success_post_body)N)N)rC   rD   rE   r   rJ   r<   r–  r—  r™  r   r¥  r±  r»  r7   r7   r‚  r8   r½  x  s   
	
	r½  c                   @   s,   e Zd ZG dd„ deƒZdd„ Zdd„ ZdS )ÚXSRFCookieKwargsTestc                   @   s   e Zd Zdd„ ZdS )zXSRFCookieKwargsTest.Handlerc                 C   s   |   | j¡ d S r0   r¾  r>   r7   r7   r8   rP   ´  s    z XSRFCookieKwargsTest.Handler.getNrQ   r7   r7   r7   r8   rJ   ³  s   rJ   c                 C   s   t dt ddddS )NTrp   )rÉ   r_   )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sNJ ‚t d|¡}|d usfJ ‚tj ¡ tj	dd }t
j | ¡ d ¡}|d usœJ ‚tj|d d	… Ž }|  t||  ¡ ƒd
k ¡ d S )NrH   z	httponly;rÖ   zexpires=z.*; expires=(?P<expires>.+);.*rp   rï   rñ   rò   rÄ   )r¢   rŒ  rØ   rÿ   rP   rs   rt   ró   rô   rõ   rö   r÷   rø   rù   rv   rú   rû   rü   r7   r7   r8   Útest_xsrf_httponly¼  s    
z'XSRFCookieKwargsTest.test_xsrf_httponlyN)rC   rD   rE   r   rJ   r<   rÁ  r7   r7   r7   r8   rÀ  ²  s   rÀ  c                   @   s$   e Zd ZG dd„ deƒZdd„ ZdS )ÚFinishExceptionTestc                   @   s   e Zd Zdd„ ZdS )zFinishExceptionTest.Handlerc                 C   s@   |   d¡ |  dd¡ |  dd¡r,tdƒ‚n|  d¡ tƒ ‚d S )Nr+  úWWW-AuthenticateúBasic realm="something"Zfinish_valuer³  zauthentication required)ru  rh  rG  r*   rO   r>   r7   r7   r8   rP   Î  s    


zFinishExceptionTest.Handler.getNrQ   r7   r7   r7   r8   rJ   Í  s   rJ   c                 C   sH   dD ]>}|   |¡}|  |jd¡ |  d|j d¡¡ |  d|j¡ qd S )N)rH   z/?finish_value=1r+  rÄ  rÃ  s   authentication required)r¢   rk   r¤   rØ   rP   r¡   )r?   Úur¨   r7   r7   r8   Útest_finish_exception×  s    
ÿz)FinishExceptionTest.test_finish_exceptionN)rC   rD   rE   r   rJ   rÆ  r7   r7   r7   r8   rÂ  Ì  s   
rÂ  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚDecoratorTestc                 C   s0   G dd„ dt ƒ}G dd„ dt ƒ}d|fd|fgS )Nc                   @   s   e Zd Zedd„ ƒZdS )z6DecoratorTest.get_handlers.<locals>.RemoveSlashHandlerc                 S   s   d S r0   r7   r>   r7   r7   r8   rP   ä  s    z:DecoratorTest.get_handlers.<locals>.RemoveSlashHandler.getN)rC   rD   rE   r,   rP   r7   r7   r7   r8   ÚRemoveSlashHandlerã  s   rÈ  c                   @   s   e Zd Zedd„ ƒZdS )z3DecoratorTest.get_handlers.<locals>.AddSlashHandlerc                 S   s   d S r0   r7   r>   r7   r7   r8   rP   é  s    z7DecoratorTest.get_handlers.<locals>.AddSlashHandler.getN)rC   rD   rE   r-   rP   r7   r7   r7   r8   ÚAddSlashHandlerè  s   rÉ  ú/removeslash/ú	/addslashrš   )r?   rÈ  rÉ  r7   r7   r8   r;   â  s    zDecoratorTest.get_handlersc                 C   s`   | j ddd}|  |jd¡ |  |jd d¡ | j ddd}|  |jd¡ |  |jd d¡ d S )	NrÊ  Fr  r£  r  z/removeslashz/removeslash/?foo=barz/removeslash?foo=barr¦  r§   r7   r7   r8   Útest_removeslashï  s    zDecoratorTest.test_removeslashc                 C   s`   | j ddd}|  |jd¡ |  |jd d¡ | j ddd}|  |jd¡ |  |jd d¡ d S )	NrË  Fr  r£  r  z
/addslash/z/addslash?foo=barz/addslash/?foo=barr¦  r§   r7   r7   r8   Útest_addslashø  s    zDecoratorTest.test_addslashN)rC   rD   rE   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                   @   s   e Zd Zdd„ Zdd„ ZdS )z+CacheTest.get_handlers.<locals>.EtagHandlerc                 S   s   |   |¡ d S r0   rN   )r?   Úcomputed_etagr7   r7   r8   rP     s    z/CacheTest.get_handlers.<locals>.EtagHandler.getc                 S   s
   | j d S r  )Z_write_bufferr>   r7   r7   r8   Úcompute_etag  s    z8CacheTest.get_handlers.<locals>.EtagHandler.compute_etagN)rC   rD   rE   rP   rÐ  r7   r7   r7   r8   ÚEtagHandler  s   rÑ  z
/etag/(.*)rš   )r?   rÑ  r7   r7   r8   r;     s    zCacheTest.get_handlersc                 C   s   d}d}|   ||d¡ d S )Nú"xyzzy"Ú*rû  ©Ú
_test_etag©r?   rÏ  Úetagsr7   r7   r8   Útest_wildcard_etag  s    zCacheTest.test_wildcard_etagc                 C   s   d}d}|   ||d¡ d S )NrÒ  rû  rÔ  rÖ  r7   r7   r8   Útest_strong_etag_match  s    z CacheTest.test_strong_etag_matchc                 C   s   d}d}|   ||d¡ d S )Nú"xyzzy1"ú"xyzzy1", "xyzzy2"rû  rÔ  rÖ  r7   r7   r8   Útest_multiple_strong_etag_match  s    z)CacheTest.test_multiple_strong_etag_matchc                 C   s   d}d}|   ||d¡ d S )NrÒ  rÚ  rœ   rÔ  rÖ  r7   r7   r8   Útest_strong_etag_not_match  s    z$CacheTest.test_strong_etag_not_matchc                 C   s   d}d}|   ||d¡ d S )NrÒ  rÛ  rœ   rÔ  rÖ  r7   r7   r8   Ú#test_multiple_strong_etag_not_match!  s    z-CacheTest.test_multiple_strong_etag_not_matchc                 C   s   d}d}|   ||d¡ d S )NrÚ  ú
W/"xyzzy1"rû  rÔ  rÖ  r7   r7   r8   Útest_weak_etag_match&  s    zCacheTest.test_weak_etag_matchc                 C   s   d}d}|   ||d¡ d S )Nú"xyzzy2"úW/"xyzzy1", W/"xyzzy2"rû  rÔ  rÖ  r7   r7   r8   Útest_multiple_weak_etag_match+  s    z'CacheTest.test_multiple_weak_etag_matchc                 C   s   d}d}|   ||d¡ d S )Nrá  rß  rœ   rÔ  rÖ  r7   r7   r8   Útest_weak_etag_not_match0  s    z"CacheTest.test_weak_etag_not_matchc                 C   s   d}d}|   ||d¡ d S )Nz"xyzzy3"râ  rœ   rÔ  rÖ  r7   r7   r8   Ú!test_multiple_weak_etag_not_match5  s    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Õ  :  s    ÿzCacheTest._test_etagN)rC   rD   rE   r;   rØ  rÙ  rÜ  rÝ  rÞ  rà  rã  rä  rå  rÕ  r7   r7   r7   r8   rÎ    s   
rÎ  c                   @   s$   e Zd ZG dd„ deƒZdd„ ZdS )ÚRequestSummaryTestc                   @   s   e Zd Zdd„ ZdS )zRequestSummaryTest.Handlerc                 C   s   d | j _|  |  ¡ ¡ d S r0   )r+  Z	remote_ipr‰   rL  r>   r7   r7   r8   rP   C  s    zRequestSummaryTest.Handler.getNrQ   r7   r7   r7   r8   rJ   B  s   rJ   c                 C   s   |   d¡}|  |jd¡ d S )NrH   s   GET / (None)rß   r!  r7   r7   r8   Útest_missing_remote_ipJ  s    
z)RequestSummaryTest.test_missing_remote_ipN)rC   rD   rE   r   rJ   rç  r7   r7   r7   r8   ræ  A  s   ræ  c                   @   s   e Zd Zdd„ ZdS )ÚHTTPErrorTestc                 C   sF   t ddd}t |¡}|  ||¡ |  |j|j¡ |  |j|j¡ d S )Nr0  zGo awayr  )r    r…   ZassertIsNotrk   rÆ  r~  )r?   rÁ   Úe2r7   r7   r8   Ú	test_copyP  s
    
zHTTPErrorTest.test_copyN)rC   rD   rE   rê  r7   r7   r7   r8   rè  O  s   rè  c                   @   s   e Zd Zdd„ ZdS )ÚApplicationTestc                 C   s"   t g ƒ}|jddd}| ¡  d S )Nr   r  )Úaddress)r   Úlistenr&  )r?   r=   Úserverr7   r7   r8   Útest_listenY  s    zApplicationTest.test_listenN)rC   rD   rE   rï  r7   r7   r7   r8   rë  X  s   rë  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚURLSpecReverseTestc                 C   s0   |   dtdd ƒ ¡ ¡ |   dtdd ƒ ¡ ¡ d S )Nz/favicon.icoz/favicon\.icoz^/favicon\.ico$©rk   r$   Úreverser>   r7   r7   r8   Útest_reverse`  s    zURLSpecReverseTest.test_reversec              	   C   sP   dg}|D ]@}t |d ƒ}z| ¡ }|  d||f ¡ W q
 tyH   Y q
0 q
d S )Nz^/api/v\d+/foo/(\w+)$z<did not get expected exception when reversing %s. result: %s)r$   rò  r<  rr  )r?   Úpathsr2   Zurl_specrà  r7   r7   r8   Útest_non_reversibled  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_argumentsv  s    ÿþz)URLSpecReverseTest.test_reverse_argumentsN)rC   rD   rE   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   s2   | j ddd}|  |jd¡ |  |jd d¡ d S )Nrø  Fr  r£  r  rù  r¦  r§   r7   r7   r8   Útest_basic_redirectˆ  s    z'RedirectHandlerTest.test_basic_redirectc                 C   s2   | j ddd}|  |jd¡ |  |jd d¡ d S )Nz/src?foo=barFr  r£  r  z/dst?foo=barr¦  r§   r7   r7   r8   Útest_redirect_with_argument  s    z/RedirectHandlerTest.test_redirect_with_argumentc                 C   s2   | j ddd}|  |jd¡ |  |jd d¡ d S )Nz/src2?foo2=bar2Fr  r£  r  z/dst2?foo=bar&foo2=bar2r¦  r§   r7   r7   r8   Ú%test_redirect_with_appending_argument’  s    z9RedirectHandlerTest.test_redirect_with_appending_argumentc                 C   s2   | j ddd}|  |jd¡ |  |jd d¡ d S )Nz/a/b/cFr  r£  r  z/b/a/cr¦  r§   r7   r7   r8   Útest_redirect_pattern—  s    z)RedirectHandlerTest.test_redirect_patternN)rC   rD   rE   r;   rú  rû  rü  rý  r7   r7   r7   r8   r÷  €  s
   r÷  c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚAcceptLanguageTestz)Test evaluation of Accept-Language headerc                 C   s8   t  tj tj t¡d¡d¡ G dd„ dtƒ}d|fgS )NZgettext_translationsZtornado_testc                   @   s   e Zd Zdd„ ZdS )z>AcceptLanguageTest.get_handlers.<locals>.AcceptLanguageHandlerc                 S   s(   |   d|  ¡ j dd¡¡ |  d¡ d S )Nry  Ú_ú-rž   )rh  Zget_browser_localer¤   Úreplacer‰   r>   r7   r7   r8   rP   §  s    ÿzBAcceptLanguageTest.get_handlers.<locals>.AcceptLanguageHandler.getNrQ   r7   r7   r7   r8   ÚAcceptLanguageHandler¦  s   r  rH   )r   Zload_gettext_translationsr1   r2   r3   r4   r5   r   )r?   r  r7   r7   r8   r;      s    þÿzAcceptLanguageTest.get_handlersc                 C   sL   | j dddid}|  |jd d¡ | j dddid}|  |jd d¡ d S )NrH   r¨  zfr-FR;q=0.9rÝ   ry  zfr-FRzfr-FR; q=0.9©r¢   rk   rØ   r§   r7   r7   r8   Útest_accept_language±  s    z'AcceptLanguageTest.test_accept_languagec                 C   s(   | j dddid}|  |jd d¡ d S )NrH   r¨  z	fr-FR;q=0rÝ   ry  úen-USr  r§   r7   r7   r8   Útest_accept_language_ignore¸  s    z.AcceptLanguageTest.test_accept_language_ignorec                 C   s(   | j dddid}|  |jd d¡ d S )NrH   r¨  z
fr-FR;q=-1rÝ   ry  r  r  r§   r7   r7   r8   Útest_accept_language_invalid¼  s    z/AcceptLanguageTest.test_accept_language_invalidN)rC   rD   rE   rF   r;   r  r  r  r7   r7   r7   r8   rþ    s
   rþ  ) Ztornado.concurrentr   Ztornador   Ztornado.escaper   r   r   r   r   r	   Ztornado.httpclientr
   Ztornado.httputilr   Ztornado.iostreamr   r   Ztornado.locksr   Ztornado.logr   r   Ztornado.simple_httpclientr   Ztornado.templater   Ztornado.testingr   r   r   r   Ztornado.test.utilr   Ztornado.utilr   r   Ztornado.webr   r   r   r   rŽ  r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   rq   rA  r…   ró   Úemail.utilsrö   r·  Úior/   ró  rå   r1   rs   r  rÍ  r6  Úurllib.parser¬  r9   r:   rG   rK   rR   ZTestCasera   r}   rˆ   r«   r  r	  r  r  r'  r2  r<  rT  r\  r`  rc  rd  rm  rp  rt  rx  rz  r¼  r¿  rÖ  r7  r?  rA  r[  rj  rm  ro  rs  rx  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:  ÚobjectrC  rU  rY  r\  rj  rn  r“  r½  rÀ  rÂ  rÇ  rÎ  ræ  rè  rë  rð  r÷  rþ  r7   r7   r7   r8   Ú<module>   sö    T5/1  0,
  	B  [C*":/.\bM
ÿ
ÿ; + M:!?	!