o
    Qœ_˜Ä ã                   @   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ƒZ�G dd€„ 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ŠeKƒZ‡G d‹dŒ„ dŒeKƒZˆG d�dŽ„ dŽeKƒZ‰e4G d�d�„ d�e%ƒƒZŠG d‘d’„ d’e‹ƒZŒG d“d”„ d”eŒeKƒZ�G d•d–„ d–eŒeKƒZŽG d—d˜„ d˜eLƒZ�G d™dš„ dšeLƒZ�G d›dœ„ dœeGjOƒZ‘G d�dž„ 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›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¡g| ¢R Ž S ©N)ÚosÚpathÚjoinÚdirnameÚ__file__)Úa© r6   ú7/usr/lib/python3/dist-packages/tornado/test/web_test.pyÚrelpath<   ó   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i |  ¡ ¤Ž| _| jS r/   )r   Úget_handlersÚget_app_kwargsÚapp©Úselfr6   r6   r7   Úget_appG   s   zWebTestCase.get_appc                 C   ó   t ƒ ‚r/   ©ÚNotImplementedErrorr>   r6   r6   r7   r;   K   ó   zWebTestCase.get_handlersc                 C   s   i S r/   r6   r>   r6   r6   r7   r<   N   ó   zWebTestCase.get_app_kwargsN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r@   r;   r<   r6   r6   r6   r7   r:   @   s
    r:   c                   @   s   e Zd ZdZdZdd„ ZdS )ÚSimpleHandlerTestCasez�Simplified 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   ó   z"SimpleHandlerTestCase.get_handlers)rF   rG   rH   rI   rM   r;   r6   r6   r6   r7   rJ   R   s    rJ   c                   @   ó   e Zd Zdd„ ZdS )ÚHelloHandlerc                 C   ó   |   d¡ d S ©NÚhello©Úwriter>   r6   r6   r7   Úget_   ó   zHelloHandler.getN©rF   rG   rH   rV   r6   r6   r6   r7   rP   ^   ó    rP   c                   @   s(   e Zd Zd	dd„Zdd„ Zd
dd„ZdS )ÚCookieTestRequestHandlerÚ
0123456789Nc                 C   s<   i | _ |d u rtt|d�d�| _d S tt||d�d�| _d S )N)Úcookie_secret)Úsettings©r\   Úkey_version)Ú_cookiesr   ÚdictÚapplication)r?   r\   r_   r6   r6   r7   Ú__init__e   s   ÿ
ÿz!CookieTestRequestHandler.__init__c                 C   s   | j  |¡S r/   )r`   rV   )r?   Únamer6   r6   r7   Ú
get_cookieq   rN   z#CookieTestRequestHandler.get_cookiec                 C   s   || j |< d S r/   )r`   )r?   rd   ÚvalueÚexpires_daysr6   r6   r7   Ú
set_cookiet   rW   z#CookieTestRequestHandler.set_cookie)r[   Nr/   )rF   rG   rH   rc   re   rh   r6   r6   r6   r7   rZ   c   s    
rZ   c                   @   ó$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚSecureCookieV1Testc                 C   ó0   t ƒ }|jdddd� |  |jddd�d¡ d S )NÚfooó   baré   ©Úversion©Úmin_version©rZ   Úset_secure_cookieÚassertEqualÚget_secure_cookie©r?   Úhandlerr6   r6   r7   Útest_round_tripz   ó   z"SecureCookieV1Test.test_round_tripc                 C   sø   t ƒ }|jdt d¡dd� |jd }t d|¡}|d usJ ‚| d¡}| d¡}|  t	|j
jd dd|ƒ|¡ |  t	|j
jd dd	d
| ƒ|¡ tdt|ƒt|ƒf ƒ|jd< ttdƒ� |  |jddd�d u ¡ W d   ƒ d S 1 suw   Y  d S )Nrl   s   d76df8e7aefcrn   ro   s   12345678\|([0-9]+)\|([0-9a-f]+)é   r\   Ú12345678Ú1234s   5678z1234|5678%s|%szCookie timestamp in futurerq   )rZ   rt   ÚbinasciiÚa2b_hexr`   ÚreÚmatchÚgroupru   r$   rb   r]   r   r	   r   r   Ú
assertTruerv   )r?   rx   Úcookier�   Ú	timestampÚsigr6   r6   r7   Ú&test_cookie_tampering_future_timestamp   s>   



üù
üù

ÿ"ÿz9SecureCookieV1Test.test_cookie_tampering_future_timestampc                 C   rk   )Nrl   ó   érn   ro   rq   rs   rw   r6   r6   r7   Útest_arbitrary_bytes¥   s   z'SecureCookieV1Test.test_arbitrary_bytesN)rF   rG   rH   ry   r‡   r‰   r6   r6   r6   r7   rj   y   s    &rj   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 )ÚSecureCookieV2TestÚajklasdf0ojaisdfÚaslkjasaolwkjsdf)r   rn   c                 C   rk   )Nrl   rm   r{   ro   rq   rs   rw   r6   r6   r7   ry   ±   rz   z"SecureCookieV2Test.test_round_tripc                 C   ó0   t | jdd�}| dd¡ |  | d¡d¡ d S )Nr   r^   rl   rm   ©rZ   ÚKEY_VERSIONSrt   ru   rv   rw   r6   r6   r7   Útest_key_version_roundtrip¶   ó
   ÿz-SecureCookieV2Test.test_key_version_roundtripc                 C   r�   )Nrn   r^   rl   rm   rŽ   rw   r6   r6   r7   Ú,test_key_version_roundtrip_differing_version½   r‘   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   r^   rl   rm   rn   )rZ   r�   rt   r`   ru   rv   )r?   rx   Ú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“   )rZ   r�   rt   ÚcopyÚpopr`   ru   rv   )r?   rx   Únew_key_versionsr”   r6   r6   r7   Ú#test_key_version_invalidate_versionÏ   s   ÿ

ÿz6SecureCookieV2Test.test_key_version_invalidate_versionN)	rF   rG   rH   r�   ry   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   rV   ä   s   €
z7FinalReturnTest.get_handlers.<locals>.FinishHandler.getc                 3   s.   � |   d¡ |  ¡ V  |  d¡ˆ _ˆ jV  d S )Nzhello,Úworld)rU   Úflushr›   rœ   r>   r�   r6   r7   Úposté   s
   €

z8FinalReturnTest.get_handlers.<locals>.FinishHandler.postN)rF   rG   rH   r   Ú	coroutinerV   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ñ   rN   zJFinalReturnTest.get_handlers.<locals>.RenderHandler.create_template_loaderc                    s   |   d¡ˆ _d S ©Nr¤   )Úrenderrœ   r>   r�   r6   r7   rV   ô   s   z7FinalReturnTest.get_handlers.<locals>.RenderHandler.getN)rF   rG   rH   r§   r   r¢   rV   r6   r�   r6   r7   ÚRenderHandlerð   s    rª   ú/finishú/render©r   )r?   r£   rª   r6   r�   r7   r;   à   s   zFinalReturnTest.get_handlersc                 C   ó
   t dd�S )Nrš   )Útemplate_path©ra   r>   r6   r6   r7   r<   ú   ó   
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_urlru   ÚcodeÚassertIsInstancerœ   r   rƒ   Ú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¹   ru   rº   r»   rœ   r   r½   r6   r6   r7   Ú test_render_method_return_future  s   z0FinalReturnTest.test_render_method_return_future)rF   rG   rH   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                   @   rO   )z1CookieTest.get_handlers.<locals>.SetCookieHandlerc                 S   ó(   |   dd¡ |   dd¡ |   dd¡ d S )NÚstrÚasdfÚunicodeÚqwerÚbytess   zxcv©rh   r>   r6   r6   r7   rV     s   z5CookieTest.get_handlers.<locals>.SetCookieHandler.getNrX   r6   r6   r6   r7   ÚSetCookieHandler  rY   rÉ   c                   @   rO   )z1CookieTest.get_handlers.<locals>.GetCookieHandlerc                 S   s&   |   dd¡}|d usJ ‚|  |¡ d S )Nrl   Údefault)re   rU   )r?   r„   r6   r6   r7   rV     s   z5CookieTest.get_handlers.<locals>.GetCookieHandler.getNrX   r6   r6   r6   r7   ÚGetCookieHandler  rY   rË   c                   @   rO   )z7CookieTest.get_handlers.<locals>.SetCookieDomainHandlerc                 S   s   | j ddddd� d S )NÚunicode_argsÚblahzfoo.comú/foo)Údomainr1   rÈ   r>   r6   r6   r7   rV     s   z;CookieTest.get_handlers.<locals>.SetCookieDomainHandler.getNrX   r6   r6   r6   r7   ÚSetCookieDomainHandler  rY   rÐ   c                   @   rO   )z<CookieTest.get_handlers.<locals>.SetCookieSpecialCharHandlerc                 S   rÂ   )NÚequalsúa=bÚ	semicolonúa;bÚquoteúa"brÈ   r>   r6   r6   r7   rV   %  s   z@CookieTest.get_handlers.<locals>.SetCookieSpecialCharHandler.getNrX   r6   r6   r6   r7   ÚSetCookieSpecialCharHandler$  rY   r×   c                   @   rO   )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   rV   +  s   z>CookieTest.get_handlers.<locals>.SetCookieOverwriteHandler.getNrX   r6   r6   r6   r7   ÚSetCookieOverwriteHandler*  rY   rÜ   c                   @   rO   )z7CookieTest.get_handlers.<locals>.SetCookieMaxAgeHandlerc                 S   ó   | j dddd� d S )Nrl   Úbaré
   )Úmax_agerÈ   r>   r6   r6   r7   rV   3  ó   z;CookieTest.get_handlers.<locals>.SetCookieMaxAgeHandler.getNrX   r6   r6   r6   r7   ÚSetCookieMaxAgeHandler2  rY   râ   c                   @   rO   )z<CookieTest.get_handlers.<locals>.SetCookieExpiresDaysHandlerc                 S   rÝ   )Nrl   rÞ   rß   )rg   rÈ   r>   r6   r6   r7   rV   7  rá   z@CookieTest.get_handlers.<locals>.SetCookieExpiresDaysHandler.getNrX   r6   r6   r6   r7   ÚSetCookieExpiresDaysHandler6  rY   rã   c                   @   rO   )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   rV   ;  s   z8CookieTest.get_handlers.<locals>.SetCookieFalsyFlags.getNrX   r6   r6   r6   r7   ÚSetCookieFalsyFlags:  rY   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¡ƒg d¢¡ d S )Nrè   ú
Set-Cookie)zbytes=zxcv; Path=/zstr=asdf; Path=/zunicode=qwer; Path=/)r¸   ru   Ú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ò   rm   z	foo="bar"z/=exception;ó   default©r¸   ru   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¸   ru   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	v |d ¡ g d
¢}|D ]\}}t d|¡ | j dd|id�}|  |j	t
|ƒ¡ q7d S )Nrë   rð   é   r   zequals="a=b"; Path=/rn   zquote="a\"b"; Path=/r{   )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ó   ru   Úlenrƒ   Ú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ó   ru   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 usJ ‚t d|¡}|d usJ ‚tj ¡ tjdd� }tj	 
| ¡ d ¡}|d us8J ‚tj|d d… Ž }|  t||  ¡ ƒdk ¡ d S )Nrî   rð   z(foo=bar; expires=(?P<expires>.+); Path=/rß   ©ÚdaysÚexpiresé   )r¸   rò   rV   r€   r�   ÚdatetimeÚutcnowÚ	timedeltaÚemailÚutilsÚ	parsedateÚ	groupdictrƒ   ÚabsÚtotal_seconds©r?   r¾   r  r�   r  ÚparsedÚ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=/; securern   zb=1; path=/r{   zc=1; httponly; path=/rý   zd=1; path=/)r¸   rñ   rò   ró   ru   Úlowerr  r6   r6   r7   Útest_set_cookie_false_flags–  s   
z&CookieTest.test_set_cookie_false_flagsN)rF   rG   rH   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   ó
   || _ d S r/   ©Ú	login_url)r?   r  r6   r6   r7   Ú
initialize¢  r±   z%AuthRedirectRequestHandler.initializec                 C   ó   | j S r/   r  r>   r6   r6   r7   Úget_login_url¥  rD   z(AuthRedirectRequestHandler.get_login_urlc                 C   rQ   )Néô  )Ú
send_errorr>   r6   r6   r7   rV   ¨  ó   zAuthRedirectRequestHandler.getN)rF   rG   rH   r   r"  r"   rV   r6   r6   r6   r7   r  ¡  s
    r  c                   @   ri   )Ú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  ra   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©Úfollow_redirectsé.  ÚLocationz/login?next=%2Frelative)r¸   r¹   ru   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¹   ru   rº   rƒ   r€   r�   rò   r½   r6   r6   r7   Útest_absolute_auth_redirect¾  s   þûz,AuthRedirectTest.test_absolute_auth_redirectN)rF   rG   rH   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   r  r/   r�   ©r?   rž   r6   r6   r7   r   Ë  r±   z!ConnectionCloseHandler.initializec                 c   s   � | j  ¡  | j j ¡ V  d S r/   )rž   Úon_handler_waitingÚcleanup_eventÚwaitr>   r6   r6   r7   rV   Î  s   €
zConnectionCloseHandler.getc                 C   s   | j  ¡  d S r/   )rž   Úon_connection_closer>   r6   r6   r7   r4  Ó  rW   z*ConnectionCloseHandler.on_connection_closeN)rF   rG   rH   r   r   r¢   rV   r4  r6   r6   r6   r7   r/  Ê  s
    
r/  c                   @   ó,   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 )NrK   r�   )r   r2  r/  ra   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>ä  s   
 z;ConnectionCloseTest.test_connection_close.<locals>.<lambda>)ÚsocketÚAF_INETÚSOCK_STREAMÚconnectÚget_http_portr   ÚstreamrU   r3  r2  ÚsetÚio_loopÚ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   r1  æ  ó   
z&ConnectionCloseTest.on_handler_waitingc                 C   s   t  d¡ |  ¡  d S )Nzconnection closed)rÿ   r   Ústopr>   r6   r6   r7   r4  ê  ó   
z'ConnectionCloseTest.on_connection_closeN)rF   rG   rH   r;   rE  r1  r4  r6   r6   r6   r7   r6  ×  s
    
r6  c                   @   rO   )ÚEchoHandlerc                 G   sÎ   | j jD ]=}t|ƒtkrtdt|ƒ ƒ‚| j j| D ]}t|ƒtkr*tdt|ƒ ƒ‚q|  |¡D ]}t|ƒtkr@tdt|ƒ ƒ‚q0q|D ]}t|ƒtkrTtdt|ƒ ƒ‚qD|  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   rU   ra   r1   r   )r?   rL  ÚkeyÚbvalueÚsvalueÚargr6   r6   r7   rV   ð  s.   ÿÿÿÿ
ýÿzEchoHandler.getNrX   r6   r6   r6   r7   rJ  ï  rY   rJ  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/([^/]*)/([^/]*))rJ  r>   r6   r6   r7   r;     ó   z RequestEncodingTest.get_handlersc                 C   s   t |  |¡jƒS r/   )r   r¸   r·   r¦   r6   r6   r7   Ú
fetch_json  rX  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ú?rK  z/group/%3F?%3F=%3F©ru   rY  ra   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õ   Ã©rV  rK  ©ru   rY  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/barrl   rÞ   rK  z/slashes/a%2Fb/c%2Fdza/bzc/dr[  r>   r6   r6   r7   Útest_slashes'  s   þþz RequestEncodingTest.test_slashesc                 C   ó:   t tdƒ� |  d¡ W d   ƒ d S 1 sw   Y  d S )Nz.*Invalid unicodez/group/?arg=%25%e9)r   r   r¸   r>   r6   r6   r7   Ú
test_error3  ó   "ÿzRequestEncodingTest.test_errorN)	rF   rG   rH   r;   rY  r\  r_  r`  rb  r6   r6   r6   r7   rW  
  s    rW  c                   @   r5  )
Ú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rFtd| j ¡  ƒ‚|  d	|  d¡t¡ |  d
|  d¡t	¡ |  d| jt¡ |  d|  ¡ t	¡ |  d|  dd¡t	¡ |  d|  ¡ t	¡ d S )NÚstatusÚargumentrl   Ú
cookie_keyr   Úcookie_valuerÄ   z%unexpected values for cookie keys: %rrv   re   Ú
xsrf_tokenÚxsrf_form_htmlÚreverse_urlÚ	typecheckÚrequest_summary)ÚerrorsÚ
check_typeÚ
get_statusÚintÚget_argumentr   ÚlistÚcookiesÚkeysrÃ   Úvaluesrf   rQ  rv   rÇ   re   ri  rj  rk  Ú_request_summaryr>   r6   r6   r7   Úprepare;  s   ÿzTypeCheckHandler.preparec                 C   ó   |   d|t¡ |  | j¡ d S ©NÚpath_component©ro  r   rU   rn  ©r?   r{  r6   r6   r7   rV   V  s   zTypeCheckHandler.getc                 C   ry  rz  r|  r}  r6   r6   r7   r¡   \  s   zTypeCheckHandler.postc                 C   s*   t |ƒ}||krd||f | j|< d S d S )Nzexpected %s, got %s)rP  rn  )r?   rd   ÚobjÚexpected_typeÚactual_typer6   r6   r7   ro  `  s   ÿzTypeCheckHandler.check_typeN)rF   rG   rH   rx  rV   r¡   ro  r6   r6   r6   r7   rd  :  s
    rd  c                   @   s   e Zd Zddd„Zdd„ ZdS )ÚDecodeArgHandlerNc                 C   sF   t |ƒtkrtdt |ƒ ƒ‚d| jjv r!| t| jjd d ƒ¡S |S )Nzunexpected type for value: %rÚencodingr   )rP  rÇ   rQ  rN  rO  Údecoder   )r?   rf   rd   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rd| gS tdƒ‚)NrÇ   rÅ   zunknown type)rP  rÇ   r   r~   Úb2a_hexr   rQ  )rD  r6   r6   r7   Údescribeq  s
   z&DecodeArgHandler.get.<locals>.describerl   ©r1   Úquery)rU   rr  )r?   rV  r†  r6   r6   r7   rV   p  s   "zDecodeArgHandler.getr/   )rF   rG   rH   r„  rV   r6   r6   r6   r7   r�  f  s    
	r�  c                   @   rO   )ÚLinkifyHandlerc                 C   s   | j ddd� d S )Núlinkify.htmlzhttp://example.com)Úmessage©r©   r>   r6   r6   r7   rV   |  ó   zLinkifyHandler.getNrX   r6   r6   r6   r7   r‰  {  rY   r‰  c                   @   rO   )ÚUIModuleResourceHandlerc                 C   s   | j dddgd� d S )Nú	page.htmlrn   r{   )ÚentriesrŒ  r>   r6   r6   r7   rV   �  s   zUIModuleResourceHandler.getNrX   r6   r6   r6   r7   rŽ  €  rY   rŽ  c                   @   rO   )ÚOptionalPathHandlerc                 C   s   |   d|i¡ d S )Nr1   rT   r¦   r6   r6   r7   rV   †  r�  zOptionalPathHandler.getNrX   r6   r6   r6   r7   r‘  …  rY   r‘  c                   @   rO   )ÚMultiHeaderHandlerc                 C   s4   |   dd¡ |   dd¡ |  dd¡ |  dd¡ d S )	Núx-overwriterä   zX-Overwriter{   úx-multirý   zX-MultiÚ4)Ú
set_headerÚ
add_headerr>   r6   r6   r7   rV   ‹  s   zMultiHeaderHandler.getNrX   r6   r6   r6   r7   r’  Š  rY   r’  c                   @   rO   )r   c                 C   sd   |   dd ¡d ur| jdtt|   d¡ƒƒd� d S |   dd ¡d ur.| jdt|   d¡ƒd� d S tdƒ‚)NÚ	permanentrK   )r˜  re  )re  z(didn't get permanent or status arguments)rr  ÚredirectÚboolrq  rQ  r>   r6   r6   r7   rV   “  s
    zRedirectHandler.getNrX   r6   r6   r6   r7   r   ’  rY   r   c                   @   ó   e Zd Zejdd„ ƒZdS )ÚEmptyFlushCallbackHandlerc                 c   sB   � |   ¡ V  |   ¡ V  |  d¡ |   ¡ V  |   ¡ V  |  d¡ d S )NÚoÚk)r    rU   r›   r>   r6   r6   r7   rV   �  s   €




zEmptyFlushCallbackHandler.getN)rF   rG   rH   r   r¢   rV   r6   r6   r6   r7   rœ  œ  ó    rœ  c                   @   rO   )ÚHeaderInjectionHandlerc              
   C   sV   z
|   dd¡ tdƒ‚ ty* } zdt|ƒv r|  d¡ n‚ W Y d }~d S d }~ww )NzX-Foozfoo
X-Bar: bazzDidn't get expected exceptionzUnsafe header valueó   ok)r–  rQ  Ú
ValueErrorrÃ   r›   ©r?   rÛ   r6   r6   r7   rV   «  s   þ€þzHeaderInjectionHandler.getNrX   r6   r6   r6   r7   r   ª  rY   r   c                   @   rO   )ÚGetArgumentHandlerc                 C   sJ   |   dd ¡dkr| j}n|   dd ¡dkr| j}n| j }|  |ddƒ¡ d S )NÚsourcerˆ  r·   rl   rÊ   )rr  Úget_query_argumentÚget_body_argumentr›   ©r?   r¶   r6   r6   r7   rx  ·  s   zGetArgumentHandler.prepareN©rF   rG   rH   rx  r6   r6   r6   r7   r¤  ¶  rY   r¤  c                   @   rO   )ÚGetArgumentsHandlerc                 C   s*   |   t|  d¡|  d¡|  d¡d�¡ d S )Nrl   ©rÊ   rˆ  r·   )r›   ra   rR  Úget_query_argumentsÚget_body_argumentsr>   r6   r6   r7   rx  Â  s   ýÿzGetArgumentsHandler.prepareNr©  r6   r6   r6   r7   rª  Á  rY   rª  c                       sÀ   e Zd ZdZdd„ Z‡ fdd„Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Z‡  ZS ),ÚWSGISafeWebTestzWebTest.COOKIE_SECRETc                 C   s    t ddddœƒ}t|d| jd�S )Nz{% module linkify(message) %}zv<html><head></head><body>
{% for e in entries %}
{% module Template("entry.html", entry=e) %}
{% end %}
</body></html>aY  {{ set_resources(embedded_css=".entry { margin-bottom: 1em; }",
                 embedded_javascript="js_embed()",
                 css_files=["/base.css", "/foo.css"],
                 javascript_files="/common.js",
                 html_head="<meta>",
                 html_body='<script src="/analytics.js"/>') }}
<div class="entry">...</div>)rŠ  r�  z
entry.htmlÚxhtml_escape)Útemplate_loaderÚ
autoescaper\   )r   ra   ÚCOOKIE_SECRET)r?   Úloaderr6   r6   r7   r<   Ð  s   øÿýzWSGISafeWebTest.get_app_kwargsc                    ó   t ƒ  ¡  tj ¡  d S r/   ©ÚsuperÚtearDownr   Ú_template_loadersÚclearr>   ©Ú	__class__r6   r7   r·  ê  rG  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/(.*)rl  )rd   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#   r˜  ú//web_redirect_double_slashú/header_injectionú/get_argumentz/get_arguments)r#   rd  r�  r‰  rŽ  r‘  r’  r   ÚWebRedirectHandlerr   r¤  rª  )r?   Úurlsr6   r6   r7   r;   î  s8   ýýýæzWSGISafeWebTest.get_handlersc                 O   s"   | j |i |¤Ž}| ¡  t|jƒS r/   )r¸   Úrethrowr   r·   )r?   rM  Úkwargsr¾   r6   r6   r7   rY    s   
zWSGISafeWebTest.fetch_jsonc                 C   s\   t t| jddƒƒ}| jddd| id�}t|jƒ}|  |i ¡ | jdddd| idd	�}d S )
NrÄ   rÆ   z/typecheck/asdf?foo=barrõ   zasdf=r÷   r³   rö   ©r¶   rò   r·   )r   r%   r²  r¸   r   r·   ru   )r?   rh  r¾   r  r6   r6   r7   Ú
test_types  s   ÿÿ


üzWSGISafeWebTest.test_typesc                 C   s‚   g d¢}|D ]}|   |¡}| ¡  t|jƒ}|  |ddgddgdœ¡ q|   d¡}| ¡  t|jƒ}|  |ddgddgdœ¡ d S )N)z,/decode_arg/%C3%A9?foo=%C3%A9&encoding=utf-8z'/decode_arg/%E9?foo=%E9&encoding=latin1z*/decode_arg_kw/%E9?foo=%E9&encoding=latin1rÅ   r]  r‡  z/decode_arg/%C3%A9?foo=%C3%A9rÇ   Úc3a9©r¸   rÈ  r   r·   ru   ©r?   rÇ  Úreq_urlr¾   r  r6   r6   r7   Útest_decode_argument#  s   

þ

ÿz$WSGISafeWebTest.test_decode_argumentc                 C   s`   t tdƒ�! |  d¡}|  |jd¡ |  d¡}|  |jd¡ W d   ƒ d S 1 s)w   Y  d S )Nz.*Invalid unicode.*z/typecheck/invalid%FFi�  z/typecheck/invalid?foo=%FF©r   r   r¸   ru   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 + 1r‡  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¼  rl   z/decode_arg/fooé*   z/decode_arg/42rˆ   z/decode_arg/%E9r]  z/decode_arg/%C3%A9rÓ  z/decode_arg/1%20%2B%201)ru   r=   rk  r>   r6   r6   r7   Útest_reverse_urlQ  s   ÿÿz WSGISafeWebTest.test_reverse_urlc                 C   ó   |   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   r×  )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  ó
   
þz'WSGISafeWebTest.test_uimodule_resourcesc                 C   s0   |   |  d¡ddi¡ |   |  d¡dd i¡ d S )Nz/optional_path/foor1   rl   z/optional_path/r^  r>   r6   r6   r7   Útest_optional_path~  ó   z"WSGISafeWebTest.test_optional_pathc                 C   s8   |   d¡}|  |jd d¡ |  |j d¡ddg¡ d S )Nr¿  r“  Ú2r”  Ú3r•  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¸   ru   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¸   ru   rº   rò   r½   r6   r6   r7   Útest_web_redirect�  s   z!WSGISafeWebTest.test_web_redirectc                 C   ó2   | 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—  ó   z.WSGISafeWebTest.test_web_redirect_double_slashc                 C   r×  )NrÄ  r¡  rù   r½   r6   r6   r7   Útest_header_injectionœ  ó   
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=barrm   z/get_argument?foo=r´   rÅ  rø   rS   ©rl   r³   rµ   ó   helloz/get_arguments?foo=barrÞ   r«  )r¸   ru   r·   ÚurllibÚparseÚ	urlencodera   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 )NrS   rê  z"/get_argument?source=query&foo=barr³   rµ   rm   z/get_argument?source=query&foo=r´   z/get_argument?source=queryrø   ©rì  rí  rî  ra   r¸   ru   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µ   rm   Ú 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ò   rV   r½   r6   r6   r7   Útest_no_gzipÖ  s   
zWSGISafeWebTest.test_no_gzip)rF   rG   rH   r²  r<   r·  r;   rY  rË  rÐ  rÒ  rÔ  rÖ  rØ  rÙ  rÛ  rß  râ  rä  ræ  rè  rï  rò  rô  rú  Ú__classcell__r6   r6   rº  r7   r®  Í  s.    r®  c                   @   ó   e Zd Zdd„ Zdd„ ZdS )ÚNonWSGIWebTestsc                 C   ó
   dt fgS )Nú/empty_flush)rœ  r>   r6   r6   r7   r;   Ý  r±   zNonWSGIWebTests.get_handlersc                 C   r×  )Nrÿ  r¡  rù   r½   r6   r6   r7   Útest_empty_flushà  ré  z NonWSGIWebTests.test_empty_flushN)rF   rG   rH   r;   r   r6   r6   r6   r7   rý  Ü  ó    rý  c                   @   r5  )
Ú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                   @   rO   )z6ErrorResponseTest.get_handlers.<locals>.DefaultHandlerc                 S   s*   |   dd ¡rtt|   d¡ƒƒ‚dd  d S ©Nre  rn   r   )rr  r   rq  r>   r6   r6   r7   rV   è  s   z:ErrorResponseTest.get_handlers.<locals>.DefaultHandler.getNrX   r6   r6   r6   r7   ÚDefaultHandlerç  rY   r  c                   @   rü  )z9ErrorResponseTest.get_handlers.<locals>.WriteErrorHandlerc                 S   s0   |   dd ¡r|  t|   d¡ƒ¡ d S dd  d S r  )rr  r$  rq  r>   r6   r6   r7   rV   î  s   z=ErrorResponseTest.get_handlers.<locals>.WriteErrorHandler.getc                 [   sB   |   dd¡ d|v r|  d|d d j ¡ d S |  d| ¡ d S )NúContent-Typeú
text/plainÚexc_infozException: %sr   z
Status: %d)r–  rU   rF   ©r?   Ústatus_coderÉ  r6   r6   r7   Úwrite_errorô  s   zEErrorResponseTest.get_handlers.<locals>.WriteErrorHandler.write_errorN©rF   rG   rH   rV   r
  r6   r6   r6   r7   ÚWriteErrorHandlerí  s    r  c                   @   rü  )z?ErrorResponseTest.get_handlers.<locals>.FailedWriteErrorHandlerc                 S   ó   dd  d S ©Nrn   r   r6   r>   r6   r6   r7   rV   ü  rN   zCErrorResponseTest.get_handlers.<locals>.FailedWriteErrorHandler.getc                 [   ó   t dƒ‚)Nzexception in write_error©rQ  r  r6   r6   r7   r
  ÿ  ó   zKErrorResponseTest.get_handlers.<locals>.FailedWriteErrorHandler.write_errorNr  r6   r6   r6   r7   ÚFailedWriteErrorHandlerû  r  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ƒ�E |  d¡}|  |jd¡ |  d|jv ¡ |  d¡}|  |jd¡ |  d|jv ¡ |  d¡}|  |jd	¡ |  d
|jv ¡ W d   ƒ d S 1 sMw   Y  d S )NúUncaught exceptionr  r#  s   500: Internal Server Errorz/default?status=503é÷  s   503: Service Unavailablez/default?status=435i³  s   435: Unknown)r   r   r¸   ru   rº   rƒ   r·   r½   r6   r6   r7   Útest_default  s   


"õzErrorResponseTest.test_defaultc                 C   s|   t tdƒ�/ |  d¡}|  |jd¡ |  d|j¡ |  d¡}|  |jd¡ |  d|j¡ W d   ƒ d S 1 s7w   Y  d S )Nr  r  r#  s   Exception: ZeroDivisionErrorz/write_error?status=503r  s   Status: 503©r   r   r¸   ru   rº   r·   r½   r6   r6   r7   Útest_write_error  s   

"ùz"ErrorResponseTest.test_write_errorc                 C   sV   t tdƒ� |  d¡}|  |jd¡ |  d|j¡ W d   ƒ d S 1 s$w   Y  d S )Nr  r  r#  r´   r  r½   r6   r6   r7   Útest_failed_write_error   s
   
"ýz)ErrorResponseTest.test_failed_write_errorN)rF   rG   rH   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                   @   rO   )z5StaticFileTest.get_handlers.<locals>.StaticUrlHandlerc                 S   s(   t |  dd¡ƒ}|  | j||d�¡ d S )NÚinclude_versionrä   )r  )rq  rr  rU   Ú
static_url)r?   r1   Úwith_vr6   r6   r7   rV   2  s   z9StaticFileTest.get_handlers.<locals>.StaticUrlHandler.getNrX   r6   r6   r6   r7   ÚStaticUrlHandler1  rY   r!  c                   @   s   e Zd ZdZdS )z=StaticFileTest.get_handlers.<locals>.AbsoluteStaticUrlHandlerTN)rF   rG   rH   Úinclude_hostr6   r6   r6   r7   ÚAbsoluteStaticUrlHandler6  s    r#  c                   @   rO   )z=StaticFileTest.get_handlers.<locals>.OverrideStaticUrlHandlerc           
      S   s¬   t |  d¡ƒ}| | _|  |¡}| j||d�}||kr"|  tdƒ¡S | jjd }t|ƒ}| 	|d|¡}| 	|d|¡}|rE|dkoC|dk}	n|dkoL|dk}	|  t|	ƒ¡ d S )Nr"  )r"  Fz://r   éÿÿÿÿ)
rš  rr  r"  r  rU   rÃ   rN  Úprotocolrþ   Úfind)
r?   r1   Ú
do_includeÚregular_urlÚoverride_urlr%  Úprotocol_lengthÚcheck_regularÚcheck_overrideÚresultr6   r6   r7   rV   :  s   
zAStaticFileTest.get_handlers.<locals>.OverrideStaticUrlHandler.getNrX   r6   r6   r6   r7   ÚOverrideStaticUrlHandler9  rY   r.  ú/static_url/(.*)z/abs_static_url/(.*)z/override_static_url/(.*)z/root_static/(.*)rK   )r1   )r   r   ra   )r?   r!  r#  r.  r6   r6   r7   r;   0  s   üzStaticFileTest.get_handlersc                 C   s   t tdƒd�S )Nr  )Ústatic_path©ra   r8   r>   r6   r6   r7   r<   U  rW   zStaticFileTest.get_app_kwargsc                 C   sL   |   d¡}|  d|jv ¡ |   d¡}|  d|jv ¡ |  |j d¡d¡ d S )Nú/robots.txts   Disallow: /ú/static/robots.txtr  r  )r¸   rƒ   r·   ru   rò   rV   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ƒv ¡ d S )Nz/static/sample.xml.gzr  zapplication/gzipz/static/sample.xml.bz2zapplication/octet-streamz/static/sample.xml)ztext/xmlzapplication/xml)r¸   ru   rò   rV   rƒ   rA  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¸   ru   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.txtrK   s   static/robots.txt?v=)r¸   ru   r·   r   r¹   r6  r½   r6   r6   r7   Útest_absolute_static_urlq  s
   
þz'StaticFileTest.test_absolute_static_urlc                 C   r×  )Nz(/static_url/robots.txt?include_version=0s   /static/robots.txtrù   r½   r6   r6   r7   Útest_relative_version_exclusionx  ré  z.StaticFileTest.test_relative_version_exclusionc                 C   s*   |   d¡}|  |jt|  d¡d ƒ¡ d S )Nz,/abs_static_url/robots.txt?include_version=0rK   ústatic/robots.txt)r¸   ru   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€  rG  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¸   rq  ru   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¸   rA  Ú	itertoolsÚchainrò   Ú
startswithÚaddru   rV   )r?   rM  rÉ  Úhead_responseÚget_responseÚ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v¡ d S )Nr3  úIf-Modified-SinceúLast-Modifiedr÷   é0  úContent-Length)rH  rò   ru   rº   rƒ   ©r?   Ú	response1Ú	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 )Nr3  úIf-None-MatchÚEtagr÷   rK  ©rH  rò   ru   rº   rM  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 )Nr3  z
"MISMATCH"rJ  )rQ  rI  r÷   r²   rS  rM  r6   r6   r7   Ú!test_static_304_etag_modified_bug®  s   
þþz0StaticFileTest.test_static_304_etag_modified_bugc                 C   ó$   | j dddid�}|  |jd¡ d S )Nr3  rI  zFri, 01 Jan 1960 00:00:00 GMTr÷   r²   ©rH  ru   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:  r3  rI  rn   r÷   r²   rK  )r0   Ústatr8   rH  r   Úst_mtimeru   rº   )r?   rY  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 )Nr3  rR  ó   ")rH  ru   r   rò   rV   r6  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 )Nr3  ÚRangez	bytes=0-9r÷   éÎ   s
   User-agentrR  r\  rL  Ú10úContent-Rangezbytes 0-9/26)rH  ru   rº   r·   r   rò   rV   r6  r½   r6   r6   r7   Útest_static_with_rangeÛ  s   ÿÿz%StaticFileTest.test_static_with_rangec                 C   óš   | j dddid�}|  |jd¡ tj | jd¡}t|ƒ�}|  |jt	| 
¡ ƒ¡ W d   ƒ n1 s2w   Y  |  |j d¡d¡ |  |j d	¡d ¡ d S )
Nr3  r^  zbytes=0-r÷   r²   ú
robots.txtrL  Ú26ra  ©rH  ru   rº   r0   r1   r2   Ú
static_dirÚopenr·   r   Úreadrò   rV   ©r?   r¾   Úrobots_file_pathÚfr6   r6   r7   Ú test_static_with_range_full_fileç  s   ÿ
ÿz/StaticFileTest.test_static_with_range_full_filec                 C   rc  )
Nr3  r^  zbytes=0-10000000r÷   r²   rd  rL  re  ra  rf  rj  r6   r6   r7   Ú$test_static_with_range_full_past_endô  ó   ÿ
ÿz3StaticFileTest.test_static_with_range_full_past_endc                 C   s¢   | j dddid�}|  |jd¡ tj | jd¡}t|ƒ�}|  |jt	| 
¡ dd … ƒ¡ W d   ƒ n1 s6w   Y  |  |j d¡d	¡ |  |j d
¡d¡ d S )Nr3  r^  zbytes=1-10000000r÷   r_  rd  rn   rL  Ú25ra  zbytes 1-25/26rf  rj  r6   r6   r7   Ú'test_static_with_range_partial_past_endÿ  s   ÿ
 ÿz6StaticFileTest.test_static_with_range_partial_past_endc                 C   óL   | j dddid�}|  |jd¡ |  |j d¡d¡ |  |j d¡d	¡ d S )
Nr3  r^  z	bytes=22-r÷   ó   : /
rL  r•  ra  úbytes 22-25/26©rH  ru   r·   rò   rV   r½   r6   r6   r7   Útest_static_with_range_end_edge
  ó   ÿz.StaticFileTest.test_static_with_range_end_edgec                 C   rr  )
Nr3  r^  zbytes=-4r÷   rs  rL  r•  ra  rt  ru  r½   r6   r6   r7   Útest_static_with_range_neg_end  rw  z-StaticFileTest.test_static_with_range_neg_endc                 C   rc  )
Nr3  r^  zbytes=-1000000r÷   r²   rd  rL  re  ra  rf  rj  r6   r6   r7   Ú%test_static_with_range_neg_past_start  ro  z4StaticFileTest.test_static_with_range_neg_past_startc                 C   rV  )Nr3  r^  rÄ   r÷   r²   rW  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 )Nr3  r^  zbytes=-0r÷   ra  ú
bytes */26é   )rH  ru   rò   rV   rº   r½   r6   r6   r7   Ú+test_static_unsatisfiable_range_zero_suffix)  s
   ÿz:StaticFileTest.test_static_unsatisfiable_range_zero_suffixc                 C   ó8   | j dddid�}|  |jd¡ |  |j d¡d¡ d S )Nr3  r^  zbytes=26r÷   r|  ra  r{  ©rH  ru   rº   rò   rV   r½   r6   r6   r7   Ú-test_static_unsatisfiable_range_invalid_start0  ó
   ÿz<StaticFileTest.test_static_unsatisfiable_range_invalid_startc                 C   r~  )Nr3  r^  z
bytes=10-3r÷   r|  ra  r{  r  r½   r6   r6   r7   Ú3test_static_unsatisfiable_range_end_less_than_start7  r�  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 )
Nr3  r>  ©r¶   r²   r´   rL  re  rR  r\  ©r¸   ru   rº   r·   rò   r   r6  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 )Nr3  r>  r^  ú	bytes=1-4)r¶   rò   r_  r´   rL  r•  rR  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v¡ |  t|jd	 ƒd| j d ¡ d S )
Nr3  r†  r\  )r^  rQ  r÷   rK  r´   rL  rR  )rH  r6  ru   rº   r·   rƒ   rò   r   r½   r6   r6   r7   Útest_static_range_if_none_matchS  s   þþÿz.StaticFileTest.test_static_range_if_none_matchc                 C   r×  )Nz/static/blargé”  rW  r½   r6   r6   r7   Útest_static_404b  ré  zStaticFileTest.test_static_404c                 C   sX   | j  ¡  tƒ | _ ttdƒ� |  d¡}W d   ƒ n1 sw   Y  |  |jd¡ d S )Nz.*not in root static directoryz/static/../static_foo.txté“  )Úhttp_clientrF  r   r   r   rH  ru   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   rH  rì  rí  rÕ   ru   rº   )r?   r1   r¾   r6   r6   r7   Útest_root_static_paths  s
   ÿz$StaticFileTest.test_root_static_pathN)/rF   rG   rH   r6  r0   r1   r2   r3   r4   rg  r;   r<   r4  r5  r7  r8  r9  r;  r=  r<  rH  rP  rT  rU  rX  r[  r]  rb  rm  rn  rq  rv  rx  ry  rz  r}  r€  r‚  r…  r‡  rˆ  rŠ  r�  ÚunittestÚskipIfrd   r�  r6   r6   r6   r7   r  '  sN    ÿ%	

r  c                   @   r5  )
ÚStaticDefaultFilenameTestc                 C   ó   t tdƒt dd�d�S ©Nr  z
index.html)Údefault_filename)r0  Ústatic_handler_argsr1  r>   r6   r6   r7   r<   �  ó   þz(StaticDefaultFilenameTest.get_app_kwargsc                 C   ó   g S r/   r6   r>   r6   r6   r7   r;   ‡  rE   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¸   ru   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,  rš  )r¸   ru   rº   rƒ   rò   Úendswithr½   r6   r6   r7   Útest_static_default_redirect�  s   z6StaticDefaultFilenameTest.test_static_default_redirectN)rF   rG   rH   r<   r;   rœ  rž  r6   r6   r6   r7   r“  €  s
    r“  c                   @   ri   )ÚStaticFileWithPathTestc                 C   r”  r•  r1  r>   r6   r6   r7   r<   –  r˜  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;   œ  rá   z#StaticFileWithPathTest.get_handlersc                 C   r×  )Nz/foo/utf8.htmls   HÃ©llo
rù   r½   r6   r6   r7   Ú
test_serveŸ  ré  z!StaticFileWithPathTest.test_serveN)rF   rG   rH   r<   r;   r   r6   r6   r6   r7   rŸ  •  s    rŸ  c                   @   r5  )
Ú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Ú.rn   z/static/%s.%s.%s)Úget_versionÚrindex)Úclsr]   r1   Úversion_hashÚextension_indexÚbefore_versionÚ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?   Úurl_pathr§  Úversion_indexr6   r6   r7   Úparse_url_path³  s   
zMCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.parse_url_pathc                 S   s   d| S )NzCustomStaticFileTest:r6   ©r¥  r]   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¼  rE   zUCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.validate_absolute_pathNc                 S   s,   |d u r|d u s
J ‚|dkrdS t d| ƒ‚)NúCustomStaticFileTest:foo.txtrm   úunexpected path %rr  )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  ƒ‚)Nr³  rý   r´  )r±  rQ  r>   r6   r6   r7   Úget_content_sizeÆ  s   
zOCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_content_sizec                 S   ó   d S r/   r6   r>   r6   r6   r7   Úget_modified_timeË  rE   zPCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_modified_timec                 S   ó   dS )NÚ42r6   r®  r6   r6   r7   r£  Î  ó   zJCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_version©NN)rF   rG   rH   Úclassmethodrª  r­  r¯  r²  r·  r¸  rº  r£  r6   r6   r6   r7   ÚMyStaticFileHandler¦  s    

rÀ  c                   @   rO   )z;CustomStaticFileTest.get_handlers.<locals>.StaticUrlHandlerc                 S   s   |   |  |¡¡ d S r/   )rU   r  r¦   r6   r6   r7   rV   Ó  rá   z?CustomStaticFileTest.get_handlers.<locals>.StaticUrlHandler.getNrX   r6   r6   r6   r7   r!  Ò  rY   r!  r/  )r   r   Ústatic_handler_class)r?   rÀ  r!  r6   r6   r7   r;   ¥  s   ,
z!CustomStaticFileTest.get_handlersc                 C   s   t d| jd�S )NÚdummy)r0  rÁ  )ra   rÁ  r>   r6   r6   r7   r<   Ú  rW   z#CustomStaticFileTest.get_app_kwargsc                 C   r×  )Nz/static/foo.42.txtrm   rù   r½   r6   r6   r7   r   Ý  ré  zCustomStaticFileTest.test_servec                 C   sL   t tddd�� |  d¡}|  |jd¡ W d   ƒ d S 1 sw   Y  d S )NzCould not open static fileF)Úrequiredz/static_url/foo.txts   /static/foo.42.txt)r   r   r¸   ru   r·   r½   r6   r6   r7   r7  á  s   
"þz$CustomStaticFileTest.test_static_urlN)rF   rG   rH   r;   r<   r   r7  r6   r6   r6   r7   r¡  ¤  s
    5r¡  c                   @   ó,   e Zd ZG dd„ deƒZdd„ Zdd„ ZdS )ÚHostMatchingTestc                   @   rü  )zHostMatchingTest.Handlerc                 C   r  r/   )Úreply)r?   rÆ  r6   r6   r7   r   é  r±   z#HostMatchingTest.Handler.initializec                 C   ó   |   | j¡ d S r/   )rU   rÆ  r>   r6   r6   r7   rV   ì  rX  zHostMatchingTest.Handler.getN)rF   rG   rH   r   rV   r6   r6   r6   r7   rM   è  r  rM   c                 C   s   dt jddifgS )NrÎ   rÆ  Úwildcard)rÅ  rM   r>   r6   r6   r7   r;   ï  r�  zHostMatchingTest.get_handlersc                 C   s<  | j  ddtjddifg¡ | j  ddtjddifg¡ | j  ddtjdd	ifg¡ | j  d
dtjddifg¡ |  d¡}|  |jd¡ |  d¡}|  |jd¡ |  d¡}|  |jd¡ | jdddid�}|  |jd¡ | jdddid�}|  |jd¡ | jdddid�}|  |jd¡ | jdddid�}|  |jd¡ d S )Núwww.example.comrÎ   rÆ  ú[0]úwww\.example\.comú/barú[1]ú/bazú[2]zwww.e.*e.comz[3]s   wildcardr‰  ÚHostr÷   ó   [0]ó   [1]ó   [2]zwww.exe.coms   [3])r=   Úadd_handlersrÅ  rM   r¸   ru   r·   rº   r½   r6   r6   r7   Útest_host_matchingò  s4   ÿÿÿÿ


z#HostMatchingTest.test_host_matchingN)rF   rG   rH   r   rM   r;   rÕ  r6   r6   r6   r7   rÅ  ç  s    rÅ  c                   @   ri   )ÚDefaultHostMatchingTestc                 C   r™  r/   r6   r>   r6   r6   r7   r;     rE   z$DefaultHostMatchingTest.get_handlersc                 C   s   ddiS )NÚdefault_hostrÉ  r6   r>   r6   r6   r7   r<     r  z&DefaultHostMatchingTest.get_app_kwargsc                 C   sà   | j  ddtjddifg¡ | j  ddtjddifg¡ | j  dd	tjdd
ifg¡ |  d¡}|  |jd¡ |  d¡}|  |jd¡ |  d	¡}|  |jd¡ | jdddid�}|  |jd¡ d| j _|  d	¡}|  |jd¡ d S )NrÉ  rÎ   rÆ  rÊ  rË  rÌ  rÍ  zwww.test.comrÎ  rÏ  rÑ  rÒ  r‰  z	X-Real-Ipr7  r÷   rÓ  )	r=   rÔ  rÅ  rM   r¸   ru   r·   rº   r×  r½   r6   r6   r7   Útest_default_host_matching  s(   ÿÿÿ



z2DefaultHostMatchingTest.test_default_host_matchingN)rF   rG   rH   r;   r<   rØ  r6   r6   r6   r7   rÖ    s    rÖ  c                   @   rü  )ÚNamedURLSpecGroupsTestc                 C   s    G dd„ dt ƒ}d|fd|fgS )Nc                   @   rO   )z8NamedURLSpecGroupsTest.get_handlers.<locals>.EchoHandlerc                 S   ó   |   |¡ d S r/   rT   r¦   r6   r6   r7   rV   6  rW   z<NamedURLSpecGroupsTest.get_handlers.<locals>.EchoHandler.getNrX   r6   r6   r6   r7   rJ  5  rY   rJ  z/str/(?P<path>.*)z/unicode/(?P<path>.*)r­   )r?   rJ  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/barrm   rù   r½   r6   r6   r7   Útest_named_urlspec_groups>  s   

z0NamedURLSpecGroupsTest.test_named_urlspec_groupsN)rF   rG   rH   r;   rÛ  r6   r6   r6   r7   rÙ  3  s    
rÙ  c                   @   ó$   e Zd ZG dd„ deƒZdd„ ZdS )ÚClearHeaderTestc                   @   rO   )zClearHeaderTest.Handlerc                 C   s0   |   dd¡ |   dd¡ |  d¡ |  d¡ d S )NÚh1rl   Úh2rÞ   Únonexistent)r–  Úclear_headerr>   r6   r6   r7   rV   H  s   
zClearHeaderTest.Handler.getNrX   r6   r6   r6   r7   rM   G  rY   rM   c                 C   s0   |   d¡}|  d|jv¡ |  |jd d¡ d S )NrK   rÞ  rß  rÞ   )r¸   rƒ   rò   ru   r½   r6   r6   r7   Útest_clear_headerN  s   
z!ClearHeaderTest.test_clear_headerN)rF   rG   rH   r   rM   râ  r6   r6   r6   r7   rÝ  F  ó    rÝ  c                   @   rÜ  )ÚHeader204Testc                   @   rO   )zHeader204Test.Handlerc                 C   s   |   d¡ |  ¡  d S )NéÌ   )Ú
set_statusr›   r>   r6   r6   r7   rV   V  rI  zHeader204Test.Handler.getNrX   r6   r6   r6   r7   rM   U  rY   rM   c                 C   s8   |   d¡}|  |jd¡ |  d|j¡ |  d|j¡ d S )NrK   rå  rL  úTransfer-Encoding)r¸   ru   rº   rù  rò   r½   r6   r6   r7   Útest_204_headersZ  ó   
zHeader204Test.test_204_headersN)rF   rG   rH   r   rM   rè  r6   r6   r6   r7   rä  T  ó    rä  c                   @   rÜ  )ÚHeader304Testc                   @   rO   )zHeader304Test.Handlerc                 C   s   |   dd¡ |  d¡ d S )NúContent-LanguageÚen_USrS   )r–  rU   r>   r6   r6   r7   rV   c  s   zHeader304Test.Handler.getNrX   r6   r6   r6   r7   rM   b  rY   rM   c                 C   sˆ   |   d¡}|  |jd d¡ |  |jd d¡ | j dd|jd id�}|  |jd	¡ |  d|jv¡ |  d|jv¡ |  d
|jv¡ d S )NrK   rL  Ú5rì  rí  rQ  rR  r÷   rK  rç  )r¸   ru   rò   rº   rƒ   rM  r6   r6   r7   Útest_304_headersg  s   
ÿzHeader304Test.test_304_headersN)rF   rG   rH   r   rM   rï  r6   r6   r6   r7   rë  a  rê  rë  c                   @   rÄ  )ÚStatusReasonTestc                   @   rO   )zStatusReasonTest.Handlerc                 C   s<   | j j dg ¡}| jt|  d¡ƒ|rt|d ƒnd d� d S )NÚreasonrº   r   ©rñ  )rN  rO  rV   ræ  rq  rr  r   )r?   rñ  r6   r6   r7   rV   x  s
   
þzStatusReasonTest.Handler.getNrX   r6   r6   r6   r7   rM   w  rY   rM   c                 C   ó   t ƒ S r/   r   r>   r6   r6   r7   Úget_http_client  ó   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=304rK  zNot Modifiedz/?code=304&reason=FooÚFooz/?code=682&reason=Baréª  ÚBarz
/?code=682ÚUnknown)r¸   ru   rº   rñ  r½   r6   r6   r7   Útest_statusƒ  s   



zStatusReasonTest.test_statusN)rF   rG   rH   r   rM   rô  rú  r6   r6   r6   r7   rð  v  s    rð  c                   @   rÜ  )ÚDateHeaderTestc                   @   rO   )zDateHeaderTest.Handlerc                 C   rQ   rR   rT   r>   r6   r6   r7   rV   ”  rW   zDateHeaderTest.Handler.getNrX   r6   r6   r6   r7   rM   “  rY   rM   c                 C   s^   |   d¡}tj |jd ¡}|d usJ ‚tj|d d… Ž }|  |tj ¡  tjdd�k ¡ d S )NrK   ÚDater  r{   )Úseconds)	r¸   r  r  r  rò   r  rƒ   r  r  )r?   r¾   r  Úheader_dater6   r6   r7   Útest_date_header—  s   
ÿzDateHeaderTest.test_date_headerN)rF   rG   rH   r   rM   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                   @   rO   )zRaiseWithReasonTest.Handlerc                 C   s   t ddd�‚)Nr÷  rö  rò  ©r   r>   r6   r6   r7   rV   £  rN   zRaiseWithReasonTest.Handler.getNrX   r6   r6   r6   r7   rM   ¢  rY   rM   c                 C   ró  r/   r   r>   r6   r6   r7   rô  ¦  rõ  z#RaiseWithReasonTest.get_http_clientc                 C   s8   |   d¡}|  |jd¡ |  |jd¡ |  d|j¡ d S )NrK   r÷  rö  s   682: Foo)r¸   ru   rº   rñ  ÚassertInr·   r½   r6   r6   r7   Útest_raise_with_reasonª  ré  z*RaiseWithReasonTest.test_raise_with_reasonc                 C   s   |   ttddd�ƒd¡ d S )Nr÷  rö  rò  zHTTP 682: Foo©ru   rÃ   r   r>   r6   r6   r7   Útest_httperror_str°  r9   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)	rF   rG   rH   r   rM   rô  r  r  r  r6   r6   r6   r7   r   ¡  s    r   c                   @   r5  )
ÚErrorHandlerXSRFTestc                 C   s   dt tdd�fgS )Nú/erroré¡  ©r	  )r!   ra   r>   r6   r6   r7   r;   ¸  s   z!ErrorHandlerXSRFTest.get_handlersc                 C   r®   ©NT)Úxsrf_cookiesr°   r>   r6   r6   r7   r<   ¾  r±   z#ErrorHandlerXSRFTest.get_app_kwargsc                 C   ó"   | j dddd�}|  |jd¡ d S )Nr  r³   ró  rµ   r	  rá  r½   r6   r6   r7   Útest_error_xsrfÁ  ó   z$ErrorHandlerXSRFTest.test_error_xsrfc                 C   r  )Nz/404r³   ró  rµ   r‰  rá  r½   r6   r6   r7   Útest_404_xsrfÅ  r  z"ErrorHandlerXSRFTest.test_404_xsrfN)rF   rG   rH   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                   @   rO   )zGzipTestCase.Handlerc                 C   s4   |   d¡D ]}|  d|¡ q|  ddtj  ¡ d S )NÚvaryrö  zhello worldú!)rR  r—  rU   r-   Ú
MIN_LENGTH)r?   Úvr6   r6   r7   rV   Ì  s   zGzipTestCase.Handler.getNrX   r6   r6   r6   r7   rM   Ë  rY   rM   c                 C   s   t dtj tj t¡d¡d�S )NTr  )r÷  r0  )ra   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÷  )ru   rò   rV   r½   r6   r6   r7   Úassert_compressed×  s   ÿüzGzipTestCase.assert_compressedc                 C   ó*   |   d¡}|  |¡ |  |jd d¡ d S )NrK   rö  rõ  ©r¸   r  ru   rò   r½   r6   r6   r7   Ú	test_gzipá  s   

zGzipTestCase.test_gzipc                 C   r  )Nr2  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 )NrK   F)Úuse_gziprø  rö  rõ  )r¸   rù  rò   ru   r½   r6   r6   r7   Útest_gzip_not_requestedí  rç  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   ó   g | ]}|  ¡ ‘qS r6   ©Ústrip©Ú.0rD  r6   r6   r7   Ú
<listcomp>ö  ó    z:GzipTestCase.test_vary_already_present.<locals>.<listcomp>rö  ú,úAccept-Languagerõ  ©r¸   r  ru   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 ƒg d¢¡ d S )Nz"/?vary=Accept-Language&vary=Cookiec                 S   r  r6   r  r   r6   r6   r7   r"  ÿ  r#  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)rF   rG   rH   r   rM   r<   r  r  r  r  r(  r)  r6   r6   r6   r7   r  Ê  s    
r  c                   @   ó4   e Zd ZG dd„ deƒZdd„ Zdd„ Zdd„ Zd	S )
ÚPathArgsInPrepareTestc                   @   rü  )zPathArgsInPrepareTest.Handlerc                 C   s   |   t| j| jd�¡ d S )N©rM  rÉ  )rU   ra   rL  Úpath_kwargsr>   r6   r6   r7   rx    s   z%PathArgsInPrepareTest.Handler.preparec                 C   s   |dksJ ‚|   ¡  d S )Nrl   ©r›   r¦   r6   r6   r7   rV   	  s   z!PathArgsInPrepareTest.Handler.getN©rF   rG   rH   rx  rV   r6   r6   r6   r7   rM     r  rM   c                 C   s   d| j fd| j fgS )Nz	/pos/(.*)z/kw/(?P<path>.*)rL   r>   r6   r6   r7   r;     rá   z"PathArgsInPrepareTest.get_handlersc                 C   s4   |   d¡}| ¡  t|jƒ}|  |dgi dœ¡ d S )Nz/pos/foorl   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   rl   r,  rÍ  r0  r6   r6   r7   Útest_kw  s   

zPathArgsInPrepareTest.test_kwN)rF   rG   rH   r   rM   r;   r1  r2  r6   r6   r6   r7   r+    s
    r+  c                   @   rÜ  )ÚClearAllCookiesTestc                   @   rO   )zClearAllCookiesTest.Handlerc                 C   s   |   ¡  |  d¡ d S ©NÚok)Úclear_all_cookiesrU   r>   r6   r6   r7   rV     s   zClearAllCookiesTest.Handler.getNrX   r6   r6   r6   r7   rM     rY   rM   c                 C   sj   | j dddid�}t|j d¡ƒ}|  |d  d¡p |d  d¡¡ |  |d	  d
¡p1|d	  d¡¡ d S )NrK   rõ   zfoo=bar; baz=xyzzyr÷   rð   r   zbaz=;zbaz="";rn   zfoo=;zfoo="";)r¸   rñ   rò   ró   rƒ   rB  )r?   r¾   Úset_cookiesr6   r6   r7   Útest_clear_all_cookies#  s   ÿÿz*ClearAllCookiesTest.test_clear_all_cookiesN)rF   rG   rH   r   rM   r8  r6   r6   r6   r7   r3    rê  r3  c                   @   ó   e Zd ZdS )ÚPermissionErrorN©rF   rG   rH   r6   r6   r6   r7   r:  /  ó    r:  c                   @   r*  )
ÚExceptionHandlerTestc                   @   ri   )zExceptionHandlerTest.Handlerc                 C   sD   |   d¡}|dkrtddƒ‚|dkrdd  d S |dkr td	ƒ‚d S )
NÚexcÚhttpéš  zno longer hereÚzerorn   r   Ú
permissionznot allowed)rr  r   r:  )r?   r>  r6   r6   r7   rV   5  s   

ÿz ExceptionHandlerTest.Handler.getc                 K   sP   d|v r|d \}}}t |tƒr|  d¡ |  d¡ d S tj| |fi |¤Ž d S )Nr  r‹  r:  )Ú
isinstancer:  ræ  rU   r   r
  )r?   r	  rÉ  Útyprf   Útbr6   r6   r7   r
  >  s   


z(ExceptionHandlerTest.Handler.write_errorc                 C   s4   t |tƒrt d|jd ¡ d S t | |||¡ d S )Nz&custom logging for PermissionError: %sr   )rC  r:  r   ÚwarningrM  r   Úlog_exception©r?   rD  rf   rE  r6   r6   r7   rG  G  s   
z*ExceptionHandlerTest.Handler.log_exceptionN)rF   rG   rH   rV   r
  rG  r6   r6   r6   r7   rM   4  s    		rM   c                 C   óH   t tdƒ� |  d¡}|  |jd¡ W d   ƒ d S 1 sw   Y  d S )Nz.*no longer herez
/?exc=httpr@  rÑ  r½   r6   r6   r7   Útest_http_errorM  ó   
"þz$ExceptionHandlerTest.test_http_errorc                 C   rI  )Nr  z
/?exc=zeror#  ©r   r   r¸   ru   rº   r½   r6   r6   r7   Útest_unknown_errorT  s   
"þz'ExceptionHandlerTest.test_unknown_errorc                 C   rI  )Nz/custom logging for PermissionError: not allowedz/?exc=permissionr‹  rL  r½   r6   r6   r7   Útest_known_errorZ  rK  z%ExceptionHandlerTest.test_known_errorN)rF   rG   rH   r   rM   rJ  rM  rN  r6   r6   r6   r7   r=  3  s
    r=  c                   @   rÜ  )ÚBuggyLoggingTestc                   @   rü  )zBuggyLoggingTest.Handlerc                 C   r  r  r6   r>   r6   r6   r7   rV   d  rN   zBuggyLoggingTest.Handler.getc                 C   r  r  r6   rH  r6   r6   r7   rG  g  rN   z&BuggyLoggingTest.Handler.log_exceptionN)rF   rG   rH   rV   rG  r6   r6   r6   r7   rM   c  r  rM   c                 C   ra  )Nz.*rK   )r   r   r¸   r>   r6   r6   r7   Útest_buggy_log_exceptionj  rc  z)BuggyLoggingTest.test_buggy_log_exceptionN)rF   rG   rH   r   rM   rP  r6   r6   r6   r7   rO  b  rã  rO  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                   @   rü  )zUIMethodUIModuleTest.Handlerc                 C   rQ   r¨   rŒ  r>   r6   r6   r7   rV   w  rW   z UIMethodUIModuleTest.Handler.getc                 C   s
   |   d¡S )Nrf   )rr  r>   r6   r6   r7   rf   z  r±   z"UIMethodUIModuleTest.Handler.valueN)rF   rG   rH   rV   rf   r6   r6   r6   r7   rM   v  r  rM   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.)rf   )rx   Úxr6   r6   r7   Úmy_ui_method~  rX  z9UIMethodUIModuleTest.get_app_kwargs.<locals>.my_ui_methodc                   @   rO   )z5UIMethodUIModuleTest.get_app_kwargs.<locals>.MyModulec                 S   s   d|t  tj| j¡ ¡ f S )Nz&In MyModule(%s) with handler value %s.)ÚtypingÚcastrQ  rM   rx   rf   )r?   rR  r6   r6   r7   r©   ‚  s   þz<UIMethodUIModuleTest.get_app_kwargs.<locals>.MyModule.renderN©rF   rG   rH   r©   r6   r6   r6   r7   ÚMyModule�  rY   rW  r¤   z1{{ my_ui_method(42) }} {% module MyModule(123) %}rS  )r°  Ú
ui_methodsÚ
ui_modules©r(   r   ra   )r?   rS  rW  r³  r6   r6   r7   r<   }  s   ÿýz#UIMethodUIModuleTest.get_app_kwargsc                    r´  r/   rµ  r>   rº  r6   r7   r·  ‘  s   
zUIMethodUIModuleTest.tearDownc                 C   r×  )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–  rÚ  z#UIMethodUIModuleTest.test_ui_method)
rF   rG   rH   rI   r   rM   r<   r·  r[  rû  r6   r6   rº  r7   rQ  q  s    rQ  c                   @   rÜ  )ÚGetArgumentErrorTestc                   @   rO   )zGetArgumentErrorTest.Handlerc              
   C   sV   z|   d¡ |  i ¡ W d S  ty* } z|  |j|jdœ¡ W Y d }~d S d }~ww )Nrl   ©Úarg_nameÚlog_message)rr  rU   r    r^  r_  r£  r6   r6   r7   rV   ¡  s   
"€ÿz GetArgumentErrorTest.Handler.getNrX   r6   r6   r6   r7   rM      rY   rM   c                 C   s&   |   d¡}|  t|jƒdddœ¡ d S )NrK   rl   zMissing argument foor]  )r¸   ru   r   r·   r½   r6   r6   r7   Útest_catch_error¨  s
   
þz%GetArgumentErrorTest.test_catch_errorN)rF   rG   rH   r   rM   r`  r6   r6   r6   r7   r\  Ÿ  ó    r\  c                   @   rÜ  )ÚSetLazyPropertiesTestc                   @   r5  )
zSetLazyPropertiesTest.Handlerc                 C   s   d| _ t d¡| _d S )NÚBenrí  )Úcurrent_userr   rV   r>   r6   r6   r7   rx  ²  s   z%SetLazyPropertiesTest.Handler.preparec                 C   rA   r/   rB   r>   r6   r6   r7   Úget_user_locale¶  rD   z-SetLazyPropertiesTest.Handler.get_user_localec                 C   rA   r/   rB   r>   r6   r6   r7   Úget_current_user¹  rD   z.SetLazyPropertiesTest.Handler.get_current_userc                 C   s   |   d| j| jjf ¡ d S )NzHello %s (%s))rU   rd  r   rº   r>   r6   r6   r7   rV   ¼  r9   z!SetLazyPropertiesTest.Handler.getN)rF   rG   rH   rx  re  rf  rV   r6   r6   r6   r7   rM   ±  s
    rM   c                 C   r×  )NrK   s   Hello Ben (en_US)rù   r½   r6   r6   r7   Útest_set_properties¿  ó   
z)SetLazyPropertiesTest.test_set_propertiesN)rF   rG   rH   r   rM   rg  r6   r6   r6   r7   rb  °  ó    rb  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                   @   rO   )z<GetCurrentUserTest.get_app_kwargs.<locals>.WithoutUserModulec                 S   r»  )Nró  r6   r>   r6   r6   r7   r©   É  rE   zCGetCurrentUserTest.get_app_kwargs.<locals>.WithoutUserModule.renderNrV  r6   r6   r6   r7   ÚWithoutUserModuleÈ  rY   rk  c                   @   rO   )z9GetCurrentUserTest.get_app_kwargs.<locals>.WithUserModulec                 S   s
   t | jƒS r/   )rÃ   rd  r>   r6   r6   r7   r©   Í  r±   z@GetCurrentUserTest.get_app_kwargs.<locals>.WithUserModule.renderNrV  r6   r6   r6   r7   ÚWithUserModuleÌ  rY   rl  ró  z{{ current_user }}z {% module WithoutUserModule() %}z{% module WithUserModule() %})úwithout_user.htmlúwith_user.htmlúwithout_user_module.htmlúwith_user_module.html)rl  rk  )r°  rY  rZ  )r?   rk  rl  r³  r6   r6   r7   r<   Ç  s   üÿþþz!GetCurrentUserTest.get_app_kwargsc                    r´  r/   rµ  r>   rº  r6   r7   r·  à  rG  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                   @   rü  )z;GetCurrentUserTest.get_handlers.<locals>.CurrentUserHandlerc                 S   s
   d| _ d S )NF©Úhas_loaded_current_userr>   r6   r6   r7   rx  æ  r±   zCGetCurrentUserTest.get_handlers.<locals>.CurrentUserHandler.preparec                 S   s
   d| _ dS )NTró  rq  r>   r6   r6   r7   rf  é  s   zLGetCurrentUserTest.get_handlers.<locals>.CurrentUserHandler.get_current_userN)rF   rG   rH   rx  rf  r6   r6   r6   r7   ÚCurrentUserHandlerå  r  rs  c                   @   rO   )z;GetCurrentUserTest.get_handlers.<locals>.WithoutUserHandlerc                 S   ó   |   d¡ |  t| jƒ¡ d S )Nrm  ©Úrender_stringr›   rÃ   rr  r>   r6   r6   r7   rV   î  ó   
z?GetCurrentUserTest.get_handlers.<locals>.WithoutUserHandler.getNrX   r6   r6   r6   r7   ÚWithoutUserHandlerí  rY   rx  c                   @   rO   )z8GetCurrentUserTest.get_handlers.<locals>.WithUserHandlerc                 S   rt  )Nrn  ru  r>   r6   r6   r7   rV   ó  rw  z<GetCurrentUserTest.get_handlers.<locals>.WithUserHandler.getNrX   r6   r6   r6   r7   ÚWithUserHandlerò  rY   ry  c                   @   rO   )zAGetCurrentUserTest.get_handlers.<locals>.CurrentUserModuleHandlerc                 S   r!  r/   )Úuir>   r6   r6   r7   Úget_template_namespaceø  s   zXGetCurrentUserTest.get_handlers.<locals>.CurrentUserModuleHandler.get_template_namespaceN)rF   rG   rH   r{  r6   r6   r6   r7   ÚCurrentUserModuleHandler÷  rY   r|  c                   @   rO   )zAGetCurrentUserTest.get_handlers.<locals>.WithoutUserModuleHandlerc                 S   rt  )Nro  ru  r>   r6   r6   r7   rV   ÿ  rw  zEGetCurrentUserTest.get_handlers.<locals>.WithoutUserModuleHandler.getNrX   r6   r6   r6   r7   ÚWithoutUserModuleHandlerþ  rY   r}  c                   @   rO   )z>GetCurrentUserTest.get_handlers.<locals>.WithUserModuleHandlerc                 S   rt  )Nrp  ru  r>   r6   r6   r7   rV     rw  zBGetCurrentUserTest.get_handlers.<locals>.WithUserModuleHandler.getNrX   r6   r6   r6   r7   ÚWithUserModuleHandler  rY   r~  ú/without_userú
/with_userú/without_user_moduleú/with_user_moduler­   )r?   rs  rx  ry  r|  r}  r~  r6   r6   r7   r;   ä  s   üzGetCurrentUserTest.get_handlersz	needs fixc                 C   r×  )Nr  ó   Falserù   r½   r6   r6   r7   Útest_get_current_user_is_lazy  rh  z0GetCurrentUserTest.test_get_current_user_is_lazyc                 C   r×  )Nr€  ó   Truerù   r½   r6   r6   r7   Útest_get_current_user_works  ré  z.GetCurrentUserTest.test_get_current_user_worksc                 C   r×  )Nr�  rƒ  rù   r½   r6   r6   r7   Ú,test_get_current_user_from_ui_module_is_lazy  ré  z?GetCurrentUserTest.test_get_current_user_from_ui_module_is_lazyc                 C   r×  )Nr‚  r…  rù   r½   r6   r6   r7   Ú*test_get_current_user_from_ui_module_works  ré  z=GetCurrentUserTest.test_get_current_user_from_ui_module_works)rF   rG   rH   r<   r·  r;   r‘  Úskipr„  r†  r‡  rˆ  rû  r6   r6   rº  r7   rj  Æ  s    +
rj  c                   @   rÜ  )ÚUnimplementedHTTPMethodsTestc                   @   r9  )z$UnimplementedHTTPMethodsTest.HandlerNr;  r6   r6   r6   r7   rM   #  r<  rM   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ÚOPTIONSrK   rƒ  é•  ©r³   ÚPUTr´   rµ   rá  )r?   r¶   r¾   r6   r6   r7   Ú#test_unimplemented_standard_methods&  s   þz@UnimplementedHTTPMethodsTest.test_unimplemented_standard_methodsN)rF   rG   rH   r   rM   r�  r6   r6   r6   r7   rŠ  "  s    rŠ  c                   @   rÄ  )Ú#UnimplementedNonStandardMethodsTestc                   @   rO   )z+UnimplementedNonStandardMethodsTest.Handlerc                 C   rQ   ©NÚotherrT   r>   r6   r6   r7   r“  1  r%  z1UnimplementedNonStandardMethodsTest.Handler.otherN)rF   rG   rH   r“  r6   r6   r6   r7   rM   0  rY   rM   c                 C   r  )NrK   ÚPATCHr´   rµ   r�  rá  r½   r6   r6   r7   Útest_unimplemented_patch6  s   z<UnimplementedNonStandardMethodsTest.test_unimplemented_patchc                 C   r  )NrK   ÚOTHERT©r¶   Úallow_nonstandard_methodsr�  rá  r½   r6   r6   r7   Útest_unimplemented_other<  r  z<UnimplementedNonStandardMethodsTest.test_unimplemented_otherN)rF   rG   rH   r   rM   r•  r™  r6   r6   r6   r7   r‘  /  s    r‘  c                   @   rÜ  )ÚAllHTTPMethodsTestc                   @   s(   e Zd Zdd„ Ze Z Z Z ZZdS )zAllHTTPMethodsTest.Handlerc                 C   s"   | j jd usJ ‚|  | j j¡ d S r/   )rN  r¶   rU   r>   r6   r6   r7   r¶   C  r  z!AllHTTPMethodsTest.Handler.methodN)	rF   rG   rH   r¶   rV   ÚdeleteÚoptionsr¡   Úputr6   r6   r6   r7   rM   B  s    rM   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|ƒ¡ q%d S )NrK   r>  rƒ  r´   )r?  r‹  rŒ  rŽ  rµ   )r¸   ru   r·   r   )r?   r¾   r¶   r6   r6   r7   Útest_standard_methodsI  s   þz(AllHTTPMethodsTest.test_standard_methodsN)rF   rG   rH   r   rM   rž  r6   r6   r6   r7   rš  A  rã  rš  c                   @   rÄ  )ÚPatchMethodTestc                   @   s&   e Zd Zejd Zdd„ Zdd„ ZdS )zPatchMethodTest.Handler)r–  c                 C   rQ   )NÚpatchrT   r>   r6   r6   r7   r   Z  rW   zPatchMethodTest.Handler.patchc                 C   rQ   r’  rT   r>   r6   r6   r7   r“  ]  rW   zPatchMethodTest.Handler.otherN)rF   rG   rH   r   ÚSUPPORTED_METHODSr   r“  r6   r6   r6   r7   rM   U  s    
rM   c                 C   r  )NrK   r”  r´   rµ   s   patchrù   r½   r6   r6   r7   Ú
test_patch`  r  zPatchMethodTest.test_patchc                 C   r  )NrK   r–  Tr—  s   otherrù   r½   r6   r6   r7   Ú
test_otherd  r  zPatchMethodTest.test_otherN)rF   rG   rH   r   rM   r¢  r£  r6   r6   r6   r7   rŸ  T  s    rŸ  c                   @   rÜ  )ÚFinishInPrepareTestc                   @   rü  )zFinishInPrepareTest.Handlerc                 C   rQ   )Nr¼   r.  r>   r6   r6   r7   rx  k  rW   z#FinishInPrepareTest.Handler.preparec                 C   r  )Nzshould not reach this methodr  r>   r6   r6   r7   rV   n  s   zFinishInPrepareTest.Handler.getNr/  r6   r6   r6   r7   rM   j  r  rM   c                 C   r×  )NrK   s   donerù   r½   r6   r6   r7   Útest_finish_in_preparet  ré  z*FinishInPrepareTest.test_finish_in_prepareN)rF   rG   rH   r   rM   r¥  r6   r6   r6   r7   r¤  i  ó    
r¤  c                   @   rü  )ÚDefault404Testc                 C   rþ  ©NrÎ   r­   r>   r6   r6   r7   r;   z  s   
zDefault404Test.get_handlersc                 C   ó*   |   d¡}|  |jd¡ |  |jd¡ d S )NrK   r‰  sE   <html><title>404: Not Found</title><body>404: Not Found</body></html>r›  r½   r6   r6   r7   Útest_404~  s   
þzDefault404Test.test_404N)rF   rG   rH   r;   rª  r6   r6   r6   r7   r§  y  s    r§  c                   @   ri   )ÚCustom404Testc                 C   rþ  r¨  r­   r>   r6   r6   r7   r;   ‰  r±   zCustom404Test.get_handlersc                 C   s   G dd„ dt ƒ}t|d�S )Nc                   @   rO   )z6Custom404Test.get_app_kwargs.<locals>.Custom404Handlerc                 S   s   |   d¡ |  d¡ d S )Nr‰  zcustom 404 response)ræ  rU   r>   r6   r6   r7   rV   Ž  rG  z:Custom404Test.get_app_kwargs.<locals>.Custom404Handler.getNrX   r6   r6   r6   r7   ÚCustom404Handler�  rY   r¬  )Údefault_handler_class)r   ra   )r?   r¬  r6   r6   r7   r<   Œ  s   
zCustom404Test.get_app_kwargsc                 C   r©  )NrK   r‰  s   custom 404 responser›  r½   r6   r6   r7   rª  ”  s   
zCustom404Test.test_404N)rF   rG   rH   r;   r<   rª  r6   r6   r6   r7   r«  ˆ  s    r«  c                   @   ri   )ÚDefaultHandlerArgumentsTestc                 C   rþ  r¨  r­   r>   r6   r6   r7   r;   ›  r±   z(DefaultHandlerArgumentsTest.get_handlersc                 C   s   t tt dd�d�S )Nr‹  r
  )r­  Údefault_handler_args)ra   r!   r>   r6   r6   r7   r<   ž  s   þz*DefaultHandlerArgumentsTest.get_app_kwargsc                 C   r×  )NrK   r‹  rá  r½   r6   r6   r7   Útest_403¤  ré  z$DefaultHandlerArgumentsTest.test_403N)rF   rG   rH   r;   r<   r°  r6   r6   r6   r7   r®  š  s    r®  c                   @   rü  )ÚHandlerByNameTestc                 C   s   dt fdtddƒgS )Nú/hello1)ú/hello2ú"tornado.test.web_test.HelloHandlerú/hello3r´  )rP   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)rF   rG   rH   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                   @   r5  )
zCStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandlerc                 S   r  r/   r�   r0  r6   r6   r7   r   ¿  r±   zNStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.initializec                 S   s   | j j d ¡ d S r/   )rž   ÚpreparedÚ
set_resultr>   r6   r6   r7   rx  Â  r�  zKStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.preparec                 S   s   | j j |¡ d S r/   )rž   r  r»  ©r?   r  r6   r6   r7   Údata_receivedÅ  r�  zQStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.data_receivedc                 S   s   | j j d ¡ |  i ¡ d S r/   )rž   Úfinishedr»  rU   r>   r6   r6   r7   rV   È  s   zGStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.getN)rF   rG   rH   r   rx  r½  rV   r6   r6   r6   r7   ÚStreamingBodyHandler½  s
    r¿  c                   @   rO   )zAStreamingRequestBodyTest.get_handlers.<locals>.EarlyReturnHandlerc                 S   r  )Né‘  r  r>   r6   r6   r7   rx  Î  s   zIStreamingRequestBodyTest.get_handlers.<locals>.EarlyReturnHandler.prepareNr©  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   r  r/   r�   r0  r6   r6   r7   r   Õ  r±   zOStreamingRequestBodyTest.get_handlers.<locals>.CloseDetectionHandler.initializec                    s   t ƒ  ¡  | jj d ¡ d S r/   )r¶  r4  rž   Úclose_futurer»  r>   rº  r6   r7   r4  Ø  ré  zXStreamingRequestBodyTest.get_handlers.<locals>.CloseDetectionHandler.on_connection_close)rF   rG   rH   r   r4  rû  r6   r6   rº  r7   ÚCloseDetectionHandlerÓ  s    rÃ  z/stream_bodyr�   z/early_returnz/close_detection)r*   r   ra   )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 ¡ |r&| d¡ | d¡ |S )Nr   r7  s   GET s    HTTP/1.1
s   Connection: close
s   Transfer-Encoding: chunked

)r;  r<  r=  r>  r?  r   rU   )r?   r#   Úconnection_closerD  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>  rU   ru   Úread_until_closerƒ   r�  rF  ©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Ç  rƒ   rB  rÈ  r6   r6   r7   Útest_early_return	  s   €
z*StreamingRequestBodyTest.test_early_returnc                 c   s8   � | j ddd�}| d¡ | ¡ V }|  | d¡¡ d S )NrÊ  FrÅ  rÆ  rË  )r>  rU   rÇ  rƒ   rB  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>  rF  )r?   r@  r6   r6   r7   Útest_close_during_upload	  s
   €z1StreamingRequestBodyTest.test_close_during_uploadN)
rF   rG   rH   r;   r>  r   rÉ  rÌ  rÍ  rÎ  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¶   Úmethodsr0  r6   r6   r7   r   	  s   
z!BaseFlowControlHandler.initializec                 c   sP   � | j d ur| j d|| j f ¡ || _ | j |¡ z	d V  W d | _ d S d | _ w )Nzentered method %s while in %s)r¶   rž   ÚfailrÐ  Úappendr¨  r6   r6   r7   Ú	in_method$	  s   €
z BaseFlowControlHandler.in_methodc                 c   s   � | j  d¡ tjV  d S )Nrx  )rÐ  rÒ  r   Úmomentr>   r6   r6   r7   rx  /	  s   €zBaseFlowControlHandler.preparec                 c   sJ   � |   d¡� tjV  W d   ƒ n1 sw   Y  |  t| jd�¡ d S )Nr¡   ©rÐ  )rÓ  r   rÔ  rU   ra   rÐ  r>   r6   r6   r7   r¡   6	  s
   €
ÿzBaseFlowControlHandler.postN)rF   rG   rH   r   Ú
contextlibÚcontextmanagerrÓ  r   r¢   rx  r¡   r6   r6   r6   r7   rÏ  	  s    


rÏ  c                   @   sL   e Zd Zdd„ Zdd„ Zdejfdd„Zdejfdd	„Zdejfd
d„Z	dS )Ú#BaseStreamingRequestFlowControlTestc                 C   s   t ddd�S )Nrß   T)Ú
chunk_sizeÚdecompress_requestr°   r>   r6   r6   r7   Úget_httpserver_options>	  s   z:BaseStreamingRequestFlowControlTest.get_httpserver_optionsc                 C   ró  r/   r   r>   r6   r6   r7   rô  C	  rõ  z3BaseStreamingRequestFlowControlTest.get_http_clientr?   c                 C   s8   | j dddd�}| ¡  |  t|jƒtg d¢d�¡ d S )NrK   Úabcdefghijklmnopqrstuvwxyzr³   )r·   r¶   ©rx  r½  r½  r½  r¡   rÕ  )r¸   rÈ  ru   r   r·   ra   r½   r6   r6   r7   Útest_flow_control_fixed_bodyH	  s   ÿþz@BaseStreamingRequestFlowControlTest.test_flow_control_fixed_bodyc                    sR   g d¢‰ t j‡ fdd„ƒ}| jd|dd�}| ¡  |  t|jƒtg d¢d�¡ d S )	N)s   abcds   efghs   ijklc                 3   s   � ˆ D ]}| |ƒV  qd S r/   r6   )rU   Úi©Úchunksr6   r7   Úbody_producer[	  s   €ÿzYBaseStreamingRequestFlowControlTest.test_flow_control_chunked_body.<locals>.body_producerrK   r³   )râ  r¶   rÝ  rÕ  )r   r¢   r¸   rÈ  ru   r   r·   ra   )r?   râ  r¾   r6   rà  r7   Útest_flow_control_chunked_bodyX	  s   ÿþzBBaseStreamingRequestFlowControlTest.test_flow_control_chunked_bodyc                 C   sl   t ƒ }tjd|d�}| d¡ | ¡  | ¡ }| jd|dddid�}| ¡  |  t	|j
ƒtg d	¢d
�¡ d S )NÚw)ÚmodeÚfileobjs   abcdefghijklmnopqrstuvwxyzrK   r³   rø  r÷  )r·   r¶   rò   rÝ  rÕ  )r.   r÷  ÚGzipFilerU   rF  Úgetvaluer¸   rÈ  ru   r   r·   ra   )r?   ÚbytesioÚ	gzip_fileÚcompressed_bodyr¾   r6   r6   r7   Ú!test_flow_control_compressed_bodyo	  s$   
üÿþzEBaseStreamingRequestFlowControlTest.test_flow_control_compressed_bodyN)
rF   rG   rH   rÛ  rô  rT  ÚAnyrÞ  rã  rì  r6   r6   r6   r7   rØ  =	  s    rØ  c                   @   rO   )Ú(DecoratedStreamingRequestFlowControlTestc                 C   ó"   G dd„ dt ƒ}d|t| d�fgS )Nc                   @   r›  )zZDecoratedStreamingRequestFlowControlTest.get_handlers.<locals>.DecoratedFlowControlHandlerc                 s   s:   � |   d¡� tjV  W d   ƒ d S 1 sw   Y  d S )Nr½  )rÓ  r   rÔ  r¼  r6   r6   r7   r½  �	  s   €
"ÿzhDecoratedStreamingRequestFlowControlTest.get_handlers.<locals>.DecoratedFlowControlHandler.data_receivedN)rF   rG   rH   r   r¢   r½  r6   r6   r6   r7   ÚDecoratedFlowControlHandlerŽ	  rŸ  rð  rK   r�   ©rÏ  ra   )r?   rð  r6   r6   r7   r;   �	  s   z5DecoratedStreamingRequestFlowControlTest.get_handlersN©rF   rG   rH   r;   r6   r6   r6   r7   rî  Š	  ó    rî  c                   @   rO   )Ú%NativeStreamingRequestFlowControlTestc                 C   rï  )Nc                   @   rO   )zTNativeStreamingRequestFlowControlTest.get_handlers.<locals>.NativeFlowControlHandlerc                 Ó   sJ   �|   d¡� dd l}| d¡I d H  W d   ƒ d S 1 sw   Y  d S )Nr½  r   )rÓ  Úasyncior9  )r?   r  rõ  r6   r6   r7   r½  œ	  s
   €"ýzbNativeStreamingRequestFlowControlTest.get_handlers.<locals>.NativeFlowControlHandler.data_receivedN)rF   rG   rH   r½  r6   r6   r6   r7   ÚNativeFlowControlHandler›	  rY   rö  rK   r�   rñ  )r?   rö  r6   r6   r7   r;   š	  s   z2NativeStreamingRequestFlowControlTest.get_handlersNrò  r6   r6   r6   r7   rô  —	  ró  rô  c                   @   ri   )ÚIncorrectContentLengthTestc                    sB   | ‰ d | _ G ‡ fdd„dtƒ}G ‡ fdd„dtƒ}d|fd|fgS )Nc                       ó   e Zd Z‡ fdd„ZdS )z8IncorrectContentLengthTest.get_handlers.<locals>.TooHighc              
      ó>   |   dd¡ z|  d¡ W d S  ty } z|ˆ _‚ d }~ww )NrL  r¼  r5  ©r–  r›   rQ  Úserver_errorr£  r�   r6   r7   rV   ¬	  ó   €þz<IncorrectContentLengthTest.get_handlers.<locals>.TooHigh.getNrX   r6   r�   r6   r7   ÚTooHigh«	  ó    rý  c                       rø  )z7IncorrectContentLengthTest.get_handlers.<locals>.TooLowc              
      rù  )NrL  rÝ  rS   rú  r£  r�   r6   r7   rV   µ	  rü  z;IncorrectContentLengthTest.get_handlers.<locals>.TooLow.getNrX   r6   r�   r6   r7   ÚTooLow´	  rþ  rÿ  ú/highú/low)rû  r   )r?   rý  rÿ  r6   r�   r7   r;   ¦	  s
   		z'IncorrectContentLengthTest.get_handlersc              
   C   ó¢   t tdƒ�9 t tdƒ�$ |  t¡� | jddd� W d   ƒ n1 s#w   Y  W d   ƒ n1 s2w   Y  W d   ƒ n1 sAw   Y  |  t| jƒd¡ d S )Nú*(Uncaught exception|Exception in callback)úS(Cannot send error response after headers written|Failed to flush partial response)r   T©Úraise_errorz0Tried to write 40 bytes less than Content-Length©	r   r   r   ÚassertRaisesr
   r¸   ru   rÃ   rû  r>   r6   r6   r7   Útest_content_length_too_high¿	  ó   þÿ€û€ÿ
ÿz7IncorrectContentLengthTest.test_content_length_too_highc              
   C   r  )Nr  r  r  Tr  z,Tried to write more data than Content-Lengthr  r>   r6   r6   r7   Útest_content_length_too_lowÏ	  r
  z6IncorrectContentLengthTest.test_content_length_too_lowN)rF   rG   rH   r;   r	  r  r6   r6   r6   r7   r÷  ¥	  s    r÷  c                   @   rÜ  )ÚClientCloseTestc                   @   rO   )zClientCloseTest.Handlerc                 C   s8   | j j d¡r| j jj ¡  |  d¡ d S |  d¡ d S )NzHTTP/1rS   úrequires HTTP/1.x)rN  rp   rB  Ú
connectionr@  rF  rU   r>   r6   r6   r7   rV   â	  s   zClientCloseTest.Handler.getNrX   r6   r6   r6   r7   rM   á	  rY   rM   c                 C   sf   |   ttjf¡�! | jddd�}|jdkr|  d¡ |  |jd¡ W d   ƒ d S 1 s,w   Y  d S )NrK   Tr  s   requires HTTP/1.xr  iW  )	r  r
   r‘  ÚSkipTestr¸   r·   ÚskipTestru   rº   r½   r6   r6   r7   Útest_client_closeï	  s   

"üz!ClientCloseTest.test_client_closeN)rF   rG   rH   r   rM   r  r6   r6   r6   r7   r  à	  ri  r  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 everybodyÚ	asdfbasdfÚ12312312Ú2342342)r   rn   r{   c                 C   s   |   ¡ d S )Ni 0* )Úpresentr>   r6   r6   r7   Úpastû	  rN   zSignedValueTest.pastc                 C   r»  )Ni m|Mr6   r>   r6   r6   r7   r  þ	  rE   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 )NrS  rf   rn   )rp   Úclocks<   dmFsdWU=|1300000000|31c934969f53e48164c50768b40cbd7e2daaaa4fr{   se   2|1:0|10:1300000000|3:key|8:dmFsdWU=|3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e152©r  )rr   r  ó   value)r%   r  ÚSECRETr  ru   r&   )r?   Ú	signed_v1Ú	signed_v2Úsigned_defaultÚ
decoded_v1Ú
decoded_v2r6   r6   r7   Útest_known_values
  s2   ÿÿÿþÿÿÿz!SignedValueTest.test_known_valuesc                 C   sl   t tjdd| jd�}t tjdd| jd�}ttjd|| jd�}|  |d ¡ ttjd|| jd�}|  |d ¡ d S )NÚkey1rf   r  Úkey2)r%   r  r  r  r&   ÚassertIs)r?   Úsigned1Úsigned2Údecoded1Údecoded2r6   r6   r7   Útest_name_swap!
  s   ÿÿÿÿzSignedValueTest.test_name_swapc                 C   sX   t tjdd| jd�}ttjd|| jd�}|  |d¡ ttjd|| jd�}|  |d ¡ d S )Nr"  rf   r  r  )r%   r  r  r  r&   ru   r  r$  )r?   ÚsignedÚdecoded_pastÚ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 ©Nr  rS  r  ©r&   r  r  r  )Úprefix©r?   r†   r6   r7   ÚvalidateC
  ó   ÿz8SignedValueTest.test_payload_tampering.<locals>.validateú%2|1:0|10:1300000000|3:key|8:dmFsdWU=|z%2|1:1|10:1300000000|3:key|8:dmFsdWU=|z$2|1:0|10:130000000|3:key|8:dmFsdWU=|z&2|1:0|10:1300000000|3:keey|8:dmFsdWU=|©rƒ   ÚassertFalse©r?   r3  r6   r2  r7   Útest_payload_tampering?
  s   z&SignedValueTest.test_payload_tamperingc                    sj   d‰ ‡ ‡fdd„}ˆ  |dƒ¡ ˆ |dƒ¡ ˆ |dƒ¡ ˆ |dƒ¡ ˆ |dƒ¡ ˆ |d	ƒ¡ d S )
Nr5  c                    s   dt tjdˆ |  ˆjd�kS r/  r0  )r†   ©r1  r?   r6   r7   r3  S
  r4  z:SignedValueTest.test_signature_tampering.<locals>.validater.  Ú 00000000000000000000000000000000Ú@4d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e152Ú@3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e153Ú?3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e15ÚA3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e1538r6  r8  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ˆ   rS  r  )r%   r  r  r  r&   ru   ©r?   rf   r*  Údecodedr6   r6   r7   Útest_non_asciip
  s   ÿÿzSignedValueTest.test_non_asciic                 C   ó>   d}t tjd|| jdd�}ttjd|| jd�}|  ||¡ d S ©Nrˆ   rS  r   ©r  r_   r  ©r%   r  ÚSECRET_DICTr  r&   ru   rA  r6   r6   r7   Ú*test_key_versioning_read_write_default_keyz
  ó   ÿÿz:SignedValueTest.test_key_versioning_read_write_default_keyc                 C   rD  )Nrˆ   rS  rn   rF  r  rG  rA  r6   r6   r7   Ú.test_key_versioning_read_write_non_default_key„
  rJ  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 rE  )r%   r  rH  r  r–   r—   r&   ru   )r?   rf   r*  ÚnewkeysrB  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ˆ   rS  rn   rF  )r%   r  rH  r  r'   ru   )r?   rf   r*  r_   r6   r6   r7   Útest_key_version_retrieval˜
  s   ÿz*SignedValueTest.test_key_version_retrievalN)rF   rG   rH   r  rH  r  r  r!  r)  r-  r9  r@  rC  rI  rK  rM  rN  r6   r6   r6   r7   r  ÷	  s      



r  c                       s¸   e Zd ZG dd„ deƒZdd„ Z‡ fdd„Zd(dd	„Zd)d
d„Zdd„ Z	dd„ Z
dd„ Z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                   @   rü  )zXSRFTest.Handlerc                 C   s*   t |  dd¡ƒ}|| jd< |  | j¡ d S )Nrp   rÝ  Úxsrf_cookie_version)rq  rr  r]   rU   ri  )r?   rp   r6   r6   r7   rV   £
  s   
zXSRFTest.Handler.getc                 C   rQ   r4  rT   r>   r6   r6   r7   r¡   ª
  rW   zXSRFTest.Handler.postN)rF   rG   rH   rV   r¡   r6   r6   r6   r7   rM   ¢
  s    rM   c                 C   r®   r  r°   r>   r6   r6   r7   r<   ­
  r±   zXSRFTest.get_app_kwargsc                    s   t ƒ  ¡  |  ¡ | _d S r/   )r¶  ÚsetUpÚ	get_tokenri  r>   rº  r6   r7   rQ  °
  rG  zXSRFTest.setUpNc                 C   sH   |d ur
|   |¡}nd }| j|d u rdnd| |d�}| ¡  t|jƒS )NrK   z/?version=%dr÷   )Úcookie_headersr¸   rÈ  r   r·   )r?   Ú	old_tokenrp   rò   r¾   r6   r6   r7   rR  ´
  s   ÿ
zXSRFTest.get_tokenc                 C   s   |d u r| j }dd| iS )Nrõ   z_xsrf=)ri  )r?   Útokenr6   r6   r7   rS  ¿
  s   zXSRFTest.cookie_headersc                 C   sL   t tdƒ� | jdddd�}W d   ƒ n1 sw   Y  |  |jd¡ d S )Nú.*'_xsrf' argument missingrK   r³   r´   rµ   r‹  rÑ  r½   r6   r6   r7   Útest_xsrf_fail_no_tokenÄ
  s   ÿz XSRFTest.test_xsrf_fail_no_tokenc              	   C   s\   t tdƒ� | jddtj t| jd�¡d�}W d   ƒ n1 s w   Y  |  |j	d¡ d S )Nú!.*XSRF cookie does not match POSTrK   r³   ©Ú_xsrfrµ   r‹  )
r   r   r¸   rì  rí  rî  ra   ri  ru   rº   r½   r6   r6   r7   Útest_xsrf_fail_body_no_cookieÉ
  s   ýÿz&XSRFTest.test_xsrf_fail_body_no_cookiec              
   C   s`   t tdƒ� | jdd|  ¡ tj tdd�¡d�}W d   ƒ n1 s"w   Y  |  |j	d¡ d S )Nz%.*'_xsrf' argument has invalid formatrK   r³   ú3|rY  rÊ  r‹  )
r   r   r¸   rS  rì  rí  rî  ra   ru   rº   r½   r6   r6   r7   Ú&test_xsrf_fail_argument_invalid_formatÒ
  s   üÿz/XSRFTest.test_xsrf_fail_argument_invalid_formatc              
   C   sf   t tdƒ� | jdd| jdd�tj t| jd�¡d�}W d   ƒ n1 s%w   Y  |  	|j
d¡ d S )	NrX  rK   r³   r\  ©rU  rY  rÊ  r‹  )r   r   r¸   rS  rì  rí  rî  ra   ri  ru   rº   r½   r6   r6   r7   Ú$test_xsrf_fail_cookie_invalid_formatÜ
  s   
üÿz-XSRFTest.test_xsrf_fail_cookie_invalid_formatc                 C   sR   t tdƒ� | jddd|  ¡ d�}W d   ƒ n1 sw   Y  |  |jd¡ d S )NrV  rK   r³   r´   ©r¶   r·   rò   r‹  )r   r   r¸   rS  ru   rº   r½   r6   r6   r7   Útest_xsrf_fail_cookie_no_bodyæ
  s   ÿÿz&XSRFTest.test_xsrf_fail_cookie_no_bodyc                 C   ó:   | j ddtj tdd�¡| jdd�d�}|  |jd¡ d S )NrK   r³   ÚdeadbeefrY  r^  r`  r²   ©r¸   rì  rí  rî  ra   rS  ru   rº   r½   r6   r6   r7   Útest_xsrf_success_short_tokení
  ó   
üz&XSRFTest.test_xsrf_success_short_tokenc                 C   rb  )NrK   r³   ÚxoxorY  r^  r`  r²   rd  r½   r6   r6   r7   Útest_xsrf_success_non_hex_tokenö
  rf  z(XSRFTest.test_xsrf_success_non_hex_tokenc                 C   s8   | j ddtj t| jd�¡|  ¡ d�}|  |jd¡ d S )NrK   r³   rY  r`  r²   ©	r¸   rì  rí  rî  ra   ri  rS  ru   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/?rY  r³   r´   r`  r²   ri  r½   r6   r6   r7   Útest_xsrf_success_query_string  s   üz'XSRFTest.test_xsrf_success_query_stringc              	   C   s:   | j dddtd| jifi |  ¡ ¤Žd�}|  |jd¡ d S )NrK   r³   r´   zX-Xsrftokenr`  r²   )r¸   ra   ri  rS  ru   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ß   )rA  ÚrangerC  rR  ru   rþ   )r?   Ú
NUM_TOKENSÚtokensrß  r6   r6   r7   Útest_distinct_tokens  s
   zXSRFTest.test_distinct_tokensc              
   C   sÌ   |   ¡ }| j|fD ]}| jddtj t|d�¡|  |¡d�}|  |j	d¡ q	| j|f|| jffD ]3\}}t
tdƒ� | jddtj t|d�¡|  |¡d�}W d   ƒ n1 sWw   Y  |  |j	d¡ q0d S )NrK   r³   rY  r`  r²   rX  r‹  )rR  ri  r¸   rì  rí  rî  ra   rS  ru   rº   r   r   )r?   Útoken2rU  r¾   Úcookie_tokenÚ
body_tokenr6   r6   r7   Útest_cross_user%  s,   üþüÿõzXSRFTest.test_cross_userc              	   C   s|   | j }t|gƒ}tdƒD ]'}|  |¡}| |¡ | jddtj t	| j d�¡|  
|¡d�}|  |jd¡ q|  t|ƒd¡ d S )Né   rK   r³   rY  r`  r²   r  )ri  rA  rm  rR  rC  r¸   rì  rí  rî  ra   rS  ru   rº   rþ   )r?   rU  Útokens_seenrß  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�|¡ q|  |¡}|   ||¡ |   ||  |¡¡ ||f||ffD ]\}}| jddtj t|d�¡|  	|¡d�}|  |j
d¡ qBd S )	Nrn   ro   ru  rK   r³   rY  r`  r²   )ÚassertNotEqualrR  rm  ru   r¸   rì  rí  rî  ra   rS  rº   )r?   Úv1_tokenrß  Úv2_tokenrr  rs  r¾   r6   r6   r7   Útest_versioningR  s    
üùzXSRFTest.test_versioningr¾  r/   )rF   rG   rH   r   rM   r<   rQ  rR  rS  rW  r[  r]  r_  ra  re  rh  rj  rk  rl  rp  rt  rw  r{  rû  r6   r6   rº  r7   rO  ¡
  s(    

	

				rO  c                   @   rÄ  )ÚXSRFCookieKwargsTestc                   @   rO   )zXSRFCookieKwargsTest.Handlerc                 C   rÇ  r/   )rU   ri  r>   r6   r6   r7   rV   n  rX  z XSRFCookieKwargsTest.Handler.getNrX   r6   r6   r6   r7   rM   m  rY   rM   c                 C   s   t dt ddd�d�S )NTr{   )ræ   rg   )r  Ú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 us'J ‚t d|¡}|d us3J ‚tj ¡ tj	dd� }t
j | ¡ d ¡}|d usNJ ‚tj|d d	… Ž }|  t||  ¡ ƒd
k ¡ d S )NrK   z	httponly;rð   zexpires=z.*; expires=(?P<expires>.+);.*r{   r	  r  r  rß   )r¸   r  rò   r  rV   r€   r�   r  r  r  r  r  r  r  rƒ   r  r  r  r6   r6   r7   Útest_xsrf_httponlyv  s   
z'XSRFCookieKwargsTest.test_xsrf_httponlyN)rF   rG   rH   r   rM   r<   r~  r6   r6   r6   r7   r|  l  s    r|  c                   @   rÜ  )ÚFinishExceptionTestc                   @   rO   )zFinishExceptionTest.Handlerc                 C   s:   |   d¡ |  dd¡ |  dd¡rtdƒ‚|  d¡ tƒ ‚)NrÀ  úWWW-AuthenticateúBasic realm="something"Úfinish_valueró  zauthentication required)ræ  r–  rr  r)   rU   r>   r6   r6   r7   rV   ˆ  s   

zFinishExceptionTest.Handler.getNrX   r6   r6   r6   r7   rM   ‡  rY   rM   c                 C   sH   dD ]}|   |¡}|  |jd¡ |  d|j d¡¡ |  d|j¡ qd S )N)rK   z/?finish_value=1rÀ  r�  r€  s   authentication required)r¸   ru   rº   rò   rV   r·   )r?   Úur¾   r6   r6   r7   Útest_finish_exception‘  s   
ÿúz)FinishExceptionTest.test_finish_exceptionN)rF   rG   rH   r   rM   r„  r6   r6   r6   r7   r  †  r¦  r  c                   @   ri   )ÚDecoratorTestc                 C   s0   G dd„ dt ƒ}G dd„ dt ƒ}d|fd|fgS )Nc                   @   ó   e Zd Zedd„ ƒZdS )z6DecoratorTest.get_handlers.<locals>.RemoveSlashHandlerc                 S   r¹  r/   r6   r>   r6   r6   r7   rV   ž  r½  z:DecoratorTest.get_handlers.<locals>.RemoveSlashHandler.getN)rF   rG   rH   r+   rV   r6   r6   r6   r7   ÚRemoveSlashHandler�  ó    r‡  c                   @   r†  )z3DecoratorTest.get_handlers.<locals>.AddSlashHandlerc                 S   r¹  r/   r6   r>   r6   r6   r7   rV   £  r½  z7DecoratorTest.get_handlers.<locals>.AddSlashHandler.getN)rF   rG   rH   r,   rV   r6   r6   r6   r7   ÚAddSlashHandler¢  rˆ  r‰  ú/removeslash/ú	/addslashr­   )r?   r‡  r‰  r6   r6   r7   r;   œ  s   zDecoratorTest.get_handlersc                 C   ó`   | 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©  ó   zDecoratorTest.test_removeslashc                 C   rŒ  )	Nr‹  Fr)  rà  r,  z
/addslash/z/addslash?foo=barz/addslash/?foo=barrã  r½   r6   r6   r7   Útest_addslash²  rŽ  zDecoratorTest.test_addslashN)rF   rG   rH   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                   @   rü  )z+CacheTest.get_handlers.<locals>.EtagHandlerc                 S   rÚ  r/   rT   )r?   Úcomputed_etagr6   r6   r7   rV   ¿  rW   z/CacheTest.get_handlers.<locals>.EtagHandler.getc                 S   s
   | j d S r8  )Ú_write_bufferr>   r6   r6   r7   Úcompute_etagÂ  r±   z8CacheTest.get_handlers.<locals>.EtagHandler.compute_etagN)rF   rG   rH   rV   r“  r6   r6   r6   r7   ÚEtagHandler¾  r  r”  z
/etag/(.*)r­   )r?   r”  r6   r6   r7   r;   ½  s   
zCacheTest.get_handlersc                 C   ó   d}d}|   ||d¡ d S )Nú"xyzzy"Ú*rK  ©Ú
_test_etag©r?   r‘  Úetagsr6   r6   r7   Útest_wildcard_etagÇ  ó   zCacheTest.test_wildcard_etagc                 C   s   d}d}|   ||d¡ d S )Nr–  rK  r˜  rš  r6   r6   r7   Útest_strong_etag_matchÌ  r�  z CacheTest.test_strong_etag_matchc                 C   r•  )Nú"xyzzy1"ú"xyzzy1", "xyzzy2"rK  r˜  rš  r6   r6   r7   Útest_multiple_strong_etag_matchÑ  r�  z)CacheTest.test_multiple_strong_etag_matchc                 C   r•  )Nr–  rŸ  r²   r˜  rš  r6   r6   r7   Útest_strong_etag_not_matchÖ  r�  z$CacheTest.test_strong_etag_not_matchc                 C   r•  )Nr–  r   r²   r˜  rš  r6   r6   r7   Ú#test_multiple_strong_etag_not_matchÛ  r�  z-CacheTest.test_multiple_strong_etag_not_matchc                 C   r•  )NrŸ  ú
W/"xyzzy1"rK  r˜  rš  r6   r6   r7   Útest_weak_etag_matchà  r�  zCacheTest.test_weak_etag_matchc                 C   r•  )Nú"xyzzy2"úW/"xyzzy1", W/"xyzzy2"rK  r˜  rš  r6   r6   r7   Útest_multiple_weak_etag_matchå  r�  z'CacheTest.test_multiple_weak_etag_matchc                 C   r•  )Nr¦  r¤  r²   r˜  rš  r6   r6   r7   Útest_weak_etag_not_matchê  r�  z"CacheTest.test_weak_etag_not_matchc                 C   r•  )Nz"xyzzy3"r§  r²   r˜  rš  r6   r6   r7   Ú!test_multiple_weak_etag_not_matchï  r�  z+CacheTest.test_multiple_weak_etag_not_matchc                 C   s(   | j d| d|id�}|  |j|¡ d S )Nz/etag/rQ  r÷   rá  )r?   r‘  r›  r	  r¾   r6   r6   r7   r™  ô  s   ÿzCacheTest._test_etagN)rF   rG   rH   r;   rœ  rž  r¡  r¢  r£  r¥  r¨  r©  rª  r™  r6   r6   r6   r7   r�  ¼  s    
r�  c                   @   rÜ  )ÚRequestSummaryTestc                   @   rO   )zRequestSummaryTest.Handlerc                 C   s   d | j _|  |  ¡ ¡ d S r/   )rN  Ú	remote_ipr›   rw  r>   r6   r6   r7   rV   ý  s   zRequestSummaryTest.Handler.getNrX   r6   r6   r6   r7   rM   ü  rY   rM   c                 C   r×  )NrK   s   GET / (None)rù   r¶  r6   r6   r7   Útest_missing_remote_ip  ré  z)RequestSummaryTest.test_missing_remote_ipN)rF   rG   rH   r   rM   r­  r6   r6   r6   r7   r«  û  ra  r«  c                   @   rO   )ÚHTTPErrorTestc                 C   sF   t ddd�}t |¡}|  ||¡ |  |j|j¡ |  |j|j¡ d S )Nr‹  zGo awayrò  )r   r–   ÚassertIsNotru   r	  rñ  )r?   rÛ   Úe2r6   r6   r7   Ú	test_copy
  s
   
zHTTPErrorTest.test_copyN)rF   rG   rH   r±  r6   r6   r6   r7   r®  	  rY   r®  c                   @   rO   )ÚApplicationTestc                 C   s"   t g ƒ}|jddd�}| ¡  d S )Nr   r7  )Úaddress)r   ÚlistenrH  )r?   r=   Úserverr6   r6   r7   Útest_listen  s   zApplicationTest.test_listenN)rF   rG   rH   r¶  r6   r6   r6   r7   r²    rY   r²  c                   @   ri   )ÚURLSpecReverseTestc                 C   s0   |   dtdd ƒ ¡ ¡ |   dtdd ƒ ¡ ¡ d S )Nz/favicon.icoz/favicon\.icoz^/favicon\.ico$©ru   r#   Úreverser>   r6   r6   r7   Útest_reverse  rÜ  zURLSpecReverseTest.test_reversec              	   C   sN   dg}|D ]}t |d ƒ}z| ¡ }|  d||f ¡ W q ty$   Y qw d S )Nz^/api/v\d+/foo/(\w+)$z<did not get expected exception when reversing %s. result: %s)r#   r¹  rÑ  r¢  )r?   Úpathsr1   Ú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\.pngru  r¸  r>   r6   r6   r7   Útest_reverse_arguments0  s   ÿþz)URLSpecReverseTest.test_reverse_argumentsN)rF   rG   rH   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   rå  )NrÀ  Fr)  rà  r,  rÁ  rã  r½   r6   r6   r7   Útest_basic_redirectB  rç  z'RedirectHandlerTest.test_basic_redirectc                 C   rå  )Nz/src?foo=barFr)  rà  r,  z/dst?foo=barrã  r½   r6   r6   r7   Útest_redirect_with_argumentG  rç  z/RedirectHandlerTest.test_redirect_with_argumentc                 C   rå  )Nz/src2?foo2=bar2Fr)  rà  r,  z/dst2?foo=bar&foo2=bar2rã  r½   r6   r6   r7   Ú%test_redirect_with_appending_argumentL  rç  z9RedirectHandlerTest.test_redirect_with_appending_argumentc                 C   rå  )Nz/a/b/cFr)  rà  r,  z/b/a/crã  r½   r6   r6   r7   Útest_redirect_patternQ  rç  z)RedirectHandlerTest.test_redirect_patternN)rF   rG   rH   r;   rÂ  rÃ  rÄ  rÅ  r6   r6   r6   r7   r¿  :  s    r¿  )œÚtornado.concurrentr   Útornador   Útornado.escaper   r   r   r   r   r	   Útornado.httpclientr
   Útornado.httputilr   Útornado.iostreamr   r   Útornado.locksr   Útornado.logr   r   Útornado.simple_httpclientr   Útornado.templater   Útornado.testingr   r   r   r   Útornado.utilr   r   Útornado.webr   r   r   r   rÆ  r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r~   rÖ  r–   r  Úemail.utilsr  r÷  Úior.   r@  rÿ   r0   r€   r;  rT  r‘  Úurllib.parserì  r8   r:   rJ   rP   rZ   ÚTestCaserj   rŠ   rš   rÁ   r  r&  r/  r6  rJ  rW  rd  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+  r3  rQ  r:  r=  rO  rQ  r\  rb  rj  rŠ  r‘  rš  rŸ  r¤  r§  r«  r®  r±  r¹  rÏ  ÚobjectrØ  rî  rô  r÷  r  r  rO  r|  r  r…  r�  r«  r®  r²  r·  r¿  r6   r6   r6   r7   Ú<module>   sò     T5/1 0,
  	B  [C*":/.\b
Mÿ
ÿ; + L!?	!