U
    ‰dÌÉ ã                   @   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!m"Z" d dl#m$Z$m%Z%m&Z&m'Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7 d dl8Z8d dl9Z9d dl:Z:d dl;Z;d dl<Z=d dl>Z>d dl?m@Z@ d dlAZAd dlBZBd dlCZCd dlDZDd dlEZEd dlFZFd dlGZGd dlHZIdd„ ZJG dd„ deƒZKG dd„ deKƒZLG dd„ de%ƒZMG dd„ de%ƒZNG dd„ deGjOƒZPG dd„ deGjOƒZQG dd „ d eKƒZRG d!d"„ d"eKƒZSG d#d$„ d$e%ƒZTG d%d&„ d&eKƒZUG d'd(„ d(e%ƒZVG d)d*„ d*eKƒZWG d+d,„ d,e%ƒZXG d-d.„ d.eKƒZYG d/d0„ d0e%ƒZZG d1d2„ d2e%ƒZ[G d3d4„ d4e%ƒZ\G d5d6„ d6e%ƒZ]G d7d8„ d8e%ƒZ^G d9d:„ d:e%ƒZ_G d;d<„ d<e%ƒZ'G d=d>„ d>e%ƒZ`G d?d@„ d@e%ƒZaG dAdB„ dBe%ƒZbG dCdD„ dDe%ƒZcG dEdF„ dFeKƒZdG dGdH„ dHeKƒZeG dIdJ„ dJeKƒZfG dKdL„ dLeKƒZgG dMdN„ dNeKƒZhG dOdP„ dPeKƒZiG dQdR„ dReKƒZjG dSdT„ dTeKƒZkG dUdV„ dVeKƒZlG dWdX„ dXeKƒZmG dYdZ„ dZeLƒZnG d[d\„ d\eLƒZoG d]d^„ d^eLƒZpG d_d`„ d`eLƒZqG dadb„ dbeLƒZrG dcdd„ ddeLƒZsG dedf„ dfeKƒZtG dgdh„ dheLƒZuG didj„ djeKƒZvG dkdl„ dleLƒZwG dmdn„ dnexƒZyG dodp„ dpeLƒZzG dqdr„ dreLƒZ{G dsdt„ dteLƒZ|G dudv„ dveLƒZ}G dwdx„ dxeLƒZ~G dydz„ dzeKƒZG d{d|„ d|eLƒZ€G d}d~„ d~eLƒZG dd€„ d€eLƒZ‚G dd‚„ d‚eLƒZƒG dƒd„„ d„eLƒZ„G d…d†„ d†eKƒZ…G d‡dˆ„ dˆeKƒZ†G d‰dŠ„ dŠeKƒZ‡G d‹dŒ„ dŒeKƒZˆG ddŽ„ dŽeKƒZ‰e4G dd„ de%ƒƒZŠG d‘d’„ d’e‹ƒZŒG d“d”„ d”eŒeKƒZG d•d–„ d–eŒeKƒZŽG d—d˜„ d˜eLƒZG d™dš„ dšeLƒZG d›dœ„ dœeGjOƒZ‘G ddž„ džeLƒZ’G dŸd „ d eLƒZ“G d¡d¢„ d¢eLƒZ”G d£d¤„ d¤eKƒZ•G d¥d¦„ d¦eKƒZ–G d§d¨„ d¨eLƒZ—G d©dª„ dªeGjOƒZ˜G d«d¬„ d¬eƒZ™G d­d®„ d®eGjOƒZšG d¯d°„ d°eKƒZ›G d±d²„ d²eKƒ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)Ú
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© r6   ú9/tmp/pip-unpacked-wheel-fekwu36z/tornado/test/web_test.pyÚrelpath<   s    r8   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 r/   )r   Úget_handlersÚget_app_kwargsÚapp©Úselfr6   r6   r7   Úget_appG   s    zWebTestCase.get_appc                 C   s
   t ƒ ‚d S r/   ©ÚNotImplementedErrorr=   r6   r6   r7   r:   K   s    zWebTestCase.get_handlersc                 C   s   i S r/   r6   r=   r6   r6   r7   r;   N   s    zWebTestCase.get_app_kwargsN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r?   r:   r;   r6   r6   r6   r7   r9   @   s   r9   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=   r6   r6   r7   r:   Z   s    z"SimpleHandlerTestCase.get_handlers)rB   rC   rD   rE   rI   r:   r6   r6   r6   r7   rF   R   s   rF   c                   @   s   e Zd Zdd„ ZdS )ÚHelloHandlerc                 C   s   |   d¡ d S ©NÚhello©Úwriter=   r6   r6   r7   Úget_   s    zHelloHandler.getN©rB   rC   rD   rO   r6   r6   r6   r7   rJ   ^   s   rJ   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©rS   Úkey_version)Ú_cookiesr   ÚdictÚapplication)r>   rS   rV   r6   r6   r7   Ú__init__e   s    ÿ

ÿz!CookieTestRequestHandler.__init__c                 C   s   | j  |¡S r/   )rW   rO   )r>   Únamer6   r6   r7   Ú
get_cookieq   s    z#CookieTestRequestHandler.get_cookiec                 C   s   || j |< d S r/   )rW   )r>   r[   ÚvalueÚexpires_daysr6   r6   r7   Ú
set_cookiet   s    z#CookieTestRequestHandler.set_cookie)rR   N)N)rB   rC   rD   rZ   r\   r_   r6   r6   r6   r7   rQ   c   s   
rQ   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©rQ   Úset_secure_cookieÚassertEqualÚget_secure_cookie©r>   Úhandlerr6   r6   r7   Útest_round_tripz   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 )Nra   s   d76df8e7aefcrc   rd   s   12345678\|([0-9]+)\|([0-9a-f]+)é   rS   Z12345678Z1234s   5678z1234|5678%s|%szCookie timestamp in futurerf   )rQ   ri   ÚbinasciiÚa2b_hexrW   ÚreÚmatchÚAssertionErrorÚgrouprj   r$   rY   rT   r   r	   r   r   Ú
assertTruerk   )r>   rm   Úcookiers   Ú	timestampÚsigr6   r6   r7   Ú&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 )Nra   ó   érc   rd   rf   rh   rl   r6   r6   r7   Útest_arbitrary_bytes¥   s    z'SecureCookieV1Test.test_arbitrary_bytesN)rB   rC   rD   rn   rz   r|   r6   r6   r6   r7   r`   y   s   &r`   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   rc   c                 C   s0   t ƒ }|jdddd |  |jdddd¡ d S )Nra   rb   ro   rd   rf   rh   rl   r6   r6   r7   rn   ±   s    z"SecureCookieV2Test.test_round_tripc                 C   s0   t | jdd}| dd¡ |  | d¡d¡ d S )Nr   rU   ra   rb   ©rQ   ÚKEY_VERSIONSri   rj   rk   rl   r6   r6   r7   Útest_key_version_roundtrip¶   s     ÿz-SecureCookieV2Test.test_key_version_roundtripc                 C   s0   t | jdd}| dd¡ |  | d¡d¡ d S )Nrc   rU   ra   rb   r~   rl   r6   r6   r7   Ú,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   rU   ra   rb   rc   )rQ   r   ri   rW   rj   rk   )r>   rm   Únew_handlerr6   r6   r7   Ú"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‚   )rQ   r   ri   ÚcopyÚpoprW   rj   rk   )r>   rm   Znew_key_versionsrƒ   r6   r6   r7   Ú#test_key_version_invalidate_versionÏ   s     ÿ

 ÿz6SecureCookieV2Test.test_key_version_invalidate_versionN)	rB   rC   rD   r   rn   r€   r   r„   r‡   r6   r6   r6   r7   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 r/   )ÚfinishÚfinal_returnr=   ©Útestr6   r7   rO   ä   s    
z7FinalReturnTest.get_handlers.<locals>.FinishHandler.getc                 3   s,   |   d¡ |  ¡ V  |  d¡ˆ _ˆ jV  d S )Nzhello,Zworld)rN   Úflushr‰   rŠ   r=   r‹   r6   r7   Úposté   s    

z8FinalReturnTest.get_handlers.<locals>.FinishHandler.postN)rB   rC   rD   r   Ú	coroutinerO   rŽ   r6   r‹   r6   r7   Ú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>   r1   r6   r6   r7   Úcreate_template_loaderñ   s    zJFinalReturnTest.get_handlers.<locals>.RenderHandler.create_template_loaderc                    s   |   d¡ˆ _d S ©Nr‘   )ÚrenderrŠ   r=   r‹   r6   r7   rO   ô   s    z7FinalReturnTest.get_handlers.<locals>.RenderHandler.getN)rB   rC   rD   r”   r   r   rO   r6   r‹   r6   r7   ÚRenderHandlerð   s   r—   ú/finishú/render©r   )r>   r   r—   r6   r‹   r7   r:   à   s    zFinalReturnTest.get_handlersc                 C   s
   t ddS )Nrˆ   )Ztemplate_path©rX   r=   r6   r6   r7   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_urlrj   ÚcodeÚassertIsInstancerŠ   r   rv   Údone©r>   Úresponser6   r6   r7   Ú 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£   rj   r¤   r¥   rŠ   r   r§   r6   r6   r7   Ú test_render_method_return_future  s    z0FinalReturnTest.test_render_method_return_future)rB   rC   rD   rŠ   r:   r;   r©   rª   r6   r6   r6   r7   rˆ   Ý   s
   rˆ   c                   @   sT   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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 ƒ}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=   r6   r6   r7   rO     s    z5CookieTest.get_handlers.<locals>.SetCookieHandler.getNrP   r6   r6   r6   r7   Ú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 )Nra   Údefault)r\   rt   rN   )r>   rw   r6   r6   r7   rO     s    z5CookieTest.get_handlers.<locals>.GetCookieHandler.getNrP   r6   r6   r6   r7   Ú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)Údomainr1   r±   r=   r6   r6   r7   rO     s    z;CookieTest.get_handlers.<locals>.SetCookieDomainHandler.getNrP   r6   r6   r6   r7   Ú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=   r6   r6   r7   rO   %  s    z@CookieTest.get_handlers.<locals>.SetCookieSpecialCharHandler.getNrP   r6   r6   r6   r7   Ú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 )Nr5   Úbzexample.com)r¶   ÚcÚdÚer±   r=   r6   r6   r7   rO   +  s    z>CookieTest.get_handlers.<locals>.SetCookieOverwriteHandler.getNrP   r6   r6   r6   r7   Ú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 )Nra   Úbaré
   )Zmax_ager±   r=   r6   r6   r7   rO   3  s    z;CookieTest.get_handlers.<locals>.SetCookieMaxAgeHandler.getNrP   r6   r6   r6   r7   ÚSetCookieMaxAgeHandler2  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 )Nra   rÃ   rÄ   )r^   r±   r=   r6   r6   r7   rO   7  s    z@CookieTest.get_handlers.<locals>.SetCookieExpiresDaysHandler.getNrP   r6   r6   r6   r7   ÚSetCookieExpiresDaysHandler6  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 )
Nr5   Ú1T)Úsecurer¾   Fr¿   )ÚhttponlyrÀ   r±   r=   r6   r6   r7   rO   ;  s    z8CookieTest.get_handlers.<locals>.SetCookieFalsyFlags.getNrP   r6   r6   r6   r7   ÚSetCookieFalsyFlags:  s   rÊ   ú/setú/getú/set_domainú/special_charú/set_overwriteú/set_max_ageú/set_expires_daysú/set_falsy_flagsrš   )	r>   r²   r´   r·   r½   rÂ   rÅ   rÆ   rÊ   r6   r6   r7   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¢   rj   ÚsortedÚheadersÚget_listr§   r6   r6   r7   Útest_set_cookieL  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Õ   rb   z	foo="bar"z/=exception;ó   default©r¢   rj   r¡   r§   r6   r6   r7   Útest_get_cookieS  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¢   rj   rÕ   rÖ   r§   r6   r6   r7   Útest_set_cookie_domain]  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=/rc   zquote="a\"b"; Path=/ro   )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Ö   rj   Úlenrv   ÚloggingÚdebugr¡   r   )r>   r¨   rÕ   ÚdataÚheaderÚexpectedr6   r6   r7   Útest_cookie_special_chard  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Ö   rj   rÔ   ©r>   r¨   rÕ   r6   r6   r7   Ú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é   r6   r6   r7   Ú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Õ   rO   rt   rr   rs   ÚdatetimeÚutcnowÚ	timedeltaÚemailÚutilsÚ	parsedateÚ	groupdictrv   ÚabsÚtotal_seconds©r>   r¨   rå   rs   rî   ÚparsedZheader_expiresr6   r6   r7   Ú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=/; securerc   zb=1; path=/ro   zc=1; httponly; path=/rà   zd=1; path=/)r¢   rÔ   rÕ   rÖ   rj   Úlowerré   r6   r6   r7   Útest_set_cookie_false_flags–  s    
z&CookieTest.test_set_cookie_false_flagsN)rB   rC   rD   r:   r×   rÝ   rß   rç   rê   rë   rû   rý   r6   r6   r6   r7   r«     s   =
r«   c                   @   s(   e Zd Zdd„ Zdd„ Zedd„ ƒZdS )ÚAuthRedirectRequestHandlerc                 C   s
   || _ d S r/   ©Ú	login_url)r>   r   r6   r6   r7   Ú
initialize¢  s    z%AuthRedirectRequestHandler.initializec                 C   s   | j S r/   rÿ   r=   r6   r6   r7   Úget_login_url¥  s    z(AuthRedirectRequestHandler.get_login_urlc                 C   s   |   d¡ d S )Néô  )Ú
send_errorr=   r6   r6   r7   rO   ¨  s    zAuthRedirectRequestHandler.getN)rB   rC   rD   r  r  r"   rO   r6   r6   r6   r7   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þ   rX   r=   r6   r6   r7   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£   rj   r¤   rÕ   r§   r6   r6   r7   Ú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£   rj   r¤   rv   rr   rs   rÕ   r§   r6   r6   r7   Útest_absolute_auth_redirect¾  s    þûz,AuthRedirectTest.test_absolute_auth_redirectN)rB   rC   rD   r:   r  r  r6   r6   r6   r7   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 r/   r‹   ©r>   rŒ   r6   r6   r7   r  Ë  s    z!ConnectionCloseHandler.initializec                 c   s   | j  ¡  | j j ¡ V  d S r/   )rŒ   Úon_handler_waitingÚcleanup_eventÚwaitr=   r6   r6   r7   rO   Î  s    
zConnectionCloseHandler.getc                 C   s   | j  ¡  d S r/   )rŒ   Úon_connection_closer=   r6   r6   r7   r  Ó  s    z*ConnectionCloseHandler.on_connection_closeN)rB   rC   rD   r  r   r   rO   r  r6   r6   r6   r7   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 )NrG   r‹   )r   r  r  rX   r=   r6   r6   r7   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   Úsleepr6   r6   r6   r7   Ú<lambda>ä  rž   z;ConnectionCloseTest.test_connection_close.<locals>.<lambda>)ÚsocketÚAF_INETÚSOCK_STREAMÚconnectÚget_http_portr   ÚstreamrN   r  r  ÚsetZio_loopZrun_sync)r>   Úsr6   r6   r7   Útest_connection_closeÜ  s    

z)ConnectionCloseTest.test_connection_closec                 C   s   t  d¡ | j ¡  d S )Nzhandler waiting)râ   rã   r  Úcloser=   r6   r6   r7   r  æ  s    
z&ConnectionCloseTest.on_handler_waitingc                 C   s   t  d¡ |  ¡  d S )Nzconnection closed)râ   rã   Ústopr=   r6   r6   r7   r  ê  s    
z'ConnectionCloseTest.on_connection_closeN)rB   rC   rD   r:   r   r  r  r6   r6   r6   r7   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©r1   Ú	path_argsÚargs)ÚrequestÚ	argumentsÚtyper¬   Ú	Exceptionr°   Úget_argumentsr   rN   rX   r1   r   )r>   r%  ÚkeyZbvalueZsvalueÚargr6   r6   r7   rO   ð  s&    
ýÿzEchoHandler.getNrP   r6   r6   r6   r7   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=   r6   r6   r7   r:     s    z RequestEncodingTest.get_handlersc                 C   s   t |  |¡jƒS r/   )r   r¢   r¡   r“   r6   r6   r7   Ú
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©rj   r/  rX   r=   r6   r6   r7   Útest_group_question_mark  s    þþz,RequestEncodingTest.test_group_question_markc                 C   s&   |   |  d¡ddgddgidœ¡ d S )Nz/group/%C3%A9?arg=%C3%A9z/group/%C3%A9õ   Ã©r-  r$  ©rj   r/  r=   r6   r6   r7   Ú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/barra   rÃ   r$  z/slashes/a%2Fb/c%2Fdza/bzc/dr1  r=   r6   r6   r7   Útest_slashes'  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=   r6   r6   r7   Ú
test_error3  s    zRequestEncodingTest.test_errorN)	rB   rC   rD   r:   r/  r2  r5  r6  r7  r6   r6   r6   r7   r.  
  s   r.  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Úargumentra   Z
cookie_keyr   Úcookie_valuer­   z%unexpected values for cookie keys: %rrk   r\   Ú
xsrf_tokenÚxsrf_form_htmlÚreverse_urlÚ	typecheckZrequest_summary)ÚerrorsÚ
check_typeZ
get_statusÚintÚget_argumentr   ÚlistÚcookiesÚkeysr¬   Úvaluesr]   r*  rk   r°   r\   r<  r=  r>  Ú_request_summaryr=   r6   r6   r7   Úprepare;  s    ÿzTypeCheckHandler.preparec                 C   s   |   d|t¡ |  | j¡ d S ©NÚpath_component©rA  r   rN   r@  ©r>   rK  r6   r6   r7   rO   V  s    zTypeCheckHandler.getc                 C   s   |   d|t¡ |  | j¡ d S rJ  rL  rM  r6   r6   r7   rŽ   \  s    zTypeCheckHandler.postc                 C   s&   t |ƒ}||kr"d||f | j|< d S )Nzexpected %s, got %s)r)  r@  )r>   r[   ÚobjZexpected_typeZactual_typer6   r6   r7   rA  `  s    zTypeCheckHandler.check_typeN)rB   rC   rD   rI  rO   rŽ   rA  r6   r6   r6   r7   r8  :  s   r8  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[   r6   r6   r7   Údecode_argumentg  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   rp   Úb2a_hexr   r*  )r  r6   r6   r7   Údescribeq  s
    z&DecodeArgHandler.get.<locals>.describera   ©r1   Úquery)rN   rC  )r>   r-  rT  r6   r6   r7   rO   p  s    zDecodeArgHandler.get)N)rB   rC   rD   rR  rO   r6   r6   r6   r7   rO  f  s   
	rO  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=   r6   r6   r7   rO   |  s    zLinkifyHandler.getNrP   r6   r6   r6   r7   rW  {  s   rW  c                   @   s   e Zd Zdd„ ZdS )ÚUIModuleResourceHandlerc                 C   s   | j dddgd d S )Nú	page.htmlrc   ro   )ÚentriesrZ  r=   r6   r6   r7   rO     s    zUIModuleResourceHandler.getNrP   r6   r6   r6   r7   r[  €  s   r[  c                   @   s   e Zd Zdd„ ZdS )ÚOptionalPathHandlerc                 C   s   |   d|i¡ d S )Nr1   rM   r“   r6   r6   r7   rO   †  s    zOptionalPathHandler.getNrP   r6   r6   r6   r7   r^  …  s   r^  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-Overwritero   úx-multirà   zX-MultiÚ4)Ú
set_headerÚ
add_headerr=   r6   r6   r7   rO   ‹  s    zMultiHeaderHandler.getNrP   r6   r6   r6   r7   r_  Š  s   r_  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Ú	permanentrG   )re  r9  )r9  z(didn't get permanent or status arguments)rC  ÚredirectÚboolrB  r*  r=   r6   r6   r7   rO   “  s
    zRedirectHandler.getNrP   r6   r6   r6   r7   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   rN   r‰   r=   r6   r6   r7   rO     s    




zEmptyFlushCallbackHandler.getN)rB   rC   rD   r   r   rO   r6   r6   r6   r7   rh  œ  s   rh  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)rc  r*  Ú
ValueErrorr¬   r‰   ©r>   rÁ   r6   r6   r7   rO   «  s    zHeaderInjectionHandler.getNrP   r6   r6   r6   r7   rk  ª  s   rk  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ÚsourcerV  r¡   ra   r³   )rC  Zget_query_argumentZget_body_argumentr‰   ©r>   r    r6   r6   r7   rI  ·  s    zGetArgumentHandler.prepareN©rB   rC   rD   rI  r6   r6   r6   r7   ro  ¶  s   ro  c                   @   s   e Zd Zdd„ ZdS )ÚGetArgumentsHandlerc                 C   s*   |   t|  d¡|  d¡|  d¡d¡ d S )Nra   ©r³   rV  r¡   )r‰   rX   r+  Zget_query_argumentsZget_body_argumentsr=   r6   r6   r7   rI  Â  s    ýÿzGetArgumentsHandler.prepareNrr  r6   r6   r6   r7   rs  Á  s   rs  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>)rX  r\  z
entry.htmlZxhtml_escape)Útemplate_loaderZ
autoescaperS   )r   rX   ÚCOOKIE_SECRET)r>   Úloaderr6   r6   r7   r;   Ð  s    øÿýzWSGISafeWebTest.get_app_kwargsc                    s   t ƒ  ¡  tj ¡  d S r/   ©ÚsuperÚtearDownr   Z_template_loadersÚclearr=   ©Ú	__class__r6   r7   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/(.*)r?  )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#   re  ú//web_redirect_double_slashú/header_injectionú/get_argumentz/get_arguments)r#   r8  rO  rW  r[  r^  r_  r   ÚWebRedirectHandlerrk  ro  rs  )r>   Úurlsr6   r6   r7   r:   î  s8    ýýýæzWSGISafeWebTest.get_handlersc                 O   s   | j ||Ž}| ¡  t|jƒS r/   )r¢   Úrethrowr   r¡   )r>   r&  Úkwargsr¨   r6   r6   r7   r/    s    zWSGISafeWebTest.fetch_jsonc                 C   s\   t t| jddƒƒ}| jddd| id}t|jƒ}|  |i ¡ | jdddd| idd	}d S )
Nr­   r¯   z/typecheck/asdf?foo=barrØ   zasdf=rÚ   r   rÙ   ©r    rÕ   r¡   )r   r%   rw  r¢   r   r¡   rj   )r>   r;  r¨   rä   r6   r6   r7   Ú
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®   r3  rU  z/decode_arg/%C3%A9?foo=%C3%A9r°   Zc3a9©r¢   r‹  r   r¡   rj   ©r>   rŠ  Zreq_urlr¨   rä   r6   r6   r7   Útest_decode_argument#  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¢   rj   r¤   r§   r6   r6   r7   Ú$test_decode_argument_invalid_unicode:  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 + 1rU  r  r  r6   r6   r7   Útest_decode_argument_plusB  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  ra   z/decode_arg/fooé*   z/decode_arg/42r{   z/decode_arg/%E9r3  z/decode_arg/%C3%A9r”  z/decode_arg/1%20%2B%201)rj   r<   r>  r=   r6   r6   r7   Útest_reverse_urlQ  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§   r6   r6   r7   Útest_uimodule_unescaped\  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§   r6   r6   r7   Útest_uimodule_resourcesb  s
    
þz'WSGISafeWebTest.test_uimodule_resourcesc                 C   s0   |   |  d¡ddi¡ |   |  d¡dd i¡ d S )Nz/optional_path/foor1   ra   z/optional_path/r4  r=   r6   r6   r7   Útest_optional_path~  s    z"WSGISafeWebTest.test_optional_pathc                 C   s8   |   d¡}|  |jd d¡ |  |j d¡ddg¡ d S )Nr‚  r`  Ú2ra  Ú3rb  rÞ   r§   r6   r6   r7   Ú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¢   rj   r¤   r§   r6   r6   r7   Ú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¢   rj   r¤   rÕ   r§   r6   r6   r7   Ú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§   r6   r6   r7   Útest_web_redirect_double_slash—  s    z.WSGISafeWebTest.test_web_redirect_double_slashc                 C   s   |   d¡}|  |jd¡ d S )Nr‡  rl  rÜ   r§   r6   r6   r7   Ú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=barrb   z/get_argument?foo=rž   rˆ  rÛ   rL   ©ra   r   rŸ   ó   helloz/get_arguments?foo=barrÃ   rt  )r¢   rj   r¡   ÚurllibÚparseÚ	urlencoderX   r   )r>   r¨   r¡   r6   r6   r7   Ú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 )NrL   r¥  z"/get_argument?source=query&foo=barr   rŸ   rb   z/get_argument?source=query&foo=rž   z/get_argument?source=queryrÛ   ©r§  r¨  r©  rX   r¢   rj   r¡   ©r>   r¡   r¨   r6   r6   r7   Ú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Ÿ   rb   Ú rž   rÛ   r«  r¬  r6   r6   r7   Ú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Õ   rO   r§   r6   r6   r7   Útest_no_gzipÖ  s    
zWSGISafeWebTest.test_no_gzip)rB   rC   rD   rw  r;   r{  r:   r/  rŽ  r‘  r“  r•  r—  r˜  r™  rš  r  r   r¢  r£  r¤  rª  r­  r¯  rµ  Ú__classcell__r6   r6   r}  r7   ru  Í  s,   ru  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)rh  r=   r6   r6   r7   r:   Ý  s    zNonWSGIWebTests.get_handlersc                 C   s   |   d¡}|  |jd¡ d S )Nr¸  rl  rÜ   r§   r6   r6   r7   Útest_empty_flushà  s    
z NonWSGIWebTests.test_empty_flushN)rB   rC   rD   r:   r¹  r6   r6   r6   r7   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 ©Nr9  rc   r   )rC  r   rB  r=   r6   r6   r7   rO   è  s    z:ErrorResponseTest.get_handlers.<locals>.DefaultHandler.getNrP   r6   r6   r6   r7   Ú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»  )rC  r  rB  r=   r6   r6   r7   rO   î  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)rc  rN   rB   ©r>   Ústatus_coderŒ  r6   r6   r7   Úwrite_errorô  s    zEErrorResponseTest.get_handlers.<locals>.WriteErrorHandler.write_errorN©rB   rC   rD   rO   rÂ  r6   r6   r6   r7   Ú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 ©Nrc   r   r6   r=   r6   r6   r7   rO   ü  s    zCErrorResponseTest.get_handlers.<locals>.FailedWriteErrorHandler.getc                 [   s   t dƒ‚d S )Nzexception in write_error©r*  rÀ  r6   r6   r7   rÂ  ÿ  s    zKErrorResponseTest.get_handlers.<locals>.FailedWriteErrorHandler.write_errorNrÃ  r6   r6   r6   r7   ÚFailedWriteErrorHandlerû  s   rÇ  ú/defaultú/write_errorú/failed_write_error)r   r#   )r>   r¼  rÄ  rÇ  r6   r6   r7   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¢   rj   r¤   rv   r¡   r§   r6   r6   r7   Ú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¢   rj   r¤   r¡   r§   r6   r6   r7   Ú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§   r6   r6   r7   Útest_failed_write_error   s    
z)ErrorResponseTest.test_failed_write_errorN)rB   rC   rD   r:   rÍ  rÏ  rÐ  r6   r6   r6   r7   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Ó  )rB  rC  rN   Ú
static_url)r>   r1   Zwith_vr6   r6   r7   rO   2  s    z9StaticFileTest.get_handlers.<locals>.StaticUrlHandler.getNrP   r6   r6   r6   r7   ÚStaticUrlHandler1  s   rÕ  c                   @   s   e Zd ZdZdS )z=StaticFileTest.get_handlers.<locals>.AbsoluteStaticUrlHandlerTN)rB   rC   rD   Úinclude_hostr6   r6   r6   r7   ÚAbsoluteStaticUrlHandler6  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   éÿÿÿÿ)
rg  rC  rÖ  rÔ  rN   r¬   r'  Úprotocolrá   Úfind)
r>   r1   Z
do_includeZregular_urlZoverride_urlrÙ  Zprotocol_lengthZcheck_regularZcheck_overrideÚresultr6   r6   r7   rO   :  s    
zAStaticFileTest.get_handlers.<locals>.OverrideStaticUrlHandler.getNrP   r6   r6   r6   r7   ÚOverrideStaticUrlHandler9  s   rÜ  ú/static_url/(.*)z/abs_static_url/(.*)z/override_static_url/(.*)z/root_static/(.*)rG   )r1   )r   r   rX   )r>   rÕ  r×  rÜ  r6   r6   r7   r:   0  s    üzStaticFileTest.get_handlersc                 C   s   t tdƒdS )NrÒ  )Ústatic_path©rX   r8   r=   r6   r6   r7   r;   U  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¢   rv   r¡   rj   rÕ   rO   r§   r6   r6   r7   Útest_static_filesX  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¢   rj   rÕ   rO   rv   r  r§   r6   r6   r7   Útest_static_compressed_files`  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¢   rj   r¡   Úrobots_txt_hashr§   r6   r6   r7   Útest_static_urlm  s    
zStaticFileTest.test_static_urlc                 C   s0   |   d¡}|  |jt|  d¡ƒd | j ¡ d S )Nz/abs_static_url/robots.txtrG   s   static/robots.txt?v=)r¢   rj   r¡   r   r£   rä  r§   r6   r6   r7   Útest_absolute_static_urlq  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§   r6   r6   r7   Útest_relative_version_exclusionx  s    
z.StaticFileTest.test_relative_version_exclusionc                 C   s*   |   d¡}|  |jt|  d¡d ƒ¡ d S )Nz,/abs_static_url/robots.txt?include_version=0rG   ústatic/robots.txt)r¢   rj   r¡   r   r£   r§   r6   r6   r7   Útest_absolute_version_exclusion|  s    
z.StaticFileTest.test_absolute_version_exclusionc                 C   s   |   d¡ |   d¡ d S )NFT)Ú_trigger_include_host_checkr=   r6   r6   r7   Ú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¢   rB  rj   r¡   r   r¬   )r>   rÖ  r1   r¨   r6   r6   r7   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Úaddrj   rO   )r>   r&  rŒ  Zhead_responseZget_responseZcontent_headersÚhr6   r6   r7   Ú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Õ   rj   r¤   rv   ©r>   Z	response1Z	response2r6   r6   r7   Ú!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Õ   rj   r¤   rø  r6   r6   r7   Ú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ø  r6   r6   r7   Ú!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ó  rj   r¤   r§   r6   r6   r7   Ú'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ô  rc   rÚ   rœ   rö  )r0   Ústatr8   ró  r   Úst_mtimerj   r¤   )r>   r  r¨   r6   r6   r7   Ú'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ó  rj   r   rÕ   rO   rä  r§   r6   r6   r7   Ú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ó  rj   r¤   r¡   r   rÕ   rO   rä  r§   r6   r6   r7   Ú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ó  rj   r¤   r0   r1   r2   Ú
static_dirÚopenr¡   r   ÚreadrÕ   rO   ©r>   r¨   Zrobots_file_pathÚfr6   r6   r7   Ú 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  r6   r6   r7   Ú$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  rc   r÷  Z25r	  zbytes 1-25/26r  r  r6   r6   r7   Ú'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÷  rb  r	  úbytes 22-25/26©ró  rj   r¡   rÕ   rO   r§   r6   r6   r7   Ú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÷  rb  r	  r  r  r§   r6   r6   r7   Ú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  r6   r6   r7   Ú%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§   r6   r6   r7   Útest_static_invalid_range%  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ó  rj   rÕ   rO   r¤   r§   r6   r6   r7   Ú+test_static_unsatisfiable_range_zero_suffix)  s     ÿz:StaticFileTest.test_static_unsatisfiable_range_zero_suffixc                 C   s8   | j dddid}|  |jd¡ |  |j d¡d¡ d S )Nrá  r  zbytes=26rÚ   r  r	  r  ©ró  rj   r¤   rÕ   rO   r§   r6   r6   r7   Ú-test_static_unsatisfiable_range_invalid_start0  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§   r6   r6   r7   Ú3test_static_unsatisfiable_range_end_less_than_start7  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¢   rj   r¤   r¡   rÕ   r   rä  r§   r6   r6   r7   Útest_static_head>  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÷  rb  rû  r  r$  r§   r6   r6   r7   Útest_static_head_rangeH  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ä  rj   r¤   r¡   rv   rÕ   r   r§   r6   r6   r7   Útest_static_range_if_none_matchS  s    þþ ÿz.StaticFileTest.test_static_range_if_none_matchc                 C   s   |   d¡}|  |jd¡ d S )Nz/static/blargé”  rÿ  r§   r6   r6   r7   Útest_static_404b  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ó  rj   r¤   r§   r6   r6   r7   Útest_path_traversal_protectionf  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œ   )r0   r1   r2   r3   Úabspathr4   ró  r§  r¨  r»   rj   r¤   )r>   r1   r¨   r6   r6   r7   Útest_root_static_paths  s     ÿz$StaticFileTest.test_root_static_pathN)/rB   rC   rD   rä  r0   r1   r2   r3   r4   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*  r-  ÚunittestZskipIfr[   r0  r6   r6   r6   r7   rÑ  '  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=   r6   r6   r7   r;     s    þz(StaticDefaultFilenameTest.get_app_kwargsc                 C   s   g S r/   r6   r=   r6   r6   r7   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¢   rj   r¤   r¡   r§   r6   r6   r7   Ú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
  r5  )r¢   rj   r¤   rv   rÕ   Úendswithr§   r6   r6   r7   Útest_static_default_redirect  s    z6StaticDefaultFilenameTest.test_static_default_redirectN)rB   rC   rD   r;   r:   r7  r9  r6   r6   r6   r7   r2  €  s   r2  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 r3  rß  r=   r6   r6   r7   r;   –  s    þz%StaticFileWithPathTest.get_app_kwargsc                 C   s   dt dtdƒifgS )Nz	/foo/(.*)r1   z
templates/)r   r8   r=   r6   r6   r7   r:   œ  s    z#StaticFileWithPathTest.get_handlersc                 C   s   |   d¡}|  |jd¡ d S )Nz/foo/utf8.htmls   HÃ©llo
rÜ   r§   r6   r6   r7   Ú
test_serveŸ  s    
z!StaticFileWithPathTest.test_serveN)rB   rC   rD   r;   r:   r;  r6   r6   r6   r7   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Ú.rc   z/static/%s.%s.%s)Úget_versionÚrindex)ÚclsrT   r1   Zversion_hashÚextension_indexZbefore_versionZafter_versionr6   r6   r7   Úmake_static_url§  s    
ýzNCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.make_static_urlc                 S   s4   |  d¡}|  dd|¡}d|d |… ||d … f S )Nr=  r   z%s%s)r?  )r>   Zurl_pathrA  Zversion_indexr6   r6   r7   Úparse_url_path³  s    
zMCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.parse_url_pathc                 S   s   d| S )NzCustomStaticFileTest:r6   ©r@  rT   r1   r6   r6   r7   Úget_absolute_path¸  s    zPCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_absolute_pathc                 S   s   |S r/   r6   )r>   ÚrootÚabsolute_pathr6   r6   r7   Ú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.txtrb   úunexpected path %r)rt   r*  )r>   r1   ÚstartÚendr6   r6   r7   Úget_content¿  s    zJCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_contentc                 S   s    | j dkrdS td| j  ƒ‚d S )NrI  rà   rJ  )rG  r*  r=   r6   r6   r7   Úget_content_sizeÆ  s    
zOCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_content_sizec                 S   s   d S r/   r6   r=   r6   r6   r7   Úget_modified_timeË  s    zPCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_modified_timec                 S   s   dS )NÚ42r6   rD  r6   r6   r7   r>  Î  s    zJCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_version)NN)rB   rC   rD   ÚclassmethodrB  rC  rE  rH  rM  rN  rO  r>  r6   r6   r6   r7   ÚMyStaticFileHandler¦  s   

rR  c                   @   s   e Zd Zdd„ ZdS )z;CustomStaticFileTest.get_handlers.<locals>.StaticUrlHandlerc                 S   s   |   |  |¡¡ d S r/   )rN   rÔ  r“   r6   r6   r7   rO   Ó  s    z?CustomStaticFileTest.get_handlers.<locals>.StaticUrlHandler.getNrP   r6   r6   r6   r7   rÕ  Ò  s   rÕ  rÝ  )r   r   Ústatic_handler_class)r>   rR  rÕ  r6   r6   r7   r:   ¥  s    ,z!CustomStaticFileTest.get_handlersc                 C   s   t d| jdS )NÚdummy)rÞ  rS  )rX   rS  r=   r6   r6   r7   r;   Ú  s    z#CustomStaticFileTest.get_app_kwargsc                 C   s   |   d¡}|  |jd¡ d S )Nz/static/foo.42.txtrb   rÜ   r§   r6   r6   r7   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¢   rj   r¡   r§   r6   r6   r7   rå  á  s    
z$CustomStaticFileTest.test_static_urlN)rB   rC   rD   r:   r;   r;  rå  r6   r6   r6   r7   r<  ¤  s   5r<  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 r/   )Úreply)r>   rW  r6   r6   r7   r  é  s    z#HostMatchingTest.Handler.initializec                 C   s   |   | j¡ d S r/   )rN   rW  r=   r6   r6   r7   rO   ì  s    zHostMatchingTest.Handler.getN)rB   rC   rD   r  rO   r6   r6   r6   r7   rI   è  s   rI   c                 C   s   dt jddifgS )Nrµ   rW  Zwildcard)rV  rI   r=   r6   r6   r7   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µ   rW  ú[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_handlersrV  rI   r¢   rj   r¡   r¤   r§   r6   r6   r7   Útest_host_matchingò  s<     ÿ ÿ ÿ ÿ


z#HostMatchingTest.test_host_matchingN)rB   rC   rD   r   rI   r:   rd  r6   r6   r6   r7   rV  ç  s   rV  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚDefaultHostMatchingTestc                 C   s   g S r/   r6   r=   r6   r6   r7   r:     s    z$DefaultHostMatchingTest.get_handlersc                 C   s   ddiS )NÚdefault_hostrX  r6   r=   r6   r6   r7   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 )NrX  rµ   rW  rY  rZ  r[  r\  zwww.test.comr]  r^  r`  ra  r)  z	X-Real-Ipr  rÚ   rb  )	r<   rc  rV  rI   r¢   rj   r¡   r¤   rf  r§   r6   r6   r7   Útest_default_host_matching  s.     ÿ ÿ ÿ



z2DefaultHostMatchingTest.test_default_host_matchingN)rB   rC   rD   r:   r;   rg  r6   r6   r6   r7   re    s   re  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 r/   rM   r“   r6   r6   r7   rO   6  s    z<NamedURLSpecGroupsTest.get_handlers.<locals>.EchoHandler.getNrP   r6   r6   r6   r7   r#  5  s   r#  z/str/(?P<path>.*)z/unicode/(?P<path>.*)rš   )r>   r#  r6   r6   r7   r:   4  s    þz#NamedURLSpecGroupsTest.get_handlersc                 C   s4   |   d¡}|  |jd¡ |   d¡}|  |jd¡ d S )Nz/str/foos   fooz/unicode/barrb   rÜ   r§   r6   r6   r7   Útest_named_urlspec_groups>  s    

z0NamedURLSpecGroupsTest.test_named_urlspec_groupsN)rB   rC   rD   r:   ri  r6   r6   r6   r7   rh  3  s   
rh  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Úh1ra   Úh2rÃ   Znonexistent)rc  Zclear_headerr=   r6   r6   r7   rO   H  s    
zClearHeaderTest.Handler.getNrP   r6   r6   r6   r7   rI   G  s   rI   c                 C   s0   |   d¡}|  d|jk¡ |  |jd d¡ d S )NrG   rk  rl  rÃ   )r¢   rv   rÕ   rj   r§   r6   r6   r7   Útest_clear_headerN  s    
z!ClearHeaderTest.test_clear_headerN)rB   rC   rD   r   rI   rm  r6   r6   r6   r7   rj  F  s   rj  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=   r6   r6   r7   rO   V  s    
zHeader204Test.Handler.getNrP   r6   r6   r6   r7   rI   U  s   rI   c                 C   s8   |   d¡}|  |jd¡ |  d|j¡ |  d|j¡ d S )NrG   ro  r÷  úTransfer-Encoding)r¢   rj   r¤   r´  rÕ   r§   r6   r6   r7   Útest_204_headersZ  s    
zHeader204Test.test_204_headersN)rB   rC   rD   r   rI   rr  r6   r6   r6   r7   rn  T  s   rn  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_USrL   )rc  rN   r=   r6   r6   r7   rO   c  s    zHeader304Test.Handler.getNrP   r6   r6   r6   r7   rI   b  s   rI   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 )NrG   r÷  Ú5rt  ru  rú  rû  rÚ   rö  rq  )r¢   rj   rÕ   r¤   rv   rø  r6   r6   r7   Útest_304_headersg  s    
 ÿzHeader304Test.test_304_headersN)rB   rC   rD   r   rI   rw  r6   r6   r6   r7   rs  a  s   rs  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   ©ry  )r'  r(  rO   rp  rB  rC  r   )r>   ry  r6   r6   r7   rO   x  s
    þzStatusReasonTest.Handler.getNrP   r6   r6   r6   r7   rI   w  s   rI   c                 C   s   t ƒ S r/   r   r=   r6   r6   r7   Ú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¢   rj   r¤   ry  r§   r6   r6   r7   Útest_statusƒ  s    



zStatusReasonTest.test_statusN)rB   rC   rD   r   rI   r{  r€  r6   r6   r6   r7   rx  v  s   rx  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 rK   rM   r=   r6   r6   r7   rO   ”  s    zDateHeaderTest.Handler.getNrP   r6   r6   r6   r7   rI   “  s   rI   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 )NrG   ÚDaterï   ro   )Úseconds)
r¢   ró   rô   rõ   rÕ   rt   rð   rv   rñ   rò   )r>   r¨   rú   Zheader_dater6   r6   r7   Útest_date_header—  s    
ÿzDateHeaderTest.test_date_headerN)rB   rC   rD   r   rI   r„  r6   r6   r6   r7   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|  rz  ©r   r=   r6   r6   r7   rO   £  s    zRaiseWithReasonTest.Handler.getNrP   r6   r6   r6   r7   rI   ¢  s   rI   c                 C   s   t ƒ S r/   r   r=   r6   r6   r7   r{  ¦  s    z#RaiseWithReasonTest.get_http_clientc                 C   s8   |   d¡}|  |jd¡ |  |jd¡ |  d|j¡ d S )NrG   r}  r|  s   682: Foo)r¢   rj   r¤   ry  ÚassertInr¡   r§   r6   r6   r7   Útest_raise_with_reasonª  s    
z*RaiseWithReasonTest.test_raise_with_reasonc                 C   s   |   ttdddƒd¡ d S )Nr}  r|  rz  zHTTP 682: Foo©rj   r¬   r   r=   r6   r6   r7   Útest_httperror_str°  s    z&RaiseWithReasonTest.test_httperror_strc                 C   s   |   ttdƒƒd¡ d S )Nr}  zHTTP 682: Unknownr‰  r=   r6   r6   r7   Ú test_httperror_str_from_httputil³  s    z4RaiseWithReasonTest.test_httperror_str_from_httputilN)	rB   rC   rD   r   rI   r{  rˆ  rŠ  r‹  r6   r6   r6   r7   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!   rX   r=   r6   r6   r7   r:   ¸  s    z!ErrorHandlerXSRFTest.get_handlersc                 C   s
   t ddS ©NT)Úxsrf_cookiesr›   r=   r6   r6   r7   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§   r6   r6   r7   Ú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§   r6   r6   r7   Útest_404_xsrfÅ  s    z"ErrorHandlerXSRFTest.test_404_xsrfN)rB   rC   rD   r:   r;   r’  r“  r6   r6   r6   r7   rŒ  ·  s   rŒ  c                   @   sT   e Zd ZG dd„ deƒZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ ZdS )ÚGzipTestCasec                   @   s   e Zd Zdd„ ZdS )zGzipTestCase.Handlerc                 C   s4   |   d¡D ]}|  d|¡ q
|  ddtj  ¡ d S )NÚvaryr±  zhello worldú!)r+  rd  rN   r-   Z
MIN_LENGTH)r>   Úvr6   r6   r7   rO   Ì  s    zGzipTestCase.Handler.getNrP   r6   r6   r6   r7   rI   Ë  s   rI   c                 C   s   t dtj tj t¡d¡dS )NTrÒ  )r²  rÞ  )rX   r0   r1   r2   r3   r4   r=   r6   r6   r7   r;   Ò  s     ÿzGzipTestCase.get_app_kwargsc                 C   s"   |   |j d|j d¡¡d¡ d S )Nr³  zX-Consumed-Content-Encodingr²  )rj   rÕ   rO   r§   r6   r6   r7   Úassert_compressed×  s     
ÿüzGzipTestCase.assert_compressedc                 C   s*   |   d¡}|  |¡ |  |jd d¡ d S )NrG   r±  r°  ©r¢   r˜  rj   rÕ   r§   r6   r6   r7   Ú	test_gzipá  s    

zGzipTestCase.test_gzipc                 C   s*   |   d¡}|  |¡ |  |jd d¡ d S )Nrà  r±  r°  r™  r§   r6   r6   r7   Útest_gzip_staticæ  s    

zGzipTestCase.test_gzip_staticc                 C   s2   | j ddd}|  d|j¡ |  |jd d¡ d S )NrG   F)Zuse_gzipr³  r±  r°  )r¢   r´  rÕ   rj   r§   r6   r6   r7   Ú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 r6   ©Ústrip©Ú.0r  r6   r6   r7   Ú
<listcomp>ö  s     z:GzipTestCase.test_vary_already_present.<locals>.<listcomp>r±  ú,úAccept-Languager°  ©r¢   r˜  rj   rÕ   Úsplitr§   r6   r6   r7   Ú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 r6   r  rŸ  r6   r6   r7   r¡  ÿ  s     zCGzipTestCase.test_vary_already_present_multiple.<locals>.<listcomp>r±  r¢  r£  rØ   r°  r¤  r§   r6   r6   r7   Ú"test_vary_already_present_multipleú  s    

þz/GzipTestCase.test_vary_already_present_multipleN)rB   rC   rD   r   rI   r;   r˜  rš  r›  rœ  r¦  r§  r6   r6   r6   r7   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Œ  )rN   rX   r%  Zpath_kwargsr=   r6   r6   r7   rI    s    z%PathArgsInPrepareTest.Handler.preparec                 C   s   |dkst ‚|  ¡  d S )Nra   )rt   r‰   r“   r6   r6   r7   rO   	  s    z!PathArgsInPrepareTest.Handler.getN©rB   rC   rD   rI  rO   r6   r6   r6   r7   rI     s   rI   c                 C   s   d| j fd| j fgS )Nz	/pos/(.*)z/kw/(?P<path>.*)rH   r=   r6   r6   r7   r:     s    z"PathArgsInPrepareTest.get_handlersc                 C   s4   |   d¡}| ¡  t|jƒ}|  |dgi dœ¡ d S )Nz/pos/foora   r©  r  ©r>   r¨   rä   r6   r6   r7   Útest_pos  s    

zPathArgsInPrepareTest.test_posc                 C   s6   |   d¡}| ¡  t|jƒ}|  |g ddidœ¡ d S )Nz/kw/foor1   ra   r©  r  r«  r6   r6   r7   Útest_kw  s    

zPathArgsInPrepareTest.test_kwN)rB   rC   rD   r   rI   r:   r¬  r­  r6   r6   r6   r7   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_cookiesrN   r=   r6   r6   r7   rO     s    zClearAllCookiesTest.Handler.getNrP   r6   r6   r6   r7   rI     s   rI   c                 C   sj   | j dddid}t|j d¡ƒ}|  |d  d¡p@|d  d¡¡ |  |d	  d
¡pb|d	  d¡¡ d S )NrG   rØ   zfoo=bar; baz=xyzzyrÚ   rÓ   r   zbaz=;zbaz="";rc   zfoo=;zfoo="";)r¢   rÔ   rÕ   rÖ   rv   rð  )r>   r¨   Zset_cookiesr6   r6   r7   Útest_clear_all_cookies#  s    ÿÿz*ClearAllCookiesTest.test_clear_all_cookiesN)rB   rC   rD   r   rI   r±  r6   r6   r6   r7   r®    s   r®  c                   @   s   e Zd ZdS )ÚPermissionErrorN©rB   rC   rD   r6   r6   r6   r7   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zerorc   r   Z
permissionznot allowed)rC  r   r²  )r>   rµ  r6   r6   r7   rO   5  s    

z ExceptionHandlerTest.Handler.getc                 K   sL   d|kr8|d \}}}t |tƒr8|  d¡ |  d¡ d S tj| |f|Ž d S )Nr¿  r+  r²  )Ú
isinstancer²  rp  rN   r   rÂ  )r>   rÁ  rŒ  Útypr]   Útbr6   r6   r7   rÂ  >  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º  r6   r6   r7   r¼  G  s    
z*ExceptionHandlerTest.Handler.log_exceptionN)rB   rC   rD   rO   rÂ  r¼  r6   r6   r6   r7   rI   4  s   		rI   c              	   C   s2   t tdƒ |  d¡}|  |jd¡ W 5 Q R X d S )Nz.*no longer herez
/?exc=httpr·  r’  r§   r6   r6   r7   Útest_http_errorM  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¢   rj   r¤   r§   r6   r6   r7   Útest_unknown_errorT  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=permissionr+  r¿  r§   r6   r6   r7   Útest_known_errorZ  s    
z%ExceptionHandlerTest.test_known_errorN)rB   rC   rD   r   rI   r¾  rÀ  rÁ  r6   r6   r6   r7   r´  3  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Å  r6   r=   r6   r6   r7   rO   d  s    zBuggyLoggingTest.Handler.getc                 C   s   dd  d S rÅ  r6   r½  r6   r6   r7   r¼  g  s    z&BuggyLoggingTest.Handler.log_exceptionN)rB   rC   rD   rO   r¼  r6   r6   r6   r7   rI   c  s   rI   c              	   C   s$   t tdƒ |  d¡ W 5 Q R X d S )Nz.*rG   )r   r   r¢   r=   r6   r6   r7   Útest_buggy_log_exceptionj  s    z)BuggyLoggingTest.test_buggy_log_exceptionN)rB   rC   rD   r   rI   rÃ  r6   r6   r6   r7   rÂ  b  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•   rZ  r=   r6   r6   r7   rO   w  s    z UIMethodUIModuleTest.Handler.getc                 C   s
   |   d¡S )Nr]   )rC  r=   r6   r6   r7   r]   z  s    z"UIMethodUIModuleTest.Handler.valueN)rB   rC   rD   rO   r]   r6   r6   r6   r7   rI   v  s   rI   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]   )rm   Úxr6   r6   r7   Ú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Ä  rI   rm   r]   )r>   rÅ  r6   r6   r7   r–   ‚  s    þz<UIMethodUIModuleTest.get_app_kwargs.<locals>.MyModule.renderN©rB   rC   rD   r–   r6   r6   r6   r7   ÚMyModule  s   rÊ  r‘   z1{{ my_ui_method(42) }} {% module MyModule(123) %}rÆ  )rv  Z
ui_methodsÚ
ui_modules©r(   r   rX   )r>   rÆ  rÊ  rx  r6   r6   r7   r;   }  s    ÿýz#UIMethodUIModuleTest.get_app_kwargsc                    s   t ƒ  ¡  tj ¡  d S r/   ry  r=   r}  r6   r7   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§   r6   r6   r7   Útest_ui_method–  s
    
þz#UIMethodUIModuleTest.test_ui_method)
rB   rC   rD   rE   r   rI   r;   r{  rÍ  r¶  r6   r6   r}  r7   rÄ  q  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 )Nra   ©Úarg_nameÚlog_message)rC  rN   r    rÐ  rÑ  rn  r6   r6   r7   rO   ¡  s
    
z GetArgumentErrorTest.Handler.getNrP   r6   r6   r6   r7   rI      s   rI   c                 C   s&   |   d¡}|  t|jƒdddœ¡ d S )NrG   ra   zMissing argument foorÏ  )r¢   rj   r   r¡   r§   r6   r6   r7   Útest_catch_error¨  s
    
þz%GetArgumentErrorTest.test_catch_errorN)rB   rC   rD   r   rI   rÒ  r6   r6   r6   r7   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Benru  )Úcurrent_userr   rO   r=   r6   r6   r7   rI  ²  s    z%SetLazyPropertiesTest.Handler.preparec                 C   s
   t ƒ ‚d S r/   r@   r=   r6   r6   r7   Úget_user_locale¶  s    z-SetLazyPropertiesTest.Handler.get_user_localec                 C   s
   t ƒ ‚d S r/   r@   r=   r6   r6   r7   Úget_current_user¹  s    z.SetLazyPropertiesTest.Handler.get_current_userc                 C   s   |   d| j| jjf ¡ d S )NzHello %s (%s))rN   rÔ  r   r¤   r=   r6   r6   r7   rO   ¼  s    z!SetLazyPropertiesTest.Handler.getN)rB   rC   rD   rI  rÕ  rÖ  rO   r6   r6   r6   r7   rI   ±  s   rI   c                 C   s   |   d¡}|  |jd¡ d S )NrG   s   Hello Ben (en_US)rÜ   r§   r6   r6   r7   Útest_set_properties¿  s    
z)SetLazyPropertiesTest.test_set_propertiesN)rB   rC   rD   r   rI   r×  r6   r6   r6   r7   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®  r6   r=   r6   r6   r7   r–   É  s    zCGetCurrentUserTest.get_app_kwargs.<locals>.WithoutUserModule.renderNrÉ  r6   r6   r6   r7   Ú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 r/   )r¬   rÔ  r=   r6   r6   r7   r–   Í  s    z@GetCurrentUserTest.get_app_kwargs.<locals>.WithUserModule.renderNrÉ  r6   r6   r6   r7   Ú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Ù  )rv  rË  rÌ  )r>   rÙ  rÚ  rx  r6   r6   r7   r;   Ç  s    üÿþþz!GetCurrentUserTest.get_app_kwargsc                    s   t ƒ  ¡  tj ¡  d S r/   ry  r=   r}  r6   r7   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=   r6   r6   r7   rI  æ  s    zCGetCurrentUserTest.get_handlers.<locals>.CurrentUserHandler.preparec                 S   s
   d| _ dS )NTr®  rß  r=   r6   r6   r7   rÖ  é  s    zLGetCurrentUserTest.get_handlers.<locals>.CurrentUserHandler.get_current_userN)rB   rC   rD   rI  rÖ  r6   r6   r6   r7   Ú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=   r6   r6   r7   rO   î  s    
z?GetCurrentUserTest.get_handlers.<locals>.WithoutUserHandler.getNrP   r6   r6   r6   r7   Ú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=   r6   r6   r7   rO   ó  s    
z<GetCurrentUserTest.get_handlers.<locals>.WithUserHandler.getNrP   r6   r6   r6   r7   ÚWithUserHandlerò  s   rä  c                   @   s   e Zd Zdd„ ZdS )zAGetCurrentUserTest.get_handlers.<locals>.CurrentUserModuleHandlerc                 S   s   | j S r/   )Úuir=   r6   r6   r7   Úget_template_namespaceø  s    zXGetCurrentUserTest.get_handlers.<locals>.CurrentUserModuleHandler.get_template_namespaceN)rB   rC   rD   ræ  r6   r6   r6   r7   Ú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=   r6   r6   r7   rO   ÿ  s    
zEGetCurrentUserTest.get_handlers.<locals>.WithoutUserModuleHandler.getNrP   r6   r6   r6   r7   Ú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=   r6   r6   r7   rO     s    
zBGetCurrentUserTest.get_handlers.<locals>.WithUserModuleHandler.getNrP   r6   r6   r6   r7   ÚWithUserModuleHandler  s   ré  ú/without_userú
/with_userú/without_user_moduleú/with_user_modulerš   )r>   rá  rã  rä  rç  rè  ré  r6   r6   r7   r:   ä  s    üzGetCurrentUserTest.get_handlersz	needs fixc                 C   s   |   d¡}|  |jd¡ d S )Nrê  ó   FalserÜ   r§   r6   r6   r7   Útest_get_current_user_is_lazy  s    
z0GetCurrentUserTest.test_get_current_user_is_lazyc                 C   s   |   d¡}|  |jd¡ d S )Nrë  ó   TruerÜ   r§   r6   r6   r7   Útest_get_current_user_works  s    
z.GetCurrentUserTest.test_get_current_user_worksc                 C   s   |   d¡}|  |jd¡ d S )Nrì  rî  rÜ   r§   r6   r6   r7   Ú,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§   r6   r6   r7   Ú*test_get_current_user_from_ui_module_works  s    
z=GetCurrentUserTest.test_get_current_user_from_ui_module_works)rB   rC   rD   r;   r{  r:   r1  Úskiprï  rñ  rò  ró  r¶  r6   r6   r}  r7   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³  r6   r6   r6   r7   rI   #  s   rI   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ÚOPTIONSrG   r#  é•  ©r   ÚPUTrž   rŸ   rŸ  )r>   r    r¨   r6   r6   r7   Ú#test_unimplemented_standard_methods&  s    z@UnimplementedHTTPMethodsTest.test_unimplemented_standard_methodsN)rB   rC   rD   r   rI   rû  r6   r6   r6   r7   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ÚotherrM   r=   r6   r6   r7   rþ  1  s    z1UnimplementedNonStandardMethodsTest.Handler.otherN)rB   rC   rD   rþ  r6   r6   r6   r7   rI   0  s   rI   c                 C   s"   | j dddd}|  |jd¡ d S )NrG   ÚPATCHrž   rŸ   rø  rŸ  r§   r6   r6   r7   Útest_unimplemented_patch6  s    z<UnimplementedNonStandardMethodsTest.test_unimplemented_patchc                 C   s"   | j dddd}|  |jd¡ d S )NrG   ÚOTHERT©r    Zallow_nonstandard_methodsrø  rŸ  r§   r6   r6   r7   Útest_unimplemented_other<  s    z<UnimplementedNonStandardMethodsTest.test_unimplemented_otherN)rB   rC   rD   r   rI   r   r  r6   r6   r6   r7   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 r/   )r'  r    rt   rN   r=   r6   r6   r7   r    C  s    z!AllHTTPMethodsTest.Handler.methodN)	rB   rC   rD   r    rO   ÚdeleteÚoptionsrŽ   Úputr6   r6   r6   r7   rI   B  s   rI   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 )NrG   rì  r#  rž   )rí  rö  r÷  rù  rŸ   )r¢   rj   r¡   r   )r>   r¨   r    r6   r6   r7   Útest_standard_methodsI  s    z(AllHTTPMethodsTest.test_standard_methodsN)rB   rC   rD   r   rI   r  r6   r6   r6   r7   r  A  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ÚpatchrM   r=   r6   r6   r7   r
  Z  s    zPatchMethodTest.Handler.patchc                 C   s   |   d¡ d S rý  rM   r=   r6   r6   r7   rþ  ]  s    zPatchMethodTest.Handler.otherN)rB   rC   rD   r   ZSUPPORTED_METHODSr
  rþ  r6   r6   r6   r7   rI   U  s   
rI   c                 C   s"   | j dddd}|  |jd¡ d S )NrG   rÿ  rž   rŸ   s   patchrÜ   r§   r6   r6   r7   Ú
test_patch`  s    zPatchMethodTest.test_patchc                 C   s"   | j dddd}|  |jd¡ d S )NrG   r  Tr  s   otherrÜ   r§   r6   r6   r7   Ú
test_otherd  s    zPatchMethodTest.test_otherN)rB   rC   rD   r   rI   r  r  r6   r6   r6   r7   r	  T  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=   r6   r6   r7   rI  k  s    z#FinishInPrepareTest.Handler.preparec                 C   s   t dƒ‚d S )Nzshould not reach this methodrÆ  r=   r6   r6   r7   rO   n  s    zFinishInPrepareTest.Handler.getNrª  r6   r6   r6   r7   rI   j  s   rI   c                 C   s   |   d¡}|  |jd¡ d S )NrG   s   donerÜ   r§   r6   r6   r7   Útest_finish_in_preparet  s    
z*FinishInPrepareTest.test_finish_in_prepareN)rB   rC   rD   r   rI   r  r6   r6   r6   r7   r  i  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=   r6   r6   r7   r:   z  s    zDefault404Test.get_handlersc                 C   s*   |   d¡}|  |jd¡ |  |jd¡ d S )NrG   r)  sE   <html><title>404: Not Found</title><body>404: Not Found</body></html>r6  r§   r6   r6   r7   Útest_404~  s    
þzDefault404Test.test_404N)rB   rC   rD   r:   r  r6   r6   r6   r7   r  y  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=   r6   r6   r7   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)rp  rN   r=   r6   r6   r7   rO   Ž  s    
z:Custom404Test.get_app_kwargs.<locals>.Custom404Handler.getNrP   r6   r6   r6   r7   ÚCustom404Handler  s   r  )Údefault_handler_class)r   rX   )r>   r  r6   r6   r7   r;   Œ  s    zCustom404Test.get_app_kwargsc                 C   s*   |   d¡}|  |jd¡ |  |jd¡ d S )NrG   r)  s   custom 404 responser6  r§   r6   r6   r7   r  ”  s    
zCustom404Test.test_404N)rB   rC   rD   r:   r;   r  r6   r6   r6   r7   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=   r6   r6   r7   r:   ›  s    z(DefaultHandlerArgumentsTest.get_handlersc                 C   s   t tt dddS )Nr+  r  )r  Zdefault_handler_args)rX   r!   r=   r6   r6   r7   r;   ž  s    þz*DefaultHandlerArgumentsTest.get_app_kwargsc                 C   s   |   d¡}|  |jd¡ d S )NrG   r+  rŸ  r§   r6   r6   r7   Útest_403¤  s    
z$DefaultHandlerArgumentsTest.test_403N)rB   rC   rD   r:   r;   r  r6   r6   r6   r7   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  )rJ   r#   r=   r6   r6   r7   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>   Úrespr6   r6   r7   Útest_handler_by_name²  s    


z&HandlerByNameTest.test_handler_by_nameN)rB   rC   rD   r:   r  r6   r6   r6   r7   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 r/   r‹   r  r6   r6   r7   r  ¿  s    zNStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.initializec                 S   s   | j j d ¡ d S r/   )rŒ   ÚpreparedÚ
set_resultr=   r6   r6   r7   rI  Â  s    zKStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.preparec                 S   s   | j j |¡ d S r/   )rŒ   rä   r!  ©r>   rä   r6   r6   r7   Údata_receivedÅ  s    zQStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.data_receivedc                 S   s   | j j d ¡ |  i ¡ d S r/   )rŒ   Úfinishedr!  rN   r=   r6   r6   r7   rO   È  s    zGStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.getN)rB   rC   rD   r  rI  r#  rO   r6   r6   r6   r7   Ú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=   r6   r6   r7   rI  Î  s    zIStreamingRequestBodyTest.get_handlers.<locals>.EarlyReturnHandler.prepareNrr  r6   r6   r6   r7   Ú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 r/   r‹   r  r6   r6   r7   r  Õ  s    zOStreamingRequestBodyTest.get_handlers.<locals>.CloseDetectionHandler.initializec                    s   t ƒ  ¡  | jj d ¡ d S r/   )rz  r  rŒ   Úclose_futurer!  r=   r}  r6   r7   r  Ø  s    
zXStreamingRequestBodyTest.get_handlers.<locals>.CloseDetectionHandler.on_connection_close)rB   rC   rD   r  r  r¶  r6   r6   r}  r7   ÚCloseDetectionHandlerÓ  s   r)  z/stream_bodyr‹   z/early_returnz/close_detection)r*   r   rX   )r>   r%  r'  r)  r6   r6   r7   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   rN   )r>   r#   Úconnection_closer  r  r6   r6   r7   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  rN   rj   Úread_until_closerv   r8  r!  ©r>   r  rä   r6   r6   r7   Útest_streaming_bodyí  s"    



z,StreamingRequestBodyTest.test_streaming_bodyc                 c   s,   | j ddd}| ¡ V }|  | d¡¡ d S )Nó   /early_returnFr+  ó   HTTP/1.1 401)r  r-  rv   rð  r.  r6   r6   r7   Útest_early_return	  s    
z*StreamingRequestBodyTest.test_early_returnc                 c   s6   | j ddd}| d¡ | ¡ V }|  | d¡¡ d S )Nr0  Fr+  r,  r1  )r  rN   r-  rv   rð  r.  r6   r6   r7   Ú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_detectionFr+  )r   r(  r  r!  )r>   r  r6   r6   r7   Útest_close_during_upload	  s    z1StreamingRequestBodyTest.test_close_during_uploadN)
rB   rC   rD   r:   r  r   r/  r2  r3  r4  r6   r6   r6   r7   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 r/   )rŒ   r    Úmethodsr  r6   r6   r7   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Œ   Úfailr6  Úappendrq  r6   r6   r7   Ú	in_method$	  s    

z BaseFlowControlHandler.in_methodc                 c   s   | j  d¡ tjV  d S )NrI  )r6  r8  r   Úmomentr=   r6   r6   r7   rI  /	  s    zBaseFlowControlHandler.preparec              	   c   s4   |   d¡ tjV  W 5 Q R X |  t| jd¡ d S )NrŽ   ©r6  )r9  r   r:  rN   rX   r6  r=   r6   r6   r7   rŽ   6	  s    zBaseFlowControlHandler.postN)rB   rC   rD   r  Ú
contextlibÚcontextmanagerr9  r   r   rI  rŽ   r6   r6   r6   r7   r5  	  s   


r5  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=   r6   r6   r7   Úget_httpserver_options>	  s    z:BaseStreamingRequestFlowControlTest.get_httpserver_optionsc                 C   s   t ƒ S r/   r   r=   r6   r6   r7   r{  C	  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 )	NrG   Úabcdefghijklmnopqrstuvwxyzr   )r¡   r    rI  r#  rŽ   r;  )r¢   r‹  rj   r   r¡   rX   r§   r6   r6   r7   Útest_flow_control_fixed_bodyH	  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 r/   r6   )rN   Úi©Úchunksr6   r7   Úbody_producer[	  s    zYBaseStreamingRequestFlowControlTest.test_flow_control_chunked_body.<locals>.body_producerrG   r   )rF  r    rI  r#  rŽ   r;  )r   r   r¢   r‹  rj   r   r¡   rX   )r>   rF  r¨   r6   rD  r7   Útest_flow_control_chunked_bodyX	  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   abcdefghijklmnopqrstuvwxyzrG   r   r³  r²  )r¡   r    rÕ   rI  r#  rŽ   r;  )r.   r²  ÚGzipFilerN   r!  Úgetvaluer¢   r‹  rj   r   r¡   rX   )r>   ZbytesioZ	gzip_fileZcompressed_bodyr¨   r6   r6   r7   Ú!test_flow_control_compressed_bodyo	  s.    
üûÿþzEBaseStreamingRequestFlowControlTest.test_flow_control_compressed_bodyN)
rB   rC   rD   r@  r{  rÇ  ÚAnyrB  rG  rM  r6   r6   r6   r7   r>  =	  s
   r>  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#  )r9  r   r:  r"  r6   r6   r7   r#  	  s    zhDecoratedStreamingRequestFlowControlTest.get_handlers.<locals>.DecoratedFlowControlHandler.data_receivedN)rB   rC   rD   r   r   r#  r6   r6   r6   r7   ÚDecoratedFlowControlHandlerŽ	  s   rP  rG   r‹   ©r5  rX   )r>   rP  r6   r6   r7   r:   	  s    z5DecoratedStreamingRequestFlowControlTest.get_handlersN©rB   rC   rD   r:   r6   r6   r6   r7   rO  Š	  s   rO  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   )r9  Úasyncior  )r>   rä   rT  r6   r6   r7   r#  œ	  s    zbNativeStreamingRequestFlowControlTest.get_handlers.<locals>.NativeFlowControlHandler.data_receivedN)rB   rC   rD   r#  r6   r6   r6   r7   ÚNativeFlowControlHandler›	  s   rU  rG   r‹   rQ  )r>   rU  r6   r6   r7   r:   š	  s    z2NativeStreamingRequestFlowControlTest.get_handlersNrR  r6   r6   r6   r7   rS  —	  s   rS  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÷  rP  r°  ©rc  r‰   r*  Úserver_errorrn  r‹   r6   r7   rO   ¬	  s    z<IncorrectContentLengthTest.get_handlers.<locals>.TooHigh.getNrP   r6   r‹   r6   r7   ÚTooHigh«	  s   rY  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›  rL   rW  rn  r‹   r6   r7   rO   µ	  s    z;IncorrectContentLengthTest.get_handlers.<locals>.TooLow.getNrP   r6   r‹   r6   r7   ÚTooLow´	  s   rZ  ú/highú/low)rX  r   )r>   rY  rZ  r6   r‹   r7   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¢   rj   r¬   rX  r=   r6   r6   r7   Ú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 )Nr]  r^  r\  Tr_  z,Tried to write more data than Content-Lengthr`  r=   r6   r6   r7   Útest_content_length_too_lowÏ	  s    þ, ÿz6IncorrectContentLengthTest.test_content_length_too_lowN)rB   rC   rD   r:   rb  rc  r6   r6   r6   r7   rV  ¥	  s   rV  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/1rL   úrequires HTTP/1.x)r'  re   rð  Ú
connectionr  r!  rN   r=   r6   r6   r7   rO   â	  s    zClientCloseTest.Handler.getNrP   r6   r6   r6   r7   rI   á	  s   rI   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 )NrG   Tr_  s   requires HTTP/1.xre  iW  )	ra  r
   r1  ZSkipTestr¢   r¡   ZskipTestrj   r¤   r§   r6   r6   r7   Útest_client_closeï	  s
    

z!ClientCloseTest.test_client_closeN)rB   rC   rD   r   rI   rg  r6   r6   r6   r7   rd  à	  s   rd  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   rc   ro   c                 C   s   |   ¡ d S )Ni 0* )Úpresentr=   r6   r6   r7   Úpastû	  s    zSignedValueTest.pastc                 C   s   dS )Ni m|Mr6   r=   r6   r6   r7   ri  þ	  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 )Nr,  r]   rc   )re   Úclocks<   dmFsdWU=|1300000000|31c934969f53e48164c50768b40cbd7e2daaaa4fro   se   2|1:0|10:1300000000|3:key|8:dmFsdWU=|3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e152©rk  )rg   rk  ó   value)r%   rh  ÚSECRETri  rj   r&   )r>   Z	signed_v1Z	signed_v2Zsigned_defaultZ
decoded_v1Z
decoded_v2r6   r6   r7   Ú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]   rl  Úkey2)r%   rh  rn  ri  r&   ÚassertIs)r>   Zsigned1Zsigned2Zdecoded1Zdecoded2r6   r6   r7   Ú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 )Nrp  r]   rl  rm  )r%   rh  rn  rj  r&   rj   ri  rr  )r>   ÚsignedZdecoded_pastZdecoded_presentr6   r6   r7   Útest_expired2
  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 ©Nrm  r,  rl  ©r&   rh  rn  ri  )Úprefix©r>   ry   r6   r7   ÚvalidateC
  s       ÿz8SignedValueTest.test_payload_tampering.<locals>.validateú%2|1:0|10:1300000000|3:key|8:dmFsdWU=|z%2|1:1|10:1300000000|3:key|8:dmFsdWU=|z$2|1:0|10:130000000|3:key|8:dmFsdWU=|z&2|1:0|10:1300000000|3:keey|8:dmFsdWU=|©rv   ZassertFalse©r>   r{  r6   rz  r7   Útest_payload_tampering?
  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 rw  rx  )ry   ©ry  r>   r6   r7   r{  S
  s       ÿz:SignedValueTest.test_signature_tampering.<locals>.validaterv  Z 00000000000000000000000000000000Z@4d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e152Z@3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e153Z?3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e15ZA3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e1538r}  r~  r6   r€  r7   Útest_signature_tamperingP
  s(    ÿÿÿÿÿÿz(SignedValueTest.test_signature_tamperingc                 C   s<   d}t tjd|| jd}ttjd|| jd}|  ||¡ d S )Nr{   r,  rl  )r%   rh  rn  ri  r&   rj   ©r>   r]   rt  Údecodedr6   r6   r7   Útest_non_asciip
  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{   r,  r   ©rk  rV   rl  ©r%   rh  ÚSECRET_DICTri  r&   rj   r‚  r6   r6   r7   Ú*test_key_versioning_read_write_default_keyz
  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{   r,  rc   r†  rl  r‡  r‚  r6   r6   r7   Ú.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%   rh  rˆ  ri  r…   r†   r&   rj   )r>   r]   rt  Znewkeysrƒ  r6   r6   r7   Ú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{   r,  rc   r†  )r%   rh  rˆ  ri  r'   rj   )r>   r]   rt  rV   r6   r6   r7   Útest_key_version_retrieval˜
  s        ÿz*SignedValueTest.test_key_version_retrievalN)rB   rC   rD   rn  rˆ  rj  ri  ro  rs  ru  r  r  r„  r‰  rŠ  r‹  rŒ  r6   r6   r6   r7   rh  ÷	  s     



rh  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 )Nre   r›  Zxsrf_cookie_version)rB  rC  rT   rN   r<  )r>   re   r6   r6   r7   rO   £
  s    
zXSRFTest.Handler.getc                 C   s   |   d¡ d S r¯  rM   r=   r6   r6   r7   rŽ   ª
  s    zXSRFTest.Handler.postN)rB   rC   rD   rO   rŽ   r6   r6   r6   r7   rI   ¢
  s   rI   c                 C   s
   t ddS r  r›   r=   r6   r6   r7   r;   ­
  s    zXSRFTest.get_app_kwargsc                    s   t ƒ  ¡  |  ¡ | _d S r/   )rz  ÚsetUpÚ	get_tokenr<  r=   r}  r6   r7   rŽ  °
  s    
zXSRFTest.setUpNc                 C   sH   |d k	r|   |¡}nd }| j|d kr(dnd| |d}| ¡  t|jƒS )NrG   z/?version=%drÚ   )Úcookie_headersr¢   r‹  r   r¡   )r>   Z	old_tokenre   rÕ   r¨   r6   r6   r7   r  ´
  s     ÿzXSRFTest.get_tokenc                 C   s   |d kr| j }dd| iS )NrØ   z_xsrf=)r<  )r>   Útokenr6   r6   r7   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 missingrG   r   rž   rŸ   r+  r’  r§   r6   r6   r7   Ú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 POSTrG   r   ©Z_xsrfrŸ   r+  )
r   r   r¢   r§  r¨  r©  rX   r<  rj   r¤   r§   r6   r6   r7   Ú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 formatrG   r   ú3|r•  r  r+  )
r   r   r¢   r  r§  r¨  r©  rX   rj   r¤   r§   r6   r6   r7   Ú&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”  rG   r   r—  ©r‘  r•  r  r+  )r   r   r¢   r  r§  r¨  r©  rX   r<  rj   r¤   r§   r6   r6   r7   Ú$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’  rG   r   rž   ©r    r¡   rÕ   r+  )r   r   r¢   r  rj   r¤   r§   r6   r6   r7   Ú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 )NrG   r   Zdeadbeefr•  r™  r›  rœ   ©r¢   r§  r¨  r©  rX   r  rj   r¤   r§   r6   r6   r7   Ú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 )NrG   r   Zxoxor•  r™  r›  rœ   r  r§   r6   r6   r7   Ú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 )NrG   r   r•  r›  rœ   ©	r¢   r§  r¨  r©  rX   r<  r  rj   r¤   r§   r6   r6   r7   Ú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§   r6   r6   r7   Ú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 )NrG   r   rž   zX-Xsrftokenr›  rœ   )r¢   rX   r<  r  rj   r¤   r§   r6   r6   r7   Ú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  rj   rá   )r>   Z
NUM_TOKENSÚtokensrC  r6   r6   r7   Ú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 )NrG   r   r•  r›  rœ   r”  r+  )r  r<  r¢   r§  r¨  r©  rX   r  rj   r¤   r   r   )r>   Ztoken2r‘  r¨   Úcookie_tokenÚ
body_tokenr6   r6   r7   Útest_cross_user%  s(    üþüzXSRFTest.test_cross_userc              	   C   s|   | j }t|gƒ}tdƒD ]N}|  |¡}| |¡ | jddtj t	| j d¡|  
|¡d}|  |jd¡ q|  t|ƒd¡ d S )Né   rG   r   r•  r›  rœ   rï   )r<  r  r¤  r  rñ  r¢   r§  r¨  r©  rX   r  rj   r¤   rá   )r>   r‘  Ztokens_seenrC  r¨   r6   r6   r7   Útest_refresh_token>  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 )	Nrc   rd   rª  rG   r   r•  r›  rœ   )ZassertNotEqualr  r¤  rj   r¢   r§  r¨  r©  rX   r  r¤   )r>   Zv1_tokenrC  Zv2_tokenr§  r¨  r¨   r6   r6   r7   Útest_versioningR  s    
üzXSRFTest.test_versioning)NN)N)rB   rC   rD   r   rI   r;   rŽ  r  r  r“  r–  r˜  rš  rœ  rž  rŸ  r¡  r¢  r£  r¦  r©  r«  r¬  r¶  r6   r6   r}  r7   r  ¡
  s&   

	

				r  c                   @   s,   e Zd ZG dd„ deƒZdd„ Zdd„ ZdS )ÚXSRFCookieKwargsTestc                   @   s   e Zd Zdd„ ZdS )zXSRFCookieKwargsTest.Handlerc                 C   s   |   | j¡ d S r/   )rN   r<  r=   r6   r6   r7   rO   n  s    z XSRFCookieKwargsTest.Handler.getNrP   r6   r6   r6   r7   rI   m  s   rI   c                 C   s   t dt ddddS )NTro   )rÉ   r^   )r‘  Zxsrf_cookie_kwargsr›   r=   r6   r6   r7   r;   q  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 )NrG   z	httponly;rÓ   zexpires=z.*; expires=(?P<expires>.+);.*ro   rì   rî   rï   rÄ   )r¢   r‡  rÕ   rü   rO   rt   rr   rs   rð   rñ   rò   ró   rô   rõ   rö   rv   r÷   rø   rù   r6   r6   r7   Útest_xsrf_httponlyv  s    
z'XSRFCookieKwargsTest.test_xsrf_httponlyN)rB   rC   rD   r   rI   r;   r®  r6   r6   r6   r7   r­  l  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)rp  rc  rC  r)   rN   r=   r6   r6   r7   rO   ˆ  s    


zFinishExceptionTest.Handler.getNrP   r6   r6   r6   r7   rI   ‡  s   rI   c                 C   sH   dD ]>}|   |¡}|  |jd¡ |  d|j d¡¡ |  d|j¡ qd S )N)rG   z/?finish_value=1r&  r±  r°  s   authentication required)r¢   rj   r¤   rÕ   rO   r¡   )r>   Úur¨   r6   r6   r7   Útest_finish_exception‘  s    
 
ÿz)FinishExceptionTest.test_finish_exceptionN)rB   rC   rD   r   rI   r³  r6   r6   r6   r7   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 r/   r6   r=   r6   r6   r7   rO   ž  s    z:DecoratorTest.get_handlers.<locals>.RemoveSlashHandler.getN)rB   rC   rD   r+   rO   r6   r6   r6   r7   ÚRemoveSlashHandler  s   rµ  c                   @   s   e Zd Zedd„ ƒZdS )z3DecoratorTest.get_handlers.<locals>.AddSlashHandlerc                 S   s   d S r/   r6   r=   r6   r6   r7   rO   £  s    z7DecoratorTest.get_handlers.<locals>.AddSlashHandler.getN)rB   rC   rD   r,   rO   r6   r6   r6   r7   ÚAddSlashHandler¢  s   r¶  ú/removeslash/ú	/addslashrš   )r>   rµ  r¶  r6   r6   r7   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§   r6   r6   r7   Ú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§   r6   r6   r7   Útest_addslash²  s    zDecoratorTest.test_addslashN)rB   rC   rD   r:   r¹  rº  r6   r6   r6   r7   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 r/   rM   )r>   Úcomputed_etagr6   r6   r7   rO   ¿  s    z/CacheTest.get_handlers.<locals>.EtagHandler.getc                 S   s
   | j d S r  )Z_write_bufferr=   r6   r6   r7   Úcompute_etagÂ  s    z8CacheTest.get_handlers.<locals>.EtagHandler.compute_etagN)rB   rC   rD   rO   r½  r6   r6   r6   r7   ÚEtagHandler¾  s   r¾  z
/etag/(.*)rš   )r>   r¾  r6   r6   r7   r:   ½  s    zCacheTest.get_handlersc                 C   s   d}d}|   ||d¡ d S )Nú"xyzzy"Ú*rö  ©Ú
_test_etag©r>   r¼  Úetagsr6   r6   r7   Útest_wildcard_etagÇ  s    zCacheTest.test_wildcard_etagc                 C   s   d}d}|   ||d¡ d S )Nr¿  rö  rÁ  rÃ  r6   r6   r7   Ú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Ã  r6   r6   r7   Ú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Ã  r6   r6   r7   Ú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Ã  r6   r6   r7   Ú#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Ã  r6   r6   r7   Ú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Ã  r6   r6   r7   Ú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Ã  r6   r6   r7   Útest_weak_etag_not_matchê  s    z"CacheTest.test_weak_etag_not_matchc                 C   s   d}d}|   ||d¡ d S )Nz"xyzzy3"rÏ  rœ   rÁ  rÃ  r6   r6   r7   Ú!test_multiple_weak_etag_not_matchï  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¨   r6   r6   r7   rÂ  ô  s
     ÿzCacheTest._test_etagN)rB   rC   rD   r:   rÅ  rÆ  rÉ  rÊ  rË  rÍ  rÐ  rÑ  rÒ  rÂ  r6   r6   r6   r7   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 r/   )r'  Z	remote_ipr‰   rH  r=   r6   r6   r7   rO   ý  s    zRequestSummaryTest.Handler.getNrP   r6   r6   r6   r7   rI   ü  s   rI   c                 C   s   |   d¡}|  |jd¡ d S )NrG   s   GET / (None)rÜ   r  r6   r6   r7   Útest_missing_remote_ip  s    
z)RequestSummaryTest.test_missing_remote_ipN)rB   rC   rD   r   rI   rÔ  r6   r6   r6   r7   rÓ  û  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 )Nr+  zGo awayrz  )r   r…   ZassertIsNotrj   rÁ  ry  )r>   rÁ   Úe2r6   r6   r7   Ú	test_copy
  s
    
zHTTPErrorTest.test_copyN)rB   rC   rD   r×  r6   r6   r6   r7   rÕ  	  s   rÕ  c                   @   s   e Zd Zdd„ ZdS )ÚApplicationTestc                 C   s"   t g ƒ}|jddd}| ¡  d S )Nr   r  )Úaddress)r   Úlistenr"  )r>   r<   Úserverr6   r6   r7   Útest_listen  s    zApplicationTest.test_listenN)rB   rC   rD   rÜ  r6   r6   r6   r7   rØ    s   rØ  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚURLSpecReverseTestc                 C   s0   |   dtdd ƒ ¡ ¡ |   dtdd ƒ ¡ ¡ d S )Nz/favicon.icoz/favicon\.icoz^/favicon\.ico$©rj   r#   Úreverser=   r6   r6   r7   Ú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ß  r7  rm  )r>   Úpathsr1   Zurl_specrÛ  r6   r6   r7   Útest_non_reversible  s    
ÿÿz&URLSpecReverseTest.test_non_reversiblec                 C   s4   |   dtdd ƒ d¡¡ |   dtdd ƒ d¡¡ d S )Nz/api/v1/foo/barz^/api/v1/foo/(\w+)$rÃ   z/api.v1/foo/5/icon.pngz/api\.v1/foo/([0-9]+)/icon\.pngrª  rÞ  r=   r6   r6   r7   Útest_reverse_arguments0  s     ÿþz)URLSpecReverseTest.test_reverse_argumentsN)rB   rC   rD   rà  râ  rã  r6   r6   r6   r7   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=   r6   r6   r7   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§   r6   r6   r7   Útest_basic_redirectB  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§   r6   r6   r7   Útest_redirect_with_argumentG  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§   r6   r6   r7   Ú%test_redirect_with_appending_argumentL  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§   r6   r6   r7   Útest_redirect_patternQ  s    z)RedirectHandlerTest.test_redirect_patternN)rB   rC   rD   r:   rç  rè  ré  rê  r6   r6   r6   r7   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 )Nrt  Ú_ú-rž   )rc  Zget_browser_localer¤   Úreplacer‰   r=   r6   r6   r7   rO   a  s
     ÿzBAcceptLanguageTest.get_handlers.<locals>.AcceptLanguageHandler.getNrP   r6   r6   r6   r7   ÚAcceptLanguageHandler`  s   rï  rG   )r   Zload_gettext_translationsr0   r1   r2   r3   r4   r   )r>   rï  r6   r6   r7   r:   Z  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 )NrG   r£  zfr-FR;q=0.9rÚ   rt  zfr-FRzfr-FR; q=0.9©r¢   rj   rÕ   r§   r6   r6   r7   Útest_accept_languagek  s    z'AcceptLanguageTest.test_accept_languagec                 C   s(   | j dddid}|  |jd d¡ d S )NrG   r£  z	fr-FR;q=0rÚ   rt  úen-USrð  r§   r6   r6   r7   Útest_accept_language_ignorer  s    z.AcceptLanguageTest.test_accept_language_ignorec                 C   s(   | j dddid}|  |jd d¡ d S )NrG   r£  z
fr-FR;q=-1rÚ   rt  rò  rð  r§   r6   r6   r7   Útest_accept_language_invalidv  s    z/AcceptLanguageTest.test_accept_language_invalidN)rB   rC   rD   rE   r:   rñ  ró  rô  r6   r6   r6   r7   rë  W  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.utilr   r   Ztornado.webr   r   r   r   r‰  r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   rp   r<  r…   rð   Úemail.utilsró   r²  Úior.   rî  râ   r0   rr   r  rÇ  r1  Úurllib.parser§  r8   r9   rF   rJ   rQ   ZTestCaser`   r}   rˆ   r«   rþ   r  r  r  r#  r.  r8  rO  rW  r[  r^  r_  rh  rk  ro  rs  ru  r·  rº  rÑ  r2  r:  r<  rV  re  rh  rj  rn  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  r5  Úobjectr>  rO  rS  rV  rd  rh  r  r­  r¯  r´  r»  rÓ  rÕ  rØ  rÝ  rä  rë  r6   r6   r6   r7   Ú<module>   sö    T5/1 0,
  	B  [C*":/.\bM
 ÿ
 ÿ; + L!?	!