U
    luf.Û ã                   @   sÞ  d dl mZ d dlmZ d dlmZmZmZmZm	Z	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZmZ d d
lmZ d dlmZ d dlmZmZmZmZ d dl m!Z! d dl"m#Z#m$Z$ d dl%m&Z&m'Z'm(Z(m)Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9 d dl:Z:d dl;Z;d dl<Z<d dl=Z=d dl>Z?d dl@Z@d dlAmBZB d dlCZCd dlDZDd dlEZEd dlFZFd dlGZGd dlHZHd dlIZId dlJZKdd„ ZLG dd„ deƒZMG dd„ deMƒZNG dd„ de'ƒZOG dd„ de'ƒZPG dd„ deIjQƒZRG dd„ deIjQƒZSG d d!„ d!eMƒZTG d"d#„ d#eMƒZUG d$d%„ d%e'ƒZVG d&d'„ d'eMƒZWG d(d)„ d)e'ƒZXG d*d+„ d+eMƒZYG d,d-„ d-e'ƒZZG d.d/„ d/eMƒZ[G d0d1„ d1e'ƒZ\G d2d3„ d3e'ƒZ]G d4d5„ d5e'ƒZ^G d6d7„ d7e'ƒZ_G d8d9„ d9e'ƒZ`G d:d;„ d;e'ƒZaG d<d=„ d=e'ƒZ)G d>d?„ d?e'ƒZbG d@dA„ dAe'ƒZcG dBdC„ dCe'ƒZdG dDdE„ dEe'ƒZeG dFdG„ dGeMƒZfG dHdI„ dIeMƒZgG dJdK„ dKeMƒZhG dLdM„ dMeMƒZiG dNdO„ dOeMƒZjG dPdQ„ dQeMƒZkG dRdS„ dSeMƒZlG dTdU„ dUeMƒZmG dVdW„ dWeMƒZnG dXdY„ dYeMƒZoG dZd[„ d[eMƒZpG d\d]„ d]eNƒZqG d^d_„ d_eNƒZrG d`da„ daeNƒZsG dbdc„ dceNƒZtG ddde„ deeNƒZuG dfdg„ dgeNƒZvG dhdi„ dieMƒZwG djdk„ dkeNƒZxG dldm„ dmeMƒZyG dndo„ doeNƒZzG dpdq„ dqe{ƒZ|G drds„ dseNƒZ}G dtdu„ dueNƒZ~G dvdw„ dweNƒZG dxdy„ dyeNƒZ€G dzd{„ d{eNƒZG d|d}„ d}eMƒ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‡eNƒZ‡G dˆd‰„ d‰eMƒZˆG dŠd‹„ d‹eMƒZ‰G dŒd„ deMƒZŠG dŽd„ deMƒZ‹G dd‘„ d‘eMƒZŒe6G d’d“„ d“e'ƒƒZG d”d•„ d•eŽƒZG d–d—„ d—eeMƒZG d˜d™„ d™eeMƒZ‘G dšd›„ d›eNƒZ’G dœd„ deNƒZ“G dždŸ„ dŸeIjQƒ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ƒZG d²d³„ d³eIjQƒZžG 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¡f| žŽ S ©N)ÚosÚpathÚjoinÚdirnameÚ__file__)Úa© r7   ú9/tmp/pip-unpacked-wheel-bmg6zs32/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|  ¡ Ž| _| 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 k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 k	s>t‚| 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 k¡ W 5 Q R X 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ÚAssertionErrorÚ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   r{   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   rw   Ú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 k	st‚|  |¡ d S )Nrb   Údefault)r]   ru   rO   )r?   rx   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¡ƒdddg¡ d S )NrÎ   ú
Set-Cookiez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	k|d ¡ d
dddddg}|D ]8\}}t d|¡ | j dd|id}|  |j	t
|ƒ¡ qvd 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   Úlenrw   Ú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 k	s"t‚t d|¡}|d k	s:t‚tj tjj	¡tj
dd }tj | ¡ d ¡}|  t||  ¡ ƒdk ¡ d S )NrÔ   r×   z(foo=bar; expires=(?P<expires>.+); Path=/rÅ   ©ÚdaysÚexpires)r£   rÙ   rP   ru   rs   rt   ÚdatetimeÚnowÚtimezoneÚutcÚ	timedeltaÚemailÚutilsÚparsedate_to_datetimeÚ	groupdictrw   ÚabsÚtotal_seconds©r?   r©   ré   rt   rò   Zheader_expiresr7   r7   r8   Útest_set_cookie_expires_days  s    
ÿz'CookieTest.test_set_cookie_expires_daysc                 C   sn   |   d¡}t|j d¡ƒ}|  |d  ¡ d¡ |  |d  ¡ d¡ |  |d  ¡ d¡ |  |d	  ¡ d
¡ d S )NrÕ   r×   r   za=1; path=/; 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   s8   t ƒ  |  d¡}W 5 Q R X |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¥   rw   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   r4  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õ   Ã©r2  r)  ©rk   r4  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/dr6  r>   r7   r7   r8   Útest_slashes4  s    þþz RequestEncodingTest.test_slashesc              	   C   s$   t tdƒ |  d¡ W 5 Q R X 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;   r4  r7  r:  r;  r<  r7   r7   r7   r8   r3    s   r3  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]   rA  rB  rC  Ú_request_summaryr>   r7   r7   r8   ÚprepareH  s    ÿzTypeCheckHandler.preparec                 C   s   |   d|t¡ |  | j¡ d S ©NÚpath_component©rF  r   rO   rE  ©r?   rP  r7   r7   r8   rP   c  s    zTypeCheckHandler.getc                 C   s   |   d|t¡ |  | j¡ d S rO  rQ  rR  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.  rE  )r?   r\   ÚobjZexpected_typeZactual_typer7   r7   r8   rF  m  s    zTypeCheckHandler.check_typeN)rC   rD   rE   rN  rP   r   rF  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k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   rH  )r?   r2  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 k	r.| jdtt|   d¡ƒƒd n2|   dd ¡d k	rX| jdt|   d¡ƒd ntdƒ‚d S )NÚ	permanentrH   )rj  r>  )r>  z(didn't get permanent or status arguments)rH  ÚredirectÚboolrG  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   sZ   z|   dd¡ tdƒ‚W n< tk
rT } zdt|ƒkrB|  d¡ n‚ W 5 d }~X Y nX 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´   )rH  Zget_query_argumentZget_body_argumentrŠ   ©r?   r¡   r7   r7   r8   rN  Ä  s    zGetArgumentHandler.prepareN©rC   rD   rE   rN  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   r0  Zget_query_argumentsZget_body_argumentsr>   r7   r7   r8   rN  Ï  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/(.*)rD  )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 ||Ž}| ¡  t|jƒS r0   )r£   Úrethrowr   r¢   )r?   r+  Úkwargsr©   r7   r7   r8   r4    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„   dddg}|D ]:}|   |¡}| ¡  t|jƒ}|  |ddgddgdœ¡ q|   d¡}| ¡  t|jƒ}|  |dd	gdd	gdœ¡ d S )
Nz,/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¯   r8  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   sJ   t tdƒ6 |  d¡}|  |jd¡ |  d¡}|  |jd¡ W 5 Q R X 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/%E9r8  z/decode_arg/%C3%A9r™  z/decode_arg/1%20%2B%201)rk   r=   rC  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/r9  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;   r4  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   )rH  r    rG  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À  )rH  r	  rG  r>   r7   r7   r8   rP   ù  s    z=ErrorResponseTest.get_handlers.<locals>.WriteErrorHandler.getc                 [   s@   |   dd¡ d|k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k¡ |  d¡}|  |jd¡ |  d|jk¡ |  d¡}|  |jd	¡ |  d
|jk¡ W 5 Q R X 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¥   rw   r¢   r¨   r7   r7   r8   Útest_default  s    


zErrorResponseTest.test_defaultc              	   C   sf   t tdƒR |  d¡}|  |jd¡ |  d|j¡ |  d¡}|  |jd¡ |  d|j¡ W 5 Q R X 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   s@   t tdƒ, |  d¡}|  |jd¡ |  d|j¡ W 5 Q R X 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                   @   sP  e Zd ZdZej ej e¡d¡Z	dd„ Z
dd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Z d1d2„ Z!d3d4„ Z"d5d6„ Z#d7d8„ Z$d9d:„ Z%d;d<„ Z&d=d>„ Z'd?d@„ Z(dAdB„ Z)dCdD„ Z*dEdF„ Z+e, -ej.dGkdH¡dIdJ„ ƒZ/dKS )LÚStaticFileTests€   63a36e950e134b5217e33c763e88840c10a07d80e6057d92b9ac97508de7fb1fa6f0e9b7531e169657165ea764e8963399cb6d921ffe6078425aaafe54c04563Ústaticc                 C   sT   G dd„ dt ƒ}G dd„ d|ƒ}G dd„ dt ƒ}d|fd|fd	|fd
ttddfgS )Nc                   @   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Ø  )rG  rH  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  rH  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k¡ |   d¡}|  d|jk¡ |  |j d¡d¡ d S )Nú/robots.txtó   Disallow: /ú/static/robots.txtrÂ  rÃ  )r£   rw   r¢   rk   rÙ   rP   r¨   r7   r7   r8   Útest_static_filesc  s
    

z StaticFileTest.test_static_filesc                 C   s:   |   d¡}|  d|jk¡ |  d|j¡ |  d|j¡ d S )Nz/robots.txt?v=12345ræ  zCache-ControlZExpires)r£   rw   r¢   ÚassertInrÙ   r¨   r7   r7   r8   Útest_static_files_cacheablek  s    
z*StaticFileTest.test_static_files_cacheablec                 C   sd   |   d¡}|  |j d¡d¡ |   d¡}|  |j d¡d¡ |   d¡}|  |j d¡tdƒk¡ 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   rw   r#  r¨   r7   r7   r8   Útest_static_compressed_filest  s    


 ÿ
ÿz+StaticFileTest.test_static_compressed_filesc                 C   s"   |   d¡}|  |jd| j ¡ d S )Nz/static_url/robots.txts   /static/robots.txt?v=)r£   rk   r¢   Úrobots_txt_hashr¨   r7   r7   r8   Útest_static_url  s    
zStaticFileTest.test_static_urlc                 C   s0   |   d¡}|  |jt|  d¡ƒd | j ¡ d S )Nz/abs_static_url/robots.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£   rG  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k¡ d S )Nrç  úIf-Modified-SinceúLast-ModifiedrÞ   é0  úContent-Length)rû  rÙ   rk   r¥   rw   ©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|dd}|  |jt	| 
¡ ƒ¡ W 5 Q R X |  |j d	¡d
¡ |  |j d¡d ¡ d S )Nrç  r  zbytes=0-rÞ   r   ú
robots.txtúutf-8©rU  rÿ  Ú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     ÿ z/StaticFileTest.test_static_with_range_full_filec              	   C   sŠ   | j dddid}|  |jd¡ tj | jd¡}t|dd}|  |jt	| 
¡ ƒ¡ W 5 Q R X |  |j d	¡d
¡ |  |j d¡d ¡ d S )Nrç  r  zbytes=0-10000000rÞ   r   r  r  r  rÿ  r  r  r  r  r7   r7   r8   Ú$test_static_with_range_full_past_end  s     ÿ z3StaticFileTest.test_static_with_range_full_past_endc              	   C   s’   | j dddid}|  |jd¡ tj | jd¡}t|dd$}|  |jt	| 
¡ d	d … ƒ¡ W 5 Q R X |  |j d
¡d¡ |  |j d¡d¡ d S )Nrç  r  zbytes=1-10000000rÞ   r  r  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|dd}|  |jt	| 
¡ ƒ¡ W 5 Q R X |  |j d	¡d
¡ |  |j d¡d ¡ d S )Nrç  r  zbytes=-1000000rÞ   r   r  r  r  rÿ  r  r  r  r  r7   r7   r8   Ú%test_static_with_range_neg_past_start.  s     ÿ 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_range9  s    z(StaticFileTest.test_static_invalid_rangec                 C   s8   | j dddid}|  |j d¡d¡ |  |jd¡ d S )Nrç  r  zbytes=-0rÞ   r  ú
bytes */26é   )rû  rk   rÙ   rP   r¥   r¨   r7   r7   r8   Ú+test_static_unsatisfiable_range_zero_suffix=  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_startD  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_startK  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_headR  s     ÿzStaticFileTest.test_static_headc                 C   sf   | j ddddid}|  |jd¡ |  |jd¡ |  |jd d	¡ |  t|jd
 ƒd| j d ¡ d S )Nrç  rô  r  ú	bytes=1-4)r¡   rÙ   r  rŸ   rÿ  rg  r  r  r.  r¨   r7   r7   r8   Útest_static_head_range\  s      ÿ ÿz%StaticFileTest.test_static_head_rangec                 C   sn   | j ddd| j d dœd}|  |jd¡ |  |jd¡ |  d|jk¡ |  t|jd	 ƒd| j d ¡ d S )
Nrç  r0  r  )r  r  rÞ   rþ  rŸ   rÿ  r  )rû  rì  rk   r¥   r¢   rw   rÙ   r   r¨   r7   r7   r8   Útest_static_range_if_none_matchg  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_404v  s    
zStaticFileTest.test_static_404c              	   C   sD   | j  ¡  tƒ | _ ttdƒ |  d¡}W 5 Q R X |  |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_protectionz  s
    
z-StaticFileTest.test_path_traversal_protectionÚposixznon-posix OSc                 C   sF   t j t j t j t¡¡d¡}|  dtj 	|¡ ¡}|  
|jd¡ d S )Nrð  z/root_staticr   )r1   r2   r3   r4   Úabspathr5   rû  r¬  r­  r¼   rk   r¥   )r?   r2   r©   r7   r7   r8   Útest_root_static_path‡  s     ÿz$StaticFileTest.test_root_static_pathN)0rC   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/  r1  r2  r4  r7  ÚunittestZskipIfr\   r:  r7   r7   r7   r8   rÖ  2  sN   ÿ%		

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×  ú
index.html©Údefault_filename)rã  Ú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 )Nú/static/dirFr  r£  r  rB  )r£   rk   r¥   rw   rÙ   Úendswithr¨   r7   r7   r8   Útest_static_default_redirect£  s    z6StaticDefaultFilenameTest.test_static_default_redirectN)rC   rD   rE   r<   r;   rD  rG  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 )
ÚStaticDefaultFilenameRootTestc                 C   s    t tj tdƒ¡t ddddS )Nr×  r>  r?  rH   )rã  rA  Zstatic_url_prefix)rY   r1   r2   r9  r9   r>   r7   r7   r8   r<   ª  s
    ýz,StaticDefaultFilenameRootTest.get_app_kwargsc                 C   s   g S r0   r7   r>   r7   r7   r8   r;   ±  s    z*StaticDefaultFilenameRootTest.get_handlersc                 C   s   t ƒ S r0   r   r>   r7   r7   r8   Úget_http_client´  s    z-StaticDefaultFilenameRootTest.get_http_clientc              	   C   sv   t j t¡}t j |¡\}}t jdkr4|  ||¡ n|}ttdƒ | j	d|› ddd}W 5 Q R X |  |j
d¡ d S )Nr8  z/.*cannot redirect path with two initial slashesz//evil.com/../rE  Fr  r5  )r1   r2   r4   r5   Ú
splitdriver\   rk   r   r   r£   r¥   )r?   Ztest_dirÚdriveÚtailr©   r7   r7   r8   Útest_no_open_redirect¹  s    

þz3StaticDefaultFilenameRootTest.test_no_open_redirectN)rC   rD   rE   r<   r;   rI  rM  r7   r7   r7   r8   rH  ©  s   rH  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 r=  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;   rO  r7   r7   r7   r8   rN  Î  s   rN  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 )NrQ  r   z%s%s)rS  )r?   Zurl_pathrU  Zversion_indexr7   r7   r8   Úparse_url_pathì  s    
zMCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.parse_url_pathc                 S   s   d| S )NzCustomStaticFileTest:r7   ©rT  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 kr|d kst ‚|dkr dS td| ƒ‚d S )NúCustomStaticFileTest:foo.txtrc   úunexpected path %r)ru   r/  )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 )Nr]  rä   r^  )r[  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   rX  r7   r7   r8   rR    s    zJCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_version)NN)rC   rD   rE   ÚclassmethodrV  rW  rY  r\  ra  rb  rc  rR  r7   r7   r7   r8   ÚMyStaticFileHandlerß  s   

rf  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?   rf  rÚ  r7   r7   r8   r;   Þ  s    ,z!CustomStaticFileTest.get_handlersc                 C   s   t d| jdS )NÚdummy)rã  rg  )rY   rg  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   rO    s    
zCustomStaticFileTest.test_servec              	   C   s6   t tddd |  d¡}|  |jd¡ W 5 Q R X 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<   rO  rí  r7   r7   r7   r8   rP  Ý  s   5rP  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?   rk  r7   r7   r8   r  "  s    z#HostMatchingTest.Handler.initializec                 C   s   |   | j¡ d S r0   )rO   rk  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¶   rk  Zwildcard)rj  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¶   rk  ú[0]úwww\.example\.comú/barú[1]ú/bazú[2]zwww.e.*e.comz[3]s   wildcardr3  ÚHostrÞ   ó   [0]ó   [1]ó   [2]zwww.exe.coms   [3])r=   Úadd_handlersrj  rJ   r£   rk   r¢   r¥   r¨   r7   r7   r8   Útest_host_matching+  s<     ÿ ÿ ÿ ÿ


z#HostMatchingTest.test_host_matchingN)rC   rD   rE   r   rJ   r;   rx  r7   r7   r7   r8   rj     s   rj  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;   K  s    z$DefaultHostMatchingTest.get_handlersc                 C   s   ddiS )NÚdefault_hostrl  r7   r>   r7   r7   r8   r<   N  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 )Nrl  r¶   rk  rm  rn  ro  rp  zwww.test.comrq  rr  rt  ru  r3  z	X-Real-Ipr  rÞ   rv  )	r=   rw  rj  rJ   r£   rk   r¢   r¥   rz  r¨   r7   r7   r8   Útest_default_host_matchingQ  s.     ÿ ÿ ÿ



z2DefaultHostMatchingTest.test_default_host_matchingN)rC   rD   rE   r;   r<   r{  r7   r7   r7   r8   ry  J  s   ry  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   o  s    z<NamedURLSpecGroupsTest.get_handlers.<locals>.EchoHandler.getNrQ   r7   r7   r7   r8   r(  n  s   r(  z/str/(?P<path>.*)z/unicode/(?P<path>.*)r›   )r?   r(  r7   r7   r8   r;   m  s    þz#NamedURLSpecGroupsTest.get_handlersc                 C   s4   |   d¡}|  |jd¡ |   d¡}|  |jd¡ d S )Nz/str/foos   fooz/unicode/barrc   rà   r¨   r7   r7   r8   Útest_named_urlspec_groupsw  s    

z0NamedURLSpecGroupsTest.test_named_urlspec_groupsN)rC   rD   rE   r;   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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    
zClearHeaderTest.Handler.getNrQ   r7   r7   r7   r8   rJ   €  s   rJ   c                 C   s0   |   d¡}|  d|jk¡ |  |jd d¡ d S )NrH   r  r€  rÄ   )r£   rw   rÙ   rk   r¨   r7   r7   r8   Útest_clear_header‡  s    
z!ClearHeaderTest.test_clear_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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     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   rƒ  rÿ  úTransfer-Encoding)r£   rk   r¥   r¹  rÙ   r¨   r7   r7   r8   Útest_204_headers“  s    
zHeader204Test.test_204_headersN)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 )Ú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   œ  s    zHeader304Test.Handler.getNrQ   r7   r7   r7   r8   rJ   ›  s   rJ   c                 C   sˆ   |   d¡}|  |jd d¡ |  |jd d¡ | j dd|jd id}|  |jd	¡ |  d|jk¡ |  d|jk¡ |  d
|jk¡ d S )NrH   rÿ  Ú5rˆ  r‰  r  r  rÞ   rþ  r…  )r£   rk   rÙ   r¥   rw   r   r7   r7   r8   Útest_304_headers   s    
 ÿzHeader304Test.test_304_headersN)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 )Ú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   r„  rG  rH  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   rI  ¸  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   rI  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   sF   |   d¡}tj |jd ¡}|  |tj tjj	¡ tj
ddk ¡ d S )NrH   ÚDaterp   )Úseconds)r£   rø   rù   rú   rÙ   rw   ró   rô   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   rI  Þ  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  ré  r¢   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   rI  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    r3  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ú!)r0  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>.  s     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 ƒdddg¡ d S )	Nz"/?vary=Accept-Language&vary=Cookiec                 S   s   g | ]}|  ¡ ‘qS r7   r¯  r±  r7   r7   r8   r³  7  s     zCGzipTestCase.test_vary_already_present_multiple.<locals>.<listcomp>r¶  r´  rµ  rÜ   rµ  r¶  r¨   r7   r7   r8   Ú"test_vary_already_present_multiple2  s    

þz/GzipTestCase.test_vary_already_present_multipleN)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   rN  >  s    z%PathArgsInPrepareTest.Handler.preparec                 C   s   |dkst ‚|  ¡  d S )Nrb   )ru   rŠ   r”   r7   r7   r8   rP   A  s    z!PathArgsInPrepareTest.Handler.getN©rC   rD   rE   rN  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;   E  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_posH  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_kwN  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   W  s    zClearAllCookiesTest.Handler.getNrQ   r7   r7   r7   r8   rJ   V  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Ú   rw   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À  U  s   rÀ  c                   @   s   e Zd ZdS )ÚPermissionErrorN©rC   rD   rE   r7   r7   r7   r8   rÄ  g  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)rH  r    rÄ  )r?   rÇ  r7   r7   r8   rP   m  s    

z ExceptionHandlerTest.Handler.getc                 K   sL   d|kr8|d \}}}t |tƒr8|  d¡ |  d¡ d S tj| |f|Ž d S )NrÄ  r5  rÄ  )Ú
isinstancerÄ  r„  rO   r   rÇ  )r?   rÆ  r‘  Útypr^   Útbr7   r7   r8   rÇ  v  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Î    s    
z*ExceptionHandlerTest.Handler.log_exceptionN)rC   rD   rE   rP   rÇ  rÎ  r7   r7   r7   r8   rJ   l  s   		rJ   c              	   C   s2   t tdƒ |  d¡}|  |jd¡ W 5 Q R X d S )Nz.*no longer herez
/?exc=httprÉ  r—  r¨   r7   r7   r8   Útest_http_error…  s    
z$ExceptionHandlerTest.test_http_errorc              	   C   s2   t tdƒ |  d¡}|  |jd¡ W 5 Q R X 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   s2   t tdƒ |  d¡}|  |jd¡ W 5 Q R X d S )Nz/custom logging for PermissionError: not allowedz/?exc=permissionr5  rÑ  r¨   r7   r7   r8   Útest_known_error’  s    
z%ExceptionHandlerTest.test_known_errorN)rC   rD   rE   r   rJ   rÐ  rÒ  rÓ  r7   r7   r7   r8   rÆ  k  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   œ  s    zBuggyLoggingTest.Handler.getc                 C   s   dd  d S rÊ  r7   rÏ  r7   r7   r8   rÎ  Ÿ  s    z&BuggyLoggingTest.Handler.log_exceptionN)rC   rD   rE   rP   rÎ  r7   r7   r7   r8   rJ   ›  s   rJ   c              	   C   s$   t tdƒ |  d¡ W 5 Q R X d S )Nz.*rH   )r   r   r£   r>   r7   r7   r8   Útest_buggy_log_exception¢  s    z)BuggyLoggingTest.test_buggy_log_exceptionN)rC   rD   rE   r   rJ   rÕ  r7   r7   r7   r8   rÔ  š  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^   )rH  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   sT   z|   d¡ |  i ¡ W n6 tk
rN } z|  |j|jdœ¡ W 5 d }~X Y nX d S )Nrb   ©Úarg_nameÚlog_message)rH  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Benr‰  )Úcurrent_userr   rP   r>   r7   r7   r8   rN  ê  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   rN  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   rN    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   rN  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   )Úuir>   r7   r7   r8   Úget_template_namespace0  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   7  s    
zEGetCurrentUserTest.get_handlers.<locals>.WithoutUserModuleHandler.getNrQ   r7   r7   r7   r8   ÚWithoutUserModuleHandler6  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_lazyG  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_worksM  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_lazyQ  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_worksU  s    
z=GetCurrentUserTest.test_get_current_user_from_ui_module_works)rC   rD   rE   r<   r€  r;   r;  Ú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_methods^  s    z@UnimplementedHTTPMethodsTest.test_unimplemented_standard_methodsN)rC   rD   rE   r   rJ   r  r7   r7   r7   r8   r  Z  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  i  s    z1UnimplementedNonStandardMethodsTest.Handler.otherN)rC   rD   rE   r  r7   r7   r7   r8   rJ   h  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_patchn  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_othert  s    z<UnimplementedNonStandardMethodsTest.test_unimplemented_otherN)rC   rD   rE   r   rJ   r  r  r7   r7   r7   r8   r  g  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 k	st‚|  | j j¡ d S r0   )r,  r¡   ru   rO   r>   r7   r7   r8   r¡   {  s    z!AllHTTPMethodsTest.Handler.methodN)	rC   rD   rE   r¡   rP   ÚdeleteÚoptionsr   Úputr7   r7   r7   r8   rJ   z  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_methods  s    z(AllHTTPMethodsTest.test_standard_methodsN)rC   rD   rE   r   rJ   r  r7   r7   r7   r8   r  y  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  ’  s    zPatchMethodTest.Handler.patchc                 C   s   |   d¡ d S r  rN   r>   r7   r7   r8   r  •  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_patch˜  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_otherœ  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   rN  £  s    z#FinishInPrepareTest.Handler.preparec                 C   s   t dƒ‚d S )Nzshould not reach this methodrË  r>   r7   r7   r8   rP   ¦  s    zFinishInPrepareTest.Handler.getNr¼  r7   r7   r7   r8   rJ   ¢  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  ¡  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   r3  sE   <html><title>404: Not Found</title><body>404: Not Found</body></html>rC  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 )Nr3  zcustom 404 response)r„  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   r3  s   custom 404 responserC  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 )Nr5  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   r5  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;   r0  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   rN  ú  s    zKStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.preparec                 S   s   | j j |¡ d S r0   )r   rè   r3  ©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   Úfinishedr3  rO   r>   r7   r7   r8   rP    	  s    zGStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.getN)rC   rD   rE   r  rN  r5  rP   r7   r7   r7   r8   ÚStreamingBodyHandlerõ  s   r7  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   rN  	  s    zIStreamingRequestBodyTest.get_handlers.<locals>.EarlyReturnHandler.prepareNrw  r7   r7   r7   r8   ÚEarlyReturnHandler	  s   r9  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_futurer3  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?   r7  r9  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   r2  rè   r6  r   rO   rk   Úread_until_closerw   rF  r&  ©r?   r"  rè   r7   r7   r8   Útest_streaming_body%	  s"    



z,StreamingRequestBodyTest.test_streaming_bodyc                 c   s,   | j ddd}| ¡ V }|  | d¡¡ d S )Nó   /early_returnFr=  ó   HTTP/1.1 401)r   r?  rw   rø  r@  r7   r7   r8   Útest_early_return<	  s    
z*StreamingRequestBodyTest.test_early_returnc                 c   s6   | j ddd}| d¡ | ¡ V }|  | d¡¡ d S )NrB  Fr=  r>  rC  )r   rO   r?  rw   rø  r@  r7   r7   r8   Útest_early_return_with_dataB	  s    

z4StreamingRequestBodyTest.test_early_return_with_datac                 c   s*   t ƒ | _| jddd}| ¡  | jV  d S )Ns   /close_detectionFr=  )r   r:  r   r&  )r?   r"  r7   r7   r8   Útest_close_during_uploadI	  s    z1StreamingRequestBodyTest.test_close_during_uploadN)
rC   rD   rE   r;   r   r   rA  rD  rE  rF  r7   r7   r7   r8   r1  ó  s   &


r1  c                   @   s>   e Zd Zdd„ Zejdd„ ƒZejdd„ ƒZ	ejdd„ ƒZ
d	S )
ÚBaseFlowControlHandlerc                 C   s   || _ d | _g | _d S r0   )r   r¡   Úmethodsr  r7   r7   r8   r  W	  s    z!BaseFlowControlHandler.initializec                 c   sJ   | j d k	r | j d|| j f ¡ || _ | j |¡ z
d V  W 5 d | _ X d S )Nzentered method %s while in %s)r¡   r   ÚfailrH  Úappendrv  r7   r7   r8   Ú	in_method\	  s    

z BaseFlowControlHandler.in_methodc                 c   s   | j  d¡ tjV  d S )NrN  )rH  rJ  r   Úmomentr>   r7   r7   r8   rN  g	  s    zBaseFlowControlHandler.preparec              	   c   s4   |   d¡ tjV  W 5 Q R X |  t| jd¡ d S )Nr   ©rH  )rK  r   rL  rO   rY   rH  r>   r7   r7   r8   r   n	  s    zBaseFlowControlHandler.postN)rC   rD   rE   r  Ú
contextlibÚcontextmanagerrK  r   r   rN  r   r7   r7   r7   r8   rG  U	  s   


rG  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_optionsv	  s    z:BaseStreamingRequestFlowControlTest.get_httpserver_optionsc                 C   s   t ƒ S r0   r   r>   r7   r7   r8   rI  {	  s    z3BaseStreamingRequestFlowControlTest.get_http_clientr>   c              	   C   s>   | j dddd}| ¡  |  t|jƒtdddddgd¡ d S )	NrH   Úabcdefghijklmnopqrstuvwxyzrž   )r¢   r¡   rN  r5  r   rM  )r£   r  rk   r   r¢   rY   r¨   r7   r7   r8   Útest_flow_control_fixed_body€	  s    ûÿþz@BaseStreamingRequestFlowControlTest.test_flow_control_fixed_bodyc              	      sZ   dddg‰ t j‡ fdd„ƒ}| jd|dd}| ¡  |  t|jƒtd	d
d
d
dgd¡ d S )Ns   abcds   efghs   ijklc                 3   s   ˆ D ]}| |ƒV  qd S r0   r7   )rO   Úi©Úchunksr7   r8   Úbody_producer“	  s    zYBaseStreamingRequestFlowControlTest.test_flow_control_chunked_body.<locals>.body_producerrH   rž   )rX  r¡   rN  r5  r   rM  )r   r   r£   r  rk   r   r¢   rY   )r?   rX  r©   r7   rV  r8   Útest_flow_control_chunked_body	  s     
ûÿþzBBaseStreamingRequestFlowControlTest.test_flow_control_chunked_bodyc              	   C   sr   t ƒ }tjd|d}| d¡ | ¡  | ¡ }| jd|dddid}| ¡  |  t	|j
ƒtd	d
d
d
dgd¡ d S )NÚw)ÚmodeÚfileobjs   abcdefghijklmnopqrstuvwxyzrH   rž   r¸  r·  )r¢   r¡   rÙ   rN  r5  r   rM  )r/   r·  ÚGzipFilerO   r&  Úgetvaluer£   r  rk   r   r¢   rY   )r?   ZbytesioZ	gzip_fileZcompressed_bodyr©   r7   r7   r8   Ú!test_flow_control_compressed_body§	  s.    
üûÿþzEBaseStreamingRequestFlowControlTest.test_flow_control_compressed_bodyN)
rC   rD   rE   rR  rI  rÙ  ÚAnyrT  rY  r_  r7   r7   r7   r8   rP  u	  s
   rP  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   s"   |   d¡ tjV  W 5 Q R X d S )Nr5  )rK  r   rL  r4  r7   r7   r8   r5  Ç	  s    zhDecoratedStreamingRequestFlowControlTest.get_handlers.<locals>.DecoratedFlowControlHandler.data_receivedN)rC   rD   rE   r   r   r5  r7   r7   r7   r8   ÚDecoratedFlowControlHandlerÆ	  s   rb  rH   rŒ   ©rG  rY   )r?   rb  r7   r7   r8   r;   Å	  s    z5DecoratedStreamingRequestFlowControlTest.get_handlersN©rC   rD   rE   r;   r7   r7   r7   r8   ra  Â	  s   ra  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              	   Ó   s2   |   d¡ dd l}| d¡I d H  W 5 Q R X d S )Nr5  r   )rK  Úasyncior  )r?   rè   rf  r7   r7   r8   r5  Ô	  s    zbNativeStreamingRequestFlowControlTest.get_handlers.<locals>.NativeFlowControlHandler.data_receivedN)rC   rD   rE   r5  r7   r7   r7   r8   ÚNativeFlowControlHandlerÓ	  s   rg  rH   rŒ   rc  )r?   rg  r7   r7   r8   r;   Ò	  s    z2NativeStreamingRequestFlowControlTest.get_handlersNrd  r7   r7   r7   r8   re  Ï	  s   re  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              
      sJ   |   dd¡ z|  d¡ W n* tk
rD } z|ˆ _‚ W 5 d }~X Y nX d S )Nrÿ  rd  rÂ  ©rh  rŠ   r/  Úserver_errorrs  rŒ   r7   r8   rP   ä	  s    z<IncorrectContentLengthTest.get_handlers.<locals>.TooHigh.getNrQ   r7   rŒ   r7   r8   ÚTooHighã	  s   rk  c                       s   e Zd Z‡ fdd„ZdS )z7IncorrectContentLengthTest.get_handlers.<locals>.TooLowc              
      sJ   |   dd¡ z|  d¡ W n* tk
rD } z|ˆ _‚ W 5 d }~X Y nX d S )Nrÿ  r   rM   ri  rs  rŒ   r7   r8   rP   í	  s    z;IncorrectContentLengthTest.get_handlers.<locals>.TooLow.getNrQ   r7   rŒ   r7   r8   ÚTooLowì	  s   rl  ú/highú/low)rj  r   )r?   rk  rl  r7   rŒ   r8   r;   Þ	  s
    		z'IncorrectContentLengthTest.get_handlersc                 C   sf   t tdƒ@ t tdƒ* |  t¡ | jddd W 5 Q R X W 5 Q R X W 5 Q R X |  t| jƒd¡ d S )Nú*(Uncaught exception|Exception in callback)úS(Cannot send error response after headers written|Failed to flush partial response)rm  T©Zraise_errorz0Tried to write 40 bytes less than Content-Length©	r   r   r   ÚassertRaisesr
   r£   rk   r­   rj  r>   r7   r7   r8   Útest_content_length_too_high÷	  s    þ, ÿz7IncorrectContentLengthTest.test_content_length_too_highc                 C   sf   t tdƒ@ t tdƒ* |  t¡ | jddd W 5 Q R X W 5 Q R X W 5 Q R X |  t| jƒd¡ d S )Nro  rp  rn  Trq  z,Tried to write more data than Content-Lengthrr  r>   r7   r7   r8   Útest_content_length_too_low
  s    þ, ÿz6IncorrectContentLengthTest.test_content_length_too_lowN)rC   rD   rE   r;   rt  ru  r7   r7   r7   r8   rh  Ý	  s   rh  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   sP   |   ttjf¡6 | jddd}|jdkr4|  d¡ |  |jd¡ W 5 Q R X d S )NrH   Trq  s   requires HTTP/1.xrw  iW  )	rs  r
   r;  ZSkipTestr£   r¢   ZskipTestrk   r¥   r¨   r7   r7   r8   Útest_client_close'
  s
    

z!ClientCloseTest.test_client_closeN)rC   rD   rE   r   rJ   ry  r7   r7   r7   r8   rv  
  s   rv  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   Úpast3
  s    zSignedValueTest.pastc                 C   s   dS )Ni m|Mr7   r>   r7   r7   r8   r{  6
  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 )Nr1  r^   rd   )rf   Úclocks<   dmFsdWU=|1300000000|31c934969f53e48164c50768b40cbd7e2daaaa4frp   se   2|1:0|10:1300000000|3:key|8:dmFsdWU=|3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e152©r}  )rh   r}  ó   value)r&   rz  ÚSECRETr{  rk   r'   )r?   Z	signed_v1Z	signed_v2Zsigned_defaultZ
decoded_v1Z
decoded_v2r7   r7   r8   Útest_known_values9
  sZ        ÿ ÿ    ÿþ   ÿ    ÿ    ÿ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^   r~  Úkey2)r&   rz  r€  r{  r'   ÚassertIs)r?   Zsigned1Zsigned2Zdecoded1Zdecoded2r7   r7   r8   Útest_name_swapY
  s4       ÿ   ÿ   ÿ   ÿzSignedValueTest.test_name_swapc                 C   sX   t tjdd| jd}ttjd|| jd}|  |d¡ ttjd|| jd}|  |d ¡ d S )Nr‚  r^   r~  r  )r&   rz  r€  r|  r'   rk   r{  r„  )r?   ÚsignedZdecoded_pastZdecoded_presentr7   r7   r8   Útest_expiredj
  s(       ÿ   ÿ   ÿzSignedValueTest.test_expiredc                    sN   d‰‡ ‡fdd„}ˆ   |dƒ¡ ˆ  |dƒ¡ ˆ  |dƒ¡ ˆ  |dƒ¡ d S )NÚ@3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e152c                    s   dt tjd| ˆ ˆ jdkS ©Nr  r1  r~  ©r'   rz  r€  r{  )Úprefix©r?   rz   r7   r8   Úvalidate{
  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=|©rw   ZassertFalse©r?   r  r7   rŒ  r8   Útest_payload_tamperingw
  s    z&SignedValueTest.test_payload_tamperingc                    sj   d‰ ‡ ‡fdd„}ˆ  |dƒ¡ ˆ |dƒ¡ ˆ |dƒ¡ ˆ |dƒ¡ ˆ |dƒ¡ ˆ |d	ƒ¡ d S )
NrŽ  c                    s   dt tjdˆ |  ˆjdkS r‰  rŠ  )rz   ©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|   r1  r~  )r&   rz  r€  r{  r'   rk   ©r?   r^   r†  Ú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|   r1  r   ©r}  rW   r~  ©r&   rz  ÚSECRET_DICTr{  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|   r1  rd   r˜  r~  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&   rz  rš  r{  r†   r‡   r'   rk   )r?   r^   r†  Znewkeysr•  r7   r7   r8   Útest_key_versioning_invalid_keyÆ
  s        ÿ

z/SignedValueTest.test_key_versioning_invalid_keyc                 C   s2   d}t tjd|| jdd}t|ƒ}|  d|¡ d S )Nr|   r1  rd   r˜  )r&   rz  rš  r{  r(   rk   )r?   r^   r†  rW   r7   r7   r8   Útest_key_version_retrievalÐ
  s        ÿz*SignedValueTest.test_key_version_retrievalN)rC   rD   rE   r€  rš  r|  r{  r  r…  r‡  r‘  r“  r–  r›  rœ  r  rž  r7   r7   r7   r8   rz  /
  s     



rz  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)rG  rH  rU   rO   rA  )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_tokenrA  r>   r‚  r7   r8   r¢  è
  s    
zXSRFTest.setUpNc                 C   sH   |d k	r|   |¡}nd }| j|d k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 kr| j }dd| iS )NrÜ   z_xsrf=©rA  ©r?   Útokenr7   r7   r8   r¥  ÷
  s    zXSRFTest.cookie_headersc              	   C   s8   t tdƒ | jdddd}W 5 Q R X |  |jd¡ d S ©Nú.*'_xsrf' argument missingrH   rž   rŸ   r    r5  r—  r¨   r7   r7   r8   Útest_xsrf_fail_no_tokenü
  s    z XSRFTest.test_xsrf_fail_no_tokenc              	   C   sH   t tdƒ& | jddtj t| jd¡d}W 5 Q R X |  |j	d¡ d S ©Nú!.*XSRF cookie does not match POSTrH   rž   ©Z_xsrfr    r5  ©
r   r   r£   r¬  r­  r®  rY   rA  rk   r¥   r¨   r7   r7   r8   Útest_xsrf_fail_body_no_cookie  s    ýz&XSRFTest.test_xsrf_fail_body_no_cookiec              
   C   sL   t tdƒ* | jdd|  ¡ tj tdd¡d}W 5 Q R X |  |j	d¡ d S )Nz%.*'_xsrf' argument has invalid formatrH   rž   ú3|r¯  r’  r5  )
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   sR   t tdƒ0 | jdd| jddtj t| jd¡d}W 5 Q R X |  	|j
d¡ d S )	Nr®  rH   rž   r²  ©r©  r¯  r’  r5  )r   r   r£   r¥  r¬  r­  r®  rY   rA  rk   r¥   r¨   r7   r7   r8   Ú$test_xsrf_fail_cookie_invalid_format  s    
üz-XSRFTest.test_xsrf_fail_cookie_invalid_formatc              	   C   s>   t tdƒ | jddd|  ¡ d}W 5 Q R X |  |jd¡ d S )Nr«  rH   rž   rŸ   ©r¡   r¢   rÙ   r5  )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   rA  r¥  rk   r¥   r¨   r7   r7   r8   Útest_xsrf_success_post_body7  s    üz$XSRFTest.test_xsrf_success_post_bodyc                 C   s<   | j dtj t| jd¡ dd|  ¡ d}|  |jd¡ d S )Nz/?r¯  rž   rŸ   r¶  r   r¼  r¨   r7   r7   r8   Útest_xsrf_success_query_string@  s    üz'XSRFTest.test_xsrf_success_query_stringc                 C   s6   | j dddtd| jif|  ¡ Žd}|  |jd¡ d S )NrH   rž   rŸ   zX-Xsrftokenr¶  r   )r£   rY   rA  r¥  rk   r¥   r¨   r7   r7   r8   Útest_xsrf_success_headerI  s    ÿþü	z!XSRFTest.test_xsrf_success_headerc                 C   s:   d}t ƒ }t|ƒD ]}| |  ¡ ¡ q|  t|ƒ|¡ d S )NrÅ   )r#  Úrangerù  r£  rk   rå   )r?   Z
NUM_TOKENSÚtokensrU  r7   r7   r8   Útest_distinct_tokensU  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 ]R\}}t
tdƒ, | jddtj t|d¡|  |¡d}W 5 Q R X |  |j	d¡ q`d S )NrH   rž   r¯  r¶  r   r®  r5  )r£  rA  r£   r¬  r­  r®  rY   r¥  rk   r¥   r   r   )r?   Ztoken2r©  r©   Úcookie_tokenÚ
body_tokenr7   r7   r8   Útest_cross_user]  s(    üþüzXSRFTest.test_cross_userc              	   C   s|   | j }t|gƒ}tdƒD ]N}|  |¡}| |¡ | jddtj t	| j d¡|  
|¡d}|  |jd¡ q|  t|ƒd¡ d S )Né   rH   rž   r¯  r¶  r   é   )rA  r#  rÀ  r£  rù  r£   r¬  r­  r®  rY   r¥  rk   r¥   rå   )r?   r©  Ztokens_seenrU  r©   r7   r7   r8   Útest_refresh_tokenv  s    


üzXSRFTest.test_refresh_tokenc              	   C   sÆ   |   | jdd| jdd¡ | jdd}tdƒD ]}|  | j|dd|¡ 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_tokenrU  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   rA  r>   r7   r7   r8   rP   §  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   ¦  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 k	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 kr| j }dd| iS )NrÜ   z__Host-xsrf=r§  r¨  r7   r7   r8   r¥  Á  s    z!XSRFCookieNameTest.cookie_headersc              	   C   s8   t tdƒ | jdddd}W 5 Q R X |  |jd¡ d S rª  r—  r¨   r7   r7   r8   r¬  Æ  s    z*XSRFCookieNameTest.test_xsrf_fail_no_tokenc              	   C   sH   t tdƒ& | jddtj t| jd¡d}W 5 Q R X |  |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Ê  ¥  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 k	sNt‚t d|¡}|d k	sft‚tj 	tj
j¡tjdd }tj | ¡ d ¡}|jd kr°|jtj
jd	}|  t||  ¡ ƒd
k ¡ d S )NrH   z	httponly;r×   zexpires=z.*; expires=(?P<expires>.+);.*rp   rð   rò   )ÚtzinforÅ   )r£   ré  rÙ   r   rP   ru   rs   rt   ró   rô   rõ   rö   r÷   rø   rù   rú   rû   rÎ  Úreplacerw   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 )Nr8  úWWW-AuthenticateúBasic realm="something"Zfinish_valuer³  zauthentication required)r„  rh  rH  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=1r8  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   4  s    z/CacheTest.get_handlers.<locals>.EtagHandler.getc                 S   s
   | j d S r  )Z_write_bufferr>   r7   r7   r8   Úcompute_etag7  s    z8CacheTest.get_handlers.<locals>.EtagHandler.compute_etagN)rC   rD   rE   rP   rß  r7   r7   r7   r8   ÚEtagHandler3  s   rà  z
/etag/(.*)r›   )r?   rà  r7   r7   r8   r;   2  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_matchA  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_matchF  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_matchK  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_matchP  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_matchU  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_matchZ  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_match_  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_matchd  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ä  i  s
     ÿzCacheTest._test_etagN)rC   rD   rE   r;   rç  rè  rë  rì  rí  rï  rò  ró  rô  rä  r7   r7   r7   r8   rÝ  1  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Š   rM  r>   r7   r7   r8   rP   r  s    zRequestSummaryTest.Handler.getNrQ   r7   r7   r7   r8   rJ   q  s   rJ   c                 C   s   |   d¡}|  |jd¡ d S )NrH   s   GET / (None)rà   r.  r7   r7   r8   Útest_missing_remote_ipy  s    
z)RequestSummaryTest.test_missing_remote_ipN)rC   rD   rE   r   rJ   rö  r7   r7   r7   r8   rõ  p  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 )Nr5  zGo awayrŽ  )r    r†   ZassertIsNotrk   rÆ  r  )r?   rÂ   Úe2r7   r7   r8   Ú	test_copy  s
    
zHTTPErrorTest.test_copyN)rC   rD   rE   rù  r7   r7   r7   r8   r÷  ~  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_listenˆ  s    zApplicationTest.test_listenN)rC   rD   rE   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 )Ú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   sR   dg}|D ]B}t |d ƒ}z| ¡ }|  d||f ¡ W q
 tk
rJ   Y q
X q
d S )Nz^/api/v\d+/foo/(\w+)$z<did not get expected exception when reversing %s. result: %s)r$   r  rI  rr  )r?   Úpathsr2   Zurl_specrà  r7   r7   r8   Útest_non_reversible“  s    
ÿÿz&URLSpecReverseTest.test_non_reversiblec                 C   s4   |   dtdd ƒ d¡¡ |   dtdd ƒ d¡¡ d S )Nz/api/v1/foo/barz^/api/v1/foo/(\w+)$rÄ   z/api.v1/foo/5/icon.pngz/api\.v1/foo/([0-9]+)/icon\.pngrÆ  r   r>   r7   r7   r8   Útest_reverse_arguments¥  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 )Nrˆ  Ú_ú-rŸ   )rh  Zget_browser_localer¥   rÏ  rŠ   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Þ   rˆ  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Þ   rˆ  ú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Þ   rˆ  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   rN  r†   ró   Úemail.utilsrø   r·  Úior/   rö  ræ   r1   rs   r  rÙ  r;  Úurllib.parser¬  r9   r:   rG   rK   rR   ZTestCasera   r~   r‰   r¬   r  r
  r  r  r(  r3  r=  rT  r\  r`  rc  rd  rm  rp  rt  rx  rz  r¼  r¿  rÖ  r<  rH  rN  rP  rj  ry  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)  r1  rG  ÚobjectrP  ra  re  rh  rv  rz  rŸ  rÊ  rÍ  rÑ  rÖ  rÝ  rõ  r÷  rú  rÿ  r  r  r7   r7   r7   r8   Ú<module>   sü    T5/1  0,
  	B  d%C*":/.\bM
 ÿ
 ÿ; + M:!?	!