
    [4%e,                    
   d dl mZ d dlmZ d dlmZmZmZmZm	Z	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZmZ d d
lmZ d dlmZ d dlmZmZmZmZ d dl m!Z! d dl"m#Z#m$Z$ d dl%m&Z&m'Z'm(Z(m)Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9 d dl:Z:d dl;Z;d dl<Z<d dl=Z=d dl>Z?d dl@Z@d dlAmBZB d dlCZCd dlDZDd dlEZEd dlFZFd dlGZGd dlHZHd dlIZId dlJZKd ZL G d de          ZM G d deM          ZN G d de'          ZO G d de'          ZP G d deIjQ                  ZR G d deIjQ                  ZS G d d eM          ZT G d! d"eM          ZU G d# d$e'          ZV G d% d&eM          ZW G d' d(e'          ZX G d) d*eM          ZY G d+ d,e'          ZZ G d- d.eM          Z[ G d/ d0e'          Z\ G d1 d2e'          Z] G d3 d4e'          Z^ G d5 d6e'          Z_ G d7 d8e'          Z` G d9 d:e'          Za G d; d<e'          Z) G d= d>e'          Zb G d? d@e'          Zc G dA dBe'          Zd G dC dDe'          Ze G dE dFeM          Zf G dG dHeM          Zg G dI dJeM          Zh G dK dLeM          Zi G dM dNeM          Zj G dO dPeM          Zk G dQ dReM          Zl G dS dTeM          Zm G dU dVeM          Zn G dW dXeM          Zo G dY dZeN          Zp G d[ d\eN          Zq G d] d^eN          Zr G d_ d`eN          Zs G da dbeN          Zt G dc ddeN          Zu G de dfeM          Zv G dg dheN          Zw G di djeM          Zx G dk dleN          Zy G dm dnez          Z{ G do dpeN          Z| G dq dreN          Z} G ds dteN          Z~ G du dveN          Z G dw dxeN          Z G dy dzeM          Z G d{ d|eN          Z G d} d~eN          Z G d deN          Z G d deN          Z G d deN          Z G d deM          Z G d deM          Z G d deM          Z G d deM          Z G d deM          Ze6 G d de'                      Z G d de          Z G d deeM          Z G d deeM          Z G d deN          Z G d deN          Z G d deIjQ                  Z G d deN          Z G d deN          Z G d deN          Z G d deN          Z G d deM          Z G d deM          Z G d deN          Z G d deIjQ                  Z G d de          Z G d deIjQ                  Z G d deM          Z G d deM          ZdS )    )Future)gen)json_decodeutf8
to_unicoderecursive_unicode
native_strto_basestring)HTTPClientError)format_timestamp)IOStream)locale)Event)app_loggen_logSimpleAsyncHTTPClient
DictLoader)AsyncHTTPTestCaseAsyncTestCase	ExpectLoggen_test)ignore_deprecation)
ObjectDictunicode_type)ApplicationRequestHandlerStaticFileHandlerRedirectHandler	HTTPErrorMissingArgumentErrorErrorHandlerauthenticatedurl_create_signature_v1create_signed_valuedecode_signed_valueget_signature_key_versionUIModuleFinishstream_request_bodyremoveslashaddslashGZipContentEncodingN)BytesIOc                  t    t          j        j        t           j                            t                    g| R  S N)ospathjoindirname__file__)as    5lib/python3.11/site-packages/tornado/test/web_test.pyrelpathr:   =   s*    7<116A6666    c                   $    e Zd ZdZd Zd Zd ZdS )WebTestCasezBase 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                 |    t          |                                 fi |                                 | _        | j        S r2   )r   get_handlersget_app_kwargsappselfs    r9   get_appzWebTestCase.get_appH   s8    t0022LLd6I6I6K6KLLxr;   c                     t                      r2   NotImplementedErrorrB   s    r9   r?   zWebTestCase.get_handlersL   s    !###r;   c                     i S r2    rB   s    r9   r@   zWebTestCase.get_app_kwargsO       	r;   N)__name__
__module____qualname____doc__rD   r?   r@   rI   r;   r9   r=   r=   A   sK           $ $ $    r;   r=   c                       e Zd ZdZdZd ZdS )SimpleHandlerTestCasezSimplified base class for tests that work with a single handler class.

    To use, define a nested class named ``Handler``.
    Nc                     d| j         fgS )N/HandlerrB   s    r9   r?   z"SimpleHandlerTestCase.get_handlers[   s    dl#$$r;   )rK   rL   rM   rN   rT   r?   rI   r;   r9   rP   rP   S   s4         
 G% % % % %r;   rP   c                       e Zd Zd ZdS )HelloHandlerc                 0    |                      d           d S NhellowriterB   s    r9   getzHelloHandler.get`   s    

7r;   NrK   rL   rM   r\   rI   r;   r9   rV   rV   _   s#            r;   rV   c                   $    e Zd ZddZd ZddZdS )CookieTestRequestHandler
0123456789Nc                     i | _         |%t          t          |                    | _        d S t          t          ||                    | _        d S )N)cookie_secret)settingsrb   key_version)_cookiesr   dictapplication)rC   rb   re   s      r9   __init__z!CookieTestRequestHandler.__init__f   si    )M:::     D  *M{SSS     Dr;   c                 6    | j                             |          S r2   )rf   r\   )rC   names     r9   
get_cookiez#CookieTestRequestHandler.get_cookier   s    }  &&&r;   c                     || j         |<   d S r2   )rf   )rC   rk   valueexpires_dayss       r9   
set_cookiez#CookieTestRequestHandler.set_cookieu   s    #dr;   )r`   Nr2   )rK   rL   rM   ri   rl   rp   rI   r;   r9   r_   r_   d   sK        
 
 
 
' ' '$ $ $ $ $ $r;   r_   c                        e Zd Zd Zd Zd ZdS )SecureCookieV1Testc                     t                      }|                    ddd           |                     |                    dd          d           d S )Nfoo   bar   versionmin_versionr_   set_signed_cookieassertEqualget_signed_cookierC   handlers     r9   test_round_tripz"SecureCookieV1Test.test_round_trip{   W    *,,!!%!;;;225a2HH&QQQQQr;   c           	         t                      }|                    dt          j        d          d           |j        d         }t          j        d|          }|J |                    d          }|                    d          }|                     t          |j
        j        d         dd|          |           |                     t          |j
        j        d         dd	d
|z             |           t          dt          |          dt          |                    |j        d<   t          t          d          5  |                     |                    dd          d u            d d d            d S # 1 swxY w Y   d S )Nrt   s   d76df8e7aefcrv   rw   s   12345678\|([0-9]+)\|([0-9a-f]+)   rb   123456781234s   5678z	1234|5678|zCookie timestamp in futurery   )r_   r|   binasciia2b_hexrf   rematchgroupr}   r&   rh   rc   r   r
   r   r   
assertTruer~   )rC   r   cookier   	timestampsigs         r9   &test_cookie_tampering_future_timestampz9SecureCookieV1Test.test_cookie_tampering_future_timestamp   s   *,,!!%)9/)J)JTU!VVV!%(<fEE   KKNN	kk!nn #,_=	  	
 	
 	
 	 #,_=)#	  	
 	
 	
 #'$ -i 8 8 8 8-:L:L:LM#
 #
 w <== 	U 	UOOG55e5KKtSTTT	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	Us   -E>>FFc                     t                      }|                    ddd           |                     |                    dd          d           d S )Nrt      rv   rw   ry   r{   r   s     r9   test_arbitrary_bytesz'SecureCookieV1Test.test_arbitrary_bytes   sY     +,,!!%!!<<<225a2HH'RRRRRr;   N)rK   rL   rM   r   r   r   rI   r;   r9   rr   rr   z   sM        R R R
$U $U $ULS S S S Sr;   rr   c                   6    e Zd ZdddZd Zd Zd Zd Zd Zd	S )
SecureCookieV2Testajklasdf0ojaisdfaslkjasaolwkjsdf)r   rv   c                     t                      }|                    ddd           |                     |                    dd          d           d S )Nrt   ru   r   rw   ry   r{   r   s     r9   r   z"SecureCookieV2Test.test_round_trip   r   r;   c                     t          | j        d          }|                    dd           |                     |                    d          d           d S )Nr   rd   rt   ru   r_   KEY_VERSIONSr|   r}   r~   r   s     r9   test_key_version_roundtripz-SecureCookieV2Test.test_key_version_roundtrip   `    *+
 
 
 	!!%000225996BBBBBr;   c                     t          | j        d          }|                    dd           |                     |                    d          d           d S )Nrv   rd   rt   ru   r   r   s     r9   ,test_key_version_roundtrip_differing_versionz?SecureCookieV2Test.test_key_version_roundtrip_differing_version   r   r;   c                     t          | j        d          }|                    dd           t          | j        d          }|j        |_        |                     |                    d          d           d S Nr   rd   rt   ru   rv   )r_   r   r|   rf   r}   r~   )rC   r   new_handlers      r9   "test_key_version_increment_versionz5SecureCookieV2Test.test_key_version_increment_version   s    *+
 
 
 	!!%000.+
 
 
  '/66u==vFFFFFr;   c                 F   t          | j        d          }|                    dd           | j                                        }|                    d           t          |d          }|j        |_        |                     |                    d          d            d S r   )r_   r   r|   copypoprf   r}   r~   )rC   r   new_key_versionsr   s       r9   #test_key_version_invalidate_versionz6SecureCookieV2Test.test_key_version_invalidate_version   s    *+
 
 
 	!!%000,1133Q.*
 
 
  '/66u==tDDDDDr;   N)	rK   rL   rM   r   r   r   r   r   r   rI   r;   r9   r   r      s~        ).@AALR R R
C C CC C C	G 	G 	GE E E E Er;   r   c                   *    e Zd ZdZd Zd Zd Zd ZdS )FinalReturnTestNc                 l    |  G fddt                     } G fddt                     }d|fd|fgS )Nc                   X    e Zd Zej         fd            Zej         fd            ZdS )3FinalReturnTest.get_handlers.<locals>.FinishHandlerc              3   P   K   |                                  _        j        V  d S r2   )finishfinal_returnrC   tests    r9   r\   z7FinalReturnTest.get_handlers.<locals>.FinishHandler.get   s,      $(KKMM!''''''r;   c              3      K   |                      d           |                                 V  |                     d          _        j        V  d S )Nzhello,world)r[   flushr   r   r   s    r9   postz8FinalReturnTest.get_handlers.<locals>.FinishHandler.post   sV      

8$$$jjll"""$(KK$8$8!''''''r;   N)rK   rL   rM   r   	coroutiner\   r   r   s   r9   FinishHandlerr      sa        ]( ( ( ( ]( ]( ( ( ( ]( ( (r;   r   c                   :    e Zd Zd Zej         fd            ZdS )3FinalReturnTest.get_handlers.<locals>.RenderHandlerc                 $    t          ddi          S )Nfoo.htmlhir   rC   r4   s     r9   create_template_loaderzJFinalReturnTest.get_handlers.<locals>.RenderHandler.create_template_loader   s    !:t"4555r;   c                 <    |                      d          _        d S Nr   )renderr   r   s    r9   r\   z7FinalReturnTest.get_handlers.<locals>.RenderHandler.get   s    $(KK
$;$;!!!r;   N)rK   rL   rM   r   r   r   r\   r   s   r9   RenderHandlerr      sK        6 6 6 ]< < < < ]< < <r;   r   /finish/renderr   )rC   r   r   r   s      @r9   r?   zFinalReturnTest.get_handlers   s    	( 	( 	( 	( 	( 	( 	(N 	( 	( 	(	< 	< 	< 	< 	< 	< 	<N 	< 	< 	< M*Y,FGGr;   c                 "    t          d          S )Nr   )template_pathrg   rB   s    r9   r@   zFinalReturnTest.get_app_kwargs   s    "34444r;   c                 H   |                      |                     d                    }|                     |j        d           |                     | j        t                     |                     | j                                                   |                      |                     d          dd          }|                     |j        d           |                     | j        t                     |                     | j                                                   d S )Nr      POSTr;   methodbody)	fetchget_urlr}   codeassertIsInstancer   r   r   donerC   responses     r9    test_finish_method_return_futurez0FinalReturnTest.test_finish_method_return_future   s    ::dll95566,,,d/888)..00111::dll955f3:OO,,,d/888)..0011111r;   c                     |                      |                     d                    }|                     |j        d           |                     | j        t                     d S )Nr   r   )r   r   r}   r   r   r   r   r   s     r9    test_render_method_return_futurez0FinalReturnTest.test_render_method_return_future	  sV    ::dll95566,,,d/88888r;   )rK   rL   rM   r   r?   r@   r   r   rI   r;   r9   r   r      sX        LH H H45 5 5	2 	2 	29 9 9 9 9r;   r   c                   J    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 ZdS )
CookieTestc           
          G d dt                     } G d dt                     } G d dt                     } G d dt                     } G d	 d
t                     } G d dt                     } G d dt                     } G d dt                     } G d dt                     }	d|fd|fd|fd|fd|fd|fd|fd|fd|	fg	S )Nc                       e Zd Zd ZdS )1CookieTest.get_handlers.<locals>.SetCookieHandlerc                     |                      dd           |                      dd           |                      dd           d S )Nstrasdfunicodeqwerbytess   zxcvrp   rB   s    r9   r\   z5CookieTest.get_handlers.<locals>.SetCookieHandler.get  sF     v...	622211111r;   Nr]   rI   r;   r9   SetCookieHandlerr     s#        2 2 2 2 2r;   r   c                       e Zd Zd ZdS )1CookieTest.get_handlers.<locals>.GetCookieHandlerc                 d    |                      dd          }|J |                     |           d S )Nrt   default)rl   r[   )rC   r   s     r9   r\   z5CookieTest.get_handlers.<locals>.GetCookieHandler.get  s9    	::)))

6"""""r;   Nr]   rI   r;   r9   GetCookieHandlerr     s#        # # # # #r;   r   c                       e Zd Zd ZdS )7CookieTest.get_handlers.<locals>.SetCookieDomainHandlerc                 8    |                      dddd           d S )Nunicode_argsblahzfoo.com/foo)domainr4   r   rB   s    r9   r\   z;CookieTest.get_handlers.<locals>.SetCookieDomainHandler.get   s$     yvVVVVVr;   Nr]   rI   r;   r9   SetCookieDomainHandlerr     s(        W W W W Wr;   r   c                       e Zd Zd ZdS )<CookieTest.get_handlers.<locals>.SetCookieSpecialCharHandlerc                     |                      dd           |                      dd           |                      dd           d S )Nequalsa=b	semicolona;bquotea"br   rB   s    r9   r\   z@CookieTest.get_handlers.<locals>.SetCookieSpecialCharHandler.get&  sD    %000U333/////r;   Nr]   rI   r;   r9   SetCookieSpecialCharHandlerr   %  s#        0 0 0 0 0r;   r   c                       e Zd Zd ZdS ):CookieTest.get_handlers.<locals>.SetCookieOverwriteHandlerc                     |                      ddd           |                      ddd           |                      dd           d S )Nr8   bzexample.com)r   cder   rB   s    r9   r\   z>CookieTest.get_handlers.<locals>.SetCookieOverwriteHandler.get,  sN    S???S??? S)))))r;   Nr]   rI   r;   r9   SetCookieOverwriteHandlerr  +  s#        * * * * *r;   r  c                       e Zd Zd ZdS )7CookieTest.get_handlers.<locals>.SetCookieMaxAgeHandlerc                 6    |                      ddd           d S )Nrt   bar
   )max_ager   rB   s    r9   r\   z;CookieTest.get_handlers.<locals>.SetCookieMaxAgeHandler.get4  s     ub99999r;   Nr]   rI   r;   r9   SetCookieMaxAgeHandlerr	  3  s#        : : : : :r;   r  c                       e Zd Zd ZdS )<CookieTest.get_handlers.<locals>.SetCookieExpiresDaysHandlerc                 6    |                      ddd           d S )Nrt   r  r  )ro   r   rB   s    r9   r\   z@CookieTest.get_handlers.<locals>.SetCookieExpiresDaysHandler.get8  s     u2>>>>>r;   Nr]   rI   r;   r9   SetCookieExpiresDaysHandlerr  7  s#        ? ? ? ? ?r;   r  c                       e Zd Zd ZdS )4CookieTest.get_handlers.<locals>.SetCookieFalsyFlagsc                     |                      ddd           |                      ddd           |                      ddd           |                      d	dd           d S )
Nr8   1T)securer  Fr  )httponlyr  r   rB   s    r9   r\   z8CookieTest.get_handlers.<locals>.SetCookieFalsyFlags.get<  sh    S666S777S4888S599999r;   Nr]   rI   r;   r9   SetCookieFalsyFlagsr  ;  s#        : : : : :r;   r  c                       e Zd Zd ZdS )8CookieTest.get_handlers.<locals>.SetCookieDeprecatedArgsc                 8    |                      dddd           d S )Nr8   r  Tr   )HttpOnlypATHr   rB   s    r9   r\   z<CookieTest.get_handlers.<locals>.SetCookieDeprecatedArgs.getC  s"    S4fEEEEEr;   Nr]   rI   r;   r9   SetCookieDeprecatedArgsr  B  s(        F F F F Fr;   r  /set/get/set_domain/special_char/set_overwrite/set_max_age/set_expires_days/set_falsy_flags/set_deprecatedr   )
rC   r   r   r   r   r  r  r  r  r  s
             r9   r?   zCookieTest.get_handlers  s   	2 	2 	2 	2 	2~ 	2 	2 	2	# 	# 	# 	# 	#~ 	# 	# 	#	W 	W 	W 	W 	W^ 	W 	W 	W	0 	0 	0 	0 	0. 	0 	0 	0	* 	* 	* 	* 	* 	* 	* 	*	: 	: 	: 	: 	:^ 	: 	: 	:	? 	? 	? 	? 	?. 	? 	? 	?	: 	: 	: 	: 	:. 	: 	: 	:	F 	F 	F 	F 	Fn 	F 	F 	F %&%&239:8934 "=>!45 78

 
	
r;   c                     |                      d          }|                     t          |j                            d                    g d           d S )Nr   
Set-Cookie)zbytes=zxcv; Path=/zstr=asdf; Path=/zunicode=qwer; Path=/)r   r}   sortedheadersget_listr   s     r9   test_set_cookiezCookieTest.test_set_cookieS  sZ    ::f%%8#,,\::;;NNN	
 	
 	
 	
 	
r;   c                 >   |                      dddi          }|                     |j        d           |                      dddi          }|                     |j        d           |                      dddi          }|                     |j        d           d S )	Nr!  Cookiefoo=barr,  ru   z	foo="bar"z/=exception;   defaultr   r}   r   r   s     r9   test_get_cookiezCookieTest.test_get_cookieZ  s    ::fx.C:DD///::fx.E:FF///::fx.H:II
33333r;   c                     |                      d          }|                     |j                            d          dg           d S )Nr"  r*  z,unicode_args=blah; Domain=foo.com; Path=/foor   r}   r,  r-  r   s     r9   test_set_cookie_domainz!CookieTest.test_set_cookie_domaind  sO    ::m,,%%l33;<	
 	
 	
 	
 	
r;   c                 @   |                      d          }t          |j                            d                    }|                     t          |          d           |                     |d         d           |                     |d         d           |                     |d         d	v |d                    g d
}|D ][\  }}t          j        d|           |                      dd|i          }|                     |j	        t          |                     \d S )Nr#  r*     r   zequals="a=b"; Path=/rv   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!  r0  r2  )r   r+  r,  r-  r}   lenr   loggingdebugr   r   )rC   r   r,  dataheaderexpecteds         r9   test_cookie_special_charz#CookieTest.test_cookie_special_chark  s+   ::o..)22<@@AAWq)))%;<<<%<===AJTTAJ	
 	
 	


 
 
 !% 	< 	<FHM+v...zz&8V2DzEEHX]DNN;;;;	< 	<r;   c                     |                      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-  r}   r+  rC   r   r,  s      r9   test_set_cookie_overwritez$CookieTest.test_set_cookie_overwrite  s]    ::.//"++L997OOm-NO	
 	
 	
 	
 	
r;   c                     |                      d          }|j                            d          }|                     t	          |          dg           d S )Nr%  r*  zfoo=bar; Max-Age=10; Path=/rC  rD  s      r9   test_set_cookie_max_agez"CookieTest.test_set_cookie_max_age  sO    ::n--"++L99+H*IJJJJJr;   c                    |                      d          }|j                            d          }|J t          j        d|          }|J t
          j                                        t          j        d          z   }t          j	        
                    |                                d                   }|J t          j        |d d          }|                     t          ||z
                                            dk                d S )Nr&  r*  z(foo=bar; expires=(?P<expires>.+); Path=/r  daysexpires   )r   r,  r\   r   r   datetimeutcnow	timedeltaemailutils	parsedate	groupdictr   abstotal_secondsrC   r   r?  r   rK  parsedheader_expiress          r9   test_set_cookie_expires_daysz'CookieTest.test_set_cookie_expires_days  s    ::122!%%l33!!!CVLL   #**,,x/Ar/J/J/JJ&&u'8'8'CDD!!!!*F2A2J7W~5DDFFGG"LMMMMMr;   c                    |                      d          }t          |j                            d                    }|                     |d                                         d           |                     |d                                         d           |                     |d                                         d           |                     |d	                                         d
           d S )Nr'  r*  r   za=1; path=/; securerv   zb=1; path=/r   zc=1; httponly; path=/r:  zd=1; path=/)r   r+  r,  r-  r}   lowerrD  s      r9   test_set_cookie_false_flagsz&CookieTest.test_set_cookie_false_flags  s    ::011)22<@@AA 	))++-BCCC))++];;;))++-DEEE))++];;;;;r;   c                     t                      5  |                     d          }d d d            n# 1 swxY w Y   |j                            d          }|                     |d           d S )Nr(  r*  za=b; HttpOnly; Path=/foo)r   r   r,  r\   r}   )rC   r   r?  s      r9   test_set_cookie_deprecatedz%CookieTest.test_set_cookie_deprecated  s    !! 	5 	5zz"344H	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5!%%l33!;<<<<<s   155N)rK   rL   rM   r?   r.  r5  r8  rA  rE  rG  rY  r\  r^  rI   r;   r9   r   r     s        A
 A
 A
F
 
 
4 4 4
 
 
< < <2
 
 
K K K
N N N< < <= = = = =r;   r   c                   0    e Zd Zd Zd Zed             ZdS )AuthRedirectRequestHandlerc                     || _         d S r2   	login_url)rC   rc  s     r9   
initializez%AuthRedirectRequestHandler.initialize  s    "r;   c                     | j         S r2   rb  rB   s    r9   get_login_urlz(AuthRedirectRequestHandler.get_login_url  s
    ~r;   c                 0    |                      d           d S )N  )
send_errorrB   s    r9   r\   zAuthRedirectRequestHandler.get  s     	r;   N)rK   rL   rM   rd  rf  r$   r\   rI   r;   r9   r`  r`    sM        # # #     ]  r;   r`  c                        e Zd Zd Zd Zd ZdS )AuthRedirectTestc                 b    dt           t          d          fdt           t          d          fgS )N	/relativez/loginrb  	/absolutezhttp://example.com/login)r`  rg   rB   s    r9   r?   zAuthRedirectTest.get_handlers  s<    4dX6N6N6NO*9:::
 	
r;   c                     |                      |                     d          d          }|                     |j        d           |                     |j        d         d           d S )Nrm  Ffollow_redirects.  Locationz/login?next=%2Frelative)r   r   r}   r   r,  r   s     r9   test_relative_auth_redirectz,AuthRedirectTest.test_relative_auth_redirect  s`    ::dll;77%:PP,,,)*57PQQQQQr;   c                    |                      |                     d          d          }|                     |j        d           |                     t          j        d|j        d                   |j        d                    d S )Nrn  Frp  rr  zIhttp://example.com/login\?next=http%3A%2F%2F127.0.0.1%3A[0-9]+%2Fabsoluters  )r   r   r}   r   r   r   r   r,  r   s     r9   test_absolute_auth_redirectz,AuthRedirectTest.test_absolute_auth_redirect  s    ::dll;77%:PP,,,H\ ,  Z(	
 	
 	
 	
 	
r;   N)rK   rL   rM   r?   rt  rv  rI   r;   r9   rk  rk    sD        
 
 
R R R
	
 	
 	
 	
 	
r;   rk  c                   :    e Zd Zd Zej        d             Zd ZdS )ConnectionCloseHandlerc                     || _         d S r2   r   r   s     r9   rd  z!ConnectionCloseHandler.initialize  s    			r;   c              #   |   K   | j                                          | j         j                                        V  d S r2   )r   on_handler_waitingcleanup_eventwaitrB   s    r9   r\   zConnectionCloseHandler.get  s=      	$$&&&i%**,,,,,,,r;   c                 8    | j                                          d S r2   )r   on_connection_closerB   s    r9   r  z*ConnectionCloseHandler.on_connection_close  s    	%%'''''r;   N)rK   rL   rM   rd  r   r   r\   r  rI   r;   r9   rx  rx    sO           	]- - ]-( ( ( ( (r;   rx  c                   &    e Zd Zd Zd Zd Zd ZdS )ConnectionCloseTestc                 Z    t                      | _        dt          t          |           fgS )NrR   r   )r   r|  rx  rg   rB   s    r9   r?   z ConnectionCloseTest.get_handlers  s'    "WW,dooo>??r;   c                    t          j         t           j        t           j        d          }|                    d|                                 f           t          |          | _        | j                            d           |                                  | j	        
                                 | j                            d            d S )Nr   	127.0.0.1s   GET / HTTP/1.0

c                  *    t          j        d          S Nr   )r   sleeprI   r;   r9   <lambda>z;ConnectionCloseTest.test_connection_close.<locals>.<lambda>  s    cill r;   )socketAF_INETSOCK_STREAMconnectget_http_portr   streamr[   r}  r|  setio_looprun_sync)rC   ss     r9   test_connection_closez)ConnectionCloseTest.test_connection_close  s    M&.&*<a@@			; 2 2 4 45666qkk3444		   2233333r;   c                 `    t          j        d           | j                                         d S )Nzhandler waiting)r<  r=  r  closerB   s    r9   r{  z&ConnectionCloseTest.on_handler_waiting  s-    '(((r;   c                 V    t          j        d           |                                  d S )Nzconnection closed)r<  r=  stoprB   s    r9   r  z'ConnectionCloseTest.on_connection_close  s$    )***		r;   N)rK   rL   rM   r?   r  r{  r  rI   r;   r9   r  r    sS        @ @ @4 4 4      r;   r  c                       e Zd Zd ZdS )EchoHandlerc           	         | j         j        D ]}t          |          t          k    rt	          dt          |          z            | j         j        |         D ]9}t          |          t
          k    rt	          dt          |          z            :|                     |          D ]9}t          |          t          k    rt	          dt          |          z            :|D ]9}t          |          t          k    rt	          dt          |          z            :|                     t          | j         j
        |t          | j         j                                       d S )Nzincorrect type for key: %rzincorrect type for value: %rzincorrect type for path arg: %rr4   	path_argsargs)request	argumentstyper   	Exceptionr   get_argumentsr   r[   rg   r4   r   )rC   r  keybvaluesvalueargs         r9   r\   zEchoHandler.get  su   
 <) 	S 	SCCyyC <tCyy HIII,05 S S<<5((#$BT&\\$QRRR ),,S11 S S<<<//#$BT&\\$QRRR 0S  	O 	OCCyyL(( ADII MNNN )

\&#&t|'=>>  	
 	
 	
 	
 	
r;   Nr]   rI   r;   r9   r  r    s#        
 
 
 
 
r;   r  c                   2    e Zd Zd Zd Zd Zd Zd Zd ZdS )RequestEncodingTestc                 &    dt           fdt           fgS )Nz/group/(.*)z/slashes/([^/]*)/([^/]*))r  rB   s    r9   r?   z RequestEncodingTest.get_handlers  s    ,/I;.WXXr;   c                 P    t          |                     |          j                  S r2   )r   r   r   r   s     r9   
fetch_jsonzRequestEncodingTest.fetch_json  s    4::d++0111r;   c           	          |                      |                     d          t          ddgi                      |                      |                     d          t          ddgddgi                     d S )Nz
/group/%3F?r  z/group/%3F?%3F=%3Fr}   r  rg   rB   s    r9   test_group_question_markz,RequestEncodingTest.test_group_question_mark  s    OOL))lse"===	
 	
 	
 	OO011lse3,GGG	
 	
 	
 	
 	
r;   c                 h    |                      |                     d          ddgddgid           d S )Nz/group/%C3%A9?arg=%C3%A9z/group/%C3%A9   ér  r  r}   r  rB   s    r9   test_group_encodingz'RequestEncodingTest.test_group_encoding)  sP    OO677'&Z
+ 	
 	
 	
 	
 	
r;   c                     |                      |                     d          t          dddgi                      |                      |                     d          t          dddgi                      d S )Nz/slashes/foo/barrt   r  r  z/slashes/a%2Fb/c%2Fdza/bzc/dr  rB   s    r9   test_slashesz RequestEncodingTest.test_slashes4  s     	OO.//(UENLLL	
 	
 	
 	OO233,RPPP	
 	
 	
 	
 	
r;   c                     t          t          d          5  |                     d           d d d            d S # 1 swxY w Y   d S )Nz.*Invalid unicodez/group/?arg=%25%e9)r   r   r   rB   s    r9   
test_errorzRequestEncodingTest.test_error@  s     w 344 	- 	-JJ+,,,	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-   9= =N)	rK   rL   rM   r?   r  r  r  r  r  rI   r;   r9   r  r    sq        Y Y Y2 2 2	
 	
 	
	
 	
 	


 

 

- - - - -r;   r  c                   &    e Zd Zd Zd Zd Zd ZdS )TypeCheckHandlerc                    i | _         |                     d|                                 t                     |                     d|                     d          t
                     |                     dt          | j                                                  d         t                     |                     dt          | j        
                                          d         j        t                     t          | j                                                  dgk    r)t          d| j                                        z            |                     d	|                     d          t                     |                     d
|                     d          t                     |                     d| j        t                     |                     d|                                 t                     |                     d|                     dd          t                     |                     d|                                 t                     d S )Nstatusargumentrt   
cookie_keyr   cookie_valuer   z%unexpected values for cookie keys: %rr~   rl   
xsrf_tokenxsrf_form_htmlreverse_url	typecheckrequest_summary)errors
check_type
get_statusintget_argumentr   listcookieskeysr   valuesrn   r  r~   r   rl   r  r  r  _request_summaryrB   s    r9   preparezTypeCheckHandler.prepareH  s   $//"3"3S999 	
D$5$5e$<$<lKKKd4<+<+<+>+>&?&?&BCHHHT\-@-@-B-B(C(CA(F(LcRRR !!##$$007$,:K:K:M:MM   	+T-C-CF-K-KUSSSdoof&=&=sCCCdou===($*=*=*?*?EEEt'7'7U'K'KSQQQ)4+@+@+B+BCHHHHHr;   c                 r    |                      d|t                     |                     | j                   d S Npath_componentr  r   r[   r  rC   r  s     r9   r\   zTypeCheckHandler.getc  s5     	(.,GGG

4;r;   c                 r    |                      d|t                     |                     | j                   d S r  r  r  s     r9   r   zTypeCheckHandler.posti  s3    (.,GGG

4;r;   c                 T    t          |          }||k    rd|d|| j        |<   d S d S )Nz	expected z, got )r  r  )rC   rk   objexpected_typeactual_types        r9   r  zTypeCheckHandler.check_typem  s@    3iiK'''9F TDK ('r;   N)rK   rL   rM   r  r\   r   r  rI   r;   r9   r  r  G  sX        I I I6          U U U U Ur;   r  c                       e Zd ZddZd ZdS )DecodeArgHandlerNc                     t          |          t          k    rt          dt          |          z            d| j        j        v r8|                    t          | j        j        d         d                             S |S )Nzunexpected type for value: %rencodingr   )r  r   r  r  r  decoder   )rC   rn   rk   s      r9   decode_argumentz DecodeArgHandler.decode_argumentt  sk    ;;%;d5kkIJJJ///<<
4<+A*+Ma+P Q QRRRLr;   c                     d }|                       ||           ||                     d                    d           d S )Nc                     t          |           t          k    r#dt          t          j        |                     gS t          |           t
          k    rd| gS t          d          )Nr   r   zunknown type)r  r   r	   r   b2a_hexr   r  )r  s    r9   describez&DecodeArgHandler.get.<locals>.describe~  sZ    Aww%H,<Q,?,?!@!@AAaL((!1~%N+++r;   rt   r4   query)r[   r  )rC   r  r  s      r9   r\   zDecodeArgHandler.get}  sS    	, 	, 	, 	

HHSMMHHT=N=Nu=U=U4V4VWWXXXXXr;   r2   )rK   rL   rM   r  r\   rI   r;   r9   r  r  s  s<           Y Y Y Y Yr;   r  c                       e Zd Zd ZdS )LinkifyHandlerc                 4    |                      dd           d S )Nlinkify.htmlzhttp://example.com)messager   rB   s    r9   r\   zLinkifyHandler.get  s    N,@AAAAAr;   Nr]   rI   r;   r9   r  r    s(        B B B B Br;   r  c                       e Zd Zd ZdS )UIModuleResourceHandlerc                 8    |                      dddg           d S )N	page.htmlrv   r   )entriesr  rB   s    r9   r\   zUIModuleResourceHandler.get  s"    K!Q00000r;   Nr]   rI   r;   r9   r  r    s#        1 1 1 1 1r;   r  c                       e Zd Zd ZdS )OptionalPathHandlerc                 4    |                      d|i           d S )Nr4   rZ   r   s     r9   r\   zOptionalPathHandler.get  s    

FD>"""""r;   Nr]   rI   r;   r9   r  r    s#        # # # # #r;   r  c                       e Zd Zd ZdS )MultiHeaderHandlerc                     |                      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_headerrB   s    r9   r\   zMultiHeaderHandler.get  sX    s+++q)))	1%%%	3'''''r;   Nr]   rI   r;   r9   r  r    s#        ( ( ( ( (r;   r  c                       e Zd Zd ZdS )r    c           
      v   |                      dd           F|                     dt          t          |                      d                                         d S |                      dd           9|                     dt          |                      d                               d S t	          d          )N	permanentrR   )r  r  )r  z(didn't get permanent or status arguments)r  redirectboolr  r  rB   s    r9   r\   zRedirectHandler.get  s    [$//;MM#c$2C2CK2P2P.Q.Q)R)RMSSSSSx..:MM#c$*;*;H*E*E&F&FMGGGGGFGGGr;   Nr]   rI   r;   r9   r    r      s(        H H H H Hr;   r    c                   .    e Zd Zej        d             ZdS )EmptyFlushCallbackHandlerc              #     K   |                                  V  |                                  V  |                     d           |                                  V  |                                  V  |                     d           d S )Nok)r   r[   r   rB   s    r9   r\   zEmptyFlushCallbackHandler.get  s      
 jjlljjll

3jjlljjllCr;   N)rK   rL   rM   r   r   r\   rI   r;   r9   r  r    s/        ]	 	 ]	 	 	r;   r  c                       e Zd Zd ZdS )HeaderInjectionHandlerc                     	 |                      dd           t          d          # t          $ r3}dt          |          v r|                     d           n Y d }~d S d }~ww xY w)NzX-Foozfoo
X-Bar: bazzDidn't get expected exceptionzUnsafe header value   ok)r  r  
ValueErrorr   r   rC   r  s     r9   r\   zHeaderInjectionHandler.get  s    	OOG%8999;<<< 	 	 	$A..E"""" #"""""	s   %' 
A$(AA$Nr]   rI   r;   r9   r  r    s#            r;   r  c                       e Zd Zd ZdS )GetArgumentHandlerc                     |                      dd           dk    r| j        }n)|                      dd           dk    r| j        }n| j         }|                      |dd                     d S )Nsourcer  r   rt   r   )r  get_query_argumentget_body_argumentr   rC   r   s     r9   r  zGetArgumentHandler.prepare  sx    Xt,,77,FFx..&88+FF&FFF5),,-----r;   NrK   rL   rM   r  rI   r;   r9   r  r    s#        . . . . .r;   r  c                       e Zd Zd ZdS )GetArgumentsHandlerc           	          |                      t          |                     d          |                     d          |                     d                               d S )Nrt   r   r  r   )r   rg   r  get_query_argumentsget_body_argumentsrB   s    r9   r  zGetArgumentsHandler.prepare  sg    **511..u55,,U33  	
 	
 	
 	
 	
r;   Nr  rI   r;   r9   r  r    s#        
 
 
 
 
r;   r  c                        e Zd ZdZd Z fdZd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z xZS )WSGISafeWebTestzWebTest.COOKIE_SECRETc                 V    t          dddd          }t          |d| j                  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
autoescaperb   )r   rg   COOKIE_SECRET)rC   loaders     r9   r@   zWSGISafeWebTest.get_app_kwargs  sM     ?  
 
& "%,
 
 
 	
r;   c                     t                                                       t          j                                         d S r2   supertearDownr   _template_loadersclearrC   	__class__s    r9   r%  zWSGISafeWebTest.tearDown  4    (..00000r;   c                 V   t          dt          d          t          dt          d          t          dt                    t          dt                    t          dt                    t          d	t
                    t          d
t                    t          dt                    t          dt          ddi          t          dt          ddd          t          dt          ddi          t          dt                    t          dt                    t          dt                    g}|S )Nz/typecheck/(.*)r  )rk   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%   r  r  r  r  r  r  r    WebRedirectHandlerr  r  r  )rC   urlss     r9   r?   zWSGISafeWebTest.get_handlers  s   !#3+FFF"$4<HHH,.>??
N++%'>??&(;<<!344_--)"/0 
 "/eDD 
 -"/0 
 #%;<<!344 "5665
8 r;   c                 l     | j         |i |}|                                 t          |j                  S r2   )r   rethrowr   r   )rC   r  kwargsr   s       r9   r  zWSGISafeWebTest.fetch_json  s:    4:t.v..8=)))r;   c                    t          t          | j        dd                    }|                     ddd|z   i          }t	          |j                  }|                     |i            |                     dddd|z   id	          }d S )
Nr   r   z/typecheck/asdf?foo=barr0  zasdf=r2  r   r1  r   r,  r   )r   r'   r   r   r   r   r}   )rC   r  r   r>  s       r9   
test_typeszWSGISafeWebTest.test_types  s    ! 2FFCC
 
 ::%'L:P/Q  
 
 8=))r"""::%w56	  
 
r;   c                    g d}|D ]\}|                      |          }|                                 t          |j                  }|                     |ddgddgd           ]|                      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   r9  r   r   r}   rC   r7  req_urlr   r>  s        r9   test_decode_argumentz$WSGISafeWebTest.test_decode_argument0  s    
 
 

  	 	Gzz'**Hx}--D#X.)X9NOO   
 ::=>>8=))&(9WfDUVVWWWWWr;   c                 "   t          t          d          5  |                     d          }|                     |j        d           |                     d          }|                     |j        d           d d d            d S # 1 swxY w Y   d S )Nz.*Invalid unicode.*z/typecheck/invalid%FFi  z/typecheck/invalid?foo=%FFr   r   r   r}   r   r   s     r9   $test_decode_argument_invalid_unicodez4WSGISafeWebTest.test_decode_argument_invalid_unicodeE  s    w 566 	1 	1zz"9::HX]C000zz">??HX]C000		1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1s   A!BBBc                     ddg}|D ]\}|                      |          }|                                 t          |j                  }|                     |ddgddgd           ]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@  rA  s        r9   test_decode_argument_plusz)WSGISafeWebTest.test_decode_argument_plusM  s     E>
  	 	Gzz'**Hx}--D#W-G8LMM   		 	r;   c                    |                      | j                            dd          d           |                      | j                            dd          d           |                      | j                            dd          d           |                      | j                            dd          d	           |                      | j                            dd
          d           d S )Nr,  rt   z/decode_arg/foo*   z/decode_arg/42r   z/decode_arg/%E9r  z/decode_arg/%C3%A9rH  z/decode_arg/1%20%2B%201)r}   rA   r  rB   s    r9   test_reverse_urlz WSGISafeWebTest.test_reverse_url\  s    --lEBBDUVVV--lB??AQRRR--lGDDFWXXXH  x88:N	
 	
 	
 	H  w779R	
 	
 	
 	
 	
r;   c                 f    |                      d          }|                     |j        d           d S )Nr-  s3   <a href="http://example.com">http://example.com</a>r4  r   s     r9   test_uimodule_unescapedz'WSGISafeWebTest.test_uimodule_unescapedg  s=    ::j))MQ	
 	
 	
 	
 	
r;   c                 f    |                      d          }|                     |j        d           d S )Nr.  s  <html><head><link href="/base.css" type="text/css" rel="stylesheet"/><link href="/foo.css" type="text/css" rel="stylesheet"/>
<style type="text/css">
.entry { margin-bottom: 1em; }
</style>
<meta>
</head><body>


<div class="entry">...</div>


<div class="entry">...</div>

<script src="/common.js" type="text/javascript"></script>
<script type="text/javascript">
//<![CDATA[
js_embed()
//]]>
</script>
<script src="/analytics.js"/>
</body></html>r4  r   s     r9   test_uimodule_resourcesz'WSGISafeWebTest.test_uimodule_resourcesm  s@    ::344M	
 	
 	
 	
 	
r;   c                     |                      |                     d          ddi           |                      |                     d          dd i           d S )Nz/optional_path/foor4   rt   z/optional_path/r  rB   s    r9   test_optional_pathz"WSGISafeWebTest.test_optional_path  sV    )=>>PPP):;;fd^LLLLLr;   c                     |                      d          }|                     |j        d         d           |                     |j                            d          ddg           d S )Nr/  r  2r  3r  r7  r   s     r9   test_multi_headerz!WSGISafeWebTest.test_multi_header  sb    ::o..)-8#>>>)229==SzJJJJJr;   c                 2   |                      dd          }|                     |j        d           |                      dd          }|                     |j        d           |                      dd          }|                     |j        d           d S )	Nz/redirect?permanent=1Frp  -  z/redirect?permanent=0rr  z/redirect?status=307i3  r   r}   r   r   s     r9   test_redirectzWSGISafeWebTest.test_redirect  s    ::5:NN,,,::5:NN,,,::4u:MM,,,,,r;   c                 R   |                      dd          }|                     |j        d           |                     |j        d         d           |                      dd          }|                     |j        d           |                     |j        d         d           d S )	Nr0  Frp  rX  rs  r1  r2  rr  r   r}   r   r,  r   s     r9   test_web_redirectz!WSGISafeWebTest.test_web_redirect  s    ::7%:PP,,,)*57NOOO::o:FF,,,)*57NOOOOOr;   c                     |                      dd          }|                     |j        d           |                     |j        d         d           d S )Nr3  Frp  rX  rs  r1  r\  r   s     r9   test_web_redirect_double_slashz.WSGISafeWebTest.test_web_redirect_double_slash  sU    ::;e:TT,,,)*57NOOOOOr;   c                 f    |                      d          }|                     |j        d           d S )Nr4  r	  r4  r   s     r9   test_header_injectionz%WSGISafeWebTest.test_header_injection  s2    ::122.....r;   c                    |                      d          }|                     |j        d           |                      d          }|                     |j        d           |                      d          }|                     |j        d           t          j                            t          d                    }|                      dd	|
          }|                     |j        d           |                      dd	|
          }|                     t          |j                  t          ddgdgdg                     d S )Nz/get_argument?foo=barru   z/get_argument?foo=r;   r5  r3  rY   rt   r   r      helloz/get_arguments?foo=barr  r  )r   r}   r   urllibparse	urlencoderg   r   )rC   r   r   s      r9   test_get_argumentz!WSGISafeWebTest.test_get_argument  s3   ::566///::233,,,::o..
333 |%%dw&7&7&788::5f4:PP111::6vD:QQ&&%)%yIII	
 	
 	
 	
 	
r;   c                    t           j                            t          d                    }|                     dd|          }|                     |j        d           |                     dd|          }|                     |j        d           |                     d	d|          }|                     |j        d
           d S )NrY   rc  z"/get_argument?source=query&foo=barr   r   ru   z/get_argument?source=query&foo=r;   z/get_argument?source=queryr3  re  rf  rg  rg   r   r}   r   rC   r   r   s      r9   test_get_query_argumentsz(WSGISafeWebTest.test_get_query_arguments  s     |%%dw&7&7&788::0d  
 
 	///::-f4  
 
 	,,,:::6PT:UU
33333r;   c                 B   t           j                            t          d                    }|                     dd|          }|                     |j        d           t           j                            t          d                    }|                     dd|          }|                     |j        d           t           j                            t                                }|                     dd|          }|                     |j        d	           d S )
Nr  rc  z#/get_argument?source=body&foo=hellor   r   ru    r;   r3  rj  rk  s      r9   test_get_body_argumentsz'WSGISafeWebTest.test_get_body_arguments  s   |%%duooo66::1&t  
 
 	///|%%drlll33::1&t  
 
 	,,,|%%dff--::1&t  
 
 	
33333r;   c                     |                      d          }|                     d|j                            dd                     |                     d|j                            dd                     d S )Nr5  Accept-EncodingVaryrn  gzipContent-Encoding)r   assertNotInr,  r\   r   s     r9   test_no_gzipzWSGISafeWebTest.test_no_gzip  sm    ::o..*H,<,@,@,L,LMMM!1!5!56H"!M!MNNNNNr;   )rK   rL   rM   r   r@   r%  r?   r  r=  rC  rF  rI  rL  rN  rP  rR  rV  rZ  r]  r_  ra  rh  rl  ro  rv  __classcell__r)  s   @r9   r  r    s       +M
 
 
41 1 1 1 1  >* * *

 
 
"X X X*1 1 1  	
 	
 	

 
 

 
 
8M M MK K K
- - -P P PP P P
/ / /
 
 
(4 4 44 4 4&O O O O O O Or;   r  c                       e Zd Zd Zd ZdS )NonWSGIWebTestsc                     dt           fgS )N/empty_flush)r  rB   s    r9   r?   zNonWSGIWebTests.get_handlers  s    !:;<<r;   c                 f    |                      d          }|                     |j        d           d S )Nr|  r	  r4  r   s     r9   test_empty_flushz NonWSGIWebTests.test_empty_flush  s1    ::n--.....r;   N)rK   rL   rM   r?   r~  rI   r;   r9   rz  rz    s2        = = =/ / / / /r;   rz  c                   &    e Zd Zd Zd Zd Zd ZdS )ErrorResponseTestc                      G d dt                     } G d dt                     } G d dt                     }t          d|          t          d|          t          d	|          gS )
Nc                       e Zd Zd ZdS )6ErrorResponseTest.get_handlers.<locals>.DefaultHandlerc                     |                      dd           r/t          t          |                      d                              ddz   d S Nr  rv   r   )r  r!   r  rB   s    r9   r\   z:ErrorResponseTest.get_handlers.<locals>.DefaultHandler.get  sL    $$Xt44 F#C(9(9((C(C$D$DEEEAr;   Nr]   rI   r;   r9   DefaultHandlerr    s#            r;   r  c                       e Zd Zd Zd ZdS )9ErrorResponseTest.get_handlers.<locals>.WriteErrorHandlerc                     |                      dd           r7|                     t          |                      d                               d S ddz   d S r  )r  ri  r  rB   s    r9   r\   z=ErrorResponseTest.get_handlers.<locals>.WriteErrorHandler.get  sU    $$Xt44 OOC(9(9((C(C$D$DEEEEEEEEEr;   c                     |                      dd           d|v r+|                     d|d         d         j        z             d S |                     d|z             d S )NContent-Type
text/plainexc_infozException: %sr   z
Status: %d)r  r[   rK   rC   status_coder:  s      r9   write_errorzEErrorResponseTest.get_handlers.<locals>.WriteErrorHandler.write_error  sh    ===''JJ
1CA1F1OOPPPPPJJ|k9:::::r;   NrK   rL   rM   r\   r  rI   r;   r9   WriteErrorHandlerr    s2          ; ; ; ; ;r;   r  c                       e Zd Zd Zd ZdS )?ErrorResponseTest.get_handlers.<locals>.FailedWriteErrorHandlerc                     ddz   d S Nrv   r   rI   rB   s    r9   r\   zCErrorResponseTest.get_handlers.<locals>.FailedWriteErrorHandler.get  s    Ar;   c                      t          d          )Nzexception in write_errorr  r  s      r9   r  zKErrorResponseTest.get_handlers.<locals>.FailedWriteErrorHandler.write_error
  s     :;;;r;   Nr  rI   r;   r9   FailedWriteErrorHandlerr    s2          < < < < <r;   r  /default/write_error/failed_write_error)r   r%   )rC   r  r  r  s       r9   r?   zErrorResponseTest.get_handlers  s    	 	 	 	 	^ 	 	 		; 	; 	; 	; 	; 	; 	; 	;	< 	< 	< 	< 	<n 	< 	< 	< 
N++ 122%'>??
 	
r;   c                 *   t          t          d          5  |                     d          }|                     |j        d           |                     d|j        v            |                     d          }|                     |j        d           |                     d|j        v            |                     d          }|                     |j        d	           |                     d
|j        v            d d d            d S # 1 swxY w Y   d S )NUncaught exceptionr  rh  s   500: Internal Server Errorz/default?status=503  s   503: Service Unavailablez/default?status=435i  s   435: Unknown)r   r   r   r}   r   r   r   r   s     r9   test_defaultzErrorResponseTest.test_default  sA   w 455 	> 	>zz*--HX]C000OO9X]JKKKzz"788HX]C000OO78=HIIIzz"788HX]C000OOOx}<===	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	>s   C%DDDc                    t          t          d          5  |                     d          }|                     |j        d           |                     d|j                   |                     d          }|                     |j        d           |                     d|j                   d d d            d S # 1 swxY w Y   d S )Nr  r  rh  s   Exception: ZeroDivisionErrorz/write_error?status=503r  s   Status: 503r   r   r   r}   r   r   r   s     r9   test_write_errorz"ErrorResponseTest.test_write_error!  s    w 455 	< 	<zz.11HX]C000<hmLLLzz";<<HX]C000^X];;;	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	<s   BB::B>B>c                     t          t          d          5  |                     d          }|                     |j        d           |                     d|j                   d d d            d S # 1 swxY w Y   d S )Nr  r  rh  r;   r  r   s     r9   test_failed_write_errorz)ErrorResponseTest.test_failed_write_error+  s    w 455 	1 	1zz"788HX]C000S(-000	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1s   AA//A36A3N)rK   rL   rM   r?   r  r  r  rI   r;   r9   r  r    sQ         
  
  
D> > >< < <1 1 1 1 1r;   r  c                      e Zd ZdZej                            ej                            e          d          Z	d Z
d Zd Zd Zd Zd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$d Z%d Z&d  Z'd! Z(d" Z)d# Z* e+j,        ej-        d$k    d%          d&             Z.d'S )(StaticFileTests   63a36e950e134b5217e33c763e88840c10a07d80e6057d92b9ac97508de7fb1fa6f0e9b7531e169657165ea764e8963399cb6d921ffe6078425aaafe54c04563staticc                      G d dt                     } G d d|          } G d dt                     }d|fd|fd	|fd
t          t          d          fgS )Nc                       e Zd Zd ZdS )5StaticFileTest.get_handlers.<locals>.StaticUrlHandlerc                     t          |                     dd                    }|                     |                     ||                     d S )Ninclude_versionr  )r  )r  r  r[   
static_url)rC   r4   with_vs      r9   r\   z9StaticFileTest.get_handlers.<locals>.StaticUrlHandler.get=  sH    T../@#FFGG

4??4?HHIIIIIr;   Nr]   rI   r;   r9   StaticUrlHandlerr  <  s(        J J J J Jr;   r  c                       e Zd ZdZdS )=StaticFileTest.get_handlers.<locals>.AbsoluteStaticUrlHandlerTN)rK   rL   rM   include_hostrI   r;   r9   AbsoluteStaticUrlHandlerr  A  s        LLLr;   r  c                       e Zd Zd ZdS )=StaticFileTest.get_handlers.<locals>.OverrideStaticUrlHandlerc                    t          |                     d                    }| | _        |                     |          }|                     ||          }||k    r"|                     t          d                    S | j        j        dz   }t          |          }|	                    |d|          }|	                    |d|          }|r|dk    o|dk    }	n|dk    o|dk    }	|                     t          |	                     d S )Nr  )r  Fz://r   )
r   r  r  r  r[   r   r  protocolr;  find)
rC   r4   
do_includeregular_urloverride_urlr  protocol_lengthcheck_regularcheck_overrideresults
             r9   r\   zAStaticFileTest.get_handlers.<locals>.OverrideStaticUrlHandler.getE  s	   !$"3"3N"C"CDD
(2N!"ood33#t*MM;..::c%jj111<058"%h-- + 0 01o N N!-!2!28Q!P!P I+q0H]b5HFF+r1Hmq6HF

3v;;'''''r;   Nr]   rI   r;   r9   OverrideStaticUrlHandlerr  D  s#        ( ( ( ( (r;   r  /static_url/(.*)z/abs_static_url/(.*)z/override_static_url/(.*)z/root_static/(.*)rR   )r4   )r   r   rg   )rC   r  r  r  s       r9   r?   zStaticFileTest.get_handlers;  s    	J 	J 	J 	J 	J~ 	J 	J 	J
	  	  	  	  	 '7 	  	  	 	( 	( 	( 	( 	(~ 	( 	( 	(,  !12#%=>(*BC "3Ts^^^D	
 	
r;   c                 <    t          t          d                    S )Nr  )static_pathrg   r:   rB   s    r9   r@   zStaticFileTest.get_app_kwargs`  s     1 12222r;   c                 &   |                      d          }|                     d|j        v            |                      d          }|                     d|j        v            |                     |j                            d          d           d S )N/robots.txts   Disallow: //static/robots.txtr  r  )r   r   r   r}   r,  r\   r   s     r9   test_static_filesz StaticFileTest.test_static_filesc  s    ::m,,(-7888::233(-7888)--n==|LLLLLr;   c                    |                      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   r}   r,  r\   r   r  r   s     r9   test_static_compressed_filesz+StaticFileTest.test_static_compressed_filesk  s    ::566)--n==?QRRR::677  002L	
 	
 	
 ::233  00C8W4X4XX	
 	
 	
 	
 	
r;   c                 v    |                      d          }|                     |j        d| j        z              d S )Nz/static_url/robots.txts   /static/robots.txt?v=)r   r}   r   robots_txt_hashr   s     r9   test_static_urlzStaticFileTest.test_static_urlx  s;    ::677(@4CW(WXXXXXr;   c                     |                      d          }|                     |j        t          |                     d                    dz   | j        z              d S )Nz/abs_static_url/robots.txtrR   s   static/robots.txt?v=)r   r}   r   r   r   r  r   s     r9   test_absolute_static_urlz'StaticFileTest.test_absolute_static_url|  s`    :::;;M$,,s##$$'>>AUU	
 	
 	
 	
 	
r;   c                 f    |                      d          }|                     |j        d           d S )Nz(/static_url/robots.txt?include_version=0s   /static/robots.txtr4  r   s     r9   test_relative_version_exclusionz.StaticFileTest.test_relative_version_exclusion  s3    ::HII(=>>>>>r;   c                     |                      d          }|                     |j        t          |                     d          dz                        d S )Nz,/abs_static_url/robots.txt?include_version=0rR   static/robots.txt)r   r}   r   r   r   r   s     r9   test_absolute_version_exclusionz.StaticFileTest.test_absolute_version_exclusion  sL    ::LMMT\\#->->AT-T(U(UVVVVVr;   c                 Z    |                      d           |                      d           d S )NFT)_trigger_include_host_checkrB   s    r9   test_include_host_overridez)StaticFileTest.test_include_host_override  s0    ((///((.....r;   c                     d}|                      |t          |          z            }|                     |j        t	          t          d                               d S )Nz//override_static_url/robots.txt?include_host=%sT)r   r  r}   r   r   r   )rC   r  r4   r   s       r9   r  z*StaticFileTest._trigger_include_host_check  sO    @::dS%6%6677SYY88888r;   c                      | j         |ddi|} | j         |ddi|}t                      }t          j        |j        |j                  D ],}|                    d          r|                    |           -|D ]}|                     |j                            |          |j                            |          |d|j                            |          d|j                            |          d           |S )zPerforms 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 differs between GET (z) and HEAD ())	r   r  	itertoolschainr,  
startswithaddr}   r\   )rC   r  r:  head_responseget_responsecontent_headershs          r9   get_and_headzStaticFileTest.get_and_head  s(    #
DBB6BB!tz4@@@@%%!68LMM 	' 	'A||J'' '##A&&&  	 	A%))!,,$((++11m+//2222L4H4L4LQ4O4O4O4OQ    r;   c                     |                      d          }|                      dd|j        d         i          }|                     |j        d           |                     d|j        v           d S )Nr  If-Modified-SinceLast-Modifiedr2  0  Content-Length)r  r,  r}   r   r   rC   	response1	response2s      r9   !test_static_304_if_modified_sincez0StaticFileTest.test_static_304_if_modified_since  s~    %%&:;;	%% ()*;O*LM & 
 
	 	---(	0AABBBBBr;   c                     |                      d          }|                      dd|j        d         i          }|                     |j        d           d S )Nr  If-None-MatchEtagr2  r  r  r,  r}   r   r  s      r9   test_static_304_if_none_matchz,StaticFileTest.test_static_304_if_none_match  sb    %%&:;;	%% ?I<Mf<U*V & 
 
	 	-----r;   c                     |                      d          }|                      dd|j        d         d          }|                     |j        d           d S )Nr  z
"MISMATCH"r  )r  r  r2  r   r  r  s      r9   !test_static_304_etag_modified_bugz0StaticFileTest.test_static_304_etag_modified_bug  sk    %%&:;;	%% !-%.%6%G  & 
 
	 	-----r;   c                 n    |                      dddi          }|                     |j        d           d S )Nr  r  zFri, 01 Jan 1960 00:00:00 GMTr2  r   r  r}   r   r   s     r9   'test_static_if_modified_since_pre_epochz6StaticFileTest.test_static_if_modified_since_pre_epoch  sJ     $$ (*IJ % 
 
 	,,,,,r;   c                 l   t          j        t          d                    }|                     ddt	          |j        dz
            i          }|                     |j        d           |                     ddt	          |j        dz             i          }|                     |j        d           d S )Nr  r  r  rv   r2  r   r  )r3   statr:   r  r   st_mtimer}   r   )rC   r  r   s      r9   'test_static_if_modified_since_time_zonez6StaticFileTest.test_static_if_modified_since_time_zone  s    
 ww23344$$ (*:4=1;L*M*MN % 
 
 	,,,$$ (*:4=1;L*M*MN % 
 
 	,,,,,r;   c                     |                      d          }|                     t          |j                            d                    d| j        z   dz              d S )Nr  r     ")r  r}   r   r,  r\   r  r   s     r9   test_static_etagzStaticFileTest.test_static_etag  sc    $$%9::!%%f--..t7K0Kd0R	
 	
 	
 	
 	
r;   c                    |                      dddi          }|                     |j        d           |                     |j        d           |                     t	          |j                            d                    d| j        z   dz              |                     |j                            d	          d
           |                     |j                            d          d           d S )Nr  Rangez	bytes=0-9r2     s
   User-agentr  r   r  10Content-Rangezbytes 0-9/26)r  r}   r   r   r   r,  r\   r  r   s     r9   test_static_with_rangez%StaticFileTest.test_static_with_range  s    $$ 7K*@ % 
 
 	,,,666!%%f--..t7K0Kd0R	
 	
 	
 	)--.>??FFF)--o>>OOOOOr;   c                 2   |                      dddi          }|                     |j        d           t          j                            | j        d          }t          |          5 }|                     |j        t          |
                                                     d d d            n# 1 swxY w Y   |                     |j                            d          d           |                     |j                            d	          d            d S )
Nr  r  zbytes=0-r2  r   
robots.txtr  26r  r  r}   r   r3   r4   r5   
static_diropenr   r   readr,  r\   rC   r   robots_file_pathfs       r9    test_static_with_range_full_filez/StaticFileTest.test_static_with_range_full_file  s4   $$ 7J*? % 
 

 	,,,7<<FF"## 	<qX]DNN;;;	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	<)--.>??FFF)--o>>EEEEE   );B00B47B4c                 2   |                      dddi          }|                     |j        d           t          j                            | j        d          }t          |          5 }|                     |j        t          |
                                                     d d d            n# 1 swxY w Y   |                     |j                            d          d           |                     |j                            d	          d            d S )
Nr  r  zbytes=0-10000000r2  r   r	  r  r
  r  r  r  s       r9   $test_static_with_range_full_past_endz3StaticFileTest.test_static_with_range_full_past_end  s5   $$ 74F*G % 
 
 	,,,7<<FF"## 	<qX]DNN;;;	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	<)--.>??FFF)--o>>EEEEEr  c           	      B   |                      dddi          }|                     |j        d           t          j                            | j        d          }t          |          5 }|                     |j        t          |
                                dd                               d d d            n# 1 swxY w Y   |                     |j                            d          d	           |                     |j                            d
          d           d S )Nr  r  zbytes=1-10000000r2  r  r	  rv   r  25r  zbytes 1-25/26r  r  s       r9   'test_static_with_range_partial_past_endz6StaticFileTest.test_static_with_range_partial_past_end
  sO   $$ 74F*G % 
 
 	,,,7<<FF"## 	@qX]D!"",>,>???	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@)--.>??FFF)--o>>PPPPPs   )AB88B<?B<c                 &   |                      dddi          }|                     |j        d           |                     |j                            d          d           |                     |j                            d          d	           d S )
Nr  r  z	bytes=22-r2     : /
r  r  r  bytes 22-25/26r  r}   r   r,  r\   r   s     r9   test_static_with_range_end_edgez.StaticFileTest.test_static_with_range_end_edge  s    $$ 7K*@ % 
 
 	111)--.>??EEE)--o>>@PQQQQQr;   c                 &   |                      dddi          }|                     |j        d           |                     |j                            d          d           |                     |j                            d          d	           d S )
Nr  r  zbytes=-4r2  r  r  r  r  r  r  r   s     r9   test_static_with_range_neg_endz-StaticFileTest.test_static_with_range_neg_end  s    $$ 7J*? % 
 
 	111)--.>??EEE)--o>>@PQQQQQr;   c                 2   |                      dddi          }|                     |j        d           t          j                            | j        d          }t          |          5 }|                     |j        t          |
                                                     d d d            n# 1 swxY w Y   |                     |j                            d          d           |                     |j                            d	          d            d S )
Nr  r  zbytes=-1000000r2  r   r	  r  r
  r  r  r  s       r9   %test_static_with_range_neg_past_startz4StaticFileTest.test_static_with_range_neg_past_start%  s5   $$ 74D*E % 
 
 	,,,7<<FF"## 	<qX]DNN;;;	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	<)--.>??FFF)--o>>EEEEEr  c                 n    |                      dddi          }|                     |j        d           d S )Nr  r  r   r2  r   r  r   s     r9   test_static_invalid_rangez(StaticFileTest.test_static_invalid_range0  s>    $$%9GVCT$UU,,,,,r;   c                     |                      dddi          }|                     |j                            d          d           |                     |j        d           d S )Nr  r  zbytes=-0r2  r  
bytes */26  )r  r}   r,  r\   r   r   s     r9   +test_static_unsatisfiable_range_zero_suffixz:StaticFileTest.test_static_unsatisfiable_range_zero_suffix4  sm    $$ 7J*? % 
 
 	)--o>>MMM,,,,,r;   c                     |                      dddi          }|                     |j        d           |                     |j                            d          d           d S )Nr  r  zbytes=26r2  r&  r  r%  r  r}   r   r,  r\   r   s     r9   -test_static_unsatisfiable_range_invalid_startz<StaticFileTest.test_static_unsatisfiable_range_invalid_start;  sm    $$ 7J*? % 
 
 	,,,)--o>>MMMMMr;   c                     |                      dddi          }|                     |j        d           |                     |j                            d          d           d S )Nr  r  z
bytes=10-3r2  r&  r  r%  r)  r   s     r9   3test_static_unsatisfiable_range_end_less_than_startzBStaticFileTest.test_static_unsatisfiable_range_end_less_than_startB  sm    $$ 7L*A % 
 
 	,,,)--o>>MMMMMr;   c                 T   |                      dd          }|                     |j        d           |                     |j        d           |                     |j        d         d           |                     t          |j        d                   d	| j        z   d	z              d S )
Nr  r  r   r   r;   r  r
  r  r   r   r}   r   r   r,  r   r  r   s     r9   test_static_headzStaticFileTest.test_static_headI  s    ::26:BB,,,,,,)*:;TBBB!&)**D43G,G$,N	
 	
 	
 	
 	
r;   c                 Z   |                      ddddi          }|                     |j        d           |                     |j        d           |                     |j        d         d	           |                     t          |j        d
                   d| j        z   dz              d S )Nr  r  r  	bytes=1-4)r   r,  r  r;   r  r  r  r   r/  r   s     r9   test_static_head_rangez%StaticFileTest.test_static_head_rangeS  s    :: ';9O  
 
 	,,,,,,)*:;SAAA!&)**D43G,G$,N	
 	
 	
 	
 	
r;   c                 f   |                      ddd| j        z   dz   d          }|                     |j        d           |                     |j        d           |                     d|j        v           |                     t          |j        d	                   d| j        z   dz              d S )
Nr  r2  r   )r  r  r2  r  r;   r  r  )r  r  r}   r   r   r   r,  r   r   s     r9   test_static_range_if_none_matchz.StaticFileTest.test_static_range_if_none_match^  s    $$ $!%(<!<t!C  % 
 
 	,,,,,,(0@@AAA!&)**D43G,G$,N	
 	
 	
 	
 	
r;   c                 f    |                      d          }|                     |j        d           d S )Nz/static/blarg  r  r   s     r9   test_static_404zStaticFileTest.test_static_404m  s3    $$_55,,,,,r;   c                    | j                                          t                      | _         t          t          d          5  |                     d          }d d d            n# 1 swxY w Y   |                     |j        d           d S )Nz.*not in root static directoryz/static/../static_foo.txt  )http_clientr  r   r   r   r  r}   r   r   s     r9   test_path_traversal_protectionz-StaticFileTest.test_path_traversal_protectionq  s     	   022w @AA 	F 	F(()DEEH	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	,,,,,s   A$$A(+A(posixznon-posix OSc                 d   t           j                            t           j                            t           j                            t
                              d          }|                     dt          j        	                    |          z             }| 
                    |j        d           d S )Nr  z/root_staticr   )r3   r4   r5   r6   abspathr7   r  re  rf  r   r}   r   )rC   r4   r   s      r9   test_root_static_pathz$StaticFileTest.test_root_static_path~  s     w||GOOBGOOH55668K
 
 $$^fl6H6H6N6N%NOO,,,,,r;   N)/rK   rL   rM   r  r3   r4   r5   r6   r7   r  r?   r@   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r!  r#  r'  r*  r,  r0  r3  r5  r8  r<  unittestskipIfrk   r@  rI   r;   r9   r  r  2  s       	L  bgooh77BBJ#
 #
 #
J3 3 3M M M
 
 
Y Y Y
 
 
? ? ?W W W/ / /9 9 9
  *C C C. . .	. 	. 	.- - -- - -$
 
 

P 
P 
PF F F	F 	F 	F	Q 	Q 	QR R RR R R	F 	F 	F- - -- - -N N NN N N
 
 
	
 	
 	

 
 
- - -- - - X_RW'88	- 	- 98	- 	- 	-r;   r  c                   &    e Zd Zd Zd Zd Zd ZdS )StaticDefaultFilenameTestc                 Z    t          t          d          t          d                    S Nr  z
index.html)default_filename)r  static_handler_argsr  rB   s    r9   r@   z(StaticDefaultFilenameTest.get_app_kwargs  2    )) $l C C C
 
 
 	
r;   c                     g S r2   rI   rB   s    r9   r?   z&StaticDefaultFilenameTest.get_handlers  rJ   r;   c                     |                      dd          }|                     |j        d           |                     d|j                   d S )N/static/dir/Frp  r   s   this is the index
r   r}   r   r   r   s     r9   test_static_default_filenamez6StaticDefaultFilenameTest.test_static_default_filename  sN    ::nu:EE,,,/?????r;   c                     |                      dd          }|                     |j        d           |                     |j        d                             d                     d S )Nz/static/dirFrp  rX  rs  rL  )r   r}   r   r   r,  endswithr   s     r9   test_static_default_redirectz6StaticDefaultFilenameTest.test_static_default_redirect  s]    ::me:DD,,,(4==nMMNNNNNr;   N)rK   rL   rM   r@   r?   rN  rQ  rI   r;   r9   rD  rD    sX        
 
 
  @ @ @
O O O O Or;   rD  c                        e Zd Zd Zd Zd ZdS )StaticFileWithPathTestc                 Z    t          t          d          t          d                    S rF  r  rB   s    r9   r@   z%StaticFileWithPathTest.get_app_kwargs  rI  r;   c                 6    dt           dt          d          ifgS )Nz	/foo/(.*)r4   z
templates/)r   r:   rB   s    r9   r?   z#StaticFileWithPathTest.get_handlers  s     /&',:O:O1PQRRr;   c                 f    |                      d          }|                     |j        d           d S )Nz/foo/utf8.htmls   Héllo
r4  r   s     r9   
test_servez!StaticFileWithPathTest.test_serve  s3    ::.//(9:::::r;   N)rK   rL   rM   r@   r?   rW  rI   r;   r9   rS  rS    sD        
 
 
S S S; ; ; ; ;r;   rS  c                   &    e Zd Zd Zd Zd Zd ZdS )CustomStaticFileTestc                 f     G d dt                     } G d dt                    }|| _        d|fgS )Nc                       e Zd Zed             Zd Zed             Zd Zed
d            Zd Z	d Z
ed	             ZdS )>CustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandlerc                     |                      ||          }|                    d          }|d |         }||dz   d          }d|d|d|S )N.rv   z/static/)get_versionrindex)clsrc   r4   version_hashextension_indexbefore_versionafter_versions          r9   make_static_urlzNCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.make_static_url  sj    "x>>"&++c"2"2!%&6&6!7 $o&9%<%< ="NN LL!M r;   c                     |                     d          }|                     dd|          }|d |         ||d          S )Nr^  r   )r`  )rC   url_pathrc  version_indexs       r9   parse_url_pathzMCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.parse_url_path  sM    "*//#"6"6 (Q H H!).=.!9!98ODTDT;U;UVVr;   c                     d|z   S )NzCustomStaticFileTest:rI   ra  rc   r4   s      r9   get_absolute_pathzPCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_absolute_path  s    .55r;   c                     |S r2   rI   )rC   rootabsolute_paths      r9   validate_absolute_pathzUCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.validate_absolute_path  s    $$r;   Nc                 B    ||J |dk    rdS t          d|z            )NCustomStaticFileTest:foo.txtru   unexpected path %rr  )rC   r4   startends       r9   get_contentzJCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_content  s4    }999!6 4t ;<<<r;   c                 J    | j         dk    rdS t          d| j         z            )Nrs  r:  rt  )rp  r  rB   s    r9   get_content_sizezOCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_content_size  s-    %)GGG1 4t7I IJJJr;   c                     d S r2   rI   rB   s    r9   get_modified_timezPCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_modified_time  s    tr;   c                     dS )N42rI   rl  s      r9   r_  zJCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_version  s    tr;   NN)rK   rL   rM   classmethodrf  rj  rm  rq  rw  ry  r{  r_  rI   r;   r9   MyStaticFileHandlerr\    s        	 	 [	W W W
 6 6 [6% % % = = = [=K K K
     [  r;   r  c                       e Zd Zd ZdS );CustomStaticFileTest.get_handlers.<locals>.StaticUrlHandlerc                 V    |                      |                     |                     d S r2   )r[   r  r   s     r9   r\   z?CustomStaticFileTest.get_handlers.<locals>.StaticUrlHandler.get  s&    

4??40011111r;   Nr]   rI   r;   r9   r  r    s#        2 2 2 2 2r;   r  r  )r   r   static_handler_class)rC   r  r  s      r9   r?   z!CustomStaticFileTest.get_handlers  sq    *	 *	 *	 *	 *	"3 *	 *	 *	X	2 	2 	2 	2 	2~ 	2 	2 	2 %8!#%5677r;   c                 .    t          d| j                  S )Ndummy)r  r  )rg   r  rB   s    r9   r@   z#CustomStaticFileTest.get_app_kwargs  s    d>WXXXXr;   c                 f    |                      d          }|                     |j        d           d S )Nz/static/foo.42.txtru   r4  r   s     r9   rW  zCustomStaticFileTest.test_serve  s2    ::233/////r;   c                     t          t          dd          5  |                     d          }|                     |j        d           d d d            d S # 1 swxY w Y   d S )NzCould not open static fileF)requiredz/static_url/foo.txts   /static/foo.42.txt)r   r   r   r}   r   r   s     r9   r  z$CustomStaticFileTest.test_static_url  s    w <uMMM 	C 	Czz"788HX],ABBB	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	Cs   1AAAN)rK   rL   rM   r?   r@   rW  r  rI   r;   r9   rY  rY    sY        38 38 38jY Y Y0 0 0C C C C Cr;   rY  c                   6    e Zd Z G d de          Zd Zd ZdS )HostMatchingTestc                       e Zd Zd Zd ZdS )HostMatchingTest.Handlerc                     || _         d S r2   )reply)rC   r  s     r9   rd  z#HostMatchingTest.Handler.initialize  s    DJJJr;   c                 :    |                      | j                   d S r2   )r[   r  rB   s    r9   r\   zHostMatchingTest.Handler.get  s    JJtz"""""r;   N)rK   rL   rM   rd  r\   rI   r;   r9   rT   r    s2        	 	 		# 	# 	# 	# 	#r;   rT   c                 &    dt           j        ddifgS )Nr   r  wildcard)r  rT   rB   s    r9   r?   zHostMatchingTest.get_handlers  s    )1GZ3HIJJr;   c                    | 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           |                     dddi          }|                     |j        d           |                     dddi          }|                     |j        d           |                     dddi          }|                     |j        d           |                     dddi          }|                     |j        d           d S )Nwww.example.comr   r  [0]www\.example\.com/bar[1]/baz[2]zwww.e.*e.comz[3]s   wildcardr7  Hostr2     [0]   [1]   [2]zwww.exe.coms   [3])rA   add_handlersr  rT   r   r}   r   r   r   s     r9   test_host_matchingz#HostMatchingTest.test_host_matching  s   )9)AGUCS TU	
 	
 	
 	 F,<,DwPUFV#W"X	
 	
 	
 	)9)AGUCS TU	
 	
 	
 	f&6&>%@PQR	
 	
 	
 ::f%%444::f%%,,,::f%%,,,::fv7H.I:JJ///::fv7H.I:JJ///::fv7H.I:JJ///::fv}.E:FF/////r;   N)rK   rL   rM   r   rT   r?   r  rI   r;   r9   r  r    s_        # # # # #. # # #K K K0 0 0 0 0r;   r  c                        e Zd Zd Zd Zd ZdS )DefaultHostMatchingTestc                     g S r2   rI   rB   s    r9   r?   z$DefaultHostMatchingTest.get_handlers  rJ   r;   c                 
    ddiS )Ndefault_hostr  rI   rB   s    r9   r@   z&DefaultHostMatchingTest.get_app_kwargs   s     122r;   c                    | 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           |                     dddi          }|                     |j        d           d| j         _        |                     d	          }|                     |j        d           d S )Nr  r   r  r  r  r  r  zwww.test.comr  r  r  r  r7  z	X-Real-Ipr  r2  r  )	rA   r  r  rT   r   r}   r   r   r  r   s     r9   test_default_host_matchingz2DefaultHostMatchingTest.test_default_host_matching#  s   )9)AGUCS TU	
 	
 	
 	 F,<,DwPUFV#W"X	
 	
 	
 	f&6&>%@PQR	
 	
 	
 ::f%%///::f%%///::f%%,,,::f{K.H:II,,, .::f%%/////r;   N)rK   rL   rM   r?   r@   r  rI   r;   r9   r  r    sA          3 3 30 0 0 0 0r;   r  c                       e Zd Zd Zd ZdS )NamedURLSpecGroupsTestc                 8     G d dt                     }d|fd|fgS )Nc                       e Zd Zd ZdS )8NamedURLSpecGroupsTest.get_handlers.<locals>.EchoHandlerc                 0    |                      |           d S r2   rZ   r   s     r9   r\   z<NamedURLSpecGroupsTest.get_handlers.<locals>.EchoHandler.getA  s    

4     r;   Nr]   rI   r;   r9   r  r  @  s#        ! ! ! ! !r;   r  z/str/(?P<path>.*)z/unicode/(?P<path>.*)r   )rC   r  s     r9   r?   z#NamedURLSpecGroupsTest.get_handlers?  sH    	! 	! 	! 	! 	!. 	! 	! 	!
 !+.$k2
 	
r;   c                     |                      d          }|                     |j        d           |                      d          }|                     |j        d           d S )Nz/str/foos   fooz/unicode/barru   r4  r   s     r9   test_named_urlspec_groupsz0NamedURLSpecGroupsTest.test_named_urlspec_groupsI  sZ    ::j))///::n--/////r;   N)rK   rL   rM   r?   r  rI   r;   r9   r  r  >  s2        
 
 
0 0 0 0 0r;   r  c                   0    e Zd Z G d de          Zd ZdS )ClearHeaderTestc                       e Zd Zd ZdS )ClearHeaderTest.Handlerc                     |                      dd           |                      dd           |                     d           |                     d           d S )Nh1rt   h2r  nonexistent)r  clear_headerrB   s    r9   r\   zClearHeaderTest.Handler.getS  sX    OOD%(((OOD%(((d###m,,,,,r;   Nr]   rI   r;   r9   rT   r  R  s#        	- 	- 	- 	- 	-r;   rT   c                     |                      d          }|                     d|j        v           |                     |j        d         d           d S )NrR   r  r  r  )r   r   r,  r}   r   s     r9   test_clear_headerz!ClearHeaderTest.test_clear_headerY  sO    ::c??H$44555)$/77777r;   N)rK   rL   rM   r   rT   r  rI   r;   r9   r  r  Q  sM        - - - - -. - - -8 8 8 8 8r;   r  c                   0    e Zd Z G d de          Zd ZdS )Header204Testc                       e Zd Zd ZdS )Header204Test.Handlerc                 X    |                      d           |                                  d S )N   )
set_statusr   rB   s    r9   r\   zHeader204Test.Handler.geta  s%    OOC   KKMMMMMr;   Nr]   rI   r;   r9   rT   r  `  s#        	 	 	 	 	r;   rT   c                     |                      d          }|                     |j        d           |                     d|j                   |                     d|j                   d S )NrR   r  r  Transfer-Encoding)r   r}   r   ru  r,  r   s     r9   test_204_headerszHeader204Test.test_204_headerse  sc    ::c??,,,)8+;<<<,h.>?????r;   N)rK   rL   rM   r   rT   r  rI   r;   r9   r  r  _  sR            .   
@ @ @ @ @r;   r  c                   0    e Zd Z G d de          Zd ZdS )Header304Testc                       e Zd Zd ZdS )Header304Test.Handlerc                 \    |                      dd           |                     d           d S )NContent-Languageen_USrY   )r  r[   rB   s    r9   r\   zHeader304Test.Handler.getn  s/    OO.888JJwr;   Nr]   rI   r;   r9   rT   r  m  s#        	  	  	  	  	 r;   rT   c                    |                      d          }|                     |j        d         d           |                     |j        d         d           |                      dd|j        d         i          }|                     |j        d	           |                     d|j        v           |                     d|j        v           |                     d
|j        v           d S )NrR   r  5r  r  r  r  r2  r  r  )r   r}   r,  r   r   r  s      r9   test_304_headerszHeader304Test.test_304_headersr  s    JJsOO	*+;<cBBB*+=>HHHJJ/9+<V+DE  
 
	 	---(	0AABBB*)2CCDDD+93DDEEEEEr;   N)rK   rL   rM   r   rT   r  rI   r;   r9   r  r  l  sR                 .      
F F F F Fr;   r  c                   6    e Zd Z G d de          Zd Zd ZdS )StatusReasonTestc                       e Zd Zd ZdS )StatusReasonTest.Handlerc                     | j         j                            dg           }|                     t	          |                     d                    |rt          |d                   nd            d S )Nreasonr   r   r  )r  r  r\   r  r  r  r   )rC   r  s     r9   r\   zStatusReasonTest.Handler.get  ss    \+//"==FOOD%%f--..06@z&),,,D      r;   Nr]   rI   r;   r9   rT   r    s#        	 	 	 	 	r;   rT   c                     t                      S r2   r   rB   s    r9   get_http_clientz StatusReasonTest.get_http_client      $&&&r;   c                 ^   |                      d          }|                     |j        d           |                     |j        d           |                      d          }|                     |j        d           |                     |j        d           |                      d          }|                     |j        d           |                     |j        d           |                      d	          }|                     |j        d           |                     |j        d
           d S )Nz
/?code=304r  zNot Modifiedz/?code=304&reason=FooFooz/?code=682&reason=Bar  Barz
/?code=682Unknown)r   r}   r   r  r   s     r9   test_statuszStatusReasonTest.test_status  s   ::l++,,,.999::566,,,%000::566,,,%000::l++,,,)44444r;   N)rK   rL   rM   r   rT   r  r  rI   r;   r9   r  r    s\            .   ' ' '5 5 5 5 5r;   r  c                   0    e Zd Z G d de          Zd ZdS )DateHeaderTestc                       e Zd Zd ZdS )DateHeaderTest.Handlerc                 0    |                      d           d S rX   rZ   rB   s    r9   r\   zDateHeaderTest.Handler.get      JJwr;   Nr]   rI   r;   r9   rT   r    s#        	  	  	  	  	 r;   rT   c                 N   |                      d          }t          j                            |j        d                   }|J t          j        |d d          }|                     |t
          j                                        z
  t          j        d          k                d S )NrR   DaterL  r   )seconds)	r   rP  rQ  rR  r,  rM  r   rN  rO  )rC   r   rW  header_dates       r9   test_date_headerzDateHeaderTest.test_date_header  s    ::c??&&x'7'?@@!!!'4(+22444x7IRS7T7T7TT	
 	
 	
 	
 	
r;   N)rK   rL   rM   r   rT   r  rI   r;   r9   r  r    sM                 .      
 
 
 
 
r;   r  c                   B    e Zd Z G d de          Zd Zd Zd Zd ZdS )RaiseWithReasonTestc                       e Zd Zd ZdS )RaiseWithReasonTest.Handlerc                 $    t          dd          )Nr  r  r  r!   rB   s    r9   r\   zRaiseWithReasonTest.Handler.get  s    C....r;   Nr]   rI   r;   r9   rT   r    s#        	/ 	/ 	/ 	/ 	/r;   rT   c                     t                      S r2   r   rB   s    r9   r  z#RaiseWithReasonTest.get_http_client  r  r;   c                     |                      d          }|                     |j        d           |                     |j        d           |                     d|j                   d S )NrR   r  r  s   682: Foo)r   r}   r   r  assertInr   r   s     r9   test_raise_with_reasonz*RaiseWithReasonTest.test_raise_with_reason  s]    ::c??,,,%000k8=11111r;   c                 j    |                      t          t          dd                    d           d S )Nr  r  r  zHTTP 682: Foor}   r   r!   rB   s    r9   test_httperror_strz&RaiseWithReasonTest.test_httperror_str  s3    Ys5999::OLLLLLr;   c                 f    |                      t          t          d                    d           d S )Nr  zHTTP 682: Unknownr  rB   s    r9    test_httperror_str_from_httputilz4RaiseWithReasonTest.test_httperror_str_from_httputil  s-    Ys^^,,.ABBBBBr;   N)	rK   rL   rM   r   rT   r  r  r  r  rI   r;   r9   r  r    s        / / / / /. / / /' ' '2 2 2M M MC C C C Cr;   r  c                   &    e Zd Zd Zd Zd Zd ZdS )ErrorHandlerXSRFTestc                 4    dt           t          d          fgS )N/error  r  )r#   rg   rB   s    r9   r?   z!ErrorHandlerXSRFTest.get_handlers  s     <#)>)>)>?@@r;   c                 "    t          d          S NT)xsrf_cookiesr   rB   s    r9   r@   z#ErrorHandlerXSRFTest.get_app_kwargs      &&&&r;   c                 l    |                      ddd          }|                     |j        d           d S )Nr  r   rn  r   r  rY  r   s     r9   test_error_xsrfz$ErrorHandlerXSRFTest.test_error_xsrf  s7    ::hvB:??,,,,,r;   c                 l    |                      ddd          }|                     |j        d           d S )Nz/404r   rn  r   r7  rY  r   s     r9   test_404_xsrfz"ErrorHandlerXSRFTest.test_404_xsrf  s7    ::fV":==,,,,,r;   N)rK   rL   rM   r?   r@   r  r  rI   r;   r9   r  r    sS        A A A' ' '- - -- - - - -r;   r  c                   T    e Zd Z G d de          Zd Zd Zd Zd Zd Z	d Z
d	 Zd
S )GzipTestCasec                       e Zd Zd ZdS )GzipTestCase.Handlerc                     |                      d          D ]}|                     d|           |                     ddt          j        z  z              d S )Nvaryrr  zhello world!)r  r  r[   r/   
MIN_LENGTH)rC   vs     r9   r\   zGzipTestCase.Handler.get  s\    ''// + +****JJ}.A.L(LMNNNNNr;   Nr]   rI   r;   r9   rT   r
    s(        	O 	O 	O 	O 	Or;   rT   c                     t          dt          j                            t          j                            t
                    d                    S )NTr  )rs  r  )rg   r3   r4   r5   r6   r7   rB   s    r9   r@   zGzipTestCase.get_app_kwargs  s<    27<<0I0I8#T#T
 
 
 	
r;   c                     |                      |j                            d|j                            d                    d           d S )Nrt  zX-Consumed-Content-Encodingrs  )r}   r,  r\   r   s     r9   assert_compressedzGzipTestCase.assert_compressed  sX     	  "H$4$8$89V$W$W  		
 	
 	
 	
 	
r;   c                     |                      d          }|                     |           |                     |j        d         d           d S )NrR   rr  rq  r   r  r}   r,  r   s     r9   	test_gzipzGzipTestCase.test_gzip  sJ    ::c??x((()&13DEEEEEr;   c                     |                      d          }|                     |           |                     |j        d         d           d S )Nr  rr  rq  r  r   s     r9   test_gzip_staticzGzipTestCase.test_gzip_static  sN     ::m,,x((()&13DEEEEEr;   c                     |                      dd          }|                     d|j                   |                     |j        d         d           d S )NrR   F)use_gziprt  rr  rq  )r   ru  r,  r}   r   s     r9   test_gzip_not_requestedz$GzipTestCase.test_gzip_not_requested  sV    ::cE:22+X-=>>>)&13DEEEEEr;   c                     |                      d          }|                     |           |                     d |j        d                             d          D             ddg           d S )Nz/?vary=Accept-Languagec                 6    g | ]}|                                 S rI   strip.0r  s     r9   
<listcomp>z:GzipTestCase.test_vary_already_present.<locals>.<listcomp>       DDD1QWWYYDDDr;   rr  ,Accept-Languagerq  r   r  r}   r,  splitr   s     r9   test_vary_already_presentz&GzipTestCase.test_vary_already_present  sz    ::677x(((DD 0 8 > >s C CDDD 12	
 	
 	
 	
 	
r;   c                     |                      d          }|                     |           |                     d |j        d                             d          D             g d           d S )Nz"/?vary=Accept-Language&vary=Cookiec                 6    g | ]}|                                 S rI   r  r  s     r9   r!  zCGzipTestCase.test_vary_already_present_multiple.<locals>.<listcomp>
  r"  r;   rr  r#  )r$  r0  rq  r%  r   s     r9   "test_vary_already_present_multiplez/GzipTestCase.test_vary_already_present_multiple  sz    ::BCCx(((DD 0 8 > >s C CDDD<<<	
 	
 	
 	
 	
r;   N)rK   rL   rM   r   rT   r@   r  r  r  r  r'  r*  rI   r;   r9   r  r    s        O O O O O. O O O
 
 


 
 
F F F
F F FF F F

 
 

 
 
 
 
r;   r  c                   <    e Zd Z G d de          Zd Zd Zd ZdS )PathArgsInPrepareTestc                       e Zd Zd Zd ZdS )PathArgsInPrepareTest.Handlerc                 b    |                      t          | j        | j                             d S )Nr  r:  )r[   rg   r  path_kwargsrB   s    r9   r  z%PathArgsInPrepareTest.Handler.prepare  s,    JJt8HIIIJJJJJr;   c                 >    |dk    sJ |                                   d S )Nrt   r   r   s     r9   r\   z!PathArgsInPrepareTest.Handler.get  s     5====KKMMMMMr;   NrK   rL   rM   r  r\   rI   r;   r9   rT   r.    s5        	K 	K 	K	 	 	 	 	r;   rT   c                 &    d| j         fd| j         fgS )Nz	/pos/(.*)z/kw/(?P<path>.*)rS   rB   s    r9   r?   z"PathArgsInPrepareTest.get_handlers  s    dl+.@$,-OPPr;   c                     |                      d          }|                                 t          |j                  }|                     |dgi d           d S )Nz/pos/foort   r0  r@  rC   r   r>  s      r9   test_poszPathArgsInPrepareTest.test_pos  sZ    ::j))8=))2>>?????r;   c                     |                      d          }|                                 t          |j                  }|                     |g ddid           d S )Nz/kw/foor4   rt   r0  r@  r7  s      r9   test_kwzPathArgsInPrepareTest.test_kw!  s\    ::i((8=))vuoFFGGGGGr;   N)rK   rL   rM   r   rT   r?   r8  r:  rI   r;   r9   r,  r,    sv            .   Q Q Q@ @ @H H H H Hr;   r,  c                   0    e Zd Z G d de          Zd ZdS )ClearAllCookiesTestc                       e Zd Zd ZdS )ClearAllCookiesTest.Handlerc                 X    |                                   |                     d           d S Nok)clear_all_cookiesr[   rB   s    r9   r\   zClearAllCookiesTest.Handler.get*  s,    ""$$$JJtr;   Nr]   rI   r;   r9   rT   r>  )  s#        	 	 	 	 	r;   rT   c                    |                      dddi          }t          |j                            d                    }|                     |d                             d          p|d                             d                     |                     |d	                             d
          p|d	                             d                     d S )NrR   r0  zfoo=bar; baz=xyzzyr2  r*  r   zbaz=;zbaz="";rv   zfoo=;zfoo="";)r   r+  r,  r-  r   r  )rC   r   set_cookiess      r9   test_clear_all_cookiesz*ClearAllCookiesTest.test_clear_all_cookies.  s    ::cH6J+K:LLX-66|DDEEN%%g..V+a.2K2KI2V2V	
 	
 	
 	N%%g..V+a.2K2KI2V2V	
 	
 	
 	
 	
r;   N)rK   rL   rM   r   rT   rE  rI   r;   r9   r<  r<  (  sM            .   
	
 	
 	
 	
 	
r;   r<  c                       e Zd ZdS )PermissionErrorNrK   rL   rM   rI   r;   r9   rG  rG  :  s        Dr;   rG  c                   <    e Zd Z G d de          Zd Zd Zd ZdS )ExceptionHandlerTestc                        e Zd Zd Zd Zd ZdS )ExceptionHandlerTest.Handlerc                     |                      d          }|dk    rt          dd          |dk    rddz   d S |dk    rt          d	          d S )
Nexchttp  zno longer herezerorv   r   
permissionznot allowed)r  r!   rG  )rC   rN  s     r9   r\   z ExceptionHandlerTest.Handler.get@  sf    ##E**Cf}}%5666A$$%m444 %$r;   c                     d|v rM|d         \  }}}t          |t                    r,|                     d           |                     d           d S t	          j        | |fi | d S )Nr  r:  rG  )
isinstancerG  r  r[   r   r  )rC   r  r:  typrn   tbs         r9   r  z(ExceptionHandlerTest.Handler.write_errorI  sz    V##!'
!3UBe_55 OOC(((JJ0111F&t[CCFCCCCCr;   c                     t          |t                    r"t          j        d|j        d                    d S t          j        | |||           d S )Nz&custom logging for PermissionError: %sr   )rT  rG  r   warningr  r   log_exceptionrC   rU  rn   rV  s       r9   rY  z*ExceptionHandlerTest.Handler.log_exceptionR  sR    %11 C H%*UV-XXXXX,T3rBBBBBr;   N)rK   rL   rM   r\   r  rY  rI   r;   r9   rT   rL  ?  sI        	5 	5 	5	D 	D 	D	C 	C 	C 	C 	Cr;   rT   c                     t          t          d          5  |                     d          }|                     |j        d           d d d            d S # 1 swxY w Y   d S )Nz.*no longer herez
/?exc=httprP  rE  r   s     r9   test_http_errorz$ExceptionHandlerTest.test_http_errorX  s     w 233 	1 	1zz,//HX]C000	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1   1AAAc                     t          t          d          5  |                     d          }|                     |j        d           d d d            d S # 1 swxY w Y   d S )Nr  z
/?exc=zerorh  r   r   r   r}   r   r   s     r9   test_unknown_errorz'ExceptionHandlerTest.test_unknown_error_  s    w 455 	1 	1zz,//HX]C000	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1r]  c                     t          t          d          5  |                     d          }|                     |j        d           d d d            d S # 1 swxY w Y   d S )Nz/custom logging for PermissionError: not allowedz/?exc=permissionr:  r_  r   s     r9   test_known_errorz%ExceptionHandlerTest.test_known_errore  s     w QRR 	1 	1zz"455HX]C000	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1r]  N)rK   rL   rM   r   rT   r\  r`  rb  rI   r;   r9   rJ  rJ  >  ss        C C C C C. C C C21 1 11 1 11 1 1 1 1r;   rJ  c                   0    e Zd Z G d de          Zd ZdS )BuggyLoggingTestc                       e Zd Zd Zd ZdS )BuggyLoggingTest.Handlerc                     ddz   d S r  rI   rB   s    r9   r\   zBuggyLoggingTest.Handler.geto      EEEEr;   c                     ddz   d S r  rI   rZ  s       r9   rY  z&BuggyLoggingTest.Handler.log_exceptionr  rh  r;   N)rK   rL   rM   r\   rY  rI   r;   r9   rT   rf  n  s2        	 	 		 	 	 	 	r;   rT   c                     t          t          d          5  |                     d           d d d            d S # 1 swxY w Y   d S )Nz.*rR   )r   r   r   rB   s    r9   test_buggy_log_exceptionz)BuggyLoggingTest.test_buggy_log_exceptionu  s     w%% 	 	JJsOOO	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	r  N)rK   rL   rM   r   rT   rk  rI   r;   r9   rd  rd  m  sM            .       r;   rd  c                   J     e Zd ZdZ G d de          Zd Z fdZd Z xZ	S )UIMethodUIModuleTestz`Test that UI methods and modules are created correctly and
    associated with the handler.
    c                       e Zd Zd Zd ZdS )UIMethodUIModuleTest.Handlerc                 0    |                      d           d S r   r  rB   s    r9   r\   z UIMethodUIModuleTest.Handler.get  s    KK
#####r;   c                 ,    |                      d          S )Nrn   )r  rB   s    r9   rn   z"UIMethodUIModuleTest.Handler.value  s    $$W---r;   N)rK   rL   rM   r\   rn   rI   r;   r9   rT   ro    s2        	$ 	$ 	$	. 	. 	. 	. 	.r;   rT   c                 |    d } G d dt                     }t          ddi          }t          |d|id|i          S )Nc                 8    d|d|                                  dS )NzIn my_ui_method() with handler value r^  )rn   )r   xs     r9   my_ui_methodz9UIMethodUIModuleTest.get_app_kwargs.<locals>.my_ui_method  s     CD11gmmooooVVr;   c                       e Zd Zd ZdS )5UIMethodUIModuleTest.get_app_kwargs.<locals>.MyModulec                 |    d|dt          j        t          j        | j                                                  dS )NzIn MyModule(rt  r^  )typingcastrm  rT   r   rn   )rC   ru  s     r9   r   z<UIMethodUIModuleTest.get_app_kwargs.<locals>.MyModule.render  s<     AAK 4 <dlKKQQSSSS r;   NrK   rL   rM   r   rI   r;   r9   MyModulerx    s#            r;   r}  r   z1{{ my_ui_method(42) }} {% module MyModule(123) %}rv  )r  
ui_methods
ui_modulesr*   r   rg   )rC   rv  r}  r!  s       r9   r@   z#UIMethodUIModuleTest.get_app_kwargs  s    	W 	W 	W	 	 	 	 	x 	 	 	 LM
 
 "&5"H-
 
 
 	
r;   c                     t                                                       t          j                                         d S r2   r#  r(  s    r9   r%  zUIMethodUIModuleTest.tearDown  s4    (..00000r;   c                 f    |                      d          }|                     |j        d           d S )Nz/?value=asdfsV   In my_ui_method(42) with handler value asdf. In MyModule(123) with handler value asdf.r4  r   s     r9   test_ui_methodz#UIMethodUIModuleTest.test_ui_method  s?    ::n--M9	
 	
 	
 	
 	
r;   )
rK   rL   rM   rN   r   rT   r@   r%  r  rw  rx  s   @r9   rm  rm  |  s         . . . . .. . . .
 
 
(1 1 1 1 1

 
 
 
 
 
 
r;   rm  c                   0    e Zd Z G d de          Zd ZdS )GetArgumentErrorTestc                       e Zd Zd ZdS )GetArgumentErrorTest.Handlerc                     	 |                      d           |                     i            d S # t          $ r-}|                     |j        |j        d           Y d }~d S d }~ww xY w)Nrt   arg_namelog_message)r  r[   r"   r  r  r  s     r9   r\   z GetArgumentErrorTest.Handler.get  s    S!!%(((

2' S S S


1=QQRRRRRRRRRSs   *. 
A%"A  A%Nr]   rI   r;   r9   rT   r    s(        	S 	S 	S 	S 	Sr;   rT   c                     |                      d          }|                     t          |j                  ddd           d S )NrR   rt   zMissing argument foor  )r   r}   r   r   r   s     r9   test_catch_errorz%GetArgumentErrorTest.test_catch_error  sL    ::c??&&/EFF	
 	
 	
 	
 	
r;   N)rK   rL   rM   r   rT   r  rI   r;   r9   r  r    sU        S S S S S. S S S
 
 
 
 
r;   r  c                   0    e Zd Z G d de          Zd ZdS )SetLazyPropertiesTestc                   &    e Zd Zd Zd Zd Zd ZdS )SetLazyPropertiesTest.Handlerc                 F    d| _         t          j        d          | _        d S )NBenr  )current_userr   r\   rB   s    r9   r  z%SetLazyPropertiesTest.Handler.prepare  s     %D *W--DKKKr;   c                     t                      r2   rF   rB   s    r9   get_user_localez-SetLazyPropertiesTest.Handler.get_user_locale      %'''r;   c                     t                      r2   rF   rB   s    r9   get_current_userz.SetLazyPropertiesTest.Handler.get_current_user  r  r;   c                 \    |                      d| j        d| j        j        d           d S )NzHello z (r  )r[   r  r   r   rB   s    r9   r\   z!SetLazyPropertiesTest.Handler.get  s5    JJJ$*;*;*;T[=M=M=MNOOOOOr;   N)rK   rL   rM   r  r  r  r\   rI   r;   r9   rT   r    sU        	. 	. 	.	( 	( 	(	( 	( 	(	P 	P 	P 	P 	Pr;   rT   c                 f    |                      d          }|                     |j        d           d S )NrR   s   Hello Ben (en_US)r4  r   s     r9   test_set_propertiesz)SetLazyPropertiesTest.test_set_properties  s2     ::c??(<=====r;   N)rK   rL   rM   r   rT   r  rI   r;   r9   r  r    sU        P P P P P. P P P> > > > >r;   r  c                   n     e Zd Zd Z fdZd Z ej        d          d             Zd Z	d Z
d Z xZS )	GetCurrentUserTestc                      G d dt                     } G d dt                     }t          ddddd	          }t          |||d
          S )Nc                       e Zd Zd ZdS )<GetCurrentUserTest.get_app_kwargs.<locals>.WithoutUserModulec                     dS )Nrn  rI   rB   s    r9   r   zCGetCurrentUserTest.get_app_kwargs.<locals>.WithoutUserModule.render  s    rr;   Nr|  rI   r;   r9   WithoutUserModuler    s#            r;   r  c                       e Zd Zd ZdS )9GetCurrentUserTest.get_app_kwargs.<locals>.WithUserModulec                 *    t          | j                  S r2   )r   r  rB   s    r9   r   z@GetCurrentUserTest.get_app_kwargs.<locals>.WithUserModule.render  s    4,---r;   Nr|  rI   r;   r9   WithUserModuler    s#        . . . . .r;   r  rn  z{{ current_user }}z {% module WithoutUserModule() %}z{% module WithUserModule() %})without_user.htmlwith_user.htmlwithout_user_module.htmlwith_user_module.html)r  r  )r  r  r  )rC   r  r  r!  s       r9   r@   z!GetCurrentUserTest.get_app_kwargs  s    	 	 	 	 	 	 	 		. 	. 	. 	. 	.X 	. 	. 	. %'"6,N)H	 
 
 ""0%6 
 
 
 	
r;   c                     t                                                       t          j                                         d S r2   r#  r(  s    r9   r%  zGetCurrentUserTest.tearDown  r*  r;   c                      G d dt                     } G d d|          } G d d|          } G d d|          } G d	 d
|          } G d d|          }d|fd|fd|fd|fgS )Nc                       e Zd Zd Zd ZdS );GetCurrentUserTest.get_handlers.<locals>.CurrentUserHandlerc                     d| _         d S )NFhas_loaded_current_userrB   s    r9   r  zCGetCurrentUserTest.get_handlers.<locals>.CurrentUserHandler.prepare  s    /4,,,r;   c                     d| _         dS )NTrn  r  rB   s    r9   r  zLGetCurrentUserTest.get_handlers.<locals>.CurrentUserHandler.get_current_user  s    /3,rr;   N)rK   rL   rM   r  r  rI   r;   r9   CurrentUserHandlerr    s2        5 5 5    r;   r  c                       e Zd Zd ZdS );GetCurrentUserTest.get_handlers.<locals>.WithoutUserHandlerc                 ~    |                      d           |                     t          | j                             d S )Nr  render_stringr   r   r  rB   s    r9   r\   z?GetCurrentUserTest.get_handlers.<locals>.WithoutUserHandler.get  s:    ""#6777C <==>>>>>r;   Nr]   rI   r;   r9   WithoutUserHandlerr    #        ? ? ? ? ?r;   r  c                       e Zd Zd ZdS )8GetCurrentUserTest.get_handlers.<locals>.WithUserHandlerc                 ~    |                      d           |                     t          | j                             d S )Nr  r  rB   s    r9   r\   z<GetCurrentUserTest.get_handlers.<locals>.WithUserHandler.get  s:    ""#3444C <==>>>>>r;   Nr]   rI   r;   r9   WithUserHandlerr    r  r;   r  c                       e Zd Zd ZdS )AGetCurrentUserTest.get_handlers.<locals>.CurrentUserModuleHandlerc                     | j         S r2   )uirB   s    r9   get_template_namespacezXGetCurrentUserTest.get_handlers.<locals>.CurrentUserModuleHandler.get_template_namespace  s     wr;   N)rK   rL   rM   r  rI   r;   r9   CurrentUserModuleHandlerr    s#            r;   r  c                       e Zd Zd ZdS )AGetCurrentUserTest.get_handlers.<locals>.WithoutUserModuleHandlerc                 ~    |                      d           |                     t          | j                             d S )Nr  r  rB   s    r9   r\   zEGetCurrentUserTest.get_handlers.<locals>.WithoutUserModuleHandler.get
  s:    ""#=>>>C <==>>>>>r;   Nr]   rI   r;   r9   WithoutUserModuleHandlerr  	  r  r;   r  c                       e Zd Zd ZdS )>GetCurrentUserTest.get_handlers.<locals>.WithUserModuleHandlerc                 ~    |                      d           |                     t          | j                             d S )Nr  r  rB   s    r9   r\   zBGetCurrentUserTest.get_handlers.<locals>.WithUserModuleHandler.get  s:    ""#:;;;C <==>>>>>r;   Nr]   rI   r;   r9   WithUserModuleHandlerr    r  r;   r  /without_user
/with_user/without_user_module/with_user_moduler   )rC   r  r  r  r  r  r  s          r9   r?   zGetCurrentUserTest.get_handlers  s2   	 	 	 	 	 	 	 		? 	? 	? 	? 	?!3 	? 	? 	?
	? 	? 	? 	? 	?0 	? 	? 	?
	 	 	 	 	'9 	 	 		? 	? 	? 	? 	?'? 	? 	? 	?
	? 	? 	? 	? 	?$< 	? 	? 	? 01?+#%=> "78	
 	
r;   z	needs fixc                 f    |                      d          }|                     |j        d           d S )Nr     Falser4  r   s     r9   test_get_current_user_is_lazyz0GetCurrentUserTest.test_get_current_user_is_lazy  s3     ::o..11111r;   c                 f    |                      d          }|                     |j        d           d S )Nr     Truer4  r   s     r9   test_get_current_user_worksz.GetCurrentUserTest.test_get_current_user_works   s1    ::l++00000r;   c                 f    |                      d          }|                     |j        d           d S )Nr  r  r4  r   s     r9   ,test_get_current_user_from_ui_module_is_lazyz?GetCurrentUserTest.test_get_current_user_from_ui_module_is_lazy$  s2    ::45511111r;   c                 f    |                      d          }|                     |j        d           d S )Nr  r  r4  r   s     r9   *test_get_current_user_from_ui_module_worksz=GetCurrentUserTest.test_get_current_user_from_ui_module_works(  s2    ::12200000r;   )rK   rL   rM   r@   r%  r?   rA  skipr  r  r  r  rw  rx  s   @r9   r  r    s        
 
 
21 1 1 1 1)
 )
 )
V X];2 2  2
1 1 12 2 21 1 1 1 1 1 1r;   r  c                   0    e Zd Z G d de          Zd ZdS )UnimplementedHTTPMethodsTestc                       e Zd ZdS )$UnimplementedHTTPMethodsTest.HandlerNrH  rI   r;   r9   rT   r  .  s        r;   rT   c                     dD ]4}|                      d|          }|                     |j        d           5dD ]5}|                      d|d          }|                     |j        d           6d S )N)r  r  DELETEOPTIONSrR   r.    r   PUTr;   r   rY  )rC   r   r   s      r9   #test_unimplemented_standard_methodsz@UnimplementedHTTPMethodsTest.test_unimplemented_standard_methods1  s    : 	1 	1Fzz#fz55HX]C0000% 	1 	1Fzz#f3z??HX]C0000	1 	1r;   N)rK   rL   rM   r   rT   r  rI   r;   r9   r  r  -  sM            .   1 1 1 1 1r;   r  c                   6    e Zd Z G d de          Zd Zd ZdS )#UnimplementedNonStandardMethodsTestc                       e Zd Zd ZdS )+UnimplementedNonStandardMethodsTest.Handlerc                 0    |                      d           d S NotherrZ   rB   s    r9   r  z1UnimplementedNonStandardMethodsTest.Handler.other<  s     JJwr;   N)rK   rL   rM   r  rI   r;   r9   rT   r  ;  s#        	  	  	  	  	 r;   rT   c                 l    |                      ddd          }|                     |j        d           d S )NrR   PATCHr;   r   r  rY  r   s     r9   test_unimplemented_patchz<UnimplementedNonStandardMethodsTest.test_unimplemented_patchA  s9     ::c':<<,,,,,r;   c                 l    |                      ddd          }|                     |j        d           d S )NrR   OTHERTr   allow_nonstandard_methodsr  rY  r   s     r9   test_unimplemented_otherz<UnimplementedNonStandardMethodsTest.test_unimplemented_otherG  s7    ::c'T:RR,,,,,r;   N)rK   rL   rM   r   rT   r  r  rI   r;   r9   r  r  :  s\                 .      - - -- - - - -r;   r  c                   0    e Zd Z G d de          Zd ZdS )AllHTTPMethodsTestc                   (    e Zd Zd ZexZxZxZxZZdS )AllHTTPMethodsTest.Handlerc                 `    | j         j        J |                     | j         j                   d S r2   )r  r   r[   rB   s    r9   r   z!AllHTTPMethodsTest.Handler.methodN  s0    <&222JJt|*+++++r;   N)	rK   rL   rM   r   r\   deleteoptionsr   putrI   r;   r9   rT   r  M  s8        	, 	, 	, /544f4w4r;   rT   c                 |   |                      dd          }|                     |j        d           dD ]A}|                      d|          }|                     |j        t          |                     BdD ]B}|                      d|d          }|                     |j        t          |                     Cd S )NrR   r  r.  r;   )r  r  r  r  r   )r   r}   r   r   )rC   r   r   s      r9   test_standard_methodsz(AllHTTPMethodsTest.test_standard_methodsT  s    ::c&:11,,,2 	: 	:Fzz#fz55HX]DLL9999% 	: 	:Fzz#f3z??HX]DLL9999	: 	:r;   N)rK   rL   rM   r   rT   r   rI   r;   r9   r  r  L  sM        5 5 5 5 5. 5 5 5: : : : :r;   r  c                   6    e Zd Z G d de          Zd Zd ZdS )PatchMethodTestc                   .    e Zd Zej        dz   Zd Zd ZdS )PatchMethodTest.Handler)r  c                 0    |                      d           d S )NpatchrZ   rB   s    r9   r  zPatchMethodTest.Handler.patche  r  r;   c                 0    |                      d           d S r  rZ   rB   s    r9   r  zPatchMethodTest.Handler.otherh  r  r;   N)rK   rL   rM   r   SUPPORTED_METHODSr  r  rI   r;   r9   rT   r  `  sF        *< @
 
	  	  	 	  	  	  	  	 r;   rT   c                 l    |                      ddd          }|                     |j        d           d S )NrR   r  r;   r   s   patchr4  r   s     r9   
test_patchzPatchMethodTest.test_patchk  s7    ::c':<<11111r;   c                 l    |                      ddd          }|                     |j        d           d S )NrR   r  Tr  s   otherr4  r   s     r9   
test_otherzPatchMethodTest.test_othero  s7    ::c'T:RR11111r;   N)rK   rL   rM   r   rT   r
  r  rI   r;   r9   r  r  _  s\        	  	  	  	  	 . 	  	  	 2 2 22 2 2 2 2r;   r  c                   0    e Zd Z G d de          Zd ZdS )FinishInPrepareTestc                       e Zd Zd Zd ZdS )FinishInPrepareTest.Handlerc                 0    |                      d           d S )Nr   r3  rB   s    r9   r  z#FinishInPrepareTest.Handler.preparev  s    KKr;   c                      t          d          )Nzshould not reach this methodr  rB   s    r9   r\   zFinishInPrepareTest.Handler.gety  s     :;;;r;   Nr4  rI   r;   r9   rT   r  u  s2        	  	  	 	< 	< 	< 	< 	<r;   rT   c                 f    |                      d          }|                     |j        d           d S )NrR   s   doner4  r   s     r9   test_finish_in_preparez*FinishInPrepareTest.test_finish_in_prepare  s/    ::c??00000r;   N)rK   rL   rM   r   rT   r  rI   r;   r9   r  r  t  sM        < < < < <. < < <1 1 1 1 1r;   r  c                       e Zd Zd Zd ZdS )Default404Testc                     dt           fgS Nr   r   rB   s    r9   r?   zDefault404Test.get_handlers  s    ())r;   c                     |                      d          }|                     |j        d           |                     |j        d           d S )NrR   r7  sE   <html><title>404: Not Found</title><body>404: Not Found</body></html>rM  r   s     r9   test_404zDefault404Test.test_404  sU    ::c??,,,M2	
 	
 	
 	
 	
r;   N)rK   rL   rM   r?   r  rI   r;   r9   r  r    s2        * * *
 
 
 
 
r;   r  c                        e Zd Zd Zd Zd ZdS )Custom404Testc                     dt           fgS r  r   rB   s    r9   r?   zCustom404Test.get_handlers      ())r;   c                 H     G d dt                     }t          |          S )Nc                       e Zd Zd ZdS )6Custom404Test.get_app_kwargs.<locals>.Custom404Handlerc                 Z    |                      d           |                     d           d S )Nr7  zcustom 404 response)r  r[   rB   s    r9   r\   z:Custom404Test.get_app_kwargs.<locals>.Custom404Handler.get  s-    $$$

011111r;   Nr]   rI   r;   r9   Custom404Handlerr!    s#        2 2 2 2 2r;   r#  )default_handler_class)r   rg   )rC   r#  s     r9   r@   zCustom404Test.get_app_kwargs  s@    	2 	2 	2 	2 	2~ 	2 	2 	2
 *:;;;;r;   c                     |                      d          }|                     |j        d           |                     |j        d           d S )NrR   r7  s   custom 404 responserM  r   s     r9   r  zCustom404Test.test_404  sH    ::c??,,,(>?????r;   N)rK   rL   rM   r?   r@   r  rI   r;   r9   r  r    sF        * * *< < <@ @ @ @ @r;   r  c                        e Zd Zd Zd Zd ZdS )DefaultHandlerArgumentsTestc                     dt           fgS r  r   rB   s    r9   r?   z(DefaultHandlerArgumentsTest.get_handlers  r  r;   c                 J    t          t          t          d                    S )Nr:  r  )r$  default_handler_args)rg   r#   rB   s    r9   r@   z*DefaultHandlerArgumentsTest.get_app_kwargs  s*    ".!%#!6!6!6
 
 
 	
r;   c                 f    |                      d          }|                     |j        d           d S )NrR   r:  rY  r   s     r9   test_403z$DefaultHandlerArgumentsTest.test_403  s/    ::c??,,,,,r;   N)rK   rL   rM   r?   r@   r,  rI   r;   r9   r'  r'    sA        * * *
 
 
- - - - -r;   r'  c                       e Zd Zd Zd ZdS )HandlerByNameTestc                 6    dt           fdt          dd          gS )N/hello1)/hello2"tornado.test.web_test.HelloHandler/hello3r2  )rV   r%   rB   s    r9   r?   zHandlerByNameTest.get_handlers  s'     %=	?@@
 	
r;   c                 &   |                      d          }|                     |j        d           |                      d          }|                     |j        d           |                      d          }|                     |j        d           d S )Nr0  rd  r1  r3  r4  rC   resps     r9   test_handler_by_namez&HandlerByNameTest.test_handler_by_name  s    zz)$$H---zz)$$H---zz)$$H-----r;   N)rK   rL   rM   r?   r7  rI   r;   r9   r.  r.    s2        
 
 
. . . . .r;   r.  c                   r    e Zd Zd Zd Zed             Zed             Zed             Zed             Z	dS )StreamingRequestBodyTestc                    t            G d dt                                }t            G d dt                                }t            G d dt                                }d|t          |           fd	|fd
|t          |           fgS )Nc                   &    e Zd Zd Zd Zd Zd ZdS )CStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandlerc                     || _         d S r2   r   r   s     r9   rd  zNStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.initialize       			r;   c                 D    | j         j                            d            d S r2   )r   prepared
set_resultrB   s    r9   r  zKStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.prepare  s!    	"--d33333r;   c                 D    | j         j                            |           d S r2   )r   r>  rA  rC   r>  s     r9   data_receivedzQStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.data_received  s     	))$/////r;   c                 n    | j         j                            d            |                     i            d S r2   )r   finishedrA  r[   rB   s    r9   r\   zGStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.get  s.    	"--d333

2r;   N)rK   rL   rM   rd  r  rD  r\   rI   r;   r9   StreamingBodyHandlerr<    sP        ! ! !4 4 40 0 0    r;   rG  c                       e Zd Zd ZdS )AStreamingRequestBodyTest.get_handlers.<locals>.EarlyReturnHandlerc                      t          d          )N  r  rB   s    r9   r  zIStreamingRequestBodyTest.get_handlers.<locals>.EarlyReturnHandler.prepare  s      nn$r;   Nr  rI   r;   r9   EarlyReturnHandlerrI    s#        % % % % %r;   rL  c                   $     e Zd Zd Z fdZ xZS )DStreamingRequestBodyTest.get_handlers.<locals>.CloseDetectionHandlerc                     || _         d S r2   r   r   s     r9   rd  zOStreamingRequestBodyTest.get_handlers.<locals>.CloseDetectionHandler.initialize  r>  r;   c                     t                                                       | j        j                            d            d S r2   )r$  r  r   close_futurerA  r(  s    r9   r  zXStreamingRequestBodyTest.get_handlers.<locals>.CloseDetectionHandler.on_connection_close  s8    ++---	&11$77777r;   )rK   rL   rM   rd  r  rw  rx  s   @r9   CloseDetectionHandlerrN    sG        ! ! !8 8 8 8 8 8 8 8 8r;   rR  z/stream_bodyr   z/early_returnz/close_detection)r,   r   rg   )rC   rG  rL  rR  s       r9   r?   z%StreamingRequestBodyTest.get_handlers  s    		 	 	 	 	> 	 	 
		 
	% 	% 	% 	% 	% 	% 	% 
		% 
	8 	8 	8 	8 	8N 	8 	8 
		8 14T???C01!6$H
 	
r;   c                 X   t          j         t           j        t           j        d          }|                    d|                                 f           t          |          }|                    d|z   dz              |r|                    d           |                    d           |S )Nr   r  s   GET s    HTTP/1.1
s   Connection: close
s   Transfer-Encoding: chunked

)r  r  r  r  r  r   r[   )rC   r%   connection_closer  r  s        r9   r  z StreamingRequestBodyTest.connect  s    M&.&*<a@@			; 2 2 4 45666!Ws]%55666 	3LL1222:;;;r;   c              #     K   t                      | _        t                      | _        t                      | _        |                     dd          }| j        V  |                    d           | j        V }|                     |d           t                      | _        |                    d           | j        V }|                     |d           |                    d           | j        V  |                                V }|                     |	                    d	                     |
                                 d S )
Ns   /stream_bodyTrT  	   4
asdf
s   asdfs	   4
qwer
s   qwers   0

s   {})r   r@  r>  rF  r  r[   r}   read_until_closer   rP  r  rC   r  r>  s      r9   test_streaming_bodyz,StreamingRequestBodyTest.test_streaming_body  s#     HH	oEEm%&&&Yw'''HH	%&&&Yw'''\"""m,,....e,,---r;   c              #      K   |                      dd          }|                                V }|                     |                    d                     d S )N   /early_returnFrV     HTTP/1.1 401)r  rX  r   r  rY  s      r9   test_early_returnz*StreamingRequestBodyTest.test_early_return	  sW      .GG,,....8899999r;   c              #      K   |                      dd          }|                    d           |                                V }|                     |                    d                     d S )Nr\  FrV  rW  r]  )r  r[   rX  r   r  rY  s      r9   test_early_return_with_dataz4StreamingRequestBodyTest.test_early_return_with_data	  sj      .GG%&&&,,....8899999r;   c              #      K   t                      | _        |                     dd          }|                                 | j        V  d S )Ns   /close_detectionFrV  )r   rQ  r  r  )rC   r  s     r9   test_close_during_uploadz1StreamingRequestBodyTest.test_close_during_upload	  sJ      "HH1EJJr;   N)
rK   rL   rM   r?   r  r   rZ  r^  r`  rb  rI   r;   r9   r9  r9    s        $
 $
 $
L	 	 	   X, : : X:
 : : X:     X     r;   r9  c                   t    e Zd Zd Zej        d             Zej        d             Z	ej        d             Z
dS )BaseFlowControlHandlerc                 0    || _         d | _        g | _        d S r2   )r   r   methodsr   s     r9   rd  z!BaseFlowControlHandler.initialize*	  s    	r;   c              #      K   | j         %| j                            d|d| j                    || _         | j                            |           	 d V  d | _         d S # d | _         w xY w)Nzentered method z
 while in )r   r   failrf  appendr  s     r9   	in_methodz BaseFlowControlHandler.in_method/	  sz      ;"INNNfffdkkRSSSF###	EEEDKKK$DKs   A 	A'c              #   Z   K   | j                             d           t          j        V  d S )Nr  )rf  ri  r   momentrB   s    r9   r  zBaseFlowControlHandler.prepare:	  s2       	I&&&jr;   c              #      K   |                      d          5  t          j        V  d d d            n# 1 swxY w Y   |                     t	          | j                             d S )Nr   rf  )rj  r   rl  r[   rg   rf  rB   s    r9   r   zBaseFlowControlHandler.postA	  s      ^^F## 	 	*	 	 	 	 	 	 	 	 	 	 	 	 	 	 	

4---.....s   377N)rK   rL   rM   rd  
contextlibcontextmanagerrj  r   r   r  r   rI   r;   r9   rd  rd  (	  s|          
    	]  ] 	]/ / ]/ / /r;   rd  c                   \    e Zd Zd Zd Zdej        fdZdej        fdZdej        fdZ	dS )#BaseStreamingRequestFlowControlTestc                 $    t          dd          S )Nr  T)
chunk_sizedecompress_requestr   rB   s    r9   get_httpserver_optionsz:BaseStreamingRequestFlowControlTest.get_httpserver_optionsI	  s     rd;;;;r;   c                     t                      S r2   r   rB   s    r9   r  z3BaseStreamingRequestFlowControlTest.get_http_clientN	  r  r;   rC   c                     |                      ddd          }|                                 |                     t          |j                  t          g d                     d S )NrR   abcdefghijklmnopqrstuvwxyzr   )r   r   r  rD  rD  rD  r   rn  )r   r9  r}   r   r   rg   r   s     r9   test_flow_control_fixed_bodyz@BaseStreamingRequestFlowControlTest.test_flow_control_fixed_bodyS	  s|    ::c(DV:TT&&    	
 	
 	
 	
 	
r;   c                    g dt           j        fd            }|                     d|d          }|                                 |                     t          |j                  t          g d                     d S )N)s   abcds   efghs   ijklc              3   0   K   D ]} | |          V  d S r2   rI   )r[   ichunkss     r9   body_producerzYBaseStreamingRequestFlowControlTest.test_flow_control_chunked_body.<locals>.body_producerf	  s3        eAhh r;   rR   r   )r  r   rz  rn  )r   r   r   r9  r}   r   r   rg   )rC   r  r   r  s      @r9   test_flow_control_chunked_bodyzBBaseStreamingRequestFlowControlTest.test_flow_control_chunked_bodyc	  s    ,,,		 	 	 	 
	 ::cv:NN&&    	
 	
 	
 	
 	
r;   c                    t                      }t          j        d|          }|                    d           |                                 |                                }|                     d|dddi          }|                                 |                     t          |j
                  t          g d	
                     d S )Nw)modefileobjs   abcdefghijklmnopqrstuvwxyzrR   r   rt  rs  )r   r   r,  rz  rn  )r0   rs  GzipFiler[   r  getvaluer   r9  r}   r   r   rg   )rC   bytesio	gzip_filecompressed_bodyr   s        r9   !test_flow_control_compressed_bodyzEBaseStreamingRequestFlowControlTest.test_flow_control_compressed_bodyz	  s    ))MsG<<<	5666!**,,:: '0	  
 
 	&&    	
 	
 	
 	
 	
r;   N)
rK   rL   rM   rv  r  rz  Anyr{  r  r  rI   r;   r9   rr  rr  H	  s        < < <
' ' '

6: 
 
 
 
 
VZ 
 
 
 
.

 
 
 
 
 
 
r;   rr  c                       e Zd Zd ZdS )(DecoratedStreamingRequestFlowControlTestc                 P     G d dt                     }d|t          |           fgS )Nc                   .    e Zd Zej        d             ZdS )ZDecoratedStreamingRequestFlowControlTest.get_handlers.<locals>.DecoratedFlowControlHandlerc              3      K   |                      d          5  t          j        V  d d d            d S # 1 swxY w Y   d S )NrD  )rj  r   rl  rC  s     r9   rD  zhDecoratedStreamingRequestFlowControlTest.get_handlers.<locals>.DecoratedFlowControlHandler.data_received	  s      ^^O44 % %*$$$% % % % % % % % % % % % % % % % % %s   488N)rK   rL   rM   r   r   rD  rI   r;   r9   DecoratedFlowControlHandlerr  	  s/        ]% % ]% % %r;   r  rR   r   rd  rg   )rC   r  s     r9   r?   z5DecoratedStreamingRequestFlowControlTest.get_handlers	  sH    	% 	% 	% 	% 	%*@ 	% 	% 	% 14T???CDDr;   NrK   rL   rM   r?   rI   r;   r9   r  r  	  s(        E E E E Er;   r  c                       e Zd Zd ZdS )%NativeStreamingRequestFlowControlTestc                 P     G d dt                     }d|t          |           fgS )Nc                       e Zd Zd ZdS )TNativeStreamingRequestFlowControlTest.get_handlers.<locals>.NativeFlowControlHandlerc                    K   |                      d          5  dd l}|                    d           d {V  d d d            d S # 1 swxY w Y   d S )NrD  r   )rj  asyncior  )rC   r>  r  s      r9   rD  zbNativeStreamingRequestFlowControlTest.get_handlers.<locals>.NativeFlowControlHandler.data_received	  s      ^^O44 + +"NNN!--*********+ + + + + + + + + + + + + + + + + +s    AA	A	N)rK   rL   rM   rD  rI   r;   r9   NativeFlowControlHandlerr  	  s#        + + + + +r;   r  rR   r   r  )rC   r  s     r9   r?   z2NativeStreamingRequestFlowControlTest.get_handlers	  sH    	+ 	+ 	+ 	+ 	+'= 	+ 	+ 	+ .$@AAr;   Nr  rI   r;   r9   r  r  	  s(        B B B B Br;   r  c                        e Zd Zd Zd Zd ZdS )IncorrectContentLengthTestc                 z    | d | _          G fddt                    } G fddt                    }d|fd|fgS )Nc                       e Zd Z fdZdS )8IncorrectContentLengthTest.get_handlers.<locals>.TooHighc                     |                      dd           	 |                     d           d S # t          $ r}|_         d }~ww xY w)Nr  r}  rA  r  r   r  server_errorrC   r  r   s     r9   r\   z<IncorrectContentLengthTest.get_handlers.<locals>.TooHigh.get	  s_     0$777KK%%%%%    ()D%   0 
AAANr]   r   s   r9   TooHighr  	  .              r;   r  c                       e Zd Z fdZdS )7IncorrectContentLengthTest.get_handlers.<locals>.TooLowc                     |                      dd           	 |                     d           d S # t          $ r}|_         d }~ww xY w)Nr  rT  rY   r  r  s     r9   r\   z;IncorrectContentLengthTest.get_handlers.<locals>.TooLow.get	  s_     0#666KK(((((    ()D%r  Nr]   r   s   r9   TooLowr  	  r  r;   r  /high/low)r  r   )rC   r  r  r   s      @r9   r?   z'IncorrectContentLengthTest.get_handlers	  s     	 	 	 	 	 	 	n 	 	 		 	 	 	 	 	 	^ 	 	 	 '"VV$455r;   c                    t          t          d          5  t          t          d          5  |                     t                    5  |                     dd           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d d d            n# 1 swxY w 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   r}   r   r  rB   s    r9   test_content_length_too_highz7IncorrectContentLengthTest.test_content_length_too_high	  s    w LMM 	: 	:5  : :
 &&77 : :JJwDJ999: : : : : : : : : : : : : : :: : : : : : : : : : : : : : :	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	!""$V	
 	
 	
 	
 	
X   BBA+B+A//B2A/3B6BB	B	B	
BB Bc                    t          t          d          5  t          t          d          5  |                     t                    5  |                     dd           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |                     t          | j                  d           d S )Nr  r  r  Tr  z,Tried to write more data than Content-Lengthr  rB   s    r9   test_content_length_too_lowz6IncorrectContentLengthTest.test_content_length_too_low	  s    w LMM 	9 	95  9 9
 &&77 9 9JJv4J8889 9 9 9 9 9 9 9 9 9 9 9 9 9 99 9 9 9 9 9 9 9 9 9 9 9 9 9 9	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	!""$R	
 	
 	
 	
 	
r  N)rK   rL   rM   r?   r  r  rI   r;   r9   r  r  	  sA        6 6 62
 
 
 
 
 
 
 
r;   r  c                   0    e Zd Z G d de          Zd ZdS )ClientCloseTestc                       e Zd Zd ZdS )ClientCloseTest.Handlerc                     | j         j                            d          r:| j         j        j                                         |                     d           d S |                     d           d S )NzHTTP/1rY   requires HTTP/1.x)r  rx   r  
connectionr  r  r[   rB   s    r9   r\   zClientCloseTest.Handler.get	  sl    |#..x88 
0 '.44666

7##### 

./////r;   Nr]   rI   r;   r9   rT   r  	  s#        	0 	0 	0 	0 	0r;   rT   c                 (   |                      t          t          j        f          5  |                     dd          }|j        dk    r|                     d           |                     |j        d           d d d            d S # 1 swxY w Y   d S )NrR   Tr  s   requires HTTP/1.xr  iW  )	r  r   rA  SkipTestr   r   skipTestr}   r   r   s     r9   test_client_closez!ClientCloseTest.test_client_close	  s    1BCDD 	1 	1zz#4z88H} 4441222X]C000		1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1s   ABBBN)rK   rL   rM   r   rT   r  rI   r;   r9   r  r  	  sM        0 0 0 0 0. 0 0 01 1 1 1 1r;   r  c                   f    e Zd ZdZddddZd Zd Zd Zd	 Zd
 Z	d Z
d Zd Zd Zd Zd Zd ZdS )SignedValueTestzIt's a secret to everybody	asdfbasdf123123122342342)r   rv   r   c                 0    |                                  dz
  S )Ni 0* )presentrB   s    r9   pastzSignedValueTest.past
  s    ||~~
**r;   c                     dS )Ni m|MrI   rB   s    r9   r  zSignedValueTest.present	
  s    zr;   c                 >   t          t          j        ddd| j                  }|                     |d           t          t          j        ddd| j                  }|                     |d           t          t          j        dd| j                  }|                     ||           t          t          j        d|d| j        	          }|                     |d
           t          t          j        d|d| j        	          }|                     |d
           d S )Nr  rn   rv   )rx   clocks<   dmFsdWU=|1300000000|31c934969f53e48164c50768b40cbd7e2daaaa4fr   se   2|1:0|10:1300000000|3:key|8:dmFsdWU=|3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e152r  )rz   r     value)r'   r  SECRETr  r}   r(   )rC   	signed_v1	signed_v2signed_default
decoded_v1
decoded_v2s         r9   test_known_valuesz!SignedValueTest.test_known_values
  sI   '"E7AT\
 
 
	 	V	
 	
 	
 ("E7AT\
 
 
	 	P	
 	
 	
 -"E7$,
 
 
 	333("E9!4<
 
 

 	X...("E9!4<
 
 

 	X.....r;   c                 n   t          t          j        dd| j                  }t          t          j        dd| j                  }t	          t          j        d|| j                  }|                     |d            t	          t          j        d|| j                  }|                     |d            d S )Nkey1rn   r  key2)r'   r  r  r  r(   assertIs)rC   signed1signed2decoded1decoded2s        r9   test_name_swapzSignedValueTest.test_name_swap,
  s    %"FG4<
 
 
 &"FG4<
 
 
 '"FG4<
 
 
 	h%%%&"FG4<
 
 
 	h%%%%%r;   c                 *   t          t          j        dd| j                  }t	          t          j        d|| j                  }|                     |d           t	          t          j        d|| j                  }|                     |d            d S )Nr  rn   r  r  )r'   r  r  r  r(   r}   r  r  )rC   signeddecoded_pastdecoded_presents       r9   test_expiredzSignedValueTest.test_expired=
  s    $"FG49
 
 
 +"FF$)
 
 
 	x000-"FF$,
 
 
 	ot,,,,,r;   c                 
    d fd}                       |d                                           |d                                           |d                                           |d                     d S )N@3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e152c                 V    dt          t          j        d| z   j                  k    S Nr  r  r  r(   r  r  r  )prefixrC   r   s    r9   validatez8SignedValueTest.test_payload_tampering.<locals>.validateN
  4    2&v|4<       r;   %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)rC   r  r   s   ` @r9   test_payload_tamperingz&SignedValueTest.test_payload_tamperingJ
  s    P	 	 	 	 	 	
 	!HIIJJJ"IJJKKK"HIIJJJ"JKKLLLLLr;   c                     d fd}                       |d                                           |d                                           |d                                           |d                                           |d                                           |d                     d S )	Nr  c                 V    dt          t          j        d| z   j                  k    S r  r  )r   r  rC   s    r9   r  z:SignedValueTest.test_signature_tampering.<locals>.validate^
  r  r;   r   00000000000000000000000000000000@4d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e152@3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e153?3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e15A3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e1538r  )rC   r  r  s   ` @r9   test_signature_tamperingz(SignedValueTest.test_signature_tampering[
  s   8	 	 	 	 	 	
 	HWXX	
 	
 	
 	(++,,,HWXX	
 	
 	
 	HWXX	
 	
 	
 	HVWW	
 	
 	
 	HS 	
 	
 	
 	
 	
r;   c                     d}t          t          j        d|| j                  }t	          t          j        d|| j                  }|                     ||           d S )Nr   r  r  )r'   r  r  r  r(   r}   rC   rn   r  decodeds       r9   test_non_asciizSignedValueTest.test_non_ascii{
  sk    $"E5
 
 
 &"E6
 
 
 	(((((r;   c                     d}t          t          j        d|| j        d          }t	          t          j        d|| j                  }|                     ||           d S Nr   r  r   r  re   r  r'   r  SECRET_DICTr  r(   r}   r  s       r9   *test_key_versioning_read_write_default_keyz:SignedValueTest.test_key_versioning_read_write_default_key
  n    $'T\WX
 
 
 &'dl
 
 
 	(((((r;   c                     d}t          t          j        d|| j        d          }t	          t          j        d|| j                  }|                     ||           d S )Nr   r  rv   r  r  r  r  s       r9   .test_key_versioning_read_write_non_default_keyz>SignedValueTest.test_key_versioning_read_write_non_default_key
  r  r;   c                    d}t          t          j        d|| j        d          }t          j                                        }|                    d           t          |d|| j                  }|                     d |           d S r  )r'   r  r  r  r   r   r(   r}   )rC   rn   r  newkeysr  s        r9   test_key_versioning_invalid_keyz/SignedValueTest.test_key_versioning_invalid_key
  s    $'T\WX
 
 
 "-2244A%gufDLQQQw'''''r;   c                     d}t          t          j        d|| j        d          }t	          |          }|                     d|           d S )Nr   r  rv   r  )r'   r  r  r  r)   r}   )rC   rn   r  re   s       r9   test_key_version_retrievalz*SignedValueTest.test_key_version_retrieval
  sW    $'T\WX
 
 
 077K(((((r;   N)rK   rL   rM   r  r  r  r  r  r  r  r  r  r  r  r  r  r  rI   r;   r9   r  r  
  s        )F!jY??K+ + +  / / /@& & &"- - -M M M"
 
 
@) ) )) ) )) ) )( ( () ) ) ) )r;   r  c                        e Zd Z G d de          Zd Z fdZddZddZd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z xZS )XSRFTestc                       e Zd Zd Zd ZdS )XSRFTest.Handlerc                     t          |                     dd                    }|| j        d<   |                     | j                   d S )Nrx   rT  xsrf_cookie_version)r  r  rc   r[   r  )rC   rx   s     r9   r\   zXSRFTest.Handler.get
  sH    $++Is;;<<G 4;DM/0JJt'''''r;   c                 0    |                      d           d S r@  rZ   rB   s    r9   r   zXSRFTest.Handler.post
      JJtr;   NrK   rL   rM   r\   r   rI   r;   r9   rT   r  
  s2        	( 	( 	(	 	 	 	 	r;   rT   c                 "    t          d          S r   r   rB   s    r9   r@   zXSRFTest.get_app_kwargs
  r  r;   c                 z    t                                                       |                                 | _        d S r2   r$  setUp	get_tokenr  r(  s    r9   r  zXSRFTest.setUp
  )    ..**r;   Nc                     ||                      |          }nd }|                     |dnd|z  |          }|                                 t          |j                  S )NrR   z/?version=%dr2  cookie_headersr   r9  r	   r   )rC   	old_tokenrx   r,  r   s        r9   r  zXSRFTest.get_token
  sp     )))44GGG::?CC')AG  
 
 	(-(((r;   c                 "    || j         }dd|z   iS )Nr0  z_xsrf=r  rC   tokens     r9   r  zXSRFTest.cookie_headers
  s    =OE(U*++r;   c                     t          t          d          5  |                     ddd          }d d d            n# 1 swxY w Y   |                     |j        d           d S N.*'_xsrf' argument missingrR   r   r;   r   r:  rE  r   s     r9   test_xsrf_fail_no_tokenz XSRFTest.test_xsrf_fail_no_token
      w <== 	@ 	@zz#f3z??H	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@,,,,,   ;??c           
      &   t          t          d          5  |                     ddt          j                            t          | j                                      }d d d            n# 1 swxY w Y   |                     |j	        d           d S N!.*XSRF cookie does not match POSTrR   r   _xsrfr   r:  
r   r   r   re  rf  rg  rg   r  r}   r   r   s     r9   test_xsrf_fail_body_no_cookiez&XSRFTest.test_xsrf_fail_body_no_cookie
      w CDD 	 	zz\++Dt,G,G,GHH "  H	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	,,,,,   A	A++A/2A/c                 B   t          t          d          5  |                     dd|                                 t          j                            t          d                              }d d d            n# 1 swxY w Y   |                     |j	        d           d S )Nz%.*'_xsrf' argument has invalid formatrR   r   3|r.  r<  r:  )
r   r   r   r  re  rf  rg  rg   r}   r   r   s     r9   &test_xsrf_fail_argument_invalid_formatz/XSRFTest.test_xsrf_fail_argument_invalid_format
  s    w GHH 	 	zz++--\++Dt,<,<,<==	 "  H	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	,,,,,s   AA99A= A=c                 P   t          t          d          5  |                     dd|                     d          t          j                            t          | j                                      }d d d            n# 1 swxY w Y   | 	                    |j
        d           d S )	Nr-  rR   r   r5  r$  r.  r<  r:  )r   r   r   r  re  rf  rg  rg   r  r}   r   r   s     r9   $test_xsrf_fail_cookie_invalid_formatz-XSRFTest.test_xsrf_fail_cookie_invalid_format
  s    w CDD 	 	zz++$+77\++Dt,G,G,GHH	 "  H	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	,,,,,s   AB  BBc                     t          t          d          5  |                     ddd|                                           }d d d            n# 1 swxY w Y   |                     |j        d           d S )Nr'  rR   r   r;   r   r   r,  r:  )r   r   r   r  r}   r   r   s     r9   test_xsrf_fail_cookie_no_bodyz&XSRFTest.test_xsrf_fail_cookie_no_body
  s    w <== 	 	zzFd6I6I6K6K "  H	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	,,,,,s   ,AAAc           	          |                      ddt          j                            t	          d                    |                     d                    }|                     |j        d           d S )NrR   r   deadbeefr.  r8  r;  r   r   re  rf  rg  rg   r  r}   r   r   s     r9   test_xsrf_success_short_tokenz&XSRFTest.test_xsrf_success_short_token
  sr    ::'':(>(>(>??''j'99	  
 
 	,,,,,r;   c           	          |                      ddt          j                            t	          d                    |                     d                    }|                     |j        d           d S )NrR   r   xoxor.  r8  r;  r   r?  r   s     r9   test_xsrf_success_non_hex_tokenz(XSRFTest.test_xsrf_success_non_hex_token  sr    ::''6(:(:(:;;''f'55	  
 
 	,,,,,r;   c           	          |                      ddt          j                            t	          | j                            |                                           }|                     |j        d           d S NrR   r   r.  r;  r   	r   re  rf  rg  rg   r  r  r}   r   r   s     r9   test_xsrf_success_post_bodyz$XSRFTest.test_xsrf_success_post_body
  so    ::''4?(C(C(CDD''))	  
 
 	,,,,,r;   c                     |                      dt          j                            t	          | j                            z   dd|                                           }|                     |j        d           d S )Nz/?r.  r   r;   r;  r   rF  r   s     r9   test_xsrf_success_query_stringz'XSRFTest.test_xsrf_success_query_string  st    ::6<))$T_*E*E*EFFF''))	  
 
 	,,,,,r;   c                     |                      dddt          d| j        ifi |                                           }|                     |j        d           d S )NrR   r   r;   zX-Xsrftokenr;  r   )r   rg   r  r  r}   r   r   s     r9   test_xsrf_success_headerz!XSRFTest.test_xsrf_success_header  ss    ::0 %%'' 	  
 
 	,,,,,r;   c                     d}t                      }t          |          D ])}|                    |                                            *|                     t          |          |           d S )Nr  )r  ranger  r  r}   r;  )rC   
NUM_TOKENStokensr~  s       r9   test_distinct_tokenszXSRFTest.test_distinct_tokens(  sh    
z"" 	) 	)AJJt~~''((((Vj11111r;   c                    |                                  }| j        |fD ]t}|                     ddt          j                            t          |                    |                     |                    }|                     |j	        d           u| j        |f|| j        ffD ]\  }}t          t          d          5  |                     ddt          j                            t          |                    |                     |                    }d d d            n# 1 swxY w Y   |                     |j	        d           d S )NrR   r   r.  r;  r   r-  r:  )r  r  r   re  rf  rg  rg   r  r}   r   r   r   )rC   token2r$  r   cookie_token
body_tokens         r9   test_cross_userzXSRFTest.test_cross_user0  s   !!ov. 	1 	1Ezz\++Du,=,=,=>>++E22	 "  H X]C0000 _f%T_%)
 	1 	1$L* 7$GHH  ::!//:0F0F0FGG //==	 &                 X]C0000	1 	1s   ?AD##D'	*D'	c           
         | j         }t          |g          }t          d          D ]}|                     |          }|                    |           |                     ddt          j                            t          | j                             | 
                    |                    }|                     |j        d           |                     t          |          d           d S )N   rR   r   r.  r;  r   rL  )r  r  rM  r  r  r   re  rf  rg  rg   r  r}   r   r;  )rC   r$  tokens_seenr~  r   s        r9   test_refresh_tokenzXSRFTest.test_refresh_tokenI  s    5'll
 q 
	1 
	1ANN5))EOOE"""zz\++Dt,G,G,GHH++E22	 "  H X]C0000[))1-----r;   c           
         |                      |                     d          |                     d                     |                     d          }t          d          D ]-}|                     |                     |d          |           .|                     |          }|                      ||           |                      ||                     |                     ||f||ffD ]w\  }}|                     ddt
          j                            t          |                    | 	                    |                    }|                     |j
        d           xd S )	Nrv   rw   rW  rR   r   r.  r;  r   )assertNotEqualr  rM  r}   r   re  rf  rg  rg   r  r   )rC   v1_tokenr~  v2_tokenrS  rT  r   s          r9   test_versioningzXSRFTest.test_versioning]  sm   DNN1N55t~~a~7P7PQQQ >>!>,,q 	L 	LAT^^Ha^@@(KKKK >>(++Hh///HdnnX&>&>??? +3H)=(?S(T 	1 	1$L*zz\++Dz,B,B,BCC++L99	 "  H X]C0000	1 	1r;   r~  r2   )rK   rL   rM   r   rT   r@   r  r  r  r(  r1  r6  r9  r<  r@  rC  rG  rI  rK  rP  rU  rY  r^  rw  rx  s   @r9   r  r  
  sk       	 	 	 	 	. 	 	 	' ' '+ + + + +	) 	) 	) 	), , , ,
- - -
- - -- - -- - -- - -- - -- - -- - -- - -
- 
- 
-2 2 21 1 12. . .(1 1 1 1 1 1 1r;   r  c                   b     e Zd Z G d de          Zd Z fdZddZddZd Z	d	 Z
d
 Z xZS )XSRFCookieNameTestc                       e Zd Zd Zd ZdS )XSRFCookieNameTest.Handlerc                 :    |                      | j                   d S r2   r[   r  rB   s    r9   r\   zXSRFCookieNameTest.Handler.getz      JJt'''''r;   c                 0    |                      d           d S r@  rZ   rB   s    r9   r   zXSRFCookieNameTest.Handler.post}  r  r;   Nr  rI   r;   r9   rT   rb  y  s2        	( 	( 	(	 	 	 	 	r;   rT   c                 *    t          ddddi          S )NTz__Host-xsrfr  )r  xsrf_cookie_namexsrf_cookie_kwargsr   rB   s    r9   r@   z!XSRFCookieNameTest.get_app_kwargs  s'    * ($/
 
 
 	
r;   c                 z    t                                                       |                                 | _        d S r2   r  r(  s    r9   r  zXSRFCookieNameTest.setUp  r  r;   Nc                     ||                      |          }nd }|                     d|          }|                                 t          |j                  S )NrR   r2  r  )rC   r   r,  r   s       r9   r  zXSRFCookieNameTest.get_token  sY     )))44GGG::c7:33(-(((r;   c                 "    || j         }dd|z   iS )Nr0  z__Host-xsrf=r"  r#  s     r9   r  z!XSRFCookieNameTest.cookie_headers  s    =OE.5011r;   c                     t          t          d          5  |                     ddd          }d d d            n# 1 swxY w Y   |                     |j        d           d S r&  rE  r   s     r9   r(  z*XSRFCookieNameTest.test_xsrf_fail_no_token  r)  r*  c           
      &   t          t          d          5  |                     ddt          j                            t          | j                                      }d d d            n# 1 swxY w Y   |                     |j	        d           d S r,  r0  r   s     r9   r1  z0XSRFCookieNameTest.test_xsrf_fail_body_no_cookie  r2  r3  c           	          |                      ddt          j                            t	          | j                            |                                           }|                     |j        d           d S rE  rF  r   s     r9   rG  z.XSRFCookieNameTest.test_xsrf_success_post_body  so    ::''4?(C(C(CDD''))  
 
 	,,,,,r;   r2   )rK   rL   rM   r   rT   r@   r  r  r  r(  r1  rG  rw  rx  s   @r9   r`  r`  x  s            .   
 
 
+ + + + +) ) ) )2 2 2 2
- - -
- - -- - - - - - -r;   r`  c                   6    e Zd Z G d de          Zd Zd ZdS )XSRFCookieKwargsTestc                       e Zd Zd ZdS )XSRFCookieKwargsTest.Handlerc                 :    |                      | j                   d S r2   rd  rB   s    r9   r\   z XSRFCookieKwargsTest.Handler.get  re  r;   Nr]   rI   r;   r9   rT   rs    s#        	( 	( 	( 	( 	(r;   rT   c                 B    t          dt          dd                    S )NTr   )r  ro   )r  ri  r   rB   s    r9   r@   z#XSRFCookieKwargsTest.get_app_kwargs  s,    $ST2U2U2U
 
 
 	
r;   c                    |                      d          }|                     d|j        d                                                    |                     d|j        d                                                    |j                            d          }|J t          j        d|          }|J t          j                                        t          j	        d          z   }t          j                            |                                d                   }|J t          j        |d d	          }|                     t          ||z
                                            d
k                d S )NrR   z	httponly;r*  zexpires=z.*; expires=(?P<expires>.+);.*r   rI  rK  rL  r  )r   r  r,  r[  r\   r   r   rM  rN  rO  rP  rQ  rR  rS  r   rT  rU  rV  s          r9   test_xsrf_httponlyz'XSRFCookieKwargsTest.test_xsrf_httponly  sC   ::c??k8#3L#A#G#G#I#IJJJj("2<"@"F"F"H"HIII!%%l33!!!96BB   #**,,x/Aq/I/I/II&&u'8'8'CDD!!!!*F2A2J7W~5DDFFGG"LMMMMMr;   N)rK   rL   rM   r   rT   r@   rw  rI   r;   r9   rq  rq    sa        ( ( ( ( (. ( ( (
 
 

N N N N Nr;   rq  c                   0    e Zd Z G d de          Zd ZdS )FinishExceptionTestc                       e Zd Zd ZdS )FinishExceptionTest.Handlerc                     |                      d           |                     dd           |                     dd          rt          d          |                     d           t                      )NrK  WWW-AuthenticateBasic realm="something"finish_valuern  zauthentication required)r  r  r  r+   r[   rB   s    r9   r\   zFinishExceptionTest.Handler.get  sm    OOC   OO.0IJJJ  44 6777

4555hhr;   Nr]   rI   r;   r9   rT   r{    s#        	 	 	 	 	r;   rT   c                    dD ]{}|                      |          }|                     |j        d           |                     d|j                            d                     |                     d|j                   |d S )N)rR   z/?finish_value=1rK  r~  r}  s   authentication required)r   r}   r   r,  r\   r   )rC   ur   s      r9   test_finish_exceptionz)FinishExceptionTest.test_finish_exception  s    * 	H 	HAzz!}}HX]C000)8+;+?+?@R+S+S   7GGGG	H 	Hr;   N)rK   rL   rM   r   rT   r  rI   r;   r9   ry  ry    sR            .   H H H H Hr;   ry  c                        e Zd Zd Zd Zd ZdS )DecoratorTestc                 ^     G d dt                     } G d dt                     }d|fd|fgS )Nc                   $    e Zd Zed             ZdS )6DecoratorTest.get_handlers.<locals>.RemoveSlashHandlerc                     d S r2   rI   rB   s    r9   r\   z:DecoratorTest.get_handlers.<locals>.RemoveSlashHandler.get      r;   N)rK   rL   rM   r-   r\   rI   r;   r9   RemoveSlashHandlerr    s-          [  r;   r  c                   $    e Zd Zed             ZdS )3DecoratorTest.get_handlers.<locals>.AddSlashHandlerc                     d S r2   rI   rB   s    r9   r\   z7DecoratorTest.get_handlers.<locals>.AddSlashHandler.get  r  r;   N)rK   rL   rM   r.   r\   rI   r;   r9   AddSlashHandlerr    s-          X  r;   r  /removeslash/	/addslashr   )rC   r  r  s      r9   r?   zDecoratorTest.get_handlers  sn    	 	 	 	 	 	 	 	
	 	 	 	 	n 	 	 	
 !"45_7UVVr;   c                 R   |                      dd          }|                     |j        d           |                     |j        d         d           |                      dd          }|                     |j        d           |                     |j        d         d           d S )	Nr  Frp  rX  rs  z/removeslashz/removeslash/?foo=barz/removeslash?foo=barr\  r   s     r9   test_removeslashzDecoratorTest.test_removeslash  s    ::o:FF,,,)*5~FFF::5:NN,,,)*57MNNNNNr;   c                 R   |                      dd          }|                     |j        d           |                     |j        d         d           |                      dd          }|                     |j        d           |                     |j        d         d           d S )	Nr  Frp  rX  rs  z
/addslash/z/addslash?foo=barz/addslash/?foo=barr\  r   s     r9   test_addslashzDecoratorTest.test_addslash  s    ::kE:BB,,,)*5|DDD::1E:JJ,,,)*57KLLLLLr;   N)rK   rL   rM   r?   r  r  rI   r;   r9   r  r    sL        W W WO O OM M M M Mr;   r  c                   P    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd ZdS )	CacheTestc                 2     G d dt                     }d|fgS )Nc                       e Zd Zd Zd ZdS )+CacheTest.get_handlers.<locals>.EtagHandlerc                 0    |                      |           d S r2   rZ   )rC   computed_etags     r9   r\   z/CacheTest.get_handlers.<locals>.EtagHandler.get  s    

=)))))r;   c                     | j         d         S r  )_write_bufferrB   s    r9   compute_etagz8CacheTest.get_handlers.<locals>.EtagHandler.compute_etag  s    )!,,r;   N)rK   rL   rM   r\   r  rI   r;   r9   EtagHandlerr    s2        * * *- - - - -r;   r  z
/etag/(.*)r   )rC   r  s     r9   r?   zCacheTest.get_handlers  s<    	- 	- 	- 	- 	-. 	- 	- 	- {+,,r;   c                 <    d}d}|                      ||d           d S )N"xyzzy"*r  
_test_etagrC   r  etagss      r9   test_wildcard_etagzCacheTest.test_wildcard_etag  s(    !uc22222r;   c                 <    d}d}|                      ||d           d S )Nr  r  r  r  s      r9   test_strong_etag_matchz CacheTest.test_strong_etag_match  s(    !uc22222r;   c                 <    d}d}|                      ||d           d S )N"xyzzy1""xyzzy1", "xyzzy2"r  r  r  s      r9   test_multiple_strong_etag_matchz)CacheTest.test_multiple_strong_etag_match  s(    "$uc22222r;   c                 <    d}d}|                      ||d           d S )Nr  r  r   r  r  s      r9   test_strong_etag_not_matchz$CacheTest.test_strong_etag_not_match  s(    !uc22222r;   c                 <    d}d}|                      ||d           d S )Nr  r  r   r  r  s      r9   #test_multiple_strong_etag_not_matchz-CacheTest.test_multiple_strong_etag_not_match!  s(    !$uc22222r;   c                 <    d}d}|                      ||d           d S )Nr  
W/"xyzzy1"r  r  r  s      r9   test_weak_etag_matchzCacheTest.test_weak_etag_match&  (    "uc22222r;   c                 <    d}d}|                      ||d           d S )N"xyzzy2"W/"xyzzy1", W/"xyzzy2"r  r  r  s      r9   test_multiple_weak_etag_matchz'CacheTest.test_multiple_weak_etag_match+  (    "(uc22222r;   c                 <    d}d}|                      ||d           d S )Nr  r  r   r  r  s      r9   test_weak_etag_not_matchz"CacheTest.test_weak_etag_not_match0  r  r;   c                 <    d}d}|                      ||d           d S )Nz"xyzzy3"r  r   r  r  s      r9   !test_multiple_weak_etag_not_matchz+CacheTest.test_multiple_weak_etag_not_match5  r  r;   c                 t    |                      d|z   d|i          }|                     |j        |           d S )Nz/etag/r  r2  rY  )rC   r  r  r  r   s        r9   r  zCacheTest._test_etag:  sI    ::}$.F  
 
 	44444r;   N)rK   rL   rM   r?   r  r  r  r  r  r  r  r  r  r  rI   r;   r9   r  r    s        - - -3 3 3
3 3 3
3 3 3
3 3 3
3 3 3
3 3 3
3 3 3
3 3 3
3 3 3
5 5 5 5 5r;   r  c                   0    e Zd Z G d de          Zd ZdS )RequestSummaryTestc                       e Zd Zd ZdS )RequestSummaryTest.Handlerc                 l    d | j         _        |                     |                                            d S r2   )r  	remote_ipr   r  rB   s    r9   r\   zRequestSummaryTest.Handler.getC  s2     &*DL"KK--//00000r;   Nr]   rI   r;   r9   rT   r  B  s#        	1 	1 	1 	1 	1r;   rT   c                 f    |                      d          }|                     |j        d           d S )NrR   s   GET / (None)r4  r5  s     r9   test_missing_remote_ipz)RequestSummaryTest.test_missing_remote_ipJ  s/    zz#O44444r;   N)rK   rL   rM   r   rT   r  rI   r;   r9   r  r  A  sM        1 1 1 1 1. 1 1 15 5 5 5 5r;   r  c                       e Zd Zd ZdS )HTTPErrorTestc                     t          dd          }t          j        |          }|                     ||           |                     |j        |j                   |                     |j        |j                   d S )Nr:  zGo awayr  )r!   r   assertIsNotr}   r  r  )rC   r  e2s      r9   	test_copyzHTTPErrorTest.test_copyP  sq    c),,,Yq\\B77729-----r;   N)rK   rL   rM   r  rI   r;   r9   r  r  O  s#        . . . . .r;   r  c                       e Zd Zd ZdS )ApplicationTestc                 z    t          g           }|                    dd          }|                                 d S )Nr   r  )address)r   listenr  )rC   rA   servers      r9   test_listenzApplicationTest.test_listenY  s3    "ooA{33r;   N)rK   rL   rM   r  rI   r;   r9   r  r  X  s#            r;   r  c                        e Zd Zd Zd Zd ZdS )URLSpecReverseTestc                     |                      dt          dd                                                      |                      dt          dd                                                      d S )Nz/favicon.icoz/favicon\.icoz^/favicon\.ico$r}   r%   reverserB   s    r9   test_reversezURLSpecReverseTest.test_reverse`  sb    -=t)D)D)L)L)N)NOOO-?)F)F)N)N)P)PQQQQQr;   c                     dg}|D ]R}t          |d           }	 |                                }|                     d|d|           C# t          $ r Y Ow xY wd S )Nz^/api/v\d+/foo/(\w+)$z.did not get expected exception when reversing z
. result: )r%   r  rh  r
  )rC   pathsr4   url_specr  s        r9   test_non_reversiblez&URLSpecReverseTest.test_non_reversibled  s    
 ** 
	 
	D4H!))++			$(DD&&2       
	 
	s   /A		
AAc                     |                      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\.pngrW  r  rB   s    r9   test_reverse_argumentsz)URLSpecReverseTest.test_reverse_argumentsv  s{    s#94@@HHOO	
 	
 	
 	$2D99AA!DD	
 	
 	
 	
 	
r;   N)rK   rL   rM   r  r  r  rI   r;   r9   r  r  _  sD        R R R  $
 
 
 
 
r;   r  c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )RedirectHandlerTestc                 H    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})r6  rB   s    r9   r?   z RedirectHandlerTest.get_handlers  s;    '%9(5/*BC!#5~7NO
 	
r;   c                     |                      dd          }|                     |j        d           |                     |j        d         d           d S )Nr  Frp  rX  rs  r  r\  r   s     r9   test_basic_redirectz'RedirectHandlerTest.test_basic_redirect  sS    ::fu:==,,,)*5v>>>>>r;   c                     |                      dd          }|                     |j        d           |                     |j        d         d           d S )Nz/src?foo=barFrp  rX  rs  z/dst?foo=barr\  r   s     r9   test_redirect_with_argumentz/RedirectHandlerTest.test_redirect_with_argument  sS    ::nu:EE,,,)*5~FFFFFr;   c                     |                      dd          }|                     |j        d           |                     |j        d         d           d S )Nz/src2?foo2=bar2Frp  rX  rs  z/dst2?foo=bar&foo2=bar2r\  r   s     r9   %test_redirect_with_appending_argumentz9RedirectHandlerTest.test_redirect_with_appending_argument  sU    ::/%:HH,,,)*57PQQQQQr;   c                     |                      dd          }|                     |j        d           |                     |j        d         d           d S )Nz/a/b/cFrp  rX  rs  z/b/a/cr\  r   s     r9   test_redirect_patternz)RedirectHandlerTest.test_redirect_pattern  sS    ::h:??,,,)*5x@@@@@r;   N)rK   rL   rM   r?   r  r  r  r  rI   r;   r9   r  r    sj        
 
 
? ? ?
G G G
R R R
A A A A Ar;   r  c                   *    e Zd ZdZd Zd Zd Zd ZdS )AcceptLanguageTestz)Test evaluation of Accept-Language headerc                     t          j        t          j                            t          j                            t                    d          d            G d dt                    }d|fgS )Ngettext_translationstornado_testc                       e Zd Zd ZdS )>AcceptLanguageTest.get_handlers.<locals>.AcceptLanguageHandlerc                     |                      d|                                 j                            dd                     |                     d           d S )Nr  _-r;   )r  get_browser_localer   replacer   rB   s    r9   r\   zBAcceptLanguageTest.get_handlers.<locals>.AcceptLanguageHandler.get  sW    &(?(?(A(A(F(N(NsTW(X(X   C     r;   Nr]   rI   r;   r9   AcceptLanguageHandlerr    s#        ! ! ! ! !r;   r  rR   )r   load_gettext_translationsr3   r4   r5   r6   r7   r   )rC   r  s     r9   r?   zAcceptLanguageTest.get_handlers  s{    (GLL224JKK	
 	
 	

	! 	! 	! 	! 	!N 	! 	! 	! '(
 	
r;   c                     |                      dddi          }|                     |j        d         d           |                      dddi          }|                     |j        d         d           d S )NrR   r$  zfr-FR;q=0.9r2  r  zfr-FRzfr-FR; q=0.9r   r}   r,  r   s     r9   test_accept_languagez'AcceptLanguageTest.test_accept_language  s|    ::c,=}+M:NN)*<=wGGG::c,=~+N:OO)*<=wGGGGGr;   c                 z    |                      dddi          }|                     |j        d         d           d S )NrR   r$  z	fr-FR;q=0r2  r  en-USr  r   s     r9   test_accept_language_ignorez.AcceptLanguageTest.test_accept_language_ignore  sB    ::c,={+K:LL)*<=wGGGGGr;   c                 z    |                      dddi          }|                     |j        d         d           d S )NrR   r$  z
fr-FR;q=-1r2  r  r   r  r   s     r9   test_accept_language_invalidz/AcceptLanguageTest.test_accept_language_invalid  sB    ::c,=|+L:MM)*<=wGGGGGr;   N)rK   rL   rM   rN   r?   r  r  r  rI   r;   r9   r  r    sa        33
 
 
"H H HH H HH H H H Hr;   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.test.utilr   tornado.utilr   r   tornado.webr   r   r   r    r6  r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r   ro  r   rM  email.utilsrP  rs  ior0   r  r<  r3   r   r  rz  rA  urllib.parsere  r:   r=   rP   rV   r_   TestCaserr   r   r   r   r`  rk  rx  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rz  r  r  rD  rS  rY  r  r  r  r  r  r  r  r  r  r  r  r,  r<  r  rG  rJ  rd  rm  r  r  r  r  r  r  r  r  r  r  r'  r.  r9  rd  objectrr  r  r  r  r  r  r  r`  rq  ry  r  r  r  r  r  r  r  r  rI   r;   r9   <module>r     sy   % % % % % %                      / . . . . . - - - - - - % % % % % %             ( ( ( ( ( ( ( ( ; ; ; ; ; ; ' ' ' ' ' ' Q Q Q Q Q Q Q Q Q Q Q Q 0 0 0 0 0 0 1 1 1 1 1 1 1 1                                         ,                        				 				       7 7 7    #   $	% 	% 	% 	% 	%K 	% 	% 	%    >   
$ $ $ $ $~ $ $ $,1S 1S 1S 1S 1S* 1S 1S 1Sj,E ,E ,E ,E ,E* ,E ,E ,E^.9 .9 .9 .9 .9k .9 .9 .9b\= \= \= \= \= \= \= \=~
 
 
 
 
 
 
 

 
 
 
 
{ 
 
 
8
( 
( 
( 
( 
(^ 
( 
( 
(    +   0
 
 
 
 
. 
 
 
6-- -- -- -- --+ -- -- --`)U )U )U )U )U~ )U )U )UXY Y Y Y Y~ Y Y Y*B B B B B^ B B B
1 1 1 1 1n 1 1 1
# # # # #. # # #
( ( ( ( ( ( ( (H H H H Hn H H H       	 	 	 	 	^ 	 	 	. . . . . . . .
 
 
 
 
. 
 
 
JO JO JO JO JOk JO JO JOZ/ / / / /k / / /?1 ?1 ?1 ?1 ?1 ?1 ?1 ?1DV- V- V- V- V-[ V- V- V-r
O O O O O O O O*; ; ; ; ;[ ; ; ;@C @C @C @C @C; @C @C @CF'0 '0 '0 '0 '0{ '0 '0 '0T0 0 0 0 0k 0 0 0D0 0 0 0 0[ 0 0 0&8 8 8 8 8+ 8 8 8
@ 
@ 
@ 
@ 
@) 
@ 
@ 
@F F F F F) F F F*5 5 5 5 5, 5 5 58
 
 
 
 
* 
 
 
C C C C C/ C C C,- - - - -; - - -&7
 7
 7
 7
 7
( 7
 7
 7
tH H H H HK H H H2
 
 
 
 
/ 
 
 
$	 	 	 	 	i 	 	 	,1 ,1 ,1 ,1 ,10 ,1 ,1 ,1^    ,   +
 +
 +
 +
 +
0 +
 +
 +
\
 
 
 
 
0 
 
 
"> > > > >1 > > >,Y1 Y1 Y1 Y1 Y1 Y1 Y1 Y1x
1 
1 
1 
1 
1#8 
1 
1 
1- - - - -*? - - -$: : : : :. : : :&2 2 2 2 2+ 2 2 2*1 1 1 1 1/ 1 1 1 
 
 
 
 
[ 
 
 
@ @ @ @ @K @ @ @$- - - - -+ - - -. . . . . . . .$[  [  [  [  [ { [  [  [ D / / / / /^ / / />J
 J
 J
 J
 J
& J
 J
 J
Z
E 
E 
E 
E 
E'
E 
E 
EB B B B B'B B B8
 8
 8
 8
 8
!6 8
 8
 8
v1 1 1 1 1+ 1 1 1.g) g) g) g) g)h' g) g) g)TH1 H1 H1 H1 H1$ H1 H1 H1X7- 7- 7- 7- 7-. 7- 7- 7-tN N N N N0 N N N4H H H H H/ H H H*M M M M MK M M MB<5 <5 <5 <5 <5 <5 <5 <5~5 5 5 5 5. 5 5 5. . . . .H% . . .    m   
 
 
 
 
* 
 
 
BA A A A A+ A A A:!H !H !H !H !H !H !H !H !H !Hr;   