U
    ‰ª/e,Ó ã                   @   sÎ  d dl mZ d dlmZ d dlmZmZmZmZm	Z	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZmZ d d
lmZ d dlmZ d dlmZmZmZmZ d dl m!Z! d dl"m#Z#m$Z$ d dl%m&Z&m'Z'm(Z(m)Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9 d dl:Z:d dl;Z;d dl<Z<d dl=Z=d dl>Z?d dl@Z@d dlAmBZB d dlCZCd dlDZDd dlEZEd dlFZFd dlGZGd dlHZHd dlIZId dlJZKdd„ ZLG dd„ deƒZMG dd„ deMƒZNG dd„ de'ƒZOG dd„ de'ƒZPG dd„ deIjQƒZRG dd„ deIjQƒZSG d d!„ d!eMƒZTG d"d#„ d#eMƒZUG d$d%„ d%e'ƒZVG d&d'„ d'eMƒZWG d(d)„ d)e'ƒZXG d*d+„ d+eMƒZYG d,d-„ d-e'ƒZZG d.d/„ d/eMƒZ[G d0d1„ d1e'ƒZ\G d2d3„ d3e'ƒZ]G d4d5„ d5e'ƒZ^G d6d7„ d7e'ƒZ_G d8d9„ d9e'ƒZ`G d:d;„ d;e'ƒZaG d<d=„ d=e'ƒZ)G d>d?„ d?e'ƒZbG d@dA„ dAe'ƒZcG dBdC„ dCe'ƒZdG dDdE„ dEe'ƒZeG dFdG„ dGeMƒZfG dHdI„ dIeMƒZgG dJdK„ dKeMƒZhG dLdM„ dMeMƒZiG dNdO„ dOeMƒZjG dPdQ„ dQeMƒZkG dRdS„ dSeMƒZlG dTdU„ dUeMƒZmG dVdW„ dWeMƒZnG dXdY„ dYeMƒZoG dZd[„ d[eNƒZpG d\d]„ d]eNƒZqG d^d_„ d_eNƒZrG d`da„ daeNƒZsG dbdc„ dceNƒZtG ddde„ deeNƒZuG dfdg„ dgeMƒZvG dhdi„ dieNƒZwG djdk„ dkeMƒZxG dldm„ dmeNƒZyG dndo„ doezƒZ{G dpdq„ dqeNƒZ|G drds„ dseNƒZ}G dtdu„ dueNƒZ~G dvdw„ dweNƒZG dxdy„ dyeNƒZ€G dzd{„ d{eMƒZG d|d}„ d}eNƒZ‚G d~d„ deNƒZƒG d€d„ deNƒZ„G d‚dƒ„ dƒeNƒZ…G d„d…„ d…eNƒZ†G d†d‡„ d‡eMƒZ‡G dˆd‰„ d‰eMƒZˆG dŠd‹„ d‹eMƒZ‰G dŒd„ deMƒZŠG dŽd„ deMƒZ‹e6G dd‘„ d‘e'ƒƒZŒG d’d“„ d“eƒZŽG d”d•„ d•eŽeMƒZG d–d—„ d—eŽeMƒZG d˜d™„ d™eNƒZ‘G dšd›„ d›eNƒZ’G dœd„ deIjQƒZ“G dždŸ„ dŸeNƒZ”G d d¡„ d¡eNƒZ•G d¢d£„ d£eNƒZ–G d¤d¥„ d¥eNƒZ—G d¦d§„ d§eMƒZ˜G d¨d©„ d©eMƒZ™G dªd«„ d«eNƒZšG d¬d­„ d­eIjQƒZ›G d®d¯„ d¯eƒZœG d°d±„ d±eIjQƒZG d²d³„ d³eMƒZžG d´dµ„ dµeMƒZŸdS )¶é    )ÚFuture)Úgen)Újson_decodeÚutf8Ú
to_unicodeÚrecursive_unicodeÚ
native_strÚto_basestring)ÚHTTPClientError)Úformat_timestamp)ÚIOStream)Úlocale)ÚEvent)Úapp_logÚgen_log©ÚSimpleAsyncHTTPClient©Ú
DictLoader)ÚAsyncHTTPTestCaseÚAsyncTestCaseÚ	ExpectLogÚgen_test)Úignore_deprecation)Ú
ObjectDictÚunicode_type)ÚApplicationÚRequestHandlerÚStaticFileHandlerÚRedirectHandlerÚ	HTTPErrorÚMissingArgumentErrorÚErrorHandlerÚauthenticatedÚurlÚ_create_signature_v1Úcreate_signed_valueÚdecode_signed_valueÚget_signature_key_versionÚUIModuleÚFinishÚstream_request_bodyÚremoveslashÚaddslashÚGZipContentEncodingN)ÚBytesIOc                  G   s   t jjt j t¡f| žŽ S ©N)ÚosÚpathÚjoinÚdirnameÚ__file__)Úa© r7   ú9/tmp/pip-unpacked-wheel-u_oqpzhd/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dd }t	j
 | ¡ d ¡}|d k	spt‚tj|d 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ÚutcnowÚ	timedeltaÚemailÚutilsÚ	parsedateÚ	groupdictrw   ÚabsÚtotal_seconds©r?   r©   ré   rt   rò   ÚparsedZheader_expiresr7   r7   r8   Útest_set_cookie_expires_days  s    
z'CookieTest.test_set_cookie_expires_daysc                 C   sn   |   d¡}t|j d¡ƒ}|  |d  ¡ d¡ |  |d  ¡ d¡ |  |d  ¡ d¡ |  |d	  ¡ d
¡ d S )NrÕ   r×   r   za=1; path=/; securerd   zb=1; path=/rp   zc=1; httponly; path=/rä   zd=1; path=/)r£   rØ   rÙ   rÚ   rk   Úlowerrí   r7   r7   r8   Útest_set_cookie_false_flags  s    
z&CookieTest.test_set_cookie_false_flagsc              	   C   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                   @   sH  e Zd ZdZej ej e¡d¡Z	dd„ Z
dd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Z d1d2„ Z!d3d4„ Z"d5d6„ Z#d7d8„ Z$d9d:„ Z%d;d<„ Z&d=d>„ Z'd?d@„ Z(dAdB„ Z)dCdD„ Z*e+ ,ej-dEkdF¡dGdH„ ƒZ.dIS )JÚStaticFileTests€   63a36e950e134b5217e33c763e88840c10a07d80e6057d92b9ac97508de7fb1fa6f0e9b7531e169657165ea764e8963399cb6d921ffe6078425aaafe54c04563Ústaticc                 C   sT   G dd„ dt ƒ}G dd„ d|ƒ}G dd„ dt ƒ}d|fd|fd	|fd
ttddfgS )Nc                   @   s   e Zd Zdd„ ZdS )z5StaticFileTest.get_handlers.<locals>.StaticUrlHandlerc                 S   s(   t |  dd¡ƒ}|  | j||d¡ d S )NÚinclude_versionrÈ   )rØ  )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.txts   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   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_filesk  s    


 ÿ
ÿz+StaticFileTest.test_static_compressed_filesc                 C   s"   |   d¡}|  |jd| j ¡ d S )Nz/static_url/robots.txts   /static/robots.txt?v=)r£   rk   r¢   Úrobots_txt_hashr¨   r7   r7   r8   Útest_static_urlx  s    
zStaticFileTest.test_static_urlc                 C   s0   |   d¡}|  |jt|  d¡ƒd | j ¡ d S )Nz/abs_static_url/robots.txtrH   s   static/robots.txt?v=)r£   rk   r¢   r   r¤   ré  r¨   r7   r7   r8   Útest_absolute_static_url|  s
    
þz'StaticFileTest.test_absolute_static_urlc                 C   s   |   d¡}|  |jd¡ d S )Nz(/static_url/robots.txt?include_version=0s   /static/robots.txtrà   r¨   r7   r7   r8   Útest_relative_version_exclusionƒ  s    
z.StaticFileTest.test_relative_version_exclusionc                 C   s*   |   d¡}|  |jt|  d¡d ƒ¡ d S )Nz,/abs_static_url/robots.txt?include_version=0rH   ústatic/robots.txt)r£   rk   r¢   r   r¤   r¨   r7   r7   r8   Útest_absolute_version_exclusion‡  s    
z.StaticFileTest.test_absolute_version_exclusionc                 C   s   |   d¡ |   d¡ d S )NFT)Ú_trigger_include_host_checkr>   r7   r7   r8   Útest_include_host_override‹  s    
z)StaticFileTest.test_include_host_overridec                 C   s0   d}|   |t|ƒ ¡}|  |jttdƒƒ¡ d S )Nz//override_static_url/robots.txt?include_host=%sT)r£   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|ƒ}|  |jt	| 
¡ ƒ¡ W 5 Q R X |  |j d¡d¡ |  |j d	¡d ¡ d S )
Nræ  r  zbytes=0-rÞ   r   ú
robots.txtrü  Ú26r  ©rø  rk   r¥   r1   r2   r3   Ú
static_dirÚopenr¢   r   ÚreadrÙ   rP   ©r?   r©   Zrobots_file_pathÚfr7   r7   r8   Ú test_static_with_range_full_fileò  s     ÿ
 z/StaticFileTest.test_static_with_range_full_filec              	   C   s†   | j dddid}|  |jd¡ tj | jd¡}t|ƒ}|  |jt	| 
¡ ƒ¡ W 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  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|ƒ$}|  |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  rd   rü  Z25r  zbytes 1-25/26r  r  r7   r7   r8   Ú'test_static_with_range_partial_past_end
  s     ÿ
(z6StaticFileTest.test_static_with_range_partial_past_endc                 C   sL   | j dddid}|  |jd¡ |  |j d¡d¡ |  |j d¡d	¡ d S )
Nræ  r  z	bytes=22-rÞ   ó   : /
rü  rg  r  úbytes 22-25/26©rø  rk   r¢   rÙ   rP   r¨   r7   r7   r8   Útest_static_with_range_end_edge  s     ÿz.StaticFileTest.test_static_with_range_end_edgec                 C   sL   | j dddid}|  |jd¡ |  |j d¡d¡ |  |j d¡d	¡ d S )
Nræ  r  zbytes=-4rÞ   r  rü  rg  r  r  r  r¨   r7   r7   r8   Útest_static_with_range_neg_end  s     ÿz-StaticFileTest.test_static_with_range_neg_endc              	   C   s†   | j dddid}|  |jd¡ tj | jd¡}t|ƒ}|  |jt	| 
¡ ƒ¡ W 5 Q R X |  |j d¡d¡ |  |j d	¡d ¡ d S )
Nræ  r  zbytes=-1000000rÞ   r   r  rü  r  r  r  r  r7   r7   r8   Ú%test_static_with_range_neg_past_start%  s     ÿ
 z4StaticFileTest.test_static_with_range_neg_past_startc                 C   s$   | j dddid}|  |jd¡ d S )Nræ  r  r®   rÞ   r   r  r¨   r7   r7   r8   Útest_static_invalid_range0  s    z(StaticFileTest.test_static_invalid_rangec                 C   s8   | j dddid}|  |j d¡d¡ |  |jd¡ d S )Nræ  r  zbytes=-0rÞ   r  ú
bytes */26é   )rø  rk   rÙ   rP   r¥   r¨   r7   r7   r8   Ú+test_static_unsatisfiable_range_zero_suffix4  s     ÿz:StaticFileTest.test_static_unsatisfiable_range_zero_suffixc                 C   s8   | j dddid}|  |jd¡ |  |j d¡d¡ d S )Nræ  r  zbytes=26rÞ   r#  r  r"  ©rø  rk   r¥   rÙ   rP   r¨   r7   r7   r8   Ú-test_static_unsatisfiable_range_invalid_start;  s     ÿz<StaticFileTest.test_static_unsatisfiable_range_invalid_startc                 C   s8   | j dddid}|  |jd¡ |  |j d¡d¡ d S )Nræ  r  z
bytes=10-3rÞ   r#  r  r"  r%  r¨   r7   r7   r8   Ú3test_static_unsatisfiable_range_end_less_than_startB  s     ÿzBStaticFileTest.test_static_unsatisfiable_range_end_less_than_startc                 C   s`   | j ddd}|  |jd¡ |  |jd¡ |  |jd d¡ |  t|jd ƒd	| j d	 ¡ d S )
Nræ  rñ  ©r¡   r   rŸ   rü  r  r   r	  ©r£   rk   r¥   r¢   rÙ   r   ré  r¨   r7   r7   r8   Útest_static_headI  s     ÿzStaticFileTest.test_static_headc                 C   sf   | j ddddid}|  |jd¡ |  |jd¡ |  |jd d	¡ |  t|jd
 ƒd| j d ¡ d S )Nræ  rñ  r  ú	bytes=1-4)r¡   rÙ   r  rŸ   rü  rg  r   r	  r)  r¨   r7   r7   r8   Útest_static_head_rangeS  s      ÿ ÿz%StaticFileTest.test_static_head_rangec                 C   sn   | j ddd| j d dœd}|  |jd¡ |  |jd¡ |  d|jk¡ |  t|jd	 ƒd| j d ¡ d S )
Nræ  r+  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_match^  s    þþ ÿz.StaticFileTest.test_static_range_if_none_matchc                 C   s   |   d¡}|  |jd¡ d S )Nz/static/blargé”  r  r¨   r7   r7   r8   Útest_static_404m  s    
zStaticFileTest.test_static_404c              	   C   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_protectionq  s
    
z-StaticFileTest.test_path_traversal_protectionÚposixznon-posix OSc                 C   sF   t j t j t j t¡¡d¡}|  dtj 	|¡ ¡}|  
|jd¡ d S )Nrí  z/root_staticr   )r1   r2   r3   r4   Úabspathr5   rø  r¬  r­  r¼   rk   r¥   )r?   r2   r©   r7   r7   r8   Útest_root_static_path~  s     ÿz$StaticFileTest.test_root_static_pathN)/rC   rD   rE   ré  r1   r2   r3   r4   r5   r  r;   r<   rç  rè  rê  rë  rì  rî  rð  rï  rø  rþ  r  r  r  r  r
  r  r  r  r  r  r  r   r!  r$  r&  r'  r*  r,  r-  r/  r2  ÚunittestZskipIfr\   r5  r7   r7   r7   r8   rÖ  2  sL   ÿ%	

rÖ  c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚStaticDefaultFilenameTestc                 C   s   t tdƒt dddS ©Nr×  z
index.html)Údefault_filename)rã  Zstatic_handler_argsrä  r>   r7   r7   r8   r<   Œ  s    þz(StaticDefaultFilenameTest.get_app_kwargsc                 C   s   g S r0   r7   r>   r7   r7   r8   r;   ’  s    z&StaticDefaultFilenameTest.get_handlersc                 C   s.   | j ddd}|  |jd¡ |  d|j¡ d S )Nú/static/dir/Fr  r   s   this is the index
©r£   rk   r¥   r¢   r¨   r7   r7   r8   Útest_static_default_filename•  s    z6StaticDefaultFilenameTest.test_static_default_filenamec                 C   s6   | j ddd}|  |jd¡ |  |jd  d¡¡ d S )Nz/static/dirFr  r£  r  r:  )r£   rk   r¥   rw   rÙ   Úendswithr¨   r7   r7   r8   Útest_static_default_redirectš  s    z6StaticDefaultFilenameTest.test_static_default_redirectN)rC   rD   rE   r<   r;   r<  r>  r7   r7   r7   r8   r7  ‹  s   r7  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚStaticFileWithPathTestc                 C   s   t tdƒt dddS r8  rä  r>   r7   r7   r8   r<   ¡  s    þz%StaticFileWithPathTest.get_app_kwargsc                 C   s   dt dtdƒifgS )Nz	/foo/(.*)r2   z
templates/)r   r9   r>   r7   r7   r8   r;   §  s    z#StaticFileWithPathTest.get_handlersc                 C   s   |   d¡}|  |jd¡ d S )Nz/foo/utf8.htmls   HÃ©llo
rà   r¨   r7   r7   r8   Ú
test_serveª  s    
z!StaticFileWithPathTest.test_serveN)rC   rD   rE   r<   r;   r@  r7   r7   r7   r8   r?     s   r?  c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚCustomStaticFileTestc                 C   s0   G dd„ dt ƒ}G dd„ dtƒ}|| _d|fgS )Nc                   @   s^   e Zd Zedd„ ƒZdd„ Zedd„ ƒZdd„ Zedd
d„ƒZdd„ Z	dd„ Z
edd„ ƒZd	S )z>CustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandlerc                 S   s@   |   ||¡}| d¡}|d |… }||d d … }d|||f S )NÚ.rd   z/static/%s.%s.%s)Úget_versionÚrindex)ÚclsrU   r2   Zversion_hashÚextension_indexZbefore_versionZafter_versionr7   r7   r8   Úmake_static_url²  s    
ýzNCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.make_static_urlc                 S   s4   |  d¡}|  dd|¡}d|d |… ||d … f S )NrB  r   z%s%s)rD  )r?   Zurl_pathrF  Zversion_indexr7   r7   r8   Úparse_url_path¾  s    
zMCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.parse_url_pathc                 S   s   d| S )NzCustomStaticFileTest:r7   ©rE  rU   r2   r7   r7   r8   Úget_absolute_pathÃ  s    zPCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_absolute_pathc                 S   s   |S r0   r7   )r?   ÚrootÚabsolute_pathr7   r7   r8   Úvalidate_absolute_pathÇ  s    zUCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.validate_absolute_pathNc                 S   s0   |d 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 )NrN  rä   rO  )rL  r/  r>   r7   r7   r8   Úget_content_sizeÑ  s    
zOCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_content_sizec                 S   s   d S r0   r7   r>   r7   r7   r8   Úget_modified_timeÖ  s    zPCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_modified_timec                 S   s   dS )NÚ42r7   rI  r7   r7   r8   rC  Ù  s    zJCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_version)NN)rC   rD   rE   ÚclassmethodrG  rH  rJ  rM  rR  rS  rT  rC  r7   r7   r7   r8   ÚMyStaticFileHandler±  s   

rW  c                   @   s   e Zd Zdd„ ZdS )z;CustomStaticFileTest.get_handlers.<locals>.StaticUrlHandlerc                 S   s   |   |  |¡¡ d S r0   )rO   rÙ  r”   r7   r7   r8   rP   Þ  s    z?CustomStaticFileTest.get_handlers.<locals>.StaticUrlHandler.getNrQ   r7   r7   r7   r8   rÚ  Ý  s   rÚ  râ  )r   r   Ústatic_handler_class)r?   rW  rÚ  r7   r7   r8   r;   °  s    ,z!CustomStaticFileTest.get_handlersc                 C   s   t d| jdS )NÚdummy)rã  rX  )rY   rX  r>   r7   r7   r8   r<   å  s    z#CustomStaticFileTest.get_app_kwargsc                 C   s   |   d¡}|  |jd¡ d S )Nz/static/foo.42.txtrc   rà   r¨   r7   r7   r8   r@  è  s    
zCustomStaticFileTest.test_servec              	   C   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<   r@  rê  r7   r7   r7   r8   rA  ¯  s   5rA  c                   @   s,   e Zd ZG dd„ deƒZdd„ Zdd„ ZdS )ÚHostMatchingTestc                   @   s   e Zd Zdd„ Zdd„ ZdS )zHostMatchingTest.Handlerc                 C   s
   || _ d S r0   )Úreply)r?   r\  r7   r7   r8   r  ô  s    z#HostMatchingTest.Handler.initializec                 C   s   |   | j¡ d S r0   )rO   r\  r>   r7   r7   r8   rP   ÷  s    zHostMatchingTest.Handler.getN)rC   rD   rE   r  rP   r7   r7   r7   r8   rJ   ó  s   rJ   c                 C   s   dt jddifgS )Nr¶   r\  Zwildcard)r[  rJ   r>   r7   r7   r8   r;   ú  s    zHostMatchingTest.get_handlersc                 C   s<  | j  ddtjddifg¡ | j  ddtjddifg¡ | j  ddtjdd	ifg¡ | j  d
dtjddifg¡ |  d¡}|  |jd¡ |  d¡}|  |jd¡ |  d¡}|  |jd¡ | jdddid}|  |jd¡ | jdddid}|  |jd¡ | jdddid}|  |jd¡ | jdddid}|  |jd¡ d S )Núwww.example.comr¶   r\  ú[0]úwww\.example\.comú/barú[1]ú/bazú[2]zwww.e.*e.comz[3]s   wildcardr.  ÚHostrÞ   ó   [0]ó   [1]ó   [2]zwww.exe.coms   [3])r=   Úadd_handlersr[  rJ   r£   rk   r¢   r¥   r¨   r7   r7   r8   Útest_host_matchingý  s<     ÿ ÿ ÿ ÿ


z#HostMatchingTest.test_host_matchingN)rC   rD   rE   r   rJ   r;   ri  r7   r7   r7   r8   r[  ò  s   r[  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚDefaultHostMatchingTestc                 C   s   g S r0   r7   r>   r7   r7   r8   r;     s    z$DefaultHostMatchingTest.get_handlersc                 C   s   ddiS )NÚdefault_hostr]  r7   r>   r7   r7   r8   r<      s    z&DefaultHostMatchingTest.get_app_kwargsc                 C   sà   | j  ddtjddifg¡ | j  ddtjddifg¡ | j  dd	tjdd
ifg¡ |  d¡}|  |jd¡ |  d¡}|  |jd¡ |  d	¡}|  |jd¡ | jdddid}|  |jd¡ d| j _|  d	¡}|  |jd¡ d S )Nr]  r¶   r\  r^  r_  r`  ra  zwww.test.comrb  rc  re  rf  r.  z	X-Real-Ipr  rÞ   rg  )	r=   rh  r[  rJ   r£   rk   r¢   r¥   rk  r¨   r7   r7   r8   Útest_default_host_matching#  s.     ÿ ÿ ÿ



z2DefaultHostMatchingTest.test_default_host_matchingN)rC   rD   rE   r;   r<   rl  r7   r7   r7   r8   rj    s   rj  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚNamedURLSpecGroupsTestc                 C   s    G dd„ dt ƒ}d|fd|fgS )Nc                   @   s   e Zd Zdd„ ZdS )z8NamedURLSpecGroupsTest.get_handlers.<locals>.EchoHandlerc                 S   s   |   |¡ d S r0   rN   r”   r7   r7   r8   rP   A  s    z<NamedURLSpecGroupsTest.get_handlers.<locals>.EchoHandler.getNrQ   r7   r7   r7   r8   r(  @  s   r(  z/str/(?P<path>.*)z/unicode/(?P<path>.*)r›   )r?   r(  r7   r7   r8   r;   ?  s    þz#NamedURLSpecGroupsTest.get_handlersc                 C   s4   |   d¡}|  |jd¡ |   d¡}|  |jd¡ d S )Nz/str/foos   fooz/unicode/barrc   rà   r¨   r7   r7   r8   Útest_named_urlspec_groupsI  s    

z0NamedURLSpecGroupsTest.test_named_urlspec_groupsN)rC   rD   rE   r;   rn  r7   r7   r7   r8   rm  >  s   
rm  c                   @   s$   e Zd ZG dd„ deƒZdd„ ZdS )ÚClearHeaderTestc                   @   s   e Zd Zdd„ ZdS )zClearHeaderTest.Handlerc                 C   s0   |   dd¡ |   dd¡ |  d¡ |  d¡ d S )NÚh1rb   Úh2rÄ   Znonexistent)rh  Zclear_headerr>   r7   r7   r8   rP   S  s    
zClearHeaderTest.Handler.getNrQ   r7   r7   r7   r8   rJ   R  s   rJ   c                 C   s0   |   d¡}|  d|jk¡ |  |jd d¡ d S )NrH   rp  rq  rÄ   )r£   rw   rÙ   rk   r¨   r7   r7   r8   Útest_clear_headerY  s    
z!ClearHeaderTest.test_clear_headerN)rC   rD   rE   r   rJ   rr  r7   r7   r7   r8   ro  Q  s   ro  c                   @   s$   e Zd ZG dd„ deƒZdd„ ZdS )ÚHeader204Testc                   @   s   e Zd Zdd„ ZdS )zHeader204Test.Handlerc                 C   s   |   d¡ |  ¡  d S )NéÌ   )Ú
set_statusrŠ   r>   r7   r7   r8   rP   a  s    
zHeader204Test.Handler.getNrQ   r7   r7   r7   r8   rJ   `  s   rJ   c                 C   s8   |   d¡}|  |jd¡ |  d|j¡ |  d|j¡ d S )NrH   rt  rü  úTransfer-Encoding)r£   rk   r¥   r¹  rÙ   r¨   r7   r7   r8   Útest_204_headerse  s    
zHeader204Test.test_204_headersN)rC   rD   rE   r   rJ   rw  r7   r7   r7   r8   rs  _  s   rs  c                   @   s$   e Zd ZG dd„ deƒZdd„ ZdS )ÚHeader304Testc                   @   s   e Zd Zdd„ ZdS )zHeader304Test.Handlerc                 C   s   |   dd¡ |  d¡ d S )NúContent-LanguageÚen_USrM   )rh  rO   r>   r7   r7   r8   rP   n  s    zHeader304Test.Handler.getNrQ   r7   r7   r7   r8   rJ   m  s   rJ   c                 C   sˆ   |   d¡}|  |jd d¡ |  |jd d¡ | j dd|jd id}|  |jd	¡ |  d|jk¡ |  d|jk¡ |  d
|jk¡ d S )NrH   rü  Ú5ry  rz  rÿ  r   rÞ   rû  rv  )r£   rk   rÙ   r¥   rw   rý  r7   r7   r8   Útest_304_headersr  s    
 ÿzHeader304Test.test_304_headersN)rC   rD   rE   r   rJ   r|  r7   r7   r7   r8   rx  l  s   rx  c                   @   s,   e Zd ZG dd„ deƒZdd„ Zdd„ ZdS )ÚStatusReasonTestc                   @   s   e Zd Zdd„ ZdS )zStatusReasonTest.Handlerc                 C   s<   | j j dg ¡}| jt|  d¡ƒ|r0t|d ƒnd d d S )NÚreasonr¥   r   ©r~  )r,  r-  rP   ru  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   Úget_http_clientŠ  s    z StatusReasonTest.get_http_clientc                 C   sœ   |   d¡}|  |jd¡ |  |jd¡ |   d¡}|  |jd¡ |  |jd¡ |   d¡}|  |jd¡ |  |jd¡ |   d	¡}|  |jd¡ |  |jd
¡ d S )Nz
/?code=304rû  zNot Modifiedz/?code=304&reason=FooÚFooz/?code=682&reason=Baréª  ÚBarz
/?code=682ÚUnknown)r£   rk   r¥   r~  r¨   r7   r7   r8   Útest_statusŽ  s    



zStatusReasonTest.test_statusN)rC   rD   rE   r   rJ   r€  r…  r7   r7   r7   r8   r}    s   r}  c                   @   s$   e Zd ZG dd„ deƒZdd„ ZdS )ÚDateHeaderTestc                   @   s   e Zd Zdd„ ZdS )zDateHeaderTest.Handlerc                 C   s   |   d¡ d S rL   rN   r>   r7   r7   r8   rP   Ÿ  s    zDateHeaderTest.Handler.getNrQ   r7   r7   r7   r8   rJ   ž  s   rJ   c                 C   s^   |   d¡}tj |jd ¡}|d k	s(t‚tj|d d… Ž }|  |tj ¡  tj	ddk ¡ d S )NrH   ÚDateró   rp   )Úseconds)
r£   r÷   rø   rù   rÙ   ru   rô   rw   rõ   rö   )r?   r©   rþ   Zheader_dater7   r7   r8   Útest_date_header¢  s    
ÿzDateHeaderTest.test_date_headerN)rC   rD   rE   r   rJ   r‰  r7   r7   r7   r8   r†    s   r†  c                   @   s<   e Zd ZG dd„ deƒZdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚRaiseWithReasonTestc                   @   s   e Zd Zdd„ ZdS )zRaiseWithReasonTest.Handlerc                 C   s   t ddd‚d S )Nr‚  r  r  ©r    r>   r7   r7   r8   rP   ®  s    zRaiseWithReasonTest.Handler.getNrQ   r7   r7   r7   r8   rJ   ­  s   rJ   c                 C   s   t ƒ S r0   r   r>   r7   r7   r8   r€  ±  s    z#RaiseWithReasonTest.get_http_clientc                 C   s8   |   d¡}|  |jd¡ |  |jd¡ |  d|j¡ d S )NrH   r‚  r  s   682: Foo)r£   rk   r¥   r~  ÚassertInr¢   r¨   r7   r7   r8   Útest_raise_with_reasonµ  s    
z*RaiseWithReasonTest.test_raise_with_reasonc                 C   s   |   ttdddƒd¡ d S )Nr‚  r  r  zHTTP 682: Foo©rk   r­   r    r>   r7   r7   r8   Útest_httperror_str»  s    z&RaiseWithReasonTest.test_httperror_strc                 C   s   |   ttdƒƒd¡ d S )Nr‚  zHTTP 682: UnknownrŽ  r>   r7   r7   r8   Ú test_httperror_str_from_httputil¾  s    z4RaiseWithReasonTest.test_httperror_str_from_httputilN)	rC   rD   rE   r   rJ   r€  r  r  r  r7   r7   r7   r8   rŠ  ¬  s
   rŠ  c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚErrorHandlerXSRFTestc                 C   s   dt tddfgS )Nú/erroré¡  ©rÆ  )r"   rY   r>   r7   r7   r8   r;   Ã  s    z!ErrorHandlerXSRFTest.get_handlersc                 C   s
   t ddS ©NT)Úxsrf_cookiesrœ   r>   r7   r7   r8   r<   É  s    z#ErrorHandlerXSRFTest.get_app_kwargsc                 C   s"   | j dddd}|  |jd¡ d S )Nr’  rž   r³  r    r“  r¤  r¨   r7   r7   r8   Útest_error_xsrfÌ  s    z$ErrorHandlerXSRFTest.test_error_xsrfc                 C   s"   | j dddd}|  |jd¡ d S )Nz/404rž   r³  r    r.  r¤  r¨   r7   r7   r8   Útest_404_xsrfÐ  s    z"ErrorHandlerXSRFTest.test_404_xsrfN)rC   rD   rE   r;   r<   r—  r˜  r7   r7   r7   r8   r‘  Â  s   r‘  c                   @   sT   e Zd ZG dd„ deƒZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ ZdS )ÚGzipTestCasec                   @   s   e Zd Zdd„ ZdS )zGzipTestCase.Handlerc                 C   s4   |   d¡D ]}|  d|¡ q
|  ddtj  ¡ d S )NÚvaryr¶  zhello worldú!)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¦  
  s     zCGzipTestCase.test_vary_already_present_multiple.<locals>.<listcomp>r¶  r§  r¨  rÜ   rµ  r©  r¨   r7   r7   r8   Ú"test_vary_already_present_multiple  s    

þz/GzipTestCase.test_vary_already_present_multipleN)rC   rD   rE   r   rJ   r<   r  rŸ  r   r¡  r«  r¬  r7   r7   r7   r8   r™  Õ  s   
r™  c                   @   s4   e Zd ZG dd„ deƒZdd„ Zdd„ Zdd„ Zd	S )
ÚPathArgsInPrepareTestc                   @   s   e Zd Zdd„ Zdd„ ZdS )zPathArgsInPrepareTest.Handlerc                 C   s   |   t| j| jd¡ d S )N©r+  r‘  )rO   rY   r*  Zpath_kwargsr>   r7   r7   r8   rN    s    z%PathArgsInPrepareTest.Handler.preparec                 C   s   |dkst ‚|  ¡  d S )Nrb   )ru   rŠ   r”   r7   r7   r8   rP     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;     s    z"PathArgsInPrepareTest.get_handlersc                 C   s4   |   d¡}| ¡  t|jƒ}|  |dgi dœ¡ d S )Nz/pos/foorb   r®  r”  ©r?   r©   rè   r7   r7   r8   Útest_pos  s    

zPathArgsInPrepareTest.test_posc                 C   s6   |   d¡}| ¡  t|jƒ}|  |g ddidœ¡ d S )Nz/kw/foor2   rb   r®  r”  r°  r7   r7   r8   Útest_kw!  s    

zPathArgsInPrepareTest.test_kwN)rC   rD   rE   r   rJ   r;   r±  r²  r7   r7   r7   r8   r­    s   r­  c                   @   s$   e Zd ZG dd„ deƒZdd„ ZdS )ÚClearAllCookiesTestc                   @   s   e Zd Zdd„ ZdS )zClearAllCookiesTest.Handlerc                 C   s   |   ¡  |  d¡ d S ©NÚok)Zclear_all_cookiesrO   r>   r7   r7   r8   rP   *  s    zClearAllCookiesTest.Handler.getNrQ   r7   r7   r7   r8   rJ   )  s   rJ   c                 C   sj   | j dddid}t|j d¡ƒ}|  |d  d¡p@|d  d¡¡ |  |d	  d
¡pb|d	  d¡¡ d S )NrH   rÜ   zfoo=bar; baz=xyzzyrÞ   r×   r   zbaz=;zbaz="";rd   zfoo=;zfoo="";)r£   rØ   rÙ   rÚ   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³  (  s   r³  c                   @   s   e Zd ZdS )ÚPermissionErrorN©rC   rD   rE   r7   r7   r7   r8   r·  :  s   r·  c                   @   s4   e Zd ZG dd„ deƒZdd„ Zdd„ Zdd„ Zd	S )
ÚExceptionHandlerTestc                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )zExceptionHandlerTest.Handlerc                 C   sD   |   d¡}|dkrtddƒ‚n"|dkr0dd  n|dkr@td	ƒ‚d S )
NÚexcÚhttpéš  zno longer hereZzerord   r   Z
permissionznot allowed)rH  r    r·  )r?   rº  r7   r7   r8   rP   @  s    

z ExceptionHandlerTest.Handler.getc                 K   sL   d|kr8|d \}}}t |tƒr8|  d¡ |  d¡ d S tj| |f|Ž d S )NrÄ  r0  r·  )Ú
isinstancer·  ru  rO   r   rÇ  )r?   rÆ  r‘  Útypr^   Útbr7   r7   r8   rÇ  I  s    


z(ExceptionHandlerTest.Handler.write_errorc                 C   s2   t |tƒrt d|jd ¡ nt | |||¡ d S )Nz&custom logging for PermissionError: %sr   )r½  r·  r   Úwarningr+  r   Úlog_exception©r?   r¾  r^   r¿  r7   r7   r8   rÁ  R  s    
z*ExceptionHandlerTest.Handler.log_exceptionN)rC   rD   rE   rP   rÇ  rÁ  r7   r7   r7   r8   rJ   ?  s   		rJ   c              	   C   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_errorX  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=permissionr0  rÄ  r¨   r7   r7   r8   Útest_known_errore  s    
z%ExceptionHandlerTest.test_known_errorN)rC   rD   rE   r   rJ   rÃ  rÅ  rÆ  r7   r7   r7   r8   r¹  >  s   r¹  c                   @   s$   e Zd ZG dd„ deƒZdd„ ZdS )ÚBuggyLoggingTestc                   @   s   e Zd Zdd„ Zdd„ ZdS )zBuggyLoggingTest.Handlerc                 C   s   dd  d S rÊ  r7   r>   r7   r7   r8   rP   o  s    zBuggyLoggingTest.Handler.getc                 C   s   dd  d S rÊ  r7   rÂ  r7   r7   r8   rÁ  r  s    z&BuggyLoggingTest.Handler.log_exceptionN)rC   rD   rE   rP   rÁ  r7   r7   r7   r8   rJ   n  s   rJ   c              	   C   s$   t tdƒ |  d¡ W 5 Q R X d S )Nz.*rH   )r   r   r£   r>   r7   r7   r8   Útest_buggy_log_exceptionu  s    z)BuggyLoggingTest.test_buggy_log_exceptionN)rC   rD   rE   r   rJ   rÈ  r7   r7   r7   r8   rÇ  m  s   rÇ  c                       s@   e Zd ZdZG dd„ deƒZdd„ Z‡ fdd„Zdd	„ Z‡  Z	S )
ÚUIMethodUIModuleTestz`Test that UI methods and modules are created correctly and
    associated with the handler.
    c                   @   s   e Zd Zdd„ Zdd„ ZdS )zUIMethodUIModuleTest.Handlerc                 C   s   |   d¡ d S r–   r_  r>   r7   r7   r8   rP   ‚  s    z UIMethodUIModuleTest.Handler.getc                 C   s
   |   d¡S )Nr^   )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Benrz  )Ú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_namespace  s    zXGetCurrentUserTest.get_handlers.<locals>.CurrentUserModuleHandler.get_template_namespaceN)rC   rD   rE   rë  r7   r7   r7   r8   ÚCurrentUserModuleHandler  s   rì  c                   @   s   e Zd Zdd„ ZdS )zAGetCurrentUserTest.get_handlers.<locals>.WithoutUserModuleHandlerc                 S   s   |   d¡ |  t| jƒ¡ d S )Nrâ  rç  r>   r7   r7   r8   rP   
  s    
zEGetCurrentUserTest.get_handlers.<locals>.WithoutUserModuleHandler.getNrQ   r7   r7   r7   r8   ÚWithoutUserModuleHandler	  s   rí  c                   @   s   e Zd Zdd„ ZdS )z>GetCurrentUserTest.get_handlers.<locals>.WithUserModuleHandlerc                 S   s   |   d¡ |  t| jƒ¡ d S )Nrã  rç  r>   r7   r7   r8   rP     s    
zBGetCurrentUserTest.get_handlers.<locals>.WithUserModuleHandler.getNrQ   r7   r7   r7   r8   ÚWithUserModuleHandler  s   rî  ú/without_userú
/with_userú/without_user_moduleú/with_user_moduler›   )r?   ræ  rè  ré  rì  rí  rî  r7   r7   r8   r;   ï  s    üzGetCurrentUserTest.get_handlersz	needs fixc                 C   s   |   d¡}|  |jd¡ d S )Nrï  ó   Falserà   r¨   r7   r7   r8   Útest_get_current_user_is_lazy  s    
z0GetCurrentUserTest.test_get_current_user_is_lazyc                 C   s   |   d¡}|  |jd¡ d S )Nrð  ó   Truerà   r¨   r7   r7   r8   Útest_get_current_user_works   s    
z.GetCurrentUserTest.test_get_current_user_worksc                 C   s   |   d¡}|  |jd¡ d S )Nrñ  ró  rà   r¨   r7   r7   r8   Ú,test_get_current_user_from_ui_module_is_lazy$  s    
z?GetCurrentUserTest.test_get_current_user_from_ui_module_is_lazyc                 C   s   |   d¡}|  |jd¡ d S )Nrò  rõ  rà   r¨   r7   r7   r8   Ú*test_get_current_user_from_ui_module_works(  s    
z=GetCurrentUserTest.test_get_current_user_from_ui_module_works)rC   rD   rE   r<   r€  r;   r6  Úskiprô  rö  r÷  rø  r»  r7   r7   r‚  r8   rÝ  Ñ  s   +
rÝ  c                   @   s$   e Zd ZG dd„ deƒZdd„ ZdS )ÚUnimplementedHTTPMethodsTestc                   @   s   e Zd ZdS )z$UnimplementedHTTPMethodsTest.HandlerNr¸  r7   r7   r7   r8   rJ   .  s   rJ   c                 C   sR   dD ] }| j d|d}|  |jd¡ qdD ]"}| j d|dd}|  |jd¡ q*d S )N)rñ  rò  ÚDELETEÚOPTIONSrH   r(  é•  ©rž   ÚPUTrŸ   r    r¤  )r?   r¡   r©   r7   r7   r8   Ú#test_unimplemented_standard_methods1  s    z@UnimplementedHTTPMethodsTest.test_unimplemented_standard_methodsN)rC   rD   rE   r   rJ   r   r7   r7   r7   r8   rú  -  s   rú  c                   @   s,   e Zd ZG dd„ deƒZdd„ Zdd„ ZdS )Ú#UnimplementedNonStandardMethodsTestc                   @   s   e Zd Zdd„ ZdS )z+UnimplementedNonStandardMethodsTest.Handlerc                 C   s   |   d¡ d S ©NÚotherrN   r>   r7   r7   r8   r  <  s    z1UnimplementedNonStandardMethodsTest.Handler.otherN)rC   rD   rE   r  r7   r7   r7   r8   rJ   ;  s   rJ   c                 C   s"   | j dddd}|  |jd¡ d S )NrH   ÚPATCHrŸ   r    rý  r¤  r¨   r7   r7   r8   Útest_unimplemented_patchA  s    z<UnimplementedNonStandardMethodsTest.test_unimplemented_patchc                 C   s"   | j dddd}|  |jd¡ d S )NrH   ÚOTHERT©r¡   Zallow_nonstandard_methodsrý  r¤  r¨   r7   r7   r8   Útest_unimplemented_otherG  s    z<UnimplementedNonStandardMethodsTest.test_unimplemented_otherN)rC   rD   rE   r   rJ   r  r  r7   r7   r7   r8   r  :  s   r  c                   @   s$   e Zd ZG dd„ deƒZdd„ ZdS )ÚAllHTTPMethodsTestc                   @   s(   e Zd Zdd„ Ze Z Z Z ZZdS )zAllHTTPMethodsTest.Handlerc                 C   s"   | j jd k	st‚|  | j j¡ d S r0   )r,  r¡   ru   rO   r>   r7   r7   r8   r¡   N  s    z!AllHTTPMethodsTest.Handler.methodN)	rC   rD   rE   r¡   rP   ÚdeleteÚoptionsr   Úputr7   r7   r7   r8   rJ   M  s   rJ   c                 C   sv   | j ddd}|  |jd¡ dD ]$}| j d|d}|  |jt|ƒ¡ q dD ]&}| j d|dd}|  |jt|ƒ¡ qJd S )NrH   rñ  r(  rŸ   )rò  rû  rü  rþ  r    )r£   rk   r¢   r   )r?   r©   r¡   r7   r7   r8   Útest_standard_methodsT  s    z(AllHTTPMethodsTest.test_standard_methodsN)rC   rD   rE   r   rJ   r  r7   r7   r7   r8   r	  L  s   r	  c                   @   s,   e Zd ZG dd„ deƒZdd„ Zdd„ ZdS )ÚPatchMethodTestc                   @   s&   e Zd Zejd Zdd„ Zdd„ ZdS )zPatchMethodTest.Handler)r  c                 C   s   |   d¡ d S )NÚpatchrN   r>   r7   r7   r8   r  e  s    zPatchMethodTest.Handler.patchc                 C   s   |   d¡ d S r  rN   r>   r7   r7   r8   r  h  s    zPatchMethodTest.Handler.otherN)rC   rD   rE   r   ZSUPPORTED_METHODSr  r  r7   r7   r7   r8   rJ   `  s   
rJ   c                 C   s"   | j dddd}|  |jd¡ d S )NrH   r  rŸ   r    s   patchrà   r¨   r7   r7   r8   Ú
test_patchk  s    zPatchMethodTest.test_patchc                 C   s"   | j dddd}|  |jd¡ d S )NrH   r  Tr  s   otherrà   r¨   r7   r7   r8   Ú
test_othero  s    zPatchMethodTest.test_otherN)rC   rD   rE   r   rJ   r  r  r7   r7   r7   r8   r  _  s   r  c                   @   s$   e Zd ZG dd„ deƒZdd„ ZdS )ÚFinishInPrepareTestc                   @   s   e Zd Zdd„ Zdd„ ZdS )zFinishInPrepareTest.Handlerc                 C   s   |   d¡ d S )Nr§   )rŠ   r>   r7   r7   r8   rN  v  s    z#FinishInPrepareTest.Handler.preparec                 C   s   t dƒ‚d S )Nzshould not reach this methodrË  r>   r7   r7   r8   rP   y  s    zFinishInPrepareTest.Handler.getNr¯  r7   r7   r7   r8   rJ   u  s   rJ   c                 C   s   |   d¡}|  |jd¡ d S )NrH   s   donerà   r¨   r7   r7   r8   Útest_finish_in_prepare  s    
z*FinishInPrepareTest.test_finish_in_prepareN)rC   rD   rE   r   rJ   r  r7   r7   r7   r8   r  t  s   
r  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚDefault404Testc                 C   s
   dt fgS ©Nr¶   r›   r>   r7   r7   r8   r;   …  s    zDefault404Test.get_handlersc                 C   s*   |   d¡}|  |jd¡ |  |jd¡ d S )NrH   r.  sE   <html><title>404: Not Found</title><body>404: Not Found</body></html>r;  r¨   r7   r7   r8   Útest_404‰  s    
þzDefault404Test.test_404N)rC   rD   rE   r;   r  r7   r7   r7   r8   r  „  s   r  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚCustom404Testc                 C   s
   dt fgS r  r›   r>   r7   r7   r8   r;   ”  s    zCustom404Test.get_handlersc                 C   s   G dd„ dt ƒ}t|dS )Nc                   @   s   e Zd Zdd„ ZdS )z6Custom404Test.get_app_kwargs.<locals>.Custom404Handlerc                 S   s   |   d¡ |  d¡ d S )Nr.  zcustom 404 response)ru  rO   r>   r7   r7   r8   rP   ™  s    
z:Custom404Test.get_app_kwargs.<locals>.Custom404Handler.getNrQ   r7   r7   r7   r8   ÚCustom404Handler˜  s   r  )Údefault_handler_class)r   rY   )r?   r  r7   r7   r8   r<   —  s    zCustom404Test.get_app_kwargsc                 C   s*   |   d¡}|  |jd¡ |  |jd¡ d S )NrH   r.  s   custom 404 responser;  r¨   r7   r7   r8   r  Ÿ  s    
zCustom404Test.test_404N)rC   rD   rE   r;   r<   r  r7   r7   r7   r8   r  “  s   r  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚDefaultHandlerArgumentsTestc                 C   s
   dt fgS r  r›   r>   r7   r7   r8   r;   ¦  s    z(DefaultHandlerArgumentsTest.get_handlersc                 C   s   t tt dddS )Nr0  r”  )r  Zdefault_handler_args)rY   r"   r>   r7   r7   r8   r<   ©  s    þz*DefaultHandlerArgumentsTest.get_app_kwargsc                 C   s   |   d¡}|  |jd¡ d S )NrH   r0  r¤  r¨   r7   r7   r8   Útest_403¯  s    
z$DefaultHandlerArgumentsTest.test_403N)rC   rD   rE   r;   r<   r  r7   r7   r7   r8   r  ¥  s   r  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚHandlerByNameTestc                 C   s   dt fdtddƒgS )Nú/hello1)ú/hello2ú"tornado.test.web_test.HelloHandlerú/hello3r  )rK   r$   r>   r7   r7   r8   r;   µ  s    ýzHandlerByNameTest.get_handlersc                 C   sL   |   d¡}|  |jd¡ |   d¡}|  |jd¡ |   d¡}|  |jd¡ d S )Nr  r«  r  r   rà   ©r?   Úrespr7   r7   r8   Útest_handler_by_name½  s    


z&HandlerByNameTest.test_handler_by_nameN)rC   rD   rE   r;   r#  r7   r7   r7   r8   r  ´  s   r  c                   @   sL   e Zd Zdd„ Zdd„ Zedd„ ƒZedd„ ƒZed	d
„ ƒZedd„ ƒZ	dS )ÚStreamingRequestBodyTestc                 C   sb   t G dd„ dtƒƒ}t G dd„ dtƒƒ}t G dd„ dtƒƒ}d|t| dfd	|fd
|t| dfgS )Nc                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
zCStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandlerc                 S   s
   || _ d S r0   rŒ   r  r7   r7   r8   r  Ê  s    zNStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.initializec                 S   s   | j j d ¡ d S r0   )r   ÚpreparedÚ
set_resultr>   r7   r7   r8   rN  Í  s    zKStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.preparec                 S   s   | j j |¡ d S r0   )r   rè   r&  ©r?   rè   r7   r7   r8   Údata_receivedÐ  s    zQStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.data_receivedc                 S   s   | j j d ¡ |  i ¡ d S r0   )r   Úfinishedr&  rO   r>   r7   r7   r8   rP   Ó  s    zGStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.getN)rC   rD   rE   r  rN  r(  rP   r7   r7   r7   r8   ÚStreamingBodyHandlerÈ  s   r*  c                   @   s   e Zd Zdd„ ZdS )zAStreamingRequestBodyTest.get_handlers.<locals>.EarlyReturnHandlerc                 S   s   t dƒ‚d S )Né‘  r‹  r>   r7   r7   r8   rN  Ù  s    zIStreamingRequestBodyTest.get_handlers.<locals>.EarlyReturnHandler.prepareNrw  r7   r7   r7   r8   ÚEarlyReturnHandler×  s   r,  c                       s$   e Zd Zdd„ Z‡ fdd„Z‡  ZS )zDStreamingRequestBodyTest.get_handlers.<locals>.CloseDetectionHandlerc                 S   s
   || _ d S r0   rŒ   r  r7   r7   r8   r  à  s    zOStreamingRequestBodyTest.get_handlers.<locals>.CloseDetectionHandler.initializec                    s   t ƒ  ¡  | jj d ¡ d S r0   )r  r  r   Úclose_futurer&  r>   r‚  r7   r8   r  ã  s    
zXStreamingRequestBodyTest.get_handlers.<locals>.CloseDetectionHandler.on_connection_close)rC   rD   rE   r  r  r»  r7   r7   r‚  r8   ÚCloseDetectionHandlerÞ  s   r.  z/stream_bodyrŒ   z/early_returnz/close_detection)r+   r   rY   )r?   r*  r,  r.  r7   r7   r8   r;   Ç  s    	ýz%StreamingRequestBodyTest.get_handlersc                 C   sZ   t   t jt jd¡}| d|  ¡ f¡ t|ƒ}| d| d ¡ |rL| d¡ | d¡ |S )Nr   r  s   GET s    HTTP/1.1
s   Connection: close
s   Transfer-Encoding: chunked

)r  r  r  r   r!  r   rO   )r?   r$   Úconnection_closer$  r"  r7   r7   r8   r   í  s    

z StreamingRequestBodyTest.connectc                 c   sª   t ƒ | _t ƒ | _t ƒ | _| jddd}| jV  | d¡ | jV }|  |d¡ t ƒ | _| d¡ | jV }|  |d¡ | d¡ | jV  | ¡ V }|  | 	d	¡¡ | 
¡  d S )
Ns   /stream_bodyT©r/  ó	   4
asdf
s   asdfs	   4
qwer
s   qwers   0

s   {})r   r%  rè   r)  r   rO   rk   Úread_until_closerw   r=  r&  ©r?   r"  rè   r7   r7   r8   Útest_streaming_bodyø  s"    



z,StreamingRequestBodyTest.test_streaming_bodyc                 c   s,   | j ddd}| ¡ V }|  | d¡¡ d S )Nó   /early_returnFr0  ó   HTTP/1.1 401)r   r2  rw   rõ  r3  r7   r7   r8   Útest_early_return	  s    
z*StreamingRequestBodyTest.test_early_returnc                 c   s6   | j ddd}| d¡ | ¡ V }|  | d¡¡ d S )Nr5  Fr0  r1  r6  )r   rO   r2  rw   rõ  r3  r7   r7   r8   Útest_early_return_with_data	  s    

z4StreamingRequestBodyTest.test_early_return_with_datac                 c   s*   t ƒ | _| jddd}| ¡  | jV  d S )Ns   /close_detectionFr0  )r   r-  r   r&  )r?   r"  r7   r7   r8   Útest_close_during_upload	  s    z1StreamingRequestBodyTest.test_close_during_uploadN)
rC   rD   rE   r;   r   r   r4  r7  r8  r9  r7   r7   r7   r8   r$  Æ  s   &


r$  c                   @   s>   e Zd Zdd„ Zejdd„ ƒZejdd„ ƒZ	ejdd„ ƒZ
d	S )
ÚBaseFlowControlHandlerc                 C   s   || _ d | _g | _d S r0   )r   r¡   Úmethodsr  r7   r7   r8   r  *	  s    z!BaseFlowControlHandler.initializec                 c   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   Úfailr;  Úappendrv  r7   r7   r8   Ú	in_method/	  s    

z BaseFlowControlHandler.in_methodc                 c   s   | j  d¡ tjV  d S )NrN  )r;  r=  r   Úmomentr>   r7   r7   r8   rN  :	  s    zBaseFlowControlHandler.preparec              	   c   s4   |   d¡ tjV  W 5 Q R X |  t| jd¡ d S )Nr   ©r;  )r>  r   r?  rO   rY   r;  r>   r7   r7   r8   r   A	  s    zBaseFlowControlHandler.postN)rC   rD   rE   r  Ú
contextlibÚcontextmanagerr>  r   r   rN  r   r7   r7   r7   r8   r:  (	  s   


r:  c                   @   sL   e Zd Zdd„ Zdd„ Zejdœdd„Zejdœdd	„Zejdœd
d„Z	dS )Ú#BaseStreamingRequestFlowControlTestc                 C   s   t dddS )NrÅ   T)Ú
chunk_sizeZdecompress_requestrœ   r>   r7   r7   r8   Úget_httpserver_optionsI	  s    z:BaseStreamingRequestFlowControlTest.get_httpserver_optionsc                 C   s   t ƒ S r0   r   r>   r7   r7   r8   r€  N	  s    z3BaseStreamingRequestFlowControlTest.get_http_clientr>   c              	   C   s>   | j dddd}| ¡  |  t|jƒtdddddgd¡ d S )	NrH   Úabcdefghijklmnopqrstuvwxyzrž   )r¢   r¡   rN  r(  r   r@  )r£   r  rk   r   r¢   rY   r¨   r7   r7   r8   Útest_flow_control_fixed_bodyS	  s    ûÿþz@BaseStreamingRequestFlowControlTest.test_flow_control_fixed_bodyc              	      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_producerf	  s    zYBaseStreamingRequestFlowControlTest.test_flow_control_chunked_body.<locals>.body_producerrH   rž   )rK  r¡   rN  r(  r   r@  )r   r   r£   r  rk   r   r¢   rY   )r?   rK  r©   r7   rI  r8   Útest_flow_control_chunked_bodyc	  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  r(  r   r@  )r/   r·  ÚGzipFilerO   r&  Úgetvaluer£   r  rk   r   r¢   rY   )r?   ZbytesioZ	gzip_fileZcompressed_bodyr©   r7   r7   r8   Ú!test_flow_control_compressed_bodyz	  s.    
üûÿþzEBaseStreamingRequestFlowControlTest.test_flow_control_compressed_bodyN)
rC   rD   rE   rE  r€  rÌ  ÚAnyrG  rL  rR  r7   r7   r7   r8   rC  H	  s
   rC  c                   @   s   e Zd Zdd„ ZdS )Ú(DecoratedStreamingRequestFlowControlTestc                 C   s"   G dd„ dt ƒ}d|t| dfgS )Nc                   @   s   e Zd Zejdd„ ƒZdS )zZDecoratedStreamingRequestFlowControlTest.get_handlers.<locals>.DecoratedFlowControlHandlerc              	   s   s"   |   d¡ tjV  W 5 Q R X d S )Nr(  )r>  r   r?  r'  r7   r7   r8   r(  š	  s    zhDecoratedStreamingRequestFlowControlTest.get_handlers.<locals>.DecoratedFlowControlHandler.data_receivedN)rC   rD   rE   r   r   r(  r7   r7   r7   r8   ÚDecoratedFlowControlHandler™	  s   rU  rH   rŒ   ©r:  rY   )r?   rU  r7   r7   r8   r;   ˜	  s    z5DecoratedStreamingRequestFlowControlTest.get_handlersN©rC   rD   rE   r;   r7   r7   r7   r8   rT  •	  s   rT  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 )Nr(  r   )r>  Úasyncior  )r?   rè   rY  r7   r7   r8   r(  §	  s    zbNativeStreamingRequestFlowControlTest.get_handlers.<locals>.NativeFlowControlHandler.data_receivedN)rC   rD   rE   r(  r7   r7   r7   r8   ÚNativeFlowControlHandler¦	  s   rZ  rH   rŒ   rV  )r?   rZ  r7   r7   r8   r;   ¥	  s    z2NativeStreamingRequestFlowControlTest.get_handlersNrW  r7   r7   r7   r8   rX  ¢	  s   rX  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ü  rU  rµ  ©rh  rŠ   r/  Úserver_errorrs  rŒ   r7   r8   rP   ·	  s    z<IncorrectContentLengthTest.get_handlers.<locals>.TooHigh.getNrQ   r7   rŒ   r7   r8   ÚTooHigh¶	  s   r^  c                       s   e Zd Z‡ fdd„ZdS )z7IncorrectContentLengthTest.get_handlers.<locals>.TooLowc              
      sJ   |   dd¡ z|  d¡ W n* tk
rD } z|ˆ _‚ W 5 d }~X Y nX d S )Nrü  r   rM   r\  rs  rŒ   r7   r8   rP   À	  s    z;IncorrectContentLengthTest.get_handlers.<locals>.TooLow.getNrQ   r7   rŒ   r7   r8   ÚTooLow¿	  s   r_  ú/highú/low)r]  r   )r?   r^  r_  r7   rŒ   r8   r;   ±	  s
    		z'IncorrectContentLengthTest.get_handlersc                 C   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)r`  T©Zraise_errorz0Tried to write 40 bytes less than Content-Length©	r   r   r   ÚassertRaisesr
   r£   rk   r­   r]  r>   r7   r7   r8   Útest_content_length_too_highÊ	  s    þ, ÿ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 )Nrb  rc  ra  Trd  z,Tried to write more data than Content-Lengthre  r>   r7   r7   r8   Útest_content_length_too_lowÚ	  s    þ, ÿz6IncorrectContentLengthTest.test_content_length_too_lowN)rC   rD   rE   r;   rg  rh  r7   r7   r7   r8   r[  °	  s   r[  c                   @   s$   e Zd ZG dd„ deƒZdd„ ZdS )ÚClientCloseTestc                   @   s   e Zd Zdd„ ZdS )zClientCloseTest.Handlerc                 C   s6   | j j d¡r(| j jj ¡  |  d¡ n
|  d¡ d S )NzHTTP/1rM   úrequires HTTP/1.x)r,  rf   rõ  Ú
connectionr"  r&  rO   r>   r7   r7   r8   rP   í	  s    zClientCloseTest.Handler.getNrQ   r7   r7   r7   r8   rJ   ì	  s   rJ   c              	   C   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   Trd  s   requires HTTP/1.xrj  iW  )	rf  r
   r6  ZSkipTestr£   r¢   ZskipTestrk   r¥   r¨   r7   r7   r8   Útest_client_closeú	  s
    

z!ClientCloseTest.test_client_closeN)rC   rD   rE   r   rJ   rl  r7   r7   r7   r8   ri  ë	  s   ri  c                   @   s|   e Zd ZdZddddœZdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚSignedValueTestzIt's a secret to everybodyZ	asdfbasdfZ12312312Z2342342)r   rd   rp   c                 C   s   |   ¡ d S )Ni 0* )Úpresentr>   r7   r7   r8   Úpast
  s    zSignedValueTest.pastc                 C   s   dS )Ni m|Mr7   r>   r7   r7   r8   rn  	
  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©rp  )rh   rp  ó   value)r&   rm  ÚSECRETrn  rk   r'   )r?   Z	signed_v1Z	signed_v2Zsigned_defaultZ
decoded_v1Z
decoded_v2r7   r7   r8   Útest_known_values
  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^   rq  Úkey2)r&   rm  rs  rn  r'   ÚassertIs)r?   Zsigned1Zsigned2Zdecoded1Zdecoded2r7   r7   r8   Útest_name_swap,
  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 )Nru  r^   rq  rr  )r&   rm  rs  ro  r'   rk   rn  rw  )r?   ÚsignedZdecoded_pastZdecoded_presentr7   r7   r8   Útest_expired=
  s(       ÿ   ÿ   ÿzSignedValueTest.test_expiredc                    sN   d‰‡ ‡fdd„}ˆ   |dƒ¡ ˆ  |dƒ¡ ˆ  |dƒ¡ ˆ  |dƒ¡ d S )NÚ@3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e152c                    s   dt tjd| ˆ ˆ jdkS ©Nrr  r1  rq  ©r'   rm  rs  rn  )Úprefix©r?   rz   r7   r8   ÚvalidateN
  s       ÿz8SignedValueTest.test_payload_tampering.<locals>.validateú%2|1:0|10:1300000000|3:key|8:dmFsdWU=|z%2|1:1|10:1300000000|3:key|8:dmFsdWU=|z$2|1:0|10:130000000|3:key|8:dmFsdWU=|z&2|1:0|10:1300000000|3:keey|8:dmFsdWU=|©rw   ZassertFalse©r?   r€  r7   r  r8   Útest_payload_tamperingJ
  s    z&SignedValueTest.test_payload_tamperingc                    sj   d‰ ‡ ‡fdd„}ˆ  |dƒ¡ ˆ |dƒ¡ ˆ |dƒ¡ ˆ |dƒ¡ ˆ |dƒ¡ ˆ |d	ƒ¡ d S )
Nr  c                    s   dt tjdˆ |  ˆjdkS r|  r}  )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  rq  )r&   rm  rs  rn  r'   rk   ©r?   r^   ry  Ú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   ©rp  rW   rq  ©r&   rm  ÚSECRET_DICTrn  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‹  rq  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&   rm  r  rn  r†   r‡   r'   rk   )r?   r^   ry  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&   rm  r  rn  r(   rk   )r?   r^   ry  rW   r7   r7   r8   Útest_key_version_retrieval£
  s        ÿz*SignedValueTest.test_key_version_retrievalN)rC   rD   rE   rs  r  ro  rn  rt  rx  rz  r„  r†  r‰  rŽ  r  r  r‘  r7   r7   r7   r8   rm  
  s     



rm  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    r0  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    r0  ©
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’  r0  )
r   r   r£   r˜  r¬  r­  r®  rY   rk   r¥   r¨   r7   r7   r8   Ú&test_xsrf_fail_argument_invalid_formatÝ
  s    üz/XSRFTest.test_xsrf_fail_argument_invalid_formatc              
   C   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’  r0  )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Ù   r0  )r   r   r£   r˜  rk   r¥   r¨   r7   r7   r8   Útest_xsrf_fail_cookie_no_bodyñ
  s       ÿz&XSRFTest.test_xsrf_fail_cookie_no_bodyc                 C   s:   | j ddtj tdd¡| jddd}|  |jd¡ d S )NrH   rž   Zdeadbeefr¢  r§  r©  r   ©r£   r¬  r­  r®  rY   r˜  rk   r¥   r¨   r7   r7   r8   Útest_xsrf_success_short_tokenø
  s    
üz&XSRFTest.test_xsrf_success_short_tokenc                 C   s:   | j ddtj tdd¡| jddd}|  |jd¡ d S )NrH   rž   Zxoxor¢  r§  r©  r   r«  r¨   r7   r7   r8   Útest_xsrf_success_non_hex_token  s    
üz(XSRFTest.test_xsrf_success_non_hex_tokenc                 C   s8   | j ddtj t| jd¡|  ¡ d}|  |jd¡ d S ©NrH   rž   r¢  r©  r   ©	r£   r¬  r­  r®  rY   rA  r˜  rk   r¥   r¨   r7   r7   r8   Útest_xsrf_success_post_body
  s    üz$XSRFTest.test_xsrf_success_post_bodyc                 C   s<   | j dtj t| jd¡ dd|  ¡ d}|  |jd¡ d S )Nz/?r¢  rž   rŸ   r©  r   r¯  r¨   r7   r7   r8   Útest_xsrf_success_query_string  s    üz'XSRFTest.test_xsrf_success_query_stringc                 C   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_header  s    ÿþü	z!XSRFTest.test_xsrf_success_headerc                 C   s:   d}t ƒ }t|ƒD ]}| |  ¡ ¡ q|  t|ƒ|¡ d S )NrÅ   )r#  Úrangerö  r–  rk   rå   )r?   Z
NUM_TOKENSÚtokensrH  r7   r7   r8   Útest_distinct_tokens(  s
    zXSRFTest.test_distinct_tokensc              
   C   s¸   |   ¡ }| j|fD ]8}| jddtj t|d¡|  |¡d}|  |j	d¡ q| j|f|| jffD ]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¡  r0  )r–  rA  r£   r¬  r­  r®  rY   r˜  rk   r¥   r   r   )r?   Ztoken2rœ  r©   Úcookie_tokenÚ
body_tokenr7   r7   r8   Útest_cross_user0  s(    üþüzXSRFTest.test_cross_userc              	   C   s|   | j }t|gƒ}tdƒD ]N}|  |¡}| |¡ | jddtj t	| j d¡|  
|¡d}|  |jd¡ q|  t|ƒd¡ d S )Né   rH   rž   r¢  r©  r   ró   )rA  r#  r³  r–  rö  r£   r¬  r­  r®  rY   r˜  rk   r¥   rå   )r?   rœ  Ztokens_seenrH  r©   r7   r7   r8   Útest_refresh_tokenI  s    


üzXSRFTest.test_refresh_tokenc              	   C   sÆ   |   | jdd| jdd¡ | jdd}tdƒD ]}|  | j|dd|¡ q0|  |¡}|   ||¡ |   ||  |¡¡ ||f||ffD ]<\}}| jddtj t|d¡|  	|¡d}|  |j
d¡ q„d S )	Nrd   re   r¹  rH   rž   r¢  r©  r   )ZassertNotEqualr–  r³  rk   r£   r¬  r­  r®  rY   r˜  r¥   )r?   Zv1_tokenrH  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   z  s    zXSRFCookieNameTest.Handler.getc                 C   s   |   d¡ d S r´  rN   r>   r7   r7   r8   r   }  s    zXSRFCookieNameTest.Handler.postNr“  r7   r7   r7   r8   rJ   y  s   rJ   c                 C   s   t ddddidS )NTz__Host-xsrfrÉ   )r–  Zxsrf_cookie_nameÚxsrf_cookie_kwargsrœ   r>   r7   r7   r8   r<   €  s
    ýz!XSRFCookieNameTest.get_app_kwargsc                    s   t ƒ  ¡  |  ¡ | _d S r0   r”  r>   r‚  r7   r8   r•  ‡  s    
zXSRFCookieNameTest.setUpNc                 C   s8   |d 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¼  x  s   
	
	r¼  c                   @   s,   e Zd ZG dd„ deƒZdd„ Zdd„ ZdS )ÚXSRFCookieKwargsTestc                   @   s   e Zd Zdd„ ZdS )zXSRFCookieKwargsTest.Handlerc                 C   s   |   | j¡ d S r0   r½  r>   r7   r7   r8   rP   ´  s    z XSRFCookieKwargsTest.Handler.getNrQ   r7   r7   r7   r8   rJ   ³  s   rJ   c                 C   s   t dt ddddS )NTrp   )rÊ   r_   )r–  r¾  rœ   r>   r7   r7   r8   r<   ·  s     
ÿz#XSRFCookieKwargsTest.get_app_kwargsc                 C   sÌ   |   d¡}|  d|jd  ¡ ¡ |  d|jd  ¡ ¡ |j d¡}|d k	sNt‚t d|¡}|d k	sft‚tj 	¡ tj
dd }tj | ¡ d ¡}|d k	sœt‚tj|d d	… Ž }|  t||  ¡ ƒd
k ¡ d S )NrH   z	httponly;r×   zexpires=z.*; expires=(?P<expires>.+);.*rp   rð   rò   ró   rÅ   )r£   rŒ  rÙ   r   rP   ru   rs   rt   rô   rõ   rö   r÷   rø   rù   rú   rw   rû   rü   rý   r7   r7   r8   Útest_xsrf_httponly¼  s    
z'XSRFCookieKwargsTest.test_xsrf_httponlyN)rC   rD   rE   r   rJ   r<   rÀ  r7   r7   r7   r8   r¿  ²  s   r¿  c                   @   s$   e Zd ZG dd„ deƒZdd„ ZdS )ÚFinishExceptionTestc                   @   s   e Zd Zdd„ ZdS )zFinishExceptionTest.Handlerc                 C   s@   |   d¡ |  dd¡ |  dd¡r,tdƒ‚n|  d¡ tƒ ‚d S )Nr+  úWWW-AuthenticateúBasic realm="something"Zfinish_valuer³  zauthentication required)ru  rh  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=1r+  rÃ  rÂ  s   authentication required)r£   rk   r¥   rÙ   rP   r¢   )r?   Úur©   r7   r7   r8   Útest_finish_exception×  s    
 
ÿz)FinishExceptionTest.test_finish_exceptionN)rC   rD   rE   r   rJ   rÅ  r7   r7   r7   r8   rÁ  Ì  s   
rÁ  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚDecoratorTestc                 C   s0   G dd„ dt ƒ}G dd„ dt ƒ}d|fd|fgS )Nc                   @   s   e Zd Zedd„ ƒZdS )z6DecoratorTest.get_handlers.<locals>.RemoveSlashHandlerc                 S   s   d S r0   r7   r>   r7   r7   r8   rP   ä  s    z:DecoratorTest.get_handlers.<locals>.RemoveSlashHandler.getN)rC   rD   rE   r,   rP   r7   r7   r7   r8   ÚRemoveSlashHandlerã  s   rÇ  c                   @   s   e Zd Zedd„ ƒZdS )z3DecoratorTest.get_handlers.<locals>.AddSlashHandlerc                 S   s   d S r0   r7   r>   r7   r7   r8   rP   é  s    z7DecoratorTest.get_handlers.<locals>.AddSlashHandler.getN)rC   rD   rE   r-   rP   r7   r7   r7   r8   ÚAddSlashHandlerè  s   rÈ  ú/removeslash/ú	/addslashr›   )r?   rÇ  rÈ  r7   r7   r8   r;   â  s    zDecoratorTest.get_handlersc                 C   s`   | j ddd}|  |jd¡ |  |jd d¡ | j ddd}|  |jd¡ |  |jd d¡ d S )	NrÉ  Fr  r£  r  z/removeslashz/removeslash/?foo=barz/removeslash?foo=barr¦  r¨   r7   r7   r8   Útest_removeslashï  s    zDecoratorTest.test_removeslashc                 C   s`   | j ddd}|  |jd¡ |  |jd d¡ | j ddd}|  |jd¡ |  |jd d¡ d S )	NrÊ  Fr  r£  r  z
/addslash/z/addslash?foo=barz/addslash/?foo=barr¦  r¨   r7   r7   r8   Útest_addslashø  s    zDecoratorTest.test_addslashN)rC   rD   rE   r;   rË  rÌ  r7   r7   r7   r8   rÆ  á  s   	rÆ  c                   @   sd   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ ZdS )Ú	CacheTestc                 C   s   G dd„ dt ƒ}d|fgS )Nc                   @   s   e Zd Zdd„ Zdd„ ZdS )z+CacheTest.get_handlers.<locals>.EtagHandlerc                 S   s   |   |¡ d S r0   rN   )r?   Úcomputed_etagr7   r7   r8   rP     s    z/CacheTest.get_handlers.<locals>.EtagHandler.getc                 S   s
   | j d S r  )Z_write_bufferr>   r7   r7   r8   Úcompute_etag  s    z8CacheTest.get_handlers.<locals>.EtagHandler.compute_etagN)rC   rD   rE   rP   rÏ  r7   r7   r7   r8   ÚEtagHandler  s   rÐ  z
/etag/(.*)r›   )r?   rÐ  r7   r7   r8   r;     s    zCacheTest.get_handlersc                 C   s   d}d}|   ||d¡ d S )Nú"xyzzy"Ú*rû  ©Ú
_test_etag©r?   rÎ  Úetagsr7   r7   r8   Útest_wildcard_etag  s    zCacheTest.test_wildcard_etagc                 C   s   d}d}|   ||d¡ d S )NrÑ  rû  rÓ  rÕ  r7   r7   r8   Útest_strong_etag_match  s    z CacheTest.test_strong_etag_matchc                 C   s   d}d}|   ||d¡ d S )Nú"xyzzy1"ú"xyzzy1", "xyzzy2"rû  rÓ  rÕ  r7   r7   r8   Útest_multiple_strong_etag_match  s    z)CacheTest.test_multiple_strong_etag_matchc                 C   s   d}d}|   ||d¡ d S )NrÑ  rÙ  r   rÓ  rÕ  r7   r7   r8   Útest_strong_etag_not_match  s    z$CacheTest.test_strong_etag_not_matchc                 C   s   d}d}|   ||d¡ d S )NrÑ  rÚ  r   rÓ  rÕ  r7   r7   r8   Ú#test_multiple_strong_etag_not_match!  s    z-CacheTest.test_multiple_strong_etag_not_matchc                 C   s   d}d}|   ||d¡ d S )NrÙ  ú
W/"xyzzy1"rû  rÓ  rÕ  r7   r7   r8   Útest_weak_etag_match&  s    zCacheTest.test_weak_etag_matchc                 C   s   d}d}|   ||d¡ d S )Nú"xyzzy2"úW/"xyzzy1", W/"xyzzy2"rû  rÓ  rÕ  r7   r7   r8   Útest_multiple_weak_etag_match+  s    z'CacheTest.test_multiple_weak_etag_matchc                 C   s   d}d}|   ||d¡ d S )Nrà  rÞ  r   rÓ  rÕ  r7   r7   r8   Útest_weak_etag_not_match0  s    z"CacheTest.test_weak_etag_not_matchc                 C   s   d}d}|   ||d¡ d S )Nz"xyzzy3"rá  r   rÓ  rÕ  r7   r7   r8   Ú!test_multiple_weak_etag_not_match5  s    z+CacheTest.test_multiple_weak_etag_not_matchc                 C   s(   | j d| d|id}|  |j|¡ d S )Nz/etag/rÿ  rÞ   r¤  )r?   rÎ  rÖ  rÆ  r©   r7   r7   r8   rÔ  :  s
     ÿzCacheTest._test_etagN)rC   rD   rE   r;   r×  rØ  rÛ  rÜ  rÝ  rß  râ  rã  rä  rÔ  r7   r7   r7   r8   rÍ    s   
rÍ  c                   @   s$   e Zd ZG dd„ deƒZdd„ ZdS )ÚRequestSummaryTestc                   @   s   e Zd Zdd„ ZdS )zRequestSummaryTest.Handlerc                 C   s   d | j _|  |  ¡ ¡ d S r0   )r,  Z	remote_iprŠ   rM  r>   r7   r7   r8   rP   C  s    zRequestSummaryTest.Handler.getNrQ   r7   r7   r7   r8   rJ   B  s   rJ   c                 C   s   |   d¡}|  |jd¡ d S )NrH   s   GET / (None)rà   r!  r7   r7   r8   Útest_missing_remote_ipJ  s    
z)RequestSummaryTest.test_missing_remote_ipN)rC   rD   rE   r   rJ   ræ  r7   r7   r7   r8   rå  A  s   rå  c                   @   s   e Zd Zdd„ ZdS )ÚHTTPErrorTestc                 C   sF   t ddd}t |¡}|  ||¡ |  |j|j¡ |  |j|j¡ d S )Nr0  zGo awayr  )r    r†   ZassertIsNotrk   rÆ  r~  )r?   rÂ   Úe2r7   r7   r8   Ú	test_copyP  s
    
zHTTPErrorTest.test_copyN)rC   rD   rE   ré  r7   r7   r7   r8   rç  O  s   rç  c                   @   s   e Zd Zdd„ ZdS )ÚApplicationTestc                 C   s"   t g ƒ}|jddd}| ¡  d S )Nr   r  )Úaddress)r   Úlistenr'  )r?   r=   Úserverr7   r7   r8   Útest_listenY  s    zApplicationTest.test_listenN)rC   rD   rE   rî  r7   r7   r7   r8   rê  X  s   rê  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚURLSpecReverseTestc                 C   s0   |   dtdd ƒ ¡ ¡ |   dtdd ƒ ¡ ¡ d S )Nz/favicon.icoz/favicon\.icoz^/favicon\.ico$©rk   r$   Úreverser>   r7   r7   r8   Útest_reverse`  s    zURLSpecReverseTest.test_reversec              	   C   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ñ  r<  rr  )r?   Úpathsr2   Zurl_specrà  r7   r7   r8   Útest_non_reversibled  s    
ÿÿz&URLSpecReverseTest.test_non_reversiblec                 C   s4   |   dtdd ƒ d¡¡ |   dtdd ƒ d¡¡ d S )Nz/api/v1/foo/barz^/api/v1/foo/(\w+)$rÄ   z/api.v1/foo/5/icon.pngz/api\.v1/foo/([0-9]+)/icon\.pngr¹  rð  r>   r7   r7   r8   Útest_reverse_argumentsv  s     ÿþz)URLSpecReverseTest.test_reverse_argumentsN)rC   rD   rE   rò  rô  rõ  r7   r7   r7   r8   rï  _  s   rï  c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚRedirectHandlerTestc                 C   s(   dt ddifdt ddifdt ddifgS )Nú/srcr$   ú/dstz/src2z/dst2?foo=barz/(.*?)/(.*?)/(.*)z/{1}/{0}/{2})rŽ  r>   r7   r7   r8   r;     s    ýz RedirectHandlerTest.get_handlersc                 C   s2   | j ddd}|  |jd¡ |  |jd d¡ d S )Nr÷  Fr  r£  r  rø  r¦  r¨   r7   r7   r8   Útest_basic_redirectˆ  s    z'RedirectHandlerTest.test_basic_redirectc                 C   s2   | j ddd}|  |jd¡ |  |jd d¡ d S )Nz/src?foo=barFr  r£  r  z/dst?foo=barr¦  r¨   r7   r7   r8   Útest_redirect_with_argument  s    z/RedirectHandlerTest.test_redirect_with_argumentc                 C   s2   | j ddd}|  |jd¡ |  |jd d¡ d S )Nz/src2?foo2=bar2Fr  r£  r  z/dst2?foo=bar&foo2=bar2r¦  r¨   r7   r7   r8   Ú%test_redirect_with_appending_argument’  s    z9RedirectHandlerTest.test_redirect_with_appending_argumentc                 C   s2   | j ddd}|  |jd¡ |  |jd d¡ d S )Nz/a/b/cFr  r£  r  z/b/a/cr¦  r¨   r7   r7   r8   Útest_redirect_pattern—  s    z)RedirectHandlerTest.test_redirect_patternN)rC   rD   rE   r;   rù  rú  rû  rü  r7   r7   r7   r8   rö  €  s
   rö  c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚAcceptLanguageTestz)Test evaluation of Accept-Language headerc                 C   s8   t  tj tj t¡d¡d¡ G dd„ dtƒ}d|fgS )NZgettext_translationsZtornado_testc                   @   s   e Zd Zdd„ ZdS )z>AcceptLanguageTest.get_handlers.<locals>.AcceptLanguageHandlerc                 S   s(   |   d|  ¡ j dd¡¡ |  d¡ d S )Nry  Ú_ú-rŸ   )rh  Zget_browser_localer¥   ÚreplacerŠ   r>   r7   r7   r8   rP   §  s
     ÿzBAcceptLanguageTest.get_handlers.<locals>.AcceptLanguageHandler.getNrQ   r7   r7   r7   r8   ÚAcceptLanguageHandler¦  s   r  rH   )r   Zload_gettext_translationsr1   r2   r3   r4   r5   r   )r?   r  r7   r7   r8   r;      s    þÿzAcceptLanguageTest.get_handlersc                 C   sL   | j dddid}|  |jd d¡ | j dddid}|  |jd d¡ d S )NrH   r¨  zfr-FR;q=0.9rÞ   ry  zfr-FRzfr-FR; q=0.9©r£   rk   rÙ   r¨   r7   r7   r8   Útest_accept_language±  s    z'AcceptLanguageTest.test_accept_languagec                 C   s(   | j dddid}|  |jd d¡ d S )NrH   r¨  z	fr-FR;q=0rÞ   ry  úen-USr  r¨   r7   r7   r8   Útest_accept_language_ignore¸  s    z.AcceptLanguageTest.test_accept_language_ignorec                 C   s(   | j dddid}|  |jd d¡ d S )NrH   r¨  z
fr-FR;q=-1rÞ   ry  r  r  r¨   r7   r7   r8   Útest_accept_language_invalid¼  s    z/AcceptLanguageTest.test_accept_language_invalidN)rC   rD   rE   rF   r;   r  r  r  r7   r7   r7   r8   rý    s
   rý  ) Ztornado.concurrentr   Ztornador   Ztornado.escaper   r   r   r   r   r	   Ztornado.httpclientr
   Ztornado.httputilr   Ztornado.iostreamr   r   Ztornado.locksr   Ztornado.logr   r   Ztornado.simple_httpclientr   Ztornado.templater   Ztornado.testingr   r   r   r   Ztornado.test.utilr   Ztornado.utilr   r   Ztornado.webr   r   r   r   rŽ  r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   rq   rA  r†   rô   Úemail.utilsr÷   r·  Úior/   ró  ræ   r1   rs   r  rÌ  r6  Úurllib.parser¬  r9   r:   rG   rK   rR   ZTestCasera   r~   r‰   r¬   r  r
  r  r  r(  r3  r=  rT  r\  r`  rc  rd  rm  rp  rt  rx  rz  r¼  r¿  rÖ  r7  r?  rA  r[  rj  rm  ro  rs  rx  r}  r†  rŠ  r‘  r™  r­  r³  r/  r·  r¹  rÇ  rÉ  rÓ  rØ  rÝ  rú  r  r	  r  r  r  r  r  r  r$  r:  ÚobjectrC  rT  rX  r[  ri  rm  r’  r¼  r¿  rÁ  rÆ  rÍ  rå  rç  rê  rï  rö  rý  r7   r7   r7   r8   Ú<module>   sú    T5/1  0,
  	B  [C*":/.\bM
 ÿ
 ÿ; + M:!?	!