
    R?g.                    (	   S SK Jr  S SKJr  S SKJrJrJrJrJ	r	J
r
  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S S	KJrJr  S S
KJr  S SKJr  S SKJrJrJrJr  S SK J!r!  S SK"J#r#J$r$  S SK%J&r&J'r'J(r(J)r*J+r+J,r,J-r-J.r.J/r/J0r0J1r1J2r2J3r3J4r4J5r5J6r6J7r7J8r8J9r9  S SK:r:S SK;r;S SK<r<S SK=r=S SK>r?S SK@r@S SKAJBrB  S SKCrCS SKDrDS SKErES SKFrFS SKGrGS SKHrHS SKIrIS SKJrKS rL " S S\5      rM " S S\M5      rN " S S\'5      rO " S S\'5      rP " S S\IR                  5      rR " S S\IR                  5      rS " S S \M5      rT " S! S"\M5      rU " S# S$\'5      rV " S% S&\M5      rW " S' S(\'5      rX " S) S*\M5      rY " S+ S,\'5      rZ " S- S.\M5      r[ " S/ S0\'5      r\ " S1 S2\'5      r] " S3 S4\'5      r^ " S5 S6\'5      r_ " S7 S8\'5      r` " S9 S:\'5      ra " S; S<\'5      r) " S= S>\'5      rb " S? S@\'5      rc " SA SB\'5      rd " SC SD\'5      re " SE SF\M5      rf " SG SH\M5      rg " SI SJ\M5      rh " SK SL\M5      ri " SM SN\M5      rj " SO SP\M5      rk " SQ SR\M5      rl " SS ST\M5      rm " SU SV\M5      rn " SW SX\M5      ro " SY SZ\M5      rp " S[ S\\N5      rq " S] S^\N5      rr " S_ S`\N5      rs " Sa Sb\N5      rt " Sc Sd\N5      ru " Se Sf\N5      rv " Sg Sh\M5      rw " Si Sj\N5      rx " Sk Sl\M5      ry " Sm Sn\N5      rz " So Sp\{5      r| " Sq Sr\N5      r} " Ss St\N5      r~ " Su Sv\N5      r " Sw Sx\N5      r " Sy Sz\N5      r " S{ S|\M5      r " S} S~\N5      r " S S\N5      r " S S\N5      r " S S\N5      r " S S\N5      r " S S\M5      r " S S\M5      r " S S\M5      r " S S\M5      r " S S\M5      r\6 " S S\'5      5       r " S S\5      r " S S\\M5      r " S S\\M5      r " S S\N5      r " S S\N5      r " S S\IR                  5      r " S S\N5      r " S S\N5      r " S S\N5      r " S S\N5      r " S S\M5      r " S S\M5      r " S S\N5      r " S S\IR                  5      r " S S\5      r " S S\IR                  5      r " S S\M5      r " S S\M5      rg)    )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                      [         R                  R                  " [         R                  R                  [        5      /U Q76 $ N)ospathjoindirname__file__)as    7/usr/lib/python3/dist-packages/tornado/test/web_test.pyrelpathr:   =   s'    77<<16A66    c                   *    \ rS rSrSrS rS rS rSrg)WebTestCaseA   zBase 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    [        U R                  5       40 U R                  5       D6U l        U R                  $ r2   )r   get_handlersget_app_kwargsappselfs    r9   get_appWebTestCase.get_appH   s.    t002Ld6I6I6KLxxr;   c                     [        5       er2   NotImplementedErrorrC   s    r9   r@   WebTestCase.get_handlersL   s    !##r;   c                     0 $ r2    rC   s    r9   rA   WebTestCase.get_app_kwargsO       	r;   )rB   N)	__name__
__module____qualname____firstlineno____doc__rE   r@   rA   __static_attributes__rL   r;   r9   r=   r=   A   s    $r;   r=   c                   "    \ rS rSrSrSrS rSrg)SimpleHandlerTestCaseS   zySimplified base class for tests that work with a single handler class.

To use, define a nested class named ``Handler``.
Nc                      SU R                   4/$ )N/HandlerrC   s    r9   r@   "SimpleHandlerTestCase.get_handlers[   s    dll#$$r;   rL   )rO   rP   rQ   rR   rS   r[   r@   rT   rL   r;   r9   rV   rV   S   s    
 G%r;   rV   c                       \ rS rSrS rSrg)HelloHandler_   c                 &    U R                  S5        g NhellowriterC   s    r9   getHelloHandler.get`   s    

7r;   rL   NrO   rP   rQ   rR   re   rT   rL   r;   r9   r^   r^   _   s    r;   r^   c                   .    \ rS rSrSS jrS rSS jrSrg)	CookieTestRequestHandlerd   Nc                 n    0 U l         Uc  [        [        US9S9U l        g [        [        XS9S9U l        g )N)cookie_secret)settingsrl   key_version)_cookiesr   dictapplication)rD   rl   ro   s      r9   __init__!CookieTestRequestHandler.__init__f   s;    )M: D  *MS Dr;   c                 8    U R                   R                  U5      $ r2   )rp   re   )rD   names     r9   
get_cookie#CookieTestRequestHandler.get_cookier   s    }}  &&r;   c                      X R                   U'   g r2   )rp   )rD   rv   valueexpires_dayss       r9   
set_cookie#CookieTestRequestHandler.set_cookieu   s    #dr;   )rp   rr   )
0123456789Nr2   )rO   rP   rQ   rR   rs   rw   r|   rT   rL   r;   r9   ri   ri   d   s    
'$r;   ri   c                   &    \ rS rSrS rS rS rSrg)SecureCookieV1Testz   c                 z    [        5       nUR                  SSSS9  U R                  UR                  SSS9S5        g )Nfoo   bar   versionmin_versionri   set_signed_cookieassertEqualget_signed_cookierD   handlers     r9   test_round_trip"SecureCookieV1Test.test_round_trip{   ?    *,!!%!;225a2H&Qr;   c           	         [        5       nUR                  S[        R                  " S5      SS9  UR                  S   n[
        R                  " SU5      nUc   eUR                  S5      nUR                  S5      nU R                  [        UR                  R                  S   SSU5      U5        U R                  [        UR                  R                  S   SS	S
U-   5      U5        [        S[        U5      < S[        U5      < 35      UR                  S'   [        [        S5         U R!                  UR#                  SSS9S L 5        S S S 5        g ! , (       d  f       g = f)Nr   s   d76df8e7aefcr   r   s   12345678\|([0-9]+)\|([0-9a-f]+)   rl   123456781234s   5678z	1234|5678|zCookie timestamp in futurer   )ri   r   binasciia2b_hexrp   rematchgroupr   r&   rr   rm   r   r
   r   r   
assertTruer   )rD   r   cookier   	timestampsigs         r9   &test_cookie_tampering_future_timestamp9SecureCookieV1Test.test_cookie_tampering_future_timestamp   sL   *,!!%)9)9/)JTU!V!!%(<fE   KKN	kk!n ##,,_=	 	
 	 ##,,_=)#	 	
 #' -i 8-:LM#
 w <=OOG55e5KtST >==s   ,"E
E%c                 z    [        5       nUR                  SSSS9  U R                  UR                  SSS9S5        g )Nr      r   r   r   r   r   s     r9   test_arbitrary_bytes'SecureCookieV1Test.test_arbitrary_bytes   sA     +,!!%!!<225a2H'Rr;   rL   N)rO   rP   rQ   rR   r   r   r   rT   rL   r;   r9   r   r   z   s    R
$ULSr;   r   c                   <    \ rS rSrSSS.rS rS rS rS rS	 r	S
r
g)SecureCookieV2Test   ajklasdf0ojaisdfaslkjasaolwkjsdf)r   r   c                 z    [        5       nUR                  SSSS9  U R                  UR                  SSS9S5        g )Nr   r   r   r   r   r   r   s     r9   r   "SecureCookieV2Test.test_round_trip   r   r;   c                     [        U R                  SS9nUR                  SS5        U R                  UR	                  S5      S5        g )Nr   rn   r   r   ri   KEY_VERSIONSr   r   r   r   s     r9   test_key_version_roundtrip-SecureCookieV2Test.test_key_version_roundtrip   D    *++
 	!!%022596Br;   c                     [        U R                  SS9nUR                  SS5        U R                  UR	                  S5      S5        g )Nr   rn   r   r   r   r   s     r9   ,test_key_version_roundtrip_differing_version?SecureCookieV2Test.test_key_version_roundtrip_differing_version   r   r;   c                     [        U R                  SS9nUR                  SS5        [        U R                  SS9nUR                  Ul        U R	                  UR                  S5      S5        g Nr   rn   r   r   r   )ri   r   r   rp   r   r   )rD   r   new_handlers      r9   "test_key_version_increment_version5SecureCookieV2Test.test_key_version_increment_version   si    *++
 	!!%0.++
  '//66u=vFr;   c                    [        U R                  SS9nUR                  SS5        U R                  R                  5       nUR	                  S5        [        USS9nUR
                  Ul        U R                  UR                  S5      S 5        g r   )ri   r   r   copypoprp   r   r   )rD   r   new_key_versionsr   s       r9   #test_key_version_invalidate_version6SecureCookieV2Test.test_key_version_invalidate_version   s    *++
 	!!%0,,113Q.*
  '//66u=tDr;   rL   N)rO   rP   rQ   rR   r   r   r   r   r   r   rT   rL   r;   r9   r   r      s+    ).@ALR
CC	GEr;   r   c                   0    \ rS rSrSrS rS rS rS rSr	g)FinalReturnTest   Nc                 `   ^ U m " U4S jS[         5      n " U4S jS[         5      nSU4SU4/$ )Nc                   j   > \ rS rSr\R
                  U 4S j5       r\R
                  U 4S j5       rSrg)3FinalReturnTest.get_handlers.<locals>.FinishHandler   c              3   T   >#    U R                  5       Tl        TR                  v   g 7fr2   )finishfinal_returnrD   tests    r9   re   7FinalReturnTest.get_handlers.<locals>.FinishHandler.get   s      $(KKM!'''s   %(c              3      >#    U R                  S5        U R                  5       v   U R                  S5      Tl        TR                  v   g 7f)Nzhello,world)rd   flushr   r   r   s    r9   post8FinalReturnTest.get_handlers.<locals>.FinishHandler.post   s;     

8$jjl"$(KK$8!'''s   A	ArL   N)	rO   rP   rQ   rR   r   	coroutinere   r   rT   r   s   r9   FinishHandlerr      s1    ]]( ( ]]( (r;   r   c                   F   > \ rS rSrS r\R                  U 4S j5       rSrg)3FinalReturnTest.get_handlers.<locals>.RenderHandler   c                     [        SS05      $ )Nfoo.htmlhir   rD   r4   s     r9   create_template_loaderJFinalReturnTest.get_handlers.<locals>.RenderHandler.create_template_loader   s    !:t"455r;   c                 2   > U R                  S5      Tl        g Nr   )renderr   r   s    r9   re   7FinalReturnTest.get_handlers.<locals>.RenderHandler.get   s    $(KK
$;!r;   rL   N)	rO   rP   rQ   rR   r   r   r   re   rT   r   s   r9   RenderHandlerr      s     6 ]]< <r;   r   /finish/renderr   )rD   r   r   r   s      @r9   r@   FinalReturnTest.get_handlers   s7    	(N 	(	<N 	< M*Y,FGGr;   c                     [        SS9$ )Nr   )template_pathrq   rC   s    r9   rA   FinalReturnTest.get_app_kwargs   s    "344r;   c                    U R                  U R                  S5      5      nU R                  UR                  S5        U R	                  U R
                  [        5        U R                  U R
                  R                  5       5        U R                  U R                  S5      SSS9nU R                  UR                  S5        U R	                  U R
                  [        5        U R                  U R
                  R                  5       5        g )Nr      POSTr;   methodbody)	fetchget_urlr   codeassertIsInstancer   r   r   donerD   responses     r9    test_finish_method_return_future0FinalReturnTest.test_finish_method_return_future   s    ::dll956,d//8))..01::dll95f3:O,d//8))..01r;   c                     U R                  U R                  S5      5      nU R                  UR                  S5        U R	                  U R
                  [        5        g )Nr   r   )r   r   r   r   r   r   r   r   s     r9    test_render_method_return_future0FinalReturnTest.test_render_method_return_future	  sC    ::dll956,d//8r;   rL   )
rO   rP   rQ   rR   r   r@   rA   r   r   rT   rL   r;   r9   r   r      s    LH45	29r;   r   c                   P    \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rS rSrg)
CookieTesti  c           
      J    " S S[         5      n " S S[         5      n " S S[         5      n " S S[         5      n " S	 S
[         5      n " S S[         5      n " S S[         5      n " S S[         5      n " S S[         5      n	SU4SU4SU4SU4SU4SU4SU4SU4SU	4/	$ )Nc                       \ rS rSrS rSrg)1CookieTest.get_handlers.<locals>.SetCookieHandleri  c                 p    U R                  SS5        U R                  SS5        U R                  SS5        g )Nstrasdfunicodeqwerbytess   zxcvr|   rC   s    r9   re   5CookieTest.get_handlers.<locals>.SetCookieHandler.get  s.     v.	621r;   rL   Nrg   rL   r;   r9   SetCookieHandlerr    s    2r;   r  c                       \ rS rSrS rSrg)1CookieTest.get_handlers.<locals>.GetCookieHandleri  c                 T    U R                  SS5      nUc   eU R                  U5        g )Nr   default)rw   rd   )rD   r   s     r9   re   5CookieTest.get_handlers.<locals>.GetCookieHandler.get  s*    	:)))

6"r;   rL   Nrg   rL   r;   r9   GetCookieHandlerr    s    #r;   r  c                       \ rS rSrS rSrg)7CookieTest.get_handlers.<locals>.SetCookieDomainHandleri  c                 (    U R                  SSSSS9  g )Nunicode_argsblahzfoo.com/foo)domainr4   r
  rC   s    r9   re   ;CookieTest.get_handlers.<locals>.SetCookieDomainHandler.get   s     yvVr;   rL   Nrg   rL   r;   r9   SetCookieDomainHandlerr    s    Wr;   r  c                       \ rS rSrS rSrg)<CookieTest.get_handlers.<locals>.SetCookieSpecialCharHandleri%  c                 p    U R                  SS5        U R                  SS5        U R                  SS5        g )Nequalsa=b	semicolona;bquotea"br
  rC   s    r9   re   @CookieTest.get_handlers.<locals>.SetCookieSpecialCharHandler.get&  s,    %0U3/r;   rL   Nrg   rL   r;   r9   SetCookieSpecialCharHandlerr  %  s    0r;   r&  c                       \ rS rSrS rSrg):CookieTest.get_handlers.<locals>.SetCookieOverwriteHandleri+  c                 l    U R                  SSSS9  U R                  SSSS9  U R                  SS5        g )Nr8   bzexample.com)r  cder
  rC   s    r9   re   >CookieTest.get_handlers.<locals>.SetCookieOverwriteHandler.get,  s6    S?S? S)r;   rL   Nrg   rL   r;   r9   SetCookieOverwriteHandlerr(  +  s    *r;   r/  c                       \ rS rSrS rSrg)7CookieTest.get_handlers.<locals>.SetCookieMaxAgeHandler3  c                 &    U R                  SSSS9  g )Nr   bar
   )max_ager
  rC   s    r9   re   ;CookieTest.get_handlers.<locals>.SetCookieMaxAgeHandler.get4  s    ub9r;   rL   Nrg   rL   r;   r9   SetCookieMaxAgeHandlerr1  3  s    :r;   r8  c                       \ rS rSrS rSrg)<CookieTest.get_handlers.<locals>.SetCookieExpiresDaysHandleri7  c                 &    U R                  SSSS9  g )Nr   r4  r5  )r{   r
  rC   s    r9   re   @CookieTest.get_handlers.<locals>.SetCookieExpiresDaysHandler.get8  s    u2>r;   rL   Nrg   rL   r;   r9   SetCookieExpiresDaysHandlerr:  7  s    ?r;   r=  c                       \ rS rSrS rSrg)4CookieTest.get_handlers.<locals>.SetCookieFalsyFlagsi;  c                     U R                  SSSS9  U R                  SSSS9  U R                  SSSS9  U R                  S	SSS9  g )
Nr8   1T)securer*  Fr+  )httponlyr,  r
  rC   s    r9   re   8CookieTest.get_handlers.<locals>.SetCookieFalsyFlags.get<  sJ    S6S7S48S59r;   rL   Nrg   rL   r;   r9   SetCookieFalsyFlagsr?  ;  s    :r;   rE  c                       \ rS rSrS rSrg)8CookieTest.get_handlers.<locals>.SetCookieDeprecatedArgsiB  c                 (    U R                  SSSSS9  g )Nr8   r*  Tr  )HttpOnlypATHr
  rC   s    r9   re   <CookieTest.get_handlers.<locals>.SetCookieDeprecatedArgs.getC  s    S4fEr;   rL   Nrg   rL   r;   r9   SetCookieDeprecatedArgsrG  B  s    Fr;   rL  /set/get/set_domain/special_char/set_overwrite/set_max_age/set_expires_days/set_falsy_flags/set_deprecatedr   )
rD   r  r  r  r&  r/  r8  r=  rE  rL  s
             r9   r@   CookieTest.get_handlers  s    	2~ 	2	#~ 	#	W^ 	W	0. 	0	* 	*	:^ 	:	?. 	?	:. 	:	Fn 	F %&%&239:8934 "=>!45 78

 
	
r;   c                     U R                  S5      nU R                  [        UR                  R	                  S5      5      / SQ5        g )NrM  
Set-Cookie)zbytes=zxcv; Path=/zstr=asdf; Path=/zunicode=qwer; Path=/)r   r   sortedheadersget_listr   s     r9   test_set_cookieCookieTest.test_set_cookieS  s:    ::f%8##,,\:;N	
r;   c                    U R                  SSS0S9nU R                  UR                  S5        U R                  SSS0S9nU R                  UR                  S5        U R                  SSS0S9nU R                  UR                  S5        g )	NrN  Cookiefoo=barrZ  r   z	foo="bar"z/=exception;   defaultr   r   r   r   s     r9   test_get_cookieCookieTest.test_get_cookieZ  s    ::fx.C:D/::fx.E:F/::fx.H:I
3r;   c                 ~    U R                  S5      nU R                  UR                  R                  S5      S/5        g )NrO  rX  z,unicode_args=blah; Domain=foo.com; Path=/foor   r   rZ  r[  r   s     r9   test_set_cookie_domain!CookieTest.test_set_cookie_domaind  s8    ::m,%%l3;<	
r;   c                    U R                  S5      n[        UR                  R                  S5      5      nU R	                  [        U5      S5        U R	                  US   S5        U R	                  US   S5        U R                  US   S	;   US   5        / S
QnU HS  u  pE[        R                  " SU5        U R                  SSU0S9nU R	                  UR                  [        U5      5        MU     g )NrP  rX     r   zequals="a=b"; Path=/r   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 %rrN  r_  ra  )r   rY  rZ  r[  r   lenr   loggingdebugr   r   )rD   r   rZ  dataheaderexpecteds         r9   test_cookie_special_char#CookieTest.test_cookie_special_chark  s    ::o.))22<@AWq)%;<%<=AJTTAJ	


 !%FMM+v.zz&8V2DzEHX]]DN; !%r;   c                     U R                  S5      nUR                  R                  S5      nU R                  [	        U5      SS/5        g )NrQ  rX  za=e; Path=/zc=d; Domain=example.com; Path=/r   rZ  r[  r   rY  rD   r   rZ  s      r9   test_set_cookie_overwrite$CookieTest.test_set_cookie_overwrite  sD    ::./""++L97Om-NO	
r;   c                     U R                  S5      nUR                  R                  S5      nU R                  [	        U5      S/5        g )NrR  rX  zfoo=bar; Max-Age=10; Path=/ru  rv  s      r9   test_set_cookie_max_age"CookieTest.test_set_cookie_max_age  s>    ::n-""++L9+H*IJr;   c                    U R                  S5      nUR                  R                  S5      nUc   e[        R                  " SU5      nUc   e[
        R
                  R                  [
        R                  R                  5      [
        R                  " SS9-   n[        R                  R                  UR                  5       S   5      nU R                  [        XE-
  R!                  5       5      S:  5        g )NrS  rX  z(foo=bar; expires=(?P<expires>.+); Path=/r5  daysexpires)r   rZ  re   r   r   datetimenowtimezoneutc	timedeltaemailutilsparsedate_to_datetime	groupdictr   abstotal_secondsrD   r   rp  r   r  header_expiress         r9   test_set_cookie_expires_days'CookieTest.test_set_cookie_expires_days  s    ::12!!%%l3!!!CVL   ##''(9(9(=(=>ASASB
 
 ::5??;LY;WXW5DDFG"LMr;   c                    U R                  S5      n[        UR                  R                  S5      5      nU R	                  US   R                  5       S5        U R	                  US   R                  5       S5        U R	                  US   R                  5       S5        U R	                  US	   R                  5       S
5        g )NrT  rX  r   za=1; path=/; securer   zb=1; path=/r   zc=1; httponly; path=/rk  zd=1; path=/)r   rY  rZ  r[  r   lowerrv  s      r9   test_set_cookie_false_flags&CookieTest.test_set_cookie_false_flags  s    ::01))22<@A 	))+-BC))+];))+-DE))+];r;   c                     [        5          U R                  S5      nS S S 5        WR                  R                  S5      nU R	                  US5        g ! , (       d  f       N<= f)NrU  rX  za=b; HttpOnly; Path=/foo)r   r   rZ  re   r   )rD   r   rp  s      r9   test_set_cookie_deprecated%CookieTest.test_set_cookie_deprecated  sL    !zz"34H "!!%%l3!;< "!s   A
A!rL   N)rO   rP   rQ   rR   r@   r\  rd  rh  rr  rw  rz  r  r  r  rT   rL   r;   r9   r   r     s8    A
F
4
<2
K
N<=r;   r   c                   0    \ rS rSrS rS r\S 5       rSrg)AuthRedirectRequestHandleri  c                     Xl         g r2   	login_url)rD   r  s     r9   
initialize%AuthRedirectRequestHandler.initialize  s    "r;   c                     U R                   $ r2   r  rC   s    r9   get_login_url(AuthRedirectRequestHandler.get_login_url  s    ~~r;   c                 &    U R                  S5        g )N  )
send_errorrC   s    r9   re   AuthRedirectRequestHandler.get  s     	r;   r  N)	rO   rP   rQ   rR   r  r  r$   re   rT   rL   r;   r9   r  r    s     #  r;   r  c                   &    \ rS rSrS rS rS rSrg)AuthRedirectTesti  c                 B    S[         [        SS94S[         [        SS94/$ )N	/relativez/loginr  	/absolutezhttp://example.com/login)r  rq   rC   s    r9   r@   AuthRedirectTest.get_handlers  s0    4dX6NO*9:
 	
r;   c                     U R                  U R                  S5      SS9nU R                  UR                  S5        U R                  UR                  S   S5        g )Nr  Ffollow_redirects.  Locationz/login?next=%2Frelative)r   r   r   r   rZ  r   s     r9   test_relative_auth_redirect,AuthRedirectTest.test_relative_auth_redirect  sM    ::dll;7%:P,))*57PQr;   c                     U R                  U R                  S5      SS9nU R                  UR                  S5        U R	                  [
        R                  " SUR                  S   5      UR                  S   5        g )Nr  Fr  r  zIhttp://example.com/login\?next=http%3A%2F%2F127.0.0.1%3A[0-9]+%2Fabsoluter  )r   r   r   r   r   r   r   rZ  r   s     r9   test_absolute_auth_redirect,AuthRedirectTest.test_absolute_auth_redirect  sj    ::dll;7%:P,HH\  , Z(	
r;   rL   N)rO   rP   rQ   rR   r@   r  r  rT   rL   r;   r9   r  r    s    
R
	
r;   r  c                   D    \ rS rSrS r\R                  S 5       rS rSr	g)ConnectionCloseHandleri  c                     Xl         g r2   r   r   s     r9   r  !ConnectionCloseHandler.initialize  s    	r;   c              #      #    U R                   R                  5         U R                   R                  R                  5       v   g 7fr2   )r   on_handler_waitingcleanup_eventwaitrC   s    r9   re   ConnectionCloseHandler.get  s.     		$$&ii%%**,,s   AAc                 8    U R                   R                  5         g r2   )r   on_connection_closerC   s    r9   r  *ConnectionCloseHandler.on_connection_close  s    		%%'r;   r   N)
rO   rP   rQ   rR   r  r   r   re   r  rT   rL   r;   r9   r  r    s$     	]]- -(r;   r  c                   ,    \ rS rSrS rS rS rS rSrg)ConnectionCloseTesti  c                 B    [        5       U l        S[        [        U S94/$ )NrY   r   )r   r  r  rq   rC   s    r9   r@    ConnectionCloseTest.get_handlers  s!    "W,do>??r;   c                    [         R                   " [         R                  [         R                  S5      nUR                  SU R	                  5       45        [        U5      U l        U R                  R                  S5        U R                  5         U R                  R                  5         U R                  R                  S 5        g )Nr   	127.0.0.1s   GET / HTTP/1.0

c                  .    [         R                  " S5      $ Nr   )r   sleeprL   r;   r9   <lambda>;ConnectionCloseTest.test_connection_close.<locals>.<lambda>  s    ciilr;   )socketAF_INETSOCK_STREAMconnectget_http_portr   streamrd   r  r  setio_looprun_sync)rD   ss     r9   test_connection_close)ConnectionCloseTest.test_connection_close  s    MM&..&*<*<a@			; 2 2 456qk34		 23r;   c                 d    [         R                  " S5        U R                  R                  5         g )Nzhandler waiting)rm  rn  r  closerC   s    r9   r  &ConnectionCloseTest.on_handler_waiting  s    '(r;   c                 P    [         R                  " S5        U R                  5         g )Nzconnection closed)rm  rn  stoprC   s    r9   r  'ConnectionCloseTest.on_connection_close  s    )*		r;   )r  r  N)	rO   rP   rQ   rR   r@   r  r  r  rT   rL   r;   r9   r  r    s    @4r;   r  c                       \ rS rSrS rSrg)EchoHandleri  c           	         U R                   R                   H  n[        U5      [        :w  a  [	        S[        U5      -  5      eU R                   R                  U    H-  n[        U5      [
        :w  d  M  [	        S[        U5      -  5      e   U R                  U5       H-  n[        U5      [        :w  d  M  [	        S[        U5      -  5      e   M     U H-  n[        U5      [        :w  d  M  [	        S[        U5      -  5      e   U R                  [        U R                   R                  U[        U R                   R                  5      S95        g )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   rd   rq   r4   r   )rD   r  keybvaluesvalueargs         r9   re   EchoHandler.get  s   
 <<))CCyC <tCy HII,,005<5(#$BT&\$QRR 6 ,,S1<</#$BT&\$QRR 2 * CCyL( ADI MNN  	

\\&&#&t||'='=>	
r;   rL   Nrg   rL   r;   r9   r  r    s    
r;   r  c                   8    \ rS rSrS rS rS rS rS rS r	Sr
g	)
RequestEncodingTesti  c                 "    S[         4S[         4/$ )Nz/group/(.*)z/slashes/([^/]*)/([^/]*))r  rC   s    r9   r@    RequestEncodingTest.get_handlers  s    ,/I;.WXXr;   c                 J    [        U R                  U5      R                  5      $ r2   )r   r   r   r   s     r9   
fetch_jsonRequestEncodingTest.fetch_json  s    4::d+0011r;   c           	          U R                  U R                  S5      [        SS/0 S95        U R                  U R                  S5      [        SS/SS/0S95        g )Nz
/group/%3F?r  z/group/%3F?%3F=%3Fr   r  rq   rC   s    r9   test_group_question_mark,RequestEncodingTest.test_group_question_mark  s[    OOL)lse"=	
 	OO01lse3,G	
r;   c                 V    U R                  U R                  S5      SS/SS/0S.5        g )Nz/group/%C3%A9?arg=%C3%A9z/group/%C3%A9   ér  r  r   r  rC   s    r9   test_group_encoding'RequestEncodingTest.test_group_encoding)  s4    OO67'&Z
+	
r;   c           	          U R                  U R                  S5      [        SSS/0 S95        U R                  U R                  S5      [        SSS/0 S95        g )Nz/slashes/foo/barr   r4  r  z/slashes/a%2Fb/c%2Fdza/bzc/dr  rC   s    r9   test_slashes RequestEncodingTest.test_slashes4  s^     	OO./(UENL	
 	OO23,RP	
r;   c                 z    [        [        S5         U R                  S5        S S S 5        g ! , (       d  f       g = f)Nz.*Invalid unicodez/group/?arg=%25%e9)r   r   r   rC   s    r9   
test_errorRequestEncodingTest.test_error@  s(     w 34JJ+, 544   ,
:rL   N)rO   rP   rQ   rR   r@   r  r  r  r  r  rT   rL   r;   r9   r  r    s!    Y2	
	


-r;   r  c                   ,    \ rS rSrS rS rS rS rSrg)TypeCheckHandleriG  c                     0 U l         U R                  SU R                  5       [        5        U R                  SU R	                  S5      [
        5        U R                  S[        U R                  R                  5       5      S   [        5        U R                  S[        U R                  R                  5       5      S   R                  [        5        [        U R                  R                  5       5      S/:w  a&  [        SU R                  R                  5       -  5      eU R                  S	U R                  S5      [        5        U R                  S
U R                  S5      [        5        U R                  SU R                   [        5        U R                  SU R#                  5       [        5        U R                  SU R%                  SS5      [        5        U R                  SU R'                  5       [        5        g )Nstatusargumentr   
cookie_keyr   cookie_valuer  z%unexpected values for cookie keys: %rr   rw   
xsrf_tokenxsrf_form_htmlreverse_url	typecheckrequest_summary)errors
check_type
get_statusintget_argumentr   listcookieskeysr  valuesrz   r  r   r	  rw   r  r  r  _request_summaryrC   s    r9   prepareTypeCheckHandler.prepareH  sm   $//"3S9 	
D$5$5e$<lKd4<<+<+<+>&?&BCHT\\-@-@-B(CA(F(L(LcR !!#$07$,,:K:K:MM  	+T-C-CF-KUSdoof&=sCdoou=($*=*=*?Et'7'7U'KSQ)4+@+@+BCHr;   c                 h    U R                  SU[        5        U R                  U R                  5        g Npath_componentr  r   rd   r  rD   r  s     r9   re   TypeCheckHandler.getc  s%     	(.,G

4;;r;   c                 h    U R                  SU[        5        U R                  U R                  5        g r  r   r!  s     r9   r   TypeCheckHandler.posti  s#    (.,G

4;;r;   c                 T    [        U5      nX4:w  a  SU< SU< 3U R                  U'   g g )Nz	expected z, got )r  r  )rD   rv   objexpected_typeactual_types        r9   r  TypeCheckHandler.check_typem  s)    3i'9F TDKK (r;   )r  N)	rO   rP   rQ   rR   r  re   r   r  rT   rL   r;   r9   r  r  G  s    I6  Ur;   r  c                   $    \ rS rSrSS jrS rSrg)DecodeArgHandleris  Nc                     [        U5      [        :w  a  [        S[        U5      -  5      eSU R                  R                  ;   a4  UR                  [        U R                  R                  S   S   5      5      $ U$ )Nzunexpected type for value: %rencodingr   )r  r	  r  r  r  decoder   )rD   rz   rv   s      r9   decode_argument DecodeArgHandler.decode_argumentt  sb    ;%;d5kIJJ///<<
4<<+A+A*+Ma+P QRRLr;   c                 h    S nU R                  U" U5      U" U R                  S5      5      S.5        g )Nc                     [        U 5      [        :X  a!  S[        [        R                  " U 5      5      /$ [        U 5      [
        :X  a  SU /$ [        S5      e)Nr	  r  zunknown type)r  r	  r	   r   b2a_hexr   r  )r  s    r9   describe&DecodeArgHandler.get.<locals>.describe~  sJ    Aw%H,<,<Q,?!@AAaL(!1~%N++r;   r   r4   query)rd   r  )rD   r  r4  s      r9   re   DecodeArgHandler.get}  s.    	, 	

HSMHT=N=Nu=U4VWXr;   rL   r2   )rO   rP   rQ   rR   r/  re   rT   rL   r;   r9   r+  r+  s  s    Yr;   r+  c                       \ rS rSrS rSrg)LinkifyHandleri  c                 $    U R                  SSS9  g )Nlinkify.htmlzhttp://example.com)messager   rC   s    r9   re   LinkifyHandler.get  s    N,@Ar;   rL   Nrg   rL   r;   r9   r:  r:    s    Br;   r:  c                       \ rS rSrS rSrg)UIModuleResourceHandleri  c                 (    U R                  SSS/S9  g )N	page.htmlr   r   )entriesr>  rC   s    r9   re   UIModuleResourceHandler.get  s    K!Q0r;   rL   Nrg   rL   r;   r9   rA  rA    s    1r;   rA  c                       \ rS rSrS rSrg)OptionalPathHandleri  c                 *    U R                  SU05        g )Nr4   rc   r   s     r9   re   OptionalPathHandler.get  s    

FD>"r;   rL   Nrg   rL   r;   r9   rG  rG    s    #r;   rG  c                       \ rS rSrS rSrg)MultiHeaderHandleri  c                     U R                  SS5        U R                  SS5        U R                  SS5        U R                  SS5        g )	Nx-overwriterA  zX-Overwriter   x-multirk  zX-Multi4)
set_header
add_headerrC   s    r9   re   MultiHeaderHandler.get  s:    s+q)	1%	3'r;   rL   Nrg   rL   r;   r9   rK  rK    s    (r;   rK  c                       \ rS rSrS rSrg)r    i  c           
         U R                  SS 5      b2  U R                  S[        [        U R                  S5      5      5      S9  g U R                  SS 5      b)  U R                  S[        U R                  S5      5      S9  g [	        S5      e)N	permanentrY   )rU  r  )r  z(didn't get permanent or status arguments)r  redirectboolr  r  rC   s    r9   re   RedirectHandler.get  sy    [$/;MM#c$2C2CK2P.Q)RMSx.:MM#c$*;*;H*E&FMGFGGr;   rL   Nrg   rL   r;   r9   r    r      s    Hr;   r    c                   8    \ rS rSr\R
                  S 5       rSrg)EmptyFlushCallbackHandleri  c              #      #    U R                  5       v   U R                  5       v   U R                  S5        U R                  5       v   U R                  5       v   U R                  S5        g 7f)Nok)r   rd   r   rC   s    r9   re   EmptyFlushCallbackHandler.get  sN     
 jjljjl

3jjljjlCs   A,A.rL   N)rO   rP   rQ   rR   r   r   re   rT   rL   r;   r9   rZ  rZ    s    ]]	 	r;   rZ  c                       \ rS rSrS rSrg)HeaderInjectionHandleri  c                      U R                  SS5        [        S5      e! [         a+  nS[        U5      ;   a  U R	                  S5         S nAg e S nAff = f)NzX-Foozfoo
X-Bar: bazzDidn't get expected exceptionzUnsafe header value   ok)rP  r  
ValueErrorr  r   rD   r-  s     r9   re   HeaderInjectionHandler.get  sP    	OOG%89;<< 	$A.E""		s    
A AAArL   Nrg   rL   r;   r9   r`  r`    s    r;   r`  c                       \ rS rSrS rSrg)GetArgumentHandleri  c                     U R                  SS 5      S:X  a  U R                  nO/U R                  SS 5      S:X  a  U R                  nOU R                   nU R                  U" SS5      5        g )Nsourcer7  r   r   r  )r  get_query_argumentget_body_argumentr   rD   r   s     r9   r  GetArgumentHandler.prepare  s`    Xt,7,,Fx.&8++F&&FF5),-r;   rL   NrO   rP   rQ   rR   r  rT   rL   r;   r9   rg  rg    s    .r;   rg  c                       \ rS rSrS rSrg)GetArgumentsHandleri  c           	          U R                  [        U R                  S5      U R                  S5      U R	                  S5      S95        g )Nr   r  r7  r   )r   rq   r  get_query_argumentsget_body_argumentsrC   s    r9   r  GetArgumentsHandler.prepare  s@    **51..u5,,U3	
r;   rL   Nrn  rL   r;   r9   rp  rp    s    
r;   rp  c                      ^  \ rS rSrSrS rU 4S jrS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rS rS rS rS rS rSrU =r$ )WSGISafeWebTesti  zWebTest.COOKIE_SECRETc                 J    [        SSSS.5      n[        USU R                  S9$ )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<  rC  z
entry.htmlxhtml_escape)template_loader
autoescaperl   )r   rq   COOKIE_SECRET)rD   loaders     r9   rA   WSGISafeWebTest.get_app_kwargs  s<     ? 
& "%,,
 	
r;   c                 ^   > [         TU ]  5         [        R                  R	                  5         g r2   supertearDownr   _template_loadersclearrD   	__class__s    r9   r  WSGISafeWebTest.tearDown       ((..0r;   c                    [        S[        SS9[        S[        SS9[        S[        5      [        S[        5      [        S[        5      [        S	[
        5      [        S
[        5      [        S[        5      [        S[        SS05      [        S[        SSS.5      [        S[        SS05      [        S[        5      [        S[        5      [        S[        5      /nU$ )Nz/typecheck/(.*)r  )rv   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%   rU  //web_redirect_double_slash/header_injection/get_argumentz/get_arguments)r%   r  r+  r:  rA  rG  rK  r    WebRedirectHandlerr`  rg  rp  )rD   urlss     r9   r@   WSGISafeWebTest.get_handlers  s    !#3+F"$4<H,.>?
N+%'>?&(;<!34_-)"/0
 "/eD
 -"/0
 #%;<!34 "565
8 r;   c                 p    U R                   " U0 UD6nUR                  5         [        UR                  5      $ r2   )r   rethrowr   r   )rD   r  kwargsr   s       r9   r  WSGISafeWebTest.fetch_json  s0    ::t.v.8==))r;   c                     [        [        U R                  SS5      5      nU R                  SSSU-   0S9n[	        UR
                  5      nU R                  U0 5        U R                  SSSSU-   0SS	9ng )
Nr  r  z/typecheck/asdf?foo=barr_  zasdf=ra  r   r`  r   rZ  r   )r   r'   r|  r   r   r   r   )rD   r  r   ro  s       r9   
test_typesWSGISafeWebTest.test_types  s    ! 2 2FFC
 ::%'L:P/Q  
 8==)r"::%w56	  
r;   c                 Z   / SQnU HR  nU R                  U5      nUR                  5         [        UR                  5      nU R	                  USS/SS/S.5        MT     U R                  S5      nUR                  5         [        UR                  5      nU R	                  USS/SS/S.5        g )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  r6  z/decode_arg/%C3%A9?foo=%C3%A9r	  c3a9r   r  r   r   r   rD   r  req_urlr   ro  s        r9   test_decode_argument$WSGISafeWebTest.test_decode_argument0  s    

 Gzz'*Hx}}-D#X.)X9NO	  ::=>8==)&(9WfDUVWr;   c                    [        [        S5         U R                  S5      nU R                  UR                  S5        U R                  S5      nU R                  UR                  S5        S S S 5        g ! , (       d  f       g = f)Nz.*Invalid unicode.*z/typecheck/invalid%FFi  z/typecheck/invalid?foo=%FFr   r   r   r   r   r   s     r9   $test_decode_argument_invalid_unicode4WSGISafeWebTest.test_decode_argument_invalid_unicodeE  s_    w 56zz"9:HX]]C0zz">?HX]]C0	 766s   AA55
Bc                     SS/nU HR  nU R                  U5      nUR                  5         [        UR                  5      nU R	                  USS/SS/S.5        MT     g )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 + 1r6  r  r  s        r9   test_decode_argument_plus)WSGISafeWebTest.test_decode_argument_plusM  si     E>
 Gzz'*Hx}}-D#W-G8LM	 r;   c                    U R                  U R                  R                  SS5      S5        U R                  U R                  R                  SS5      S5        U R                  U R                  R                  SS5      S5        U R                  U R                  R                  SS5      S	5        U R                  U R                  R                  SS
5      S5        g )Nr  r   z/decode_arg/foo*   z/decode_arg/42r   z/decode_arg/%E9r  z/decode_arg/%C3%A9r  z/decode_arg/1%20%2B%201)r   rB   r  rC   s    r9   test_reverse_url WSGISafeWebTest.test_reverse_url\  s    --lEBDUV--lB?AQR--lGDFWXHH  x8:N	
 	HH  w79R	
r;   c                 ^    U R                  S5      nU R                  UR                  S5        g )Nr  s3   <a href="http://example.com">http://example.com</a>rc  r   s     r9   test_uimodule_unescaped'WSGISafeWebTest.test_uimodule_unescapedg  s(    ::j)MMQ	
r;   c                 ^    U R                  S5      nU R                  UR                  S5        g )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>rc  r   s     r9   test_uimodule_resources'WSGISafeWebTest.test_uimodule_resourcesm  s+    ::34MM	
r;   c                     U R                  U R                  S5      SS05        U R                  U R                  S5      SS 05        g )Nz/optional_path/foor4   r   z/optional_path/r  rC   s    r9   test_optional_path"WSGISafeWebTest.test_optional_path  s>    )=>P):;fd^Lr;   c                     U R                  S5      nU R                  UR                  S   S5        U R                  UR                  R                  S5      SS/5        g )Nr  rM  2rN  3rO  rg  r   s     r9   test_multi_header!WSGISafeWebTest.test_multi_header  sP    ::o.))-8#>))229=SzJr;   c                    U R                  SSS9nU R                  UR                  S5        U R                  SSS9nU R                  UR                  S5        U R                  SSS9nU R                  UR                  S5        g )	Nz/redirect?permanent=1Fr  -  z/redirect?permanent=0r  z/redirect?status=307r2  r   r   r   r   s     r9   test_redirectWSGISafeWebTest.test_redirect  sw    ::5:N,::5:N,::4u:M,r;   c                 0   U R                  SSS9nU R                  UR                  S5        U R                  UR                  S   S5        U R                  SSS9nU R                  UR                  S5        U R                  UR                  S   S5        g )	Nr  Fr  r  r  r  r  r  r   r   r   rZ  r   s     r9   test_web_redirect!WSGISafeWebTest.test_web_redirect  s    ::7%:P,))*57NO::o:F,))*57NOr;   c                     U R                  SSS9nU R                  UR                  S5        U R                  UR                  S   S5        g )Nr  Fr  r  r  r  r  r   s     r9   test_web_redirect_double_slash.WSGISafeWebTest.test_web_redirect_double_slash  sE    ::;e:T,))*57NOr;   c                 ^    U R                  S5      nU R                  UR                  S5        g )Nr  rb  rc  r   s     r9   test_header_injection%WSGISafeWebTest.test_header_injection  s%    ::12.r;   c           	      >   U R                  S5      nU R                  UR                  S5        U R                  S5      nU R                  UR                  S5        U R                  S5      nU R                  UR                  S5        [        R                  R                  [        SS95      nU R                  SS	US
9nU R                  UR                  S5        U R                  SS	US
9nU R                  [        UR                  5      [        SS/S/S/S95        g )Nz/get_argument?foo=barr   z/get_argument?foo=r;   r  rb  rb   r   r   r      helloz/get_arguments?foo=barr4  rr  )r   r   r   urllibparse	urlencoderq   r   )rD   r   r   s      r9   test_get_argument!WSGISafeWebTest.test_get_argument  s    ::56/::23,::o.
3 ||%%dw&78::5f4:P1::6vD:Q&%)%yI	
r;   c                 ^   [         R                  R                  [        SS95      nU R	                  SSUS9nU R                  UR                  S5        U R	                  SSUS9nU R                  UR                  S5        U R	                  S	SUS9nU R                  UR                  S
5        g )Nrb   r  z"/get_argument?source=query&foo=barr   r   r   z/get_argument?source=query&foo=r;   z/get_argument?source=queryrb  r  r  r  rq   r   r   r   rD   r   r   s      r9   test_get_query_arguments(WSGISafeWebTest.test_get_query_arguments  s     ||%%dw&78::0d  
 	/::-f4  
 	,:::6PT:U
3r;   c                    [         R                  R                  [        SS95      nU R	                  SSUS9nU R                  UR                  S5        [         R                  R                  [        SS95      nU R	                  SSUS9nU R                  UR                  S5        [         R                  R                  [        5       5      nU R	                  SSUS9nU R                  UR                  S	5        g )
Nr4  r  z#/get_argument?source=body&foo=hellor   r   r    r;   rb  r  r  s      r9   test_get_body_arguments'WSGISafeWebTest.test_get_body_arguments  s    ||%%duo6::1&t  
 	/||%%drl3::1&t  
 	,||%%df-::1&t  
 	
3r;   c                     U R                  S5      nU R                  SUR                  R                  SS5      5        U R                  SUR                  R                  SS5      5        g )Nr  Accept-EncodingVaryr  gzipContent-Encoding)r   assertNotInrZ  re   r   s     r9   test_no_gzipWSGISafeWebTest.test_no_gzip  sX    ::o.*H,<,<,@,@,LM!1!1!5!56H"!MNr;   rL   )rO   rP   rQ   rR   r|  rA   r  r@   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rT   __classcell__r  s   @r9   rw  rw    s}    +M
41>*

"X*1	


8MK
-PP
/
(44&O Or;   rw  c                        \ rS rSrS rS rSrg)NonWSGIWebTestsi  c                     S[         4/$ )N/empty_flush)rZ  rC   s    r9   r@   NonWSGIWebTests.get_handlers  s    !:;<<r;   c                 ^    U R                  S5      nU R                  UR                  S5        g )Nr  rb  rc  r   s     r9   test_empty_flush NonWSGIWebTests.test_empty_flush  s$    ::n-.r;   rL   N)rO   rP   rQ   rR   r@   r  rT   rL   r;   r9   r  r    s    =/r;   r  c                   ,    \ rS rSrS rS rS rS rSrg)ErrorResponseTesti  c                      " S S[         5      n " S S[         5      n " S S[         5      n[        SU5      [        SU5      [        S	U5      /$ )
Nc                       \ rS rSrS rSrg)6ErrorResponseTest.get_handlers.<locals>.DefaultHandleri  c                     U R                  SS 5      (       a#  [        [        U R                  S5      5      5      eSS-    g Nr  r   r   )r  r!   r  rC   s    r9   re   :ErrorResponseTest.get_handlers.<locals>.DefaultHandler.get  s7    $$Xt44#C(9(9((C$DEEAr;   rL   Nrg   rL   r;   r9   DefaultHandlerr    s    r;   r  c                        \ rS rSrS rS rSrg)9ErrorResponseTest.get_handlers.<locals>.WriteErrorHandleri  c                     U R                  SS 5      (       a*  U R                  [        U R                  S5      5      5        g SS-    g r  )r  r  r  rC   s    r9   re   =ErrorResponseTest.get_handlers.<locals>.WriteErrorHandler.get  s8    $$Xt44OOC(9(9((C$DEEr;   c                     U R                  SS5        SU;   a%  U R                  SUS   S   R                  -  5        g U R                  SU-  5        g )NContent-Type
text/plainexc_infozException: %sr   z
Status: %d)rP  rd   rO   rD   status_coder  s      r9   write_errorEErrorResponseTest.get_handlers.<locals>.WriteErrorHandler.write_error  sJ    ='JJ
1CA1F1O1OOPJJ|k9:r;   rL   NrO   rP   rQ   rR   re   r  rT   rL   r;   r9   WriteErrorHandlerr    s    ;r;   r  c                        \ rS rSrS rS rSrg)?ErrorResponseTest.get_handlers.<locals>.FailedWriteErrorHandleri  c                     SS-    g Nr   r   rL   rC   s    r9   re   CErrorResponseTest.get_handlers.<locals>.FailedWriteErrorHandler.get  s	    Ar;   c                     [        S5      e)Nzexception in write_errorr  r  s      r9   r  KErrorResponseTest.get_handlers.<locals>.FailedWriteErrorHandler.write_error
  s     :;;r;   rL   Nr  rL   r;   r9   FailedWriteErrorHandlerr
    s    <r;   r  /default/write_error/failed_write_error)r   r%   )rD   r  r  r  s       r9   r@   ErrorResponseTest.get_handlers  sS    	^ 		; 	;	<n 	< 
N+ 12%'>?
 	
r;   c                    [        [        S5         U R                  S5      nU R                  UR                  S5        U R                  SUR                  ;   5        U R                  S5      nU R                  UR                  S5        U R                  SUR                  ;   5        U R                  S5      nU R                  UR                  S	5        U R                  S
UR                  ;   5        S S S 5        g ! , (       d  f       g = f)NUncaught exceptionr  r  s   500: Internal Server Errorz/default?status=503  s   503: Service Unavailablez/default?status=435i  s   435: Unknown)r   r   r   r   r   r   r   r   s     r9   test_defaultErrorResponseTest.test_default  s    w 45zz*-HX]]C0OO9X]]JKzz"78HX]]C0OO78==HIzz"78HX]]C0OOOx}}<= 655s   C"C<<
D
c                 |   [        [        S5         U R                  S5      nU R                  UR                  S5        U R                  SUR
                  5        U R                  S5      nU R                  UR                  S5        U R                  SUR
                  5        S S S 5        g ! , (       d  f       g = f)Nr  r  r  s   Exception: ZeroDivisionErrorz/write_error?status=503r  s   Status: 503r   r   r   r   r   r   r   s     r9   test_write_error"ErrorResponseTest.test_write_error!  s    w 45zz.1HX]]C0<hmmLzz";<HX]]C0^X]]; 655s   BB--
B;c                     [        [        S5         U R                  S5      nU R                  UR                  S5        U R                  SUR
                  5        S S S 5        g ! , (       d  f       g = f)Nr  r  r  r;   r  r   s     r9   test_failed_write_error)ErrorResponseTest.test_failed_write_error+  sP    w 45zz"78HX]]C0S(--0 655s   A
A$$
A2rL   N)	rO   rP   rQ   rR   r@   r  r  r   rT   rL   r;   r9   r  r    s     
D><1r;   r  c                      \ rS rSrSr\R                  R                  \R                  R                  \	5      S5      r
S rS rS rS rS rS	 rS
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS r S r!S r"S r#S r$S r%S r&S  r'S! r(S" r)S# r*S$ r+S% r,\-R\                  " \R^                  S&:g  S'5      S( 5       r0S)r1g*)+StaticFileTesti2  s   63a36e950e134b5217e33c763e88840c10a07d80e6057d92b9ac97508de7fb1fa6f0e9b7531e169657165ea764e8963399cb6d921ffe6078425aaafe54c04563staticc           	           " S S[         5      n " S SU5      n " S S[         5      nSU4SU4S	U4S
[        [        SS94/$ )Nc                       \ rS rSrS rSrg)5StaticFileTest.get_handlers.<locals>.StaticUrlHandleri<  c                 v    [        U R                  SS5      5      nU R                  U R                  XS95        g )Ninclude_versionrA  )r)  )r  r  rd   
static_url)rD   r4   with_vs      r9   re   9StaticFileTest.get_handlers.<locals>.StaticUrlHandler.get=  s1    T../@#FG

4??4?HIr;   rL   Nrg   rL   r;   r9   StaticUrlHandlerr'  <  s    Jr;   r-  c                       \ rS rSrSrSrg)=StaticFileTest.get_handlers.<locals>.AbsoluteStaticUrlHandleriA  TrL   N)rO   rP   rQ   rR   include_hostrT   rL   r;   r9   AbsoluteStaticUrlHandlerr/  A  s    Lr;   r1  c                       \ rS rSrS rSrg)=StaticFileTest.get_handlers.<locals>.OverrideStaticUrlHandleriD  c                    [        U R                  S5      5      nU(       + U l        U R                  U5      nU R                  XS9nXC:X  a  U R	                  [        S5      5      $ U R                  R                  S-   n[        U5      nUR                  USU5      nUR                  USU5      nU(       a  US:H  =(       a    US:H  n	OUS:H  =(       a    US:H  n	U R	                  [        U	5      5        g )Nr0  r0  Fz://r   )
rW  r  r0  r*  rd   r  r  protocolrl  find)
rD   r4   
do_includeregular_urloverride_urlr7  protocol_lengthcheck_regularcheck_overrideresults
             r9   re   AStaticFileTest.get_handlers.<locals>.OverrideStaticUrlHandler.getE  s    !$"3"3N"CD
(2N!"ood3#tM.::c%j11<<0058"%h- + 0 01o N!-!2!28Q!P+q0H]b5HF+r1Hmq6HF

3v;'r;   r5  Nrg   rL   r;   r9   OverrideStaticUrlHandlerr3  D  s    (r;   rA  /static_url/(.*)z/abs_static_url/(.*)z/override_static_url/(.*)z/root_static/(.*)rY   )r4   )r   r   rq   )rD   r-  r1  rA  s       r9   r@   StaticFileTest.get_handlers;  s_    	J~ 	J
	 '7 	 	(~ 	(,  !12#%=>(*BC "3Ts^D	
 	
r;   c                 &    [        [        S5      S9$ )Nr$  )static_pathrq   r:   rC   s    r9   rA   StaticFileTest.get_app_kwargs`  s     122r;   c                    U R                  S5      nU R                  SUR                  ;   5        U R                  S5      nU R                  SUR                  ;   5        U R                  UR                  R                  S5      S5        g )N/robots.txt   Disallow: //static/robots.txtr   r  )r   r   r   r   rZ  re   r   s     r9   test_static_files StaticFileTest.test_static_filesc  sj    ::m,(--78::23(--78))--n=|Lr;   c                     U R                  S5      nU R                  SUR                  ;   5        U R                  SUR                  5        U R                  SUR                  5        g )Nz/robots.txt?v=12345rJ  zCache-ControlExpires)r   r   r   assertInrZ  r   s     r9   test_static_files_cacheable*StaticFileTest.test_static_files_cacheablek  sP     ::34(--78ox'7'78i!1!12r;   c                    U R                  S5      nU R                  UR                  R                  S5      S5        U R                  S5      nU R                  UR                  R                  S5      S5        U R                  S5      nU R	                  UR                  R                  S5      [        S5      ;   5        g )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   rZ  re   r   r  r   s     r9   test_static_compressed_files+StaticFileTest.test_static_compressed_filest  s    ::56))--n=?QR::67  02L	
 ::23  0C8W4XX	
r;   c                 x    U R                  S5      nU R                  UR                  SU R                  -   5        g )Nz/static_url/robots.txts   /static/robots.txt?v=)r   r   r   robots_txt_hashr   s     r9   test_static_urlStaticFileTest.test_static_url  s1    ::67(@4CWCW(WXr;   c                     U R                  S5      nU R                  UR                  [        U R	                  S5      5      S-   U R
                  -   5        g )Nz/abs_static_url/robots.txtrY   s   static/robots.txt?v=)r   r   r   r   r   rW  r   s     r9   test_absolute_static_url'StaticFileTest.test_absolute_static_url  sH    :::;MM$,,s#$'>>AUAUU	
r;   c                 ^    U R                  S5      nU R                  UR                  S5        g )Nz(/static_url/robots.txt?include_version=0s   /static/robots.txtrc  r   s     r9   test_relative_version_exclusion.StaticFileTest.test_relative_version_exclusion  s&    ::HI(=>r;   c                     U R                  S5      nU R                  UR                  [        U R	                  S5      S-   5      5        g )Nz,/abs_static_url/robots.txt?include_version=0rY   static/robots.txt)r   r   r   r   r   r   s     r9   test_absolute_version_exclusion.StaticFileTest.test_absolute_version_exclusion  s9    ::LMT\\#->AT-T(UVr;   c                 H    U R                  S5        U R                  S5        g )NFT)_trigger_include_host_checkrC   s    r9   test_include_host_override)StaticFileTest.test_include_host_override  s    ((/((.r;   c                     SnU R                  U[        U5      -  5      nU R                  UR                  [	        [        S5      5      5        g )Nz//override_static_url/robots.txt?include_host=%sT)r   r  r   r   r   r  )rD   r0  r4   r   s       r9   re  *StaticFileTest._trigger_include_host_check  s;    @::dS%667SY8r;   c                 8   U R                   " USS0UD6nU R                   " USS0UD6n[        5       n[        R                  " UR                  UR                  5       H,  nUR                  S5      (       d  M  UR                  U5        M.     U H  nU R                  UR                  R                  U5      UR                  R                  U5      U< SUR                  R                  U5      < SUR                  R                  U5      < S35        M     U$ )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chainrZ  
startswithaddr   re   )rD   r  r  head_responseget_responsecontent_headershs          r9   get_and_headStaticFileTest.get_and_head  s     

DBB6Bzz4@@@%!6!68L8LMA||J''##A& N !A%%))!,$$((+m++//2L4H4H4L4LQ4OQ ! r;   c                     U R                  S5      nU R                  SSUR                  S   0S9nU R                  UR                  S5        U R	                  SUR                  ;  5        g )NrK  If-Modified-SinceLast-Modifiedra  0  Content-Length)rv  rZ  r   r   r   rD   	response1	response2s      r9   !test_static_304_if_modified_since0StaticFileTest.test_static_304_if_modified_since  sl    %%&:;	%% ()*;*;O*LM & 
	 	-(	0A0AABr;   c                     U R                  S5      nU R                  SSUR                  S   0S9nU R                  UR                  S5        g )NrK  If-None-MatchEtagra  r{  rv  rZ  r   r   r}  s      r9   test_static_304_if_none_match,StaticFileTest.test_static_304_if_none_match  sS    %%&:;	%% ?I<M<Mf<U*V & 
	 	-r;   c                     U R                  S5      nU R                  SSUR                  S   S.S9nU R                  UR                  S5        g )NrK  z
"MISMATCH"rz  )r  ry  ra  r   r  r}  s      r9   !test_static_304_etag_modified_bug0StaticFileTest.test_static_304_etag_modified_bug  sW    %%&:;	%% !-%.%6%6%G & 
	 	-r;   c                 `    U R                  SSS0S9nU R                  UR                  S5        g )NrK  ry  zFri, 01 Jan 1960 00:00:00 GMTra  r   rv  r   r   r   s     r9   'test_static_if_modified_since_pre_epoch6StaticFileTest.test_static_if_modified_since_pre_epoch  s;     $$ (*IJ % 
 	,r;   c                 R   [         R                  " [        S5      5      nU R                  SS[	        UR
                  S-
  5      0S9nU R                  UR                  S5        U R                  SS[	        UR
                  S-   5      0S9nU R                  UR                  S5        g )Nra  rK  ry  r   ra  r   r{  )r3   statr:   rv  r   st_mtimer   r   )rD   r  r   s      r9   'test_static_if_modified_since_time_zone6StaticFileTest.test_static_if_modified_since_time_zone  s    
 www234$$ (*:4==1;L*MN % 
 	,$$ (*:4==1;L*MN % 
 	,r;   c                     U R                  S5      nU R                  [        UR                  R	                  S5      5      SU R
                  -   S-   5        g )NrK  r     ")rv  r   r   rZ  re   rW  r   s     r9   test_static_etagStaticFileTest.test_static_etag  sL    $$%9:!!%%f-.t7K7K0Kd0R	
r;   c                    U R                  SSS0S9nU R                  UR                  S5        U R                  UR                  S5        U R                  [	        UR
                  R                  S5      5      SU R                  -   S-   5        U R                  UR
                  R                  S	5      S
5        U R                  UR
                  R                  S5      S5        g )NrK  Rangez	bytes=0-9ra     s
   User-agentr  r  r|  10Content-Rangezbytes 0-9/26)rv  r   r   r   r   rZ  re   rW  r   s     r9   test_static_with_range%StaticFileTest.test_static_with_range  s    $$ 7K*@ % 
 	,6!!%%f-.t7K7K0Kd0R	
 	))--.>?F))--o>Or;   c                    U R                  SSS0S9nU R                  UR                  S5        [        R                  R                  U R                  S5      n[        USS9 nU R                  UR                  [        UR                  5       5      5        S S S 5        U R                  UR                  R                  S	5      S
5        U R                  UR                  R                  S5      S 5        g ! , (       d  f       Ne= f)NrK  r  zbytes=0-ra  r   
robots.txtutf-8r-  r|  26r  rv  r   r   r3   r4   r5   
static_diropenr   r   readrZ  re   rD   r   robots_file_pathfs       r9    test_static_with_range_full_file/StaticFileTest.test_static_with_range_full_file  s    $$ 7J*? % 

 	,77<<F"W5X]]DN; 6))--.>?F))--o>E 65   #4C66
Dc                    U R                  SSS0S9nU R                  UR                  S5        [        R                  R                  U R                  S5      n[        USS9 nU R                  UR                  [        UR                  5       5      5        S S S 5        U R                  UR                  R                  S	5      S
5        U R                  UR                  R                  S5      S 5        g ! , (       d  f       Ne= f)NrK  r  zbytes=0-10000000ra  r   r  r  r  r|  r  r  r  r  s       r9   $test_static_with_range_full_past_end3StaticFileTest.test_static_with_range_full_past_end  s    $$ 74F*G % 
 	,77<<F"W5X]]DN; 6))--.>?F))--o>E 65r  c           	         U R                  SSS0S9nU R                  UR                  S5        [        R                  R                  U R                  S5      n[        USS9 nU R                  UR                  [        UR                  5       S	S  5      5        S S S 5        U R                  UR                  R                  S
5      S5        U R                  UR                  R                  S5      S5        g ! , (       d  f       Ne= f)NrK  r  zbytes=1-10000000ra  r  r  r  r  r   r|  25r  zbytes 1-25/26r  r  s       r9   'test_static_with_range_partial_past_end6StaticFileTest.test_static_with_range_partial_past_end  s    $$ 74F*G % 
 	,77<<F"W5X]]D!",>? 6))--.>?F))--o>P 65s   #7C99
Dc                    U R                  SSS0S9nU R                  UR                  S5        U R                  UR                  R	                  S5      S5        U R                  UR                  R	                  S5      S	5        g )
NrK  r  z	bytes=22-ra     : /
r|  rO  r  bytes 22-25/26rv  r   r   rZ  re   r   s     r9   test_static_with_range_end_edge.StaticFileTest.test_static_with_range_end_edge  s{    $$ 7K*@ % 
 	1))--.>?E))--o>@PQr;   c                    U R                  SSS0S9nU R                  UR                  S5        U R                  UR                  R	                  S5      S5        U R                  UR                  R	                  S5      S	5        g )
NrK  r  zbytes=-4ra  r  r|  rO  r  r  r  r   s     r9   test_static_with_range_neg_end-StaticFileTest.test_static_with_range_neg_end&  s{    $$ 7J*? % 
 	1))--.>?E))--o>@PQr;   c                    U R                  SSS0S9nU R                  UR                  S5        [        R                  R                  U R                  S5      n[        USS9 nU R                  UR                  [        UR                  5       5      5        S S S 5        U R                  UR                  R                  S	5      S
5        U R                  UR                  R                  S5      S 5        g ! , (       d  f       Ne= f)NrK  r  zbytes=-1000000ra  r   r  r  r  r|  r  r  r  r  s       r9   %test_static_with_range_neg_past_start4StaticFileTest.test_static_with_range_neg_past_start.  s    $$ 74D*E % 
 	,77<<F"W5X]]DN; 6))--.>?F))--o>E 65r  c                 `    U R                  SSS0S9nU R                  UR                  S5        g )NrK  r  r  ra  r   r  r   s     r9   test_static_invalid_range(StaticFileTest.test_static_invalid_range9  s1    $$%9GVCT$U,r;   c                     U R                  SSS0S9nU R                  UR                  R                  S5      S5        U R                  UR                  S5        g )NrK  r  zbytes=-0ra  r  
bytes */26  )rv  r   rZ  re   r   r   s     r9   +test_static_unsatisfiable_range_zero_suffix:StaticFileTest.test_static_unsatisfiable_range_zero_suffix=  sX    $$ 7J*? % 
 	))--o>M,r;   c                     U R                  SSS0S9nU R                  UR                  S5        U R                  UR                  R	                  S5      S5        g )NrK  r  zbytes=26ra  r  r  r  rv  r   r   rZ  re   r   s     r9   -test_static_unsatisfiable_range_invalid_start<StaticFileTest.test_static_unsatisfiable_range_invalid_startD  sX    $$ 7J*? % 
 	,))--o>Mr;   c                     U R                  SSS0S9nU R                  UR                  S5        U R                  UR                  R	                  S5      S5        g )NrK  r  z
bytes=10-3ra  r  r  r  r  r   s     r9   3test_static_unsatisfiable_range_end_less_than_startBStaticFileTest.test_static_unsatisfiable_range_end_less_than_startK  sX    $$ 7L*A % 
 	,))--o>Mr;   c                 B   U R                  SSS9nU R                  UR                  S5        U R                  UR                  S5        U R                  UR                  S   S5        U R                  [        UR                  S   5      S	U R                  -   S	-   5        g )
NrK  rk  r   r   r;   r|  r  r  r  r   r   r   r   rZ  r   rW  r   s     r9   test_static_headStaticFileTest.test_static_headR  s    ::26:B,,))*:;TB!!&)*D43G3G,G$,N	
r;   c                 H   U R                  SSSS0S9nU R                  UR                  S5        U R                  UR                  S5        U R                  UR                  S   S	5        U R                  [        UR                  S
   5      SU R                  -   S-   5        g )NrK  rk  r  	bytes=1-4)r   rZ  r  r;   r|  rO  r  r  r  r   s     r9   test_static_head_range%StaticFileTest.test_static_head_range\  s    :: ';9O  
 	,,))*:;SA!!&)*D43G3G,G$,N	
r;   c                 f   U R                  SSSU R                  -   S-   S.S9nU R                  UR                  S5        U R                  UR                  S5        U R                  SUR                  ;  5        U R                  [        UR                  S	   5      SU R                  -   S-   5        g )
NrK  r  r  )r  r  ra  r{  r;   r|  r  )rv  rW  r   r   r   r   rZ  r   r   s     r9   test_static_range_if_none_match.StaticFileTest.test_static_range_if_none_matchg  s    $$ $!%(<(<!<t!C % 
 	,,(0@0@@A!!&)*D43G3G,G$,N	
r;   c                 ^    U R                  S5      nU R                  UR                  S5        g )Nz/static/blarg  r  r   s     r9   test_static_404StaticFileTest.test_static_404v  s&    $$_5,r;   c                    U R                   R                  5         [        5       U l         [        [        S5         U R                  S5      nS S S 5        U R                  WR                  S5        g ! , (       d  f       N+= f)Nz.*not in root static directoryz/static/../static_foo.txt  )http_clientr  r   r   r   rv  r   r   r   s     r9   test_path_traversal_protection-StaticFileTest.test_path_traversal_protectionz  sc     	 02w @A(()DEH B 	, BAs   A11
A?posixznon-posix OSc                 Z   [         R                  R                  [         R                  R                  [         R                  R	                  [
        5      5      S5      nU R                  S[        R                  R                  U5      -   5      nU R                  UR                  S5        g )Nra  z/root_staticr   )r3   r4   r5   r6   abspathr7   rv  r  r  r#  r   r   )rD   r4   r   s      r9   test_root_static_path$StaticFileTest.test_root_static_path  sp     ww||GGOOBGGOOH568K
 $$^fll6H6H6N%NO,r;   )r  N)2rO   rP   rQ   rR   rW  r3   r4   r5   r6   r7   r  r@   rA   rL  rQ  rT  rX  r[  r^  rb  rf  re  rv  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  unittestskipIfrv   r  rT   rL   r;   r9   r#  r#  2  s   	L  bggooh7BJ#
J3M3
Y
?W/9
*C.	.--$

PF	F	QRR	F--NN
	

-- __RWW'8	- 9	-r;   r#  c                   ,    \ rS rSrS rS rS rS rSrg)StaticDefaultFilenameTesti  c                 6    [        [        S5      [        SS9S9$ Nr$  
index.htmldefault_filename)rE  static_handler_argsrF  rC   s    r9   rA   (StaticDefaultFilenameTest.get_app_kwargs      ) $l C
 	
r;   c                     / $ r2   rL   rC   s    r9   r@   &StaticDefaultFilenameTest.get_handlers  rN   r;   c                     U R                  SSS9nU R                  UR                  S5        U R                  SUR                  5        g )N/static/dir/Fr  r   s   this is the index
r   r   r   r   r   s     r9   test_static_default_filename6StaticDefaultFilenameTest.test_static_default_filename  s=    ::nu:E,/?r;   c                     U R                  SSS9nU R                  UR                  S5        U R                  UR                  S   R                  S5      5        g )N/static/dirFr  r  r  r  )r   r   r   r   rZ  endswithr   s     r9   test_static_default_redirect6StaticDefaultFilenameTest.test_static_default_redirect  sJ    ::me:D,((4==nMNr;   rL   N)	rO   rP   rQ   rR   rA   r@   r  r   rT   rL   r;   r9   r  r    s    
@
Or;   r  c                   ,    \ rS rSrS rS rS rS rSrg)StaticDefaultFilenameRootTesti  c                 r    [        [        R                  R                  [	        S5      5      [        SS9SS9$ )Nr$  r  r  rY   )rE  r  static_url_prefix)rq   r3   r4   r  r:   rC   s    r9   rA   ,StaticDefaultFilenameRootTest.get_app_kwargs  s/    (9: $l C!
 	
r;   c                     / $ r2   rL   rC   s    r9   r@   *StaticDefaultFilenameRootTest.get_handlers  rN   r;   c                     [        5       $ r2   r   rC   s    r9   get_http_client-StaticDefaultFilenameRootTest.get_http_client  s     %&&r;   c                    [         R                  R                  [        5      n[         R                  R	                  U5      u  p#[         R
                  S:X  a  U R                  X15        OUn[        [        S5         U R                  SU S3SS9nS S S 5        U R                  WR                  S5        g ! , (       d  f       N+= f)Nr  z/.*cannot redirect path with two initial slashesz//evil.com/../r  Fr  r  )r3   r4   r6   r7   
splitdriverv   r   r   r   r   r   )rD   test_dirdrivetailr   s        r9   test_no_open_redirect3StaticDefaultFilenameRootTest.test_no_open_redirect  s     77??8,gg((277gT,Hw QRzz 
+6!& " H S
 	, SRs   =B77
CrL   N)	rO   rP   rQ   rR   rA   r@   r
  r  rT   rL   r;   r9   r  r    s    
'
-r;   r  c                   &    \ rS rSrS rS rS rSrg)StaticFileWithPathTesti  c                 6    [        [        S5      [        SS9S9$ r  rF  rC   s    r9   rA   %StaticFileWithPathTest.get_app_kwargs  r  r;   c                 ,    S[         S[        S5      04/$ )Nz	/foo/(.*)r4   z
templates/)r   r:   rC   s    r9   r@   #StaticFileWithPathTest.get_handlers  s    /&',:O1PQRRr;   c                 ^    U R                  S5      nU R                  UR                  S5        g )Nz/foo/utf8.htmls   Héllo
rc  r   s     r9   
test_serve!StaticFileWithPathTest.test_serve  s&    ::./(9:r;   rL   N)rO   rP   rQ   rR   rA   r@   r  rT   rL   r;   r9   r  r    s    
S;r;   r  c                   ,    \ rS rSrS rS rS rS rSrg)CustomStaticFileTesti  c                 T     " S S[         5      n " S S[        5      nXl        SU4/$ )Nc                   p    \ rS rSr\S 5       rS r\S 5       rS r\SS j5       r	S r
S	 r\S
 5       rSrg)>CustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandleri  c                 z    U R                  X5      nUR                  S5      nUS U nX$S-   S  nSU< SU< SU< 3$ )N.r   z/static/)get_versionrindex)clsrm   r4   version_hashextension_indexbefore_versionafter_versions          r9   make_static_urlNCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.make_static_url  sN    "x>"&++c"2!%&6!7 $&9%< =" ! r;   c                 d    UR                  S5      nUR                  SSU5      nUS U < XS  < 3$ )Nr"  r   )r$  )rD   url_pathr'  version_indexs       r9   parse_url_pathMCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.parse_url_path  s:    "*//#"6 (Q H!).=!98DT;UVVr;   c                     SU-   $ )NzCustomStaticFileTest:rL   r%  rm   r4   s      r9   get_absolute_pathPCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_absolute_path  s    .55r;   c                     U$ r2   rL   )rD   rootabsolute_paths      r9   validate_absolute_pathUCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.validate_absolute_path  s    $$r;   Nc                 <    Uc  Ub   eUS:X  a  g[        SU-  5      e)NCustomStaticFileTest:foo.txtr   unexpected path %rr  )rD   r4   startends       r9   get_contentJCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_content  s.    }4499! 4t ;<<r;   c                 T    U R                   S:X  a  g[        SU R                   -  5      e)Nr;  rk  r<  )r7  r  rC   s    r9   get_content_sizeOCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_content_size  s+    %%)GG 4t7I7I IJJr;   c                     g r2   rL   rC   s    r9   get_modified_timePCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_modified_time  s    r;   c                     g)N42rL   r2  s      r9   r#  JCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_version  s    r;   rL   NN)rO   rP   rQ   rR   classmethodr*  r/  r3  r8  r?  rB  rE  r#  rT   rL   r;   r9   MyStaticFileHandlerr     sf    	 	W
 6 6% = =K
  r;   rL  c                       \ rS rSrS rSrg);CustomStaticFileTest.get_handlers.<locals>.StaticUrlHandleri  c                 D    U R                  U R                  U5      5        g r2   )rd   r*  r   s     r9   re   ?CustomStaticFileTest.get_handlers.<locals>.StaticUrlHandler.get  s    

4??401r;   rL   Nrg   rL   r;   r9   r-  rN    s    2r;   r-  rB  )r   r   static_handler_class)rD   rL  r-  s      r9   r@   !CustomStaticFileTest.get_handlers  s3    *	"3 *	X	2~ 	2 %8!#%5677r;   c                 *    [        SU R                  S9$ )Ndummy)rE  rQ  )rq   rQ  rC   s    r9   rA   #CustomStaticFileTest.get_app_kwargs  s    d>W>WXXr;   c                 ^    U R                  S5      nU R                  UR                  S5        g )Nz/static/foo.42.txtr   rc  r   s     r9   r  CustomStaticFileTest.test_serve  s%    ::23/r;   c                     [        [        SSS9   U R                  S5      nU R                  UR                  S5        S S S 5        g ! , (       d  f       g = f)NzCould not open static fileF)requiredz/static_url/foo.txts   /static/foo.42.txt)r   r   r   r   r   r   s     r9   rX  $CustomStaticFileTest.test_static_url  s@    w <uMzz"78HX]],AB NMMs   .A
A)rQ  N)	rO   rP   rQ   rR   r@   rA   r  rX  rT   rL   r;   r9   r  r    s    38jY0Cr;   r  c                   6    \ rS rSr " S S\5      rS rS rSrg)HostMatchingTesti   c                        \ rS rSrS rS rSrg)HostMatchingTest.Handleri!  c                     Xl         g r2   reply)rD   ra  s     r9   r  #HostMatchingTest.Handler.initialize"  s    Jr;   c                 :    U R                  U R                  5        g r2   )rd   ra  rC   s    r9   re   HostMatchingTest.Handler.get%  s    JJtzz"r;   r`  N)rO   rP   rQ   rR   r  re   rT   rL   r;   r9   r[   r^  !  s    		#r;   r[   c                 .    S[         R                  SS04/$ )Nr  ra  wildcard)r\  r[   rC   s    r9   r@   HostMatchingTest.get_handlers(  s    )11GZ3HIJJr;   c                    U R                   R                  SS[        R                  SS04/5        U R                   R                  SS[        R                  SS04/5        U R                   R                  SS[        R                  SS	04/5        U R                   R                  S
S[        R                  SS04/5        U R	                  S5      nU R                  UR                  S5        U R	                  S5      nU R                  UR                  S5        U R	                  S5      nU R                  UR                  S5        U R	                  SSS0S9nU R                  UR                  S5        U R	                  SSS0S9nU R                  UR                  S5        U R	                  SSS0S9nU R                  UR                  S5        U R	                  SSS0S9nU R                  UR                  S5        g )Nwww.example.comr  ra  [0]www\.example\.com/bar[1]/baz[2]zwww.e.*e.comz[3]s   wildcardr  Hostra     [0]   [1]   [2]zwww.exe.coms   [3])rB   add_handlersr\  r[   r   r   r   r   r   s     r9   test_host_matching#HostMatchingTest.test_host_matching+  s   )9)A)AGUCS TU	
 	 F,<,D,DwPUFV#W"X	
 	)9)A)AGUCS TU	
 	f&6&>&>%@PQR	
 ::f%4::f%,::f%,::fv7H.I:J/::fv7H.I:J/::fv7H.I:J/::fv}.E:F/r;   rL   N)	rO   rP   rQ   rR   r   r[   r@   ru  rT   rL   r;   r9   r\  r\     s    #. #K0r;   r\  c                   &    \ rS rSrS rS rS rSrg)DefaultHostMatchingTestiJ  c                     / $ r2   rL   rC   s    r9   r@   $DefaultHostMatchingTest.get_handlersK  rN   r;   c                 
    SS0$ )Ndefault_hostri  rL   rC   s    r9   rA   &DefaultHostMatchingTest.get_app_kwargsN  s     122r;   c                 
   U R                   R                  SS[        R                  SS04/5        U R                   R                  SS[        R                  SS04/5        U R                   R                  SS	[        R                  SS
04/5        U R	                  S5      nU R                  UR                  S5        U R	                  S5      nU R                  UR                  S5        U R	                  S	5      nU R                  UR                  S5        U R	                  SSS0S9nU R                  UR                  S5        SU R                   l        U R	                  S	5      nU R                  UR                  S5        g )Nri  r  ra  rj  rk  rl  rm  zwww.test.comrn  ro  rq  rr  r  z	X-Real-Ipr  ra  rs  )	rB   rt  r\  r[   r   r   r   r   r|  r   s     r9   test_default_host_matching2DefaultHostMatchingTest.test_default_host_matchingQ  sO   )9)A)AGUCS TU	
 	 F,<,D,DwPUFV#W"X	
 	f&6&>&>%@PQR	
 ::f%/::f%/::f%,::f{K.H:I, .::f%/r;   rL   N)rO   rP   rQ   rR   r@   rA   r  rT   rL   r;   r9   rx  rx  J  s    30r;   rx  c                        \ rS rSrS rS rSrg)NamedURLSpecGroupsTestil  c                 0     " S S[         5      nSU4SU4/$ )Nc                       \ rS rSrS rSrg)8NamedURLSpecGroupsTest.get_handlers.<locals>.EchoHandlerin  c                 &    U R                  U5        g r2   rc   r   s     r9   re   <NamedURLSpecGroupsTest.get_handlers.<locals>.EchoHandler.geto  s    

4 r;   rL   Nrg   rL   r;   r9   r  r  n  s    !r;   r  z/str/(?P<path>.*)z/unicode/(?P<path>.*)r   )rD   r  s     r9   r@   #NamedURLSpecGroupsTest.get_handlersm  s*    	!. 	!
 !+.$k2
 	
r;   c                     U R                  S5      nU R                  UR                  S5        U R                  S5      nU R                  UR                  S5        g )Nz/str/foos   fooz/unicode/barr   rc  r   s     r9   test_named_urlspec_groups0NamedURLSpecGroupsTest.test_named_urlspec_groupsw  sF    ::j)/::n-/r;   rL   N)rO   rP   rQ   rR   r@   r  rT   rL   r;   r9   r  r  l  s    
0r;   r  c                   0    \ rS rSr " S S\5      rS rSrg)ClearHeaderTesti  c                       \ rS rSrS rSrg)ClearHeaderTest.Handleri  c                     U R                  SS5        U R                  SS5        U R                  S5        U R                  S5        g )Nh1r   h2r4  nonexistent)rP  clear_headerrC   s    r9   re   ClearHeaderTest.Handler.get  s:    OOD%(OOD%(d#m,r;   rL   Nrg   rL   r;   r9   r[   r    s    	-r;   r[   c                     U R                  S5      nU R                  SUR                  ;  5        U R                  UR                  S   S5        g )NrY   r  r  r4  )r   r   rZ  r   r   s     r9   test_clear_header!ClearHeaderTest.test_clear_header  sA    ::c?H$4$445))$/7r;   rL   N)rO   rP   rQ   rR   r   r[   r  rT   rL   r;   r9   r  r    s    -. -8r;   r  c                   0    \ rS rSr " S S\5      rS rSrg)Header204Testi  c                       \ rS rSrS rSrg)Header204Test.Handleri  c                 F    U R                  S5        U R                  5         g )N   )
set_statusr   rC   s    r9   re   Header204Test.Handler.get  s    OOC KKMr;   rL   Nrg   rL   r;   r9   r[   r    s    	r;   r[   c                     U R                  S5      nU R                  UR                  S5        U R                  SUR                  5        U R                  SUR                  5        g )NrY   r  r|  Transfer-Encoding)r   r   r   r  rZ  r   s     r9   test_204_headersHeader204Test.test_204_headers  sQ    ::c?,)8+;+;<,h.>.>?r;   rL   N)rO   rP   rQ   rR   r   r[   r  rT   rL   r;   r9   r  r    s    . 
@r;   r  c                   0    \ rS rSr " S S\5      rS rSrg)Header304Testi  c                       \ rS rSrS rSrg)Header304Test.Handleri  c                 J    U R                  SS5        U R                  S5        g )NContent-Languageen_USrb   )rP  rd   rC   s    r9   re   Header304Test.Handler.get  s    OO.8JJwr;   rL   Nrg   rL   r;   r9   r[   r    s    	 r;   r[   c                    U R                  S5      nU R                  UR                  S   S5        U R                  UR                  S   S5        U R                  SSUR                  S   0S9nU R                  UR                  S	5        U R	                  SUR                  ;  5        U R	                  SUR                  ;  5        U R	                  S
UR                  ;  5        g )NrY   r|  5r  r  r  r  ra  r{  r  )r   r   rZ  r   r   r}  s      r9   test_304_headersHeader304Test.test_304_headers  s    JJsO	**+;<cB**+=>HJJ/9+<+<V+DE  
	 	-(	0A0AAB*)2C2CCD+93D3DDEr;   rL   N)rO   rP   rQ   rR   r   r[   r  rT   rL   r;   r9   r  r    s     .  
Fr;   r  c                   6    \ rS rSr " S S\5      rS rS rSrg)StatusReasonTesti  c                       \ rS rSrS rSrg)StatusReasonTest.Handleri  c                     U R                   R                  R                  S/ 5      nU R                  [	        U R                  S5      5      U(       a  [        US   5      OS S9  g )Nreasonr   r   r  )r  r  re   r  r  r  r   )rD   r  s     r9   re   StatusReasonTest.Handler.get  sR    \\++//"=FOOD%%f-.06z&),D  r;   rL   Nrg   rL   r;   r9   r[   r    s    	r;   r[   c                     [        5       $ r2   r   rC   s    r9   r
   StatusReasonTest.get_http_client      $&&r;   c                 L   U R                  S5      nU R                  UR                  S5        U R                  UR                  S5        U R                  S5      nU R                  UR                  S5        U R                  UR                  S5        U R                  S5      nU R                  UR                  S5        U R                  UR                  S5        U R                  S	5      nU R                  UR                  S5        U R                  UR                  S
5        g )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_statusStatusReasonTest.test_status  s    ::l+,.9::56,%0::56,%0::l+,)4r;   rL   N)	rO   rP   rQ   rR   r   r[   r
  r  rT   rL   r;   r9   r  r    s    . '5r;   r  c                   0    \ rS rSr " S S\5      rS rSrg)DateHeaderTesti  c                       \ rS rSrS rSrg)DateHeaderTest.Handleri  c                 &    U R                  S5        g ra   rc   rC   s    r9   re   DateHeaderTest.Handler.get      JJwr;   rL   Nrg   rL   r;   r9   r[   r    s    	 r;   r[   c                 :   U R                  S5      n[        R                  R                  UR                  S   5      nU R                  U[        R                  R                  [        R                  R                  5      -
  [        R                  " SS9:  5        g )NrY   Dater   )seconds)r   r  r  r  rZ  r   r  r  r  r  r  )rD   r   header_dates      r9   test_date_headerDateHeaderTest.test_date_header  sr    ::c?kk778H8H8PQ(++//0A0A0E0EFF  +,	
r;   rL   N)rO   rP   rQ   rR   r   r[   r  rT   rL   r;   r9   r  r    s     .  
r;   r  c                   B    \ rS rSr " S S\5      rS rS rS rS r	Sr
g	)
RaiseWithReasonTesti  c                       \ rS rSrS rSrg)RaiseWithReasonTest.Handleri  c                     [        SSS9e)Nr  r  r  r!   rC   s    r9   re   RaiseWithReasonTest.Handler.get  s    C..r;   rL   Nrg   rL   r;   r9   r[   r    s    	/r;   r[   c                     [        5       $ r2   r   rC   s    r9   r
  #RaiseWithReasonTest.get_http_client  r  r;   c                     U R                  S5      nU R                  UR                  S5        U R                  UR                  S5        U R	                  SUR
                  5        g )NrY   r  r  s   682: Foo)r   r   r   r  rP  r   r   s     r9   test_raise_with_reason*RaiseWithReasonTest.test_raise_with_reason  sI    ::c?,%0k8==1r;   c           	      J    U R                  [        [        SSS95      S5        g )Nr  r  r  zHTTP 682: Foor   r  r!   rC   s    r9   test_httperror_str&RaiseWithReasonTest.test_httperror_str  s    Ys59:OLr;   c                 L    U R                  [        [        S5      5      S5        g )Nr  zHTTP 682: Unknownr  rC   s    r9    test_httperror_str_from_httputil4RaiseWithReasonTest.test_httperror_str_from_httputil  s    Ys^,.ABr;   rL   N)rO   rP   rQ   rR   r   r[   r
  r  r  r  rT   rL   r;   r9   r  r    s$    /. /'2MCr;   r  c                   ,    \ rS rSrS rS rS rS rSrg)ErrorHandlerXSRFTesti  c                 $    S[         [        SS94/$ )N/error  r  )r#   rq   rC   s    r9   r@   !ErrorHandlerXSRFTest.get_handlers  s     <#)>?@@r;   c                     [        SS9$ NT)xsrf_cookiesr   rC   s    r9   rA   #ErrorHandlerXSRFTest.get_app_kwargs      &&r;   c                 ^    U R                  SSSS9nU R                  UR                  S5        g )Nr  r   r  r   r  r  r   s     r9   test_error_xsrf$ErrorHandlerXSRFTest.test_error_xsrf  s*    ::hvB:?,r;   c                 ^    U R                  SSSS9nU R                  UR                  S5        g )Nz/404r   r  r   r  r  r   s     r9   test_404_xsrf"ErrorHandlerXSRFTest.test_404_xsrf  s*    ::fV":=,r;   rL   N)	rO   rP   rQ   rR   r@   rA   r  r  rT   rL   r;   r9   r  r    s    A'--r;   r  c                   T    \ rS rSr " S S\5      rS rS rS rS r	S r
S	 rS
 rSrg)GzipTestCasei  c                       \ rS rSrS rSrg)GzipTestCase.Handleri  c                     U R                  S5       H  nU R                  SU5        M     U R                  SS[        R                  -  -   5        g )Nvaryr  zhello world!)r  rQ  rd   r/   
MIN_LENGTH)rD   vs     r9   re   GzipTestCase.Handler.get  sD    ''/* 0 JJ}.A.L.L(LMNr;   rL   Nrg   rL   r;   r9   r[   r    s    	Or;   r[   c                     [        S[        R                  R                  [        R                  R	                  [
        5      S5      S9$ )NTr$  )r  rE  )rq   r3   r4   r5   r6   r7   rC   s    r9   rA   GzipTestCase.get_app_kwargs
  s0    277<<0I8#T
 	
r;   c                     U R                  UR                  R                  SUR                  R                  S5      5      S5        g )Nr  zX-Consumed-Content-Encodingr  )r   rZ  re   r   s     r9   assert_compressedGzipTestCase.assert_compressed  sB     	  "H$4$4$8$89V$W 		
r;   c                     U R                  S5      nU R                  U5        U R                  UR                  S   S5        g )NrY   r  r  r   r  r   rZ  r   s     r9   	test_gzipGzipTestCase.test_gzip  s9    ::c?x())&13DEr;   c                     U R                  S5      nU R                  U5        U R                  UR                  S   S5        g )NrI  r  r  r  r   s     r9   test_gzip_staticGzipTestCase.test_gzip_static  s<     ::m,x())&13DEr;   c                     U R                  SSS9nU R                  SUR                  5        U R                  UR                  S   S5        g )NrY   F)use_gzipr  r  r  )r   r  rZ  r   r   s     r9   test_gzip_not_requested$GzipTestCase.test_gzip_not_requested%  sG    ::cE:2+X-=-=>))&13DEr;   c                     U R                  S5      nU R                  U5        U R                  UR                  S   R	                  S5       Vs/ s H  o"R                  5       PM     snSS/5        g s  snf )Nz/?vary=Accept-Languager  ,Accept-Languager  r   r  r   rZ  splitstriprD   r   r  s      r9   test_vary_already_present&GzipTestCase.test_vary_already_present*  sg    ::67x( ( 0 0 8 > >s CD C1WWY CD 12	
D   A2c                     U R                  S5      nU R                  U5        U R                  UR                  S   R	                  S5       Vs/ s H  o"R                  5       PM     sn/ SQ5        g s  snf )Nz"/?vary=Accept-Language&vary=Cookier  r  )r  r_  r  r  r  s      r9   "test_vary_already_present_multiple/GzipTestCase.test_vary_already_present_multiple2  sa    ::BCx( ( 0 0 8 > >s CD C1WWY CD<	
Dr  rL   N)rO   rP   rQ   rR   r   r[   rA   r  r  r	  r  r  r  rT   rL   r;   r9   r  r    s6    O. O


F
FF


r;   r  c                   <    \ rS rSr " S S\5      rS rS rS rSr	g)	PathArgsInPrepareTesti<  c                        \ rS rSrS rS rSrg)PathArgsInPrepareTest.Handleri=  c                 ^    U R                  [        U R                  U R                  S95        g )Nr  r  )rd   rq   r  path_kwargsrC   s    r9   r  %PathArgsInPrepareTest.Handler.prepare>  s    JJt8H8HIJr;   c                 4    US:X  d   eU R                  5         g )Nr   r   r   s     r9   re   !PathArgsInPrepareTest.Handler.getA  s    5= =KKMr;   rL   NrO   rP   rQ   rR   r  re   rT   rL   r;   r9   r[   r  =  s    	K	r;   r[   c                 :    SU R                   4SU R                   4/$ )Nz	/pos/(.*)z/kw/(?P<path>.*)rZ   rC   s    r9   r@   "PathArgsInPrepareTest.get_handlersE  s     dll+.@$,,-OPPr;   c                     U R                  S5      nUR                  5         [        UR                  5      nU R	                  US/0 S.5        g )Nz/pos/foor   r!  r  rD   r   ro  s      r9   test_posPathArgsInPrepareTest.test_posH  sA    ::j)8==)2>?r;   c                     U R                  S5      nUR                  5         [        UR                  5      nU R	                  U/ SS0S.5        g )Nz/kw/foor4   r   r!  r  r+  s      r9   test_kwPathArgsInPrepareTest.test_kwN  sC    ::i(8==)vuoFGr;   rL   N)
rO   rP   rQ   rR   r   r[   r@   r,  r/  rT   rL   r;   r9   r  r  <  s     . Q@Hr;   r  c                   0    \ rS rSr " S S\5      rS rSrg)ClearAllCookiesTestiU  c                       \ rS rSrS rSrg)ClearAllCookiesTest.HandleriV  c                 F    U R                  5         U R                  S5        g Nok)clear_all_cookiesrd   rC   s    r9   re   ClearAllCookiesTest.Handler.getW  s    ""$JJtr;   rL   Nrg   rL   r;   r9   r[   r4  V  s    	r;   r[   c                 h   U R                  SSS0S9n[        UR                  R                  S5      5      nU R	                  US   R                  S5      =(       d    US   R                  S5      5        U R	                  US	   R                  S
5      =(       d    US	   R                  S5      5        g )NrY   r_  zfoo=bar; baz=xyzzyra  rX  r   zbaz=;zbaz="";r   zfoo=;zfoo="";)r   rY  rZ  r[  r   rp  )rD   r   set_cookiess      r9   test_clear_all_cookies*ClearAllCookiesTest.test_clear_all_cookies[  s    ::cH6J+K:LX--66|DEN%%g.V+a.2K2KI2V	
 	N%%g.V+a.2K2KI2V	
r;   rL   N)rO   rP   rQ   rR   r   r[   r<  rT   rL   r;   r9   r2  r2  U  s    . 
	
r;   r2  c                       \ rS rSrSrg)PermissionErrorig  rL   NrO   rP   rQ   rR   rT   rL   r;   r9   r?  r?  g  s    r;   r?  c                   <    \ rS rSr " S S\5      rS rS rS rSr	g)	ExceptionHandlerTestik  c                   &    \ rS rSrS rS rS rSrg)ExceptionHandlerTest.Handleril  c                     U R                  S5      nUS:X  a  [        SS5      eUS:X  a  SS-    g US:X  a  [        S	5      eg )
Nexchttp  zno longer herezeror   r   
permissionznot allowed)r  r!   r?  )rD   rF  s     r9   re    ExceptionHandlerTest.Handler.getm  sM    ##E*Cf}%566A$%m44 %r;   c                     SU;   a@  US   u  p4n[        U[        5      (       a#  U R                  S5        U R                  S5        g [        R
                  " X40 UD6  g )Nr  r  r?  )
isinstancer?  r  rd   r   r  )rD   r  r  typrz   tbs         r9   r  (ExceptionHandlerTest.Handler.write_errorv  sT    V#!'
!3Be_55OOC(JJ01&&tCFCr;   c                     [        U[        5      (       a%  [        R                  " SUR                  S   5        g [
        R                  " XX#5        g )Nz&custom logging for PermissionError: %sr   )rM  r?  r   warningr  r   log_exceptionrD   rN  rz   rO  s       r9   rS  *ExceptionHandlerTest.Handler.log_exception  s7    %11 H%**UV-X,,TBr;   rL   N)rO   rP   rQ   rR   re   r  rS  rT   rL   r;   r9   r[   rD  l  s    	5	D	Cr;   r[   c                     [        [        S5         U R                  S5      nU R                  UR                  S5        S S S 5        g ! , (       d  f       g = f)Nz.*no longer herez
/?exc=httprH  r  r   s     r9   test_http_error$ExceptionHandlerTest.test_http_error  s=     w 23zz,/HX]]C0 433   .A
Ac                     [        [        S5         U R                  S5      nU R                  UR                  S5        S S S 5        g ! , (       d  f       g = f)Nr  z
/?exc=zeror  r   r   r   r   r   r   s     r9   test_unknown_error'ExceptionHandlerTest.test_unknown_error  s;    w 45zz,/HX]]C0 655rY  c                     [        [        S5         U R                  S5      nU R                  UR                  S5        S S S 5        g ! , (       d  f       g = f)Nz/custom logging for PermissionError: not allowedz/?exc=permissionr  r[  r   s     r9   test_known_error%ExceptionHandlerTest.test_known_error  s?     w QRzz"45HX]]C0 SRRrY  rL   N)
rO   rP   rQ   rR   r   r[   rW  r\  r_  rT   rL   r;   r9   rB  rB  k  s    C. C2111r;   rB  c                   0    \ rS rSr " S S\5      rS rSrg)BuggyLoggingTesti  c                        \ rS rSrS rS rSrg)BuggyLoggingTest.Handleri  c                     SS-    g r  rL   rC   s    r9   re   BuggyLoggingTest.Handler.get  	    Er;   c                     SS-    g r  rL   rT  s       r9   rS  &BuggyLoggingTest.Handler.log_exception  rg  r;   rL   N)rO   rP   rQ   rR   re   rS  rT   rL   r;   r9   r[   rd    s    		r;   r[   c                 z    [        [        S5         U R                  S5        S S S 5        g ! , (       d  f       g = f)Nz.*rY   )r   r   r   rC   s    r9   test_buggy_log_exception)BuggyLoggingTest.test_buggy_log_exception  s%     w%JJsO &%%r  rL   N)rO   rP   rQ   rR   r   r[   rk  rT   rL   r;   r9   rb  rb    s    . r;   rb  c                   N   ^  \ rS rSrSr " S S\5      rS rU 4S jrS r	Sr
U =r$ )	UIMethodUIModuleTesti  zXTest that UI methods and modules are created correctly and
associated with the handler.
c                        \ rS rSrS rS rSrg)UIMethodUIModuleTest.Handleri  c                 &    U R                  S5        g r   r>  rC   s    r9   re    UIMethodUIModuleTest.Handler.get  s    KK
#r;   c                 $    U R                  S5      $ )Nrz   )r  rC   s    r9   rz   "UIMethodUIModuleTest.Handler.value  s    $$W--r;   rL   N)rO   rP   rQ   rR   re   rz   rT   rL   r;   r9   r[   rp    s    	$	.r;   r[   c                 ^    S n " S S[         5      n[        SS05      n[        USU0SU0S9$ )Nc                 4    SU< SU R                  5       < S3$ )NzIn my_ui_method() with handler value r"  )rz   )r   xs     r9   my_ui_method9UIMethodUIModuleTest.get_app_kwargs.<locals>.my_ui_method  s    CDgmmoVVr;   c                       \ rS rSrS rSrg)5UIMethodUIModuleTest.get_app_kwargs.<locals>.MyModulei  c                     SU< S[         R                  " [        R                  U R                  5      R                  5       < S3$ )NzIn MyModule(rw  r"  )typingcastrn  r[   r   rz   )rD   rx  s     r9   r   <UIMethodUIModuleTest.get_app_kwargs.<locals>.MyModule.render  s1    KK 4 < <dllKQQS r;   rL   NrO   rP   rQ   rR   r   rT   rL   r;   r9   MyModuler|    s    r;   r  r   z1{{ my_ui_method(42) }} {% module MyModule(123) %}ry  )rz  
ui_methods
ui_modulesr*   r   rq   )rD   ry  r  r}  s       r9   rA   #UIMethodUIModuleTest.get_app_kwargs  sK    	W	x 	 LM
 "&5"H-
 	
r;   c                 ^   > [         TU ]  5         [        R                  R	                  5         g r2   r  r  s    r9   r  UIMethodUIModuleTest.tearDown  s     ((..0r;   c                 ^    U R                  S5      nU R                  UR                  S5        g )Nz/?value=asdfsV   In my_ui_method(42) with handler value asdf. In MyModule(123) with handler value asdf.rc  r   s     r9   test_ui_method#UIMethodUIModuleTest.test_ui_method  s*    ::n-MM9	
r;   rL   )rO   rP   rQ   rR   rS   r   r[   rA   r  r  rT   r  r  s   @r9   rn  rn    s(    .. .
(1

 
r;   rn  c                   0    \ rS rSr " S S\5      rS rSrg)GetArgumentErrorTesti  c                       \ rS rSrS rSrg)GetArgumentErrorTest.Handleri  c                      U R                  S5        U R                  0 5        g ! [         a2  nU R                  UR                  UR                  S.5         S nAg S nAff = f)Nr   arg_namelog_message)r  rd   r"   r  r  rd  s     r9   re    GetArgumentErrorTest.Handler.get  sO    S!!%(

2' S



1==QRRSs   "% 
A!(AA!rL   Nrg   rL   r;   r9   r[   r    s    	Sr;   r[   c                 v    U R                  S5      nU R                  [        UR                  5      SSS.5        g )NrY   r   zMissing argument foor  )r   r   r   r   r   s     r9   test_catch_error%GetArgumentErrorTest.test_catch_error  s2    ::c?&/EF	
r;   rL   N)rO   rP   rQ   rR   r   r[   r  rT   rL   r;   r9   r  r    s    S. S
r;   r  c                   0    \ rS rSr " S S\5      rS rSrg)SetLazyPropertiesTesti  c                   ,    \ rS rSrS rS rS rS rSrg)SetLazyPropertiesTest.Handleri  c                 H    SU l         [        R                  " S5      U l        g )NBenr  )current_userr   re   rC   s    r9   r  %SetLazyPropertiesTest.Handler.prepare  s     %D **W-DKr;   c                     [        5       er2   rH   rC   s    r9   get_user_locale-SetLazyPropertiesTest.Handler.get_user_locale      %''r;   c                     [        5       er2   rH   rC   s    r9   get_current_user.SetLazyPropertiesTest.Handler.get_current_user  r  r;   c                 t    U R                  SU R                  < SU R                  R                  < S35        g )NzHello z (rm  )rd   r  r   r   rC   s    r9   re   !SetLazyPropertiesTest.Handler.get  s#    JJ$*;*;T[[=M=MNOr;   )r  r   N)	rO   rP   rQ   rR   r  r  r  re   rT   rL   r;   r9   r[   r    s    	.	(	(	Pr;   r[   c                 ^    U R                  S5      nU R                  UR                  S5        g )NrY   s   Hello Ben (en_US)rc  r   s     r9   test_set_properties)SetLazyPropertiesTest.test_set_properties  s&     ::c?(<=r;   rL   N)rO   rP   rQ   rR   r   r[   r  rT   rL   r;   r9   r  r    s    P. P>r;   r  c                   v   ^  \ rS rSrS rU 4S jrS r\R                  " S5      S 5       r	S r
S rS	 rS
rU =r$ )GetCurrentUserTesti  c                 x     " S S[         5      n " S S[         5      n[        SSSSS	.5      n[        UUUS
.S9$ )Nc                       \ rS rSrS rSrg)<GetCurrentUserTest.get_app_kwargs.<locals>.WithoutUserModulei   c                     g)Nr  rL   rC   s    r9   r   CGetCurrentUserTest.get_app_kwargs.<locals>.WithoutUserModule.render  s    r;   rL   Nr  rL   r;   r9   WithoutUserModuler     s    r;   r  c                       \ rS rSrS rSrg)9GetCurrentUserTest.get_app_kwargs.<locals>.WithUserModulei  c                 ,    [        U R                  5      $ r2   )r  r  rC   s    r9   r   @GetCurrentUserTest.get_app_kwargs.<locals>.WithUserModule.render  s    4,,--r;   rL   Nr  rL   r;   r9   WithUserModuler    s    .r;   r  r  z{{ current_user }}z {% module WithoutUserModule() %}z{% module WithUserModule() %})without_user.htmlwith_user.htmlwithout_user_module.htmlwith_user_module.html)r  r  )rz  r  r  )rD   r  r  r}  s       r9   rA   !GetCurrentUserTest.get_app_kwargs  sT    	 		.X 	. %'"6,N)H	
 ""0%6
 	
r;   c                 ^   > [         TU ]  5         [        R                  R	                  5         g r2   r  r  s    r9   r  GetCurrentUserTest.tearDown  r  r;   c                      " S S[         5      n " S SU5      n " S SU5      n " S SU5      n " S	 S
U5      n " S SU5      nSU4SU4SU4SU4/$ )Nc                        \ rS rSrS rS rSrg);GetCurrentUserTest.get_handlers.<locals>.CurrentUserHandleri  c                     SU l         g )NFhas_loaded_current_userrC   s    r9   r  CGetCurrentUserTest.get_handlers.<locals>.CurrentUserHandler.prepare  s
    /4,r;   c                     SU l         g)NTr  r  rC   s    r9   r  LGetCurrentUserTest.get_handlers.<locals>.CurrentUserHandler.get_current_user!  s    /3,r;   r  N)rO   rP   rQ   rR   r  r  rT   rL   r;   r9   CurrentUserHandlerr    s    5r;   r  c                       \ rS rSrS rSrg);GetCurrentUserTest.get_handlers.<locals>.WithoutUserHandleri%  c                 n    U R                  S5        U R                  [        U R                  5      5        g )Nr  render_stringr   r  r  rC   s    r9   re   ?GetCurrentUserTest.get_handlers.<locals>.WithoutUserHandler.get&  s(    ""#67C < <=>r;   rL   Nrg   rL   r;   r9   WithoutUserHandlerr  %      ?r;   r  c                       \ rS rSrS rSrg)8GetCurrentUserTest.get_handlers.<locals>.WithUserHandleri*  c                 n    U R                  S5        U R                  [        U R                  5      5        g )Nr  r  rC   s    r9   re   <GetCurrentUserTest.get_handlers.<locals>.WithUserHandler.get+  s(    ""#34C < <=>r;   rL   Nrg   rL   r;   r9   WithUserHandlerr  *  r  r;   r  c                       \ rS rSrS rSrg)AGetCurrentUserTest.get_handlers.<locals>.CurrentUserModuleHandleri/  c                     U R                   $ r2   )uirC   s    r9   get_template_namespaceXGetCurrentUserTest.get_handlers.<locals>.CurrentUserModuleHandler.get_template_namespace0  s     wwr;   rL   N)rO   rP   rQ   rR   r  rT   rL   r;   r9   CurrentUserModuleHandlerr  /  s    r;   r  c                       \ rS rSrS rSrg)AGetCurrentUserTest.get_handlers.<locals>.WithoutUserModuleHandleri6  c                 n    U R                  S5        U R                  [        U R                  5      5        g )Nr  r  rC   s    r9   re   EGetCurrentUserTest.get_handlers.<locals>.WithoutUserModuleHandler.get7  s(    ""#=>C < <=>r;   rL   Nrg   rL   r;   r9   WithoutUserModuleHandlerr  6  r  r;   r  c                       \ rS rSrS rSrg)>GetCurrentUserTest.get_handlers.<locals>.WithUserModuleHandleri;  c                 n    U R                  S5        U R                  [        U R                  5      5        g )Nr  r  rC   s    r9   re   BGetCurrentUserTest.get_handlers.<locals>.WithUserModuleHandler.get<  s(    ""#:;C < <=>r;   rL   Nrg   rL   r;   r9   WithUserModuleHandlerr  ;  r  r;   r  /without_user
/with_user/without_user_module/with_user_moduler   )rD   r  r  r  r  r  r  s          r9   r@   GetCurrentUserTest.get_handlers  s~    	 		?!3 	?
	?0 	?
	'9 		?'? 	?
	?$< 	? 01?+#%=> "78	
 	
r;   z	needs fixc                 ^    U R                  S5      nU R                  UR                  S5        g )Nr     Falserc  r   s     r9   test_get_current_user_is_lazy0GetCurrentUserTest.test_get_current_user_is_lazyG  s&     ::o.1r;   c                 ^    U R                  S5      nU R                  UR                  S5        g )Nr     Truerc  r   s     r9   test_get_current_user_works.GetCurrentUserTest.test_get_current_user_worksM  s$    ::l+0r;   c                 ^    U R                  S5      nU R                  UR                  S5        g )Nr  r  rc  r   s     r9   ,test_get_current_user_from_ui_module_is_lazy?GetCurrentUserTest.test_get_current_user_from_ui_module_is_lazyQ  s%    ::451r;   c                 ^    U R                  S5      nU R                  UR                  S5        g )Nr  r  rc  r   s     r9   *test_get_current_user_from_ui_module_works=GetCurrentUserTest.test_get_current_user_from_ui_module_worksU  s%    ::120r;   rL   )rO   rP   rQ   rR   rA   r  r@   r  skipr  r  r  r  rT   r  r  s   @r9   r  r    sD    
21)
V ]];2  2
121 1r;   r  c                   0    \ rS rSr " S S\5      rS rSrg)UnimplementedHTTPMethodsTestiZ  c                       \ rS rSrSrg)$UnimplementedHTTPMethodsTest.Handleri[  rL   Nr@  rL   r;   r9   r[   r  [  s    r;   r[   c                     S H/  nU R                  SUS9nU R                  UR                  S5        M1     S H0  nU R                  SUSS9nU R                  UR                  S5        M2     g )N)rk  rl  DELETEOPTIONSrY   r    r   PUTr;   r   r  )rD   r   r   s      r9   #test_unimplemented_standard_methods@UnimplementedHTTPMethodsTest.test_unimplemented_standard_methods^  sf    :Fzz#fz5HX]]C0 ; &Fzz#f3z?HX]]C0 &r;   rL   N)rO   rP   rQ   rR   r   r[   r  rT   rL   r;   r9   r  r  Z  s    . 1r;   r  c                   6    \ rS rSr " S S\5      rS rS rSrg)#UnimplementedNonStandardMethodsTestig  c                       \ rS rSrS rSrg)+UnimplementedNonStandardMethodsTest.Handlerih  c                 &    U R                  S5        g Notherrc   rC   s    r9   r  1UnimplementedNonStandardMethodsTest.Handler.otheri  s     JJwr;   rL   N)rO   rP   rQ   rR   r  rT   rL   r;   r9   r[   r  h  s    	 r;   r[   c                 ^    U R                  SSSS9nU R                  UR                  S5        g )NrY   PATCHr;   r   r  r  r   s     r9   test_unimplemented_patch<UnimplementedNonStandardMethodsTest.test_unimplemented_patchn  s,     ::c':<,r;   c                 ^    U R                  SSSS9nU R                  UR                  S5        g )NrY   OTHERTr   allow_nonstandard_methodsr  r  r   s     r9   test_unimplemented_other<UnimplementedNonStandardMethodsTest.test_unimplemented_othert  s*    ::c'T:R,r;   rL   N)	rO   rP   rQ   rR   r   r[   r  r  rT   rL   r;   r9   r	  r	  g  s     .  --r;   r	  c                   0    \ rS rSr " S S\5      rS rSrg)AllHTTPMethodsTestiy  c                   .    \ rS rSrS r\=r=r=r=rr	Sr
g)AllHTTPMethodsTest.Handleriz  c                     U R                   R                  c   eU R                  U R                   R                  5        g r2   )r  r   rd   rC   s    r9   r   !AllHTTPMethodsTest.Handler.method{  s.    <<&&222JJt||**+r;   rL   N)rO   rP   rQ   rR   r   re   deleteoptionsr   putrT   rL   r;   r9   r[   r  z  s"    	, /544f4w4r;   r[   c                 V   U R                  SSS9nU R                  UR                  S5        S H8  nU R                  SUS9nU R                  UR                  [        U5      5        M:     S H9  nU R                  SUSS9nU R                  UR                  [        U5      5        M;     g )NrY   rk  r  r;   )rl  r  r  r  r   )r   r   r   r   )rD   r   r   s      r9   test_standard_methods(AllHTTPMethodsTest.test_standard_methods  s    ::c&:1,2Fzz#fz5HX]]DL9 3 &Fzz#f3z?HX]]DL9 &r;   rL   N)rO   rP   rQ   rR   r   r[   r$  rT   rL   r;   r9   r  r  y  s    5. 5:r;   r  c                   6    \ rS rSr " S S\5      rS rS rSrg)PatchMethodTesti  c                   >    \ rS rSr\R
                  S-   rS rS rSrg)PatchMethodTest.Handleri  )r  c                 &    U R                  S5        g )Npatchrc   rC   s    r9   r+  PatchMethodTest.Handler.patch  r  r;   c                 &    U R                  S5        g r  rc   rC   s    r9   r  PatchMethodTest.Handler.other  r  r;   rL   N)	rO   rP   rQ   rR   r   SUPPORTED_METHODSr+  r  rT   rL   r;   r9   r[   r)    s#    *<< @
 
	 	 r;   r[   c                 ^    U R                  SSSS9nU R                  UR                  S5        g )NrY   r  r;   r   s   patchrc  r   s     r9   
test_patchPatchMethodTest.test_patch  s*    ::c':<1r;   c                 ^    U R                  SSSS9nU R                  UR                  S5        g )NrY   r  Tr  s   otherrc  r   s     r9   
test_otherPatchMethodTest.test_other  s*    ::c'T:R1r;   rL   N)	rO   rP   rQ   rR   r   r[   r1  r4  rT   rL   r;   r9   r'  r'    s    	 . 	 22r;   r'  c                   0    \ rS rSr " S S\5      rS rSrg)FinishInPrepareTesti  c                        \ rS rSrS rS rSrg)FinishInPrepareTest.Handleri  c                 &    U R                  S5        g )Nr   r%  rC   s    r9   r  #FinishInPrepareTest.Handler.prepare  s    KKr;   c                     [        S5      e)Nzshould not reach this methodr  rC   s    r9   re   FinishInPrepareTest.Handler.get  s     :;;r;   rL   Nr'  rL   r;   r9   r[   r9    s    	 	<r;   r[   c                 ^    U R                  S5      nU R                  UR                  S5        g )NrY   s   donerc  r   s     r9   test_finish_in_prepare*FinishInPrepareTest.test_finish_in_prepare  s#    ::c?0r;   rL   N)rO   rP   rQ   rR   r   r[   r?  rT   rL   r;   r9   r7  r7    s    <. <1r;   r7  c                        \ rS rSrS rS rSrg)Default404Testi  c                     S[         4/$ Nr  r   rC   s    r9   r@   Default404Test.get_handlers  s    ())r;   c                     U R                  S5      nU R                  UR                  S5        U R                  UR                  S5        g )NrY   r  sE   <html><title>404: Not Found</title><body>404: Not Found</body></html>r  r   s     r9   test_404Default404Test.test_404  s=    ::c?,MM2	
r;   rL   N)rO   rP   rQ   rR   r@   rG  rT   rL   r;   r9   rB  rB    s    *
r;   rB  c                   &    \ rS rSrS rS rS rSrg)Custom404Testi  c                     S[         4/$ rD  r   rC   s    r9   r@   Custom404Test.get_handlers      ())r;   c                 2     " S S[         5      n[        US9$ )Nc                       \ rS rSrS rSrg)6Custom404Test.get_app_kwargs.<locals>.Custom404Handleri  c                 H    U R                  S5        U R                  S5        g )Nr  zcustom 404 response)r  rd   rC   s    r9   re   :Custom404Test.get_app_kwargs.<locals>.Custom404Handler.get  s    $

01r;   rL   Nrg   rL   r;   r9   Custom404HandlerrP    s    2r;   rS  )default_handler_class)r   rq   )rD   rS  s     r9   rA   Custom404Test.get_app_kwargs  s    	2~ 	2
 *:;;r;   c                     U R                  S5      nU R                  UR                  S5        U R                  UR                  S5        g )NrY   r  s   custom 404 responser  r   s     r9   rG  Custom404Test.test_404  s8    ::c?,(>?r;   rL   N)rO   rP   rQ   rR   r@   rA   rG  rT   rL   r;   r9   rJ  rJ    s    *<@r;   rJ  c                   &    \ rS rSrS rS rS rSrg)DefaultHandlerArgumentsTesti  c                     S[         4/$ rD  r   rC   s    r9   r@   (DefaultHandlerArgumentsTest.get_handlers  rM  r;   c                 ,    [        [        [        SS9S9$ )Nr  r  )rT  default_handler_args)rq   r#   rC   s    r9   rA   *DefaultHandlerArgumentsTest.get_app_kwargs  s    ".!%#!6
 	
r;   c                 ^    U R                  S5      nU R                  UR                  S5        g )NrY   r  r  r   s     r9   test_403$DefaultHandlerArgumentsTest.test_403  s#    ::c?,r;   rL   N)rO   rP   rQ   rR   r@   rA   r`  rT   rL   r;   r9   rY  rY    s    *
-r;   rY  c                        \ rS rSrS rS rSrg)HandlerByNameTesti  c                 ,    S[         4S[        SS5      /$ )N/hello1)/hello2"tornado.test.web_test.HelloHandler/hello3rg  )r^   r%   rC   s    r9   r@   HandlerByNameTest.get_handlers  s$     %=	?@
 	
r;   c                    U R                  S5      nU R                  UR                  S5        U R                  S5      nU R                  UR                  S5        U R                  S5      nU R                  UR                  S5        g )Nre  r  rf  rh  rc  rD   resps     r9   test_handler_by_name&HandlerByNameTest.test_handler_by_name  sh    zz)$H-zz)$H-zz)$H-r;   rL   N)rO   rP   rQ   rR   r@   rm  rT   rL   r;   r9   rc  rc    s    
.r;   rc  c                   `    \ rS rSrS rS r\S 5       r\S 5       r\S 5       r	\S 5       r
Srg	)
StreamingRequestBodyTesti  c                     [          " S S[        5      5       n[          " S S[        5      5       n[          " S S[        5      5       nSU[        U S94S	U4S
U[        U S94/$ )Nc                   ,    \ rS rSrS rS rS rS rSrg)CStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandleri  c                     Xl         g r2   r   r   s     r9   r  NStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.initialize       	r;   c                 N    U R                   R                  R                  S 5        g r2   )r   prepared
set_resultrC   s    r9   r  KStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.prepare  s    		""--d3r;   c                 N    U R                   R                  R                  U5        g r2   )r   ro  ry  rD   ro  s     r9   data_receivedQStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.data_received  s    		))$/r;   c                 p    U R                   R                  R                  S 5        U R                  0 5        g r2   )r   finishedry  rd   rC   s    r9   re   GStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.get 	  s%    		""--d3

2r;   r   N)	rO   rP   rQ   rR   r  r  r}  re   rT   rL   r;   r9   StreamingBodyHandlerrs    s    !40r;   r  c                       \ rS rSrS rSrg)AStreamingRequestBodyTest.get_handlers.<locals>.EarlyReturnHandleri	  c                     [        S5      e)N  r  rC   s    r9   r  IStreamingRequestBodyTest.get_handlers.<locals>.EarlyReturnHandler.prepare	  s      n$r;   rL   Nrn  rL   r;   r9   EarlyReturnHandlerr  	  s    %r;   r  c                   .   ^  \ rS rSrS rU 4S jrSrU =r$ )DStreamingRequestBodyTest.get_handlers.<locals>.CloseDetectionHandleri	  c                     Xl         g r2   r   r   s     r9   r  OStreamingRequestBodyTest.get_handlers.<locals>.CloseDetectionHandler.initialize	  rv  r;   c                 l   > [         TU ]  5         U R                  R                  R	                  S 5        g r2   )r  r  r   close_futurery  r  s    r9   r  XStreamingRequestBodyTest.get_handlers.<locals>.CloseDetectionHandler.on_connection_close	  s&    +-		&&11$7r;   r   )rO   rP   rQ   rR   r  r  rT   r  r  s   @r9   CloseDetectionHandlerr  	  s    !8 8r;   r  z/stream_bodyr   z/early_returnz/close_detection)r,   r   rq   )rD   r  r  r  s       r9   r@   %StreamingRequestBodyTest.get_handlers  s    		> 	 
	 
	% 	% 
	% 
	8N 	8 
	8 14T?C01!6$H
 	
r;   c                 F   [         R                   " [         R                  [         R                  S5      nUR                  SU R	                  5       45        [        U5      nUR                  SU-   S-   5        U(       a  UR                  S5        UR                  S5        U$ )Nr   r  s   GET s    HTTP/1.1
s   Connection: close
s   Transfer-Encoding: chunked

)r  r  r  r  r  r   rd   )rD   r%   connection_closer  r  s        r9   r   StreamingRequestBodyTest.connect	  sy    MM&..&*<*<a@			; 2 2 456!Ws]%556LL12:;r;   c              #   F  #    [        5       U l        [        5       U l        [        5       U l        U R	                  SSS9nU R                  v   UR                  S5        U R                  v nU R                  US5        [        5       U l        UR                  S5        U R                  v nU R                  US5        UR                  S5        U R                  v   UR                  5       v nU R                  UR                  S	5      5        UR                  5         g 7f)
Ns   /stream_bodyTr  	   4
asdf
s   asdfs	   4
qwer
s   qwers   0

s   {})r   rx  ro  r  r  rd   r   read_until_closer   r  r  rD   r  ro  s      r9   test_streaming_body,StreamingRequestBodyTest.test_streaming_body%	  s     H	oEmm%&YYw'H	%&YYw'\"mm,,..e,-s   DD!c              #      #    U R                  SSS9nUR                  5       v nU R                  UR                  S5      5        g 7f)N   /early_returnFr     HTTP/1.1 401)r  r  r   rp  r  s      r9   test_early_return*StreamingRequestBodyTest.test_early_return<	  s>     .G,,..89s   AAc              #      #    U R                  SSS9nUR                  S5        UR                  5       v nU R                  UR	                  S5      5        g 7f)Nr  Fr  r  r  )r  rd   r  r   rp  r  s      r9   test_early_return_with_data4StreamingRequestBodyTest.test_early_return_with_dataB	  sK     .G%&,,..89s   AAc              #      #    [        5       U l        U R                  SSS9nUR                  5         U R                  v   g 7f)Ns   /close_detectionFr  )r   r  r  r  )rD   r  s     r9   test_close_during_upload1StreamingRequestBodyTest.test_close_during_uploadI	  s7     "H1EJs   ?A)r  ro  r  rx  N)rO   rP   rQ   rR   r@   r  r   r  r  r  r  rT   rL   r;   r9   rp  rp    s]    $
L	  , : :
 : :    r;   rp  c                       \ rS rSrS r\R                  S 5       r\R                  S 5       r
\R                  S 5       rSrg)BaseFlowControlHandleriU	  c                 ,    Xl         S U l        / U l        g r2   )r   r   methodsr   s     r9   r  !BaseFlowControlHandler.initializeW	  s    	r;   c              #      #    U R                   b-  U R                  R                  SU< SU R                   < 35        Xl         U R                  R	                  U5         S v   S U l         g ! S U l         f = f7f)Nzentered method z
 while in )r   r   failr  appendrl  s     r9   	in_method BaseFlowControlHandler.in_method\	  sU     ;;"IINNfdkkRSF#	DK$DKs   AA7A+ #A7+	A44A7c              #   f   #    U R                   R                  S5        [        R                  v   g 7f)Nr  )r  r  r   momentrC   s    r9   r  BaseFlowControlHandler.prepareg	  s#      	I&jjs   /1c              #      #    U R                  S5         [        R                  v   S S S 5        U R                  [	        U R
                  S95        g ! , (       d  f       N1= f7f)Nr   r  )r  r   r  rd   rq   r  rC   s    r9   r   BaseFlowControlHandler.postn	  s=     ^^F#** $

4-. $#s   A#A+A#
A A#)r   r  r   N)rO   rP   rQ   rR   r  
contextlibcontextmanagerr  r   r   r  r   rT   rL   r;   r9   r  r  U	  sQ    
   	]]  	]]/ /r;   r  c                       \ rS rSrS rS rS\R                  4S jrS\R                  4S jr	S\R                  4S jr
Srg	)
#BaseStreamingRequestFlowControlTestiu	  c                     [        SSS9$ )Nr5  T)
chunk_sizedecompress_requestr   rC   s    r9   get_httpserver_options:BaseStreamingRequestFlowControlTest.get_httpserver_optionsv	  s     rd;;r;   c                     [        5       $ r2   r   rC   s    r9   r
  3BaseStreamingRequestFlowControlTest.get_http_client{	  r  r;   rD   c                     U R                  SSSS9nUR                  5         U R                  [        UR                  5      [        / SQS95        g )NrY   abcdefghijklmnopqrstuvwxyzr   )r   r   r  r}  r}  r}  r   r  )r   r  r   r   r   rq   r   s     r9   test_flow_control_fixed_body@BaseStreamingRequestFlowControlTest.test_flow_control_fixed_body	  sJ    ::c(DV:T&	
r;   c                    ^ / SQm[         R                  U4S j5       nU R                  SUSS9nUR                  5         U R	                  [        UR                  5      [        / SQS95        g )N)s   abcds   efghs   ijklc              3   4   >#    T H  nU " U5      v   M     g 7fr2   rL   )rd   ichunkss     r9   body_producerYBaseStreamingRequestFlowControlTest.test_flow_control_chunked_body.<locals>.body_producer	  s     Ah s   rY   r   )r  r   r  r  )r   r   r   r  r   r   r   rq   )rD   r  r   r  s      @r9   test_flow_control_chunked_bodyBBaseStreamingRequestFlowControlTest.test_flow_control_chunked_body	  sg    ,		 
	 ::cv:N&	
r;   c                 H   [        5       n[        R                  " SUS9nUR                  S5        UR	                  5         UR                  5       nU R                  SUSSS0S9nUR                  5         U R                  [        UR                  5      [        / S	QS
95        g )Nw)modefileobjs   abcdefghijklmnopqrstuvwxyzrY   r   r  r  )r   r   rZ  r  r  )r0   r  GzipFilerd   r  getvaluer   r  r   r   r   rq   )rD   bytesio	gzip_filecompressed_bodyr   s        r9   !test_flow_control_compressed_bodyEBaseStreamingRequestFlowControlTest.test_flow_control_compressed_body	  s    )MMsG<	56!**,:: '0	  
 	&	
r;   rL   N)rO   rP   rQ   rR   r  r
  r~  Anyr  r  r  rT   rL   r;   r9   r  r  u	  s<    <
'

6:: 
 
VZZ 
.


 
r;   r  c                       \ rS rSrS rSrg)(DecoratedStreamingRequestFlowControlTesti	  c                 :     " S S[         5      nSU[        U S94/$ )Nc                   8    \ rS rSr\R
                  S 5       rSrg)ZDecoratedStreamingRequestFlowControlTest.get_handlers.<locals>.DecoratedFlowControlHandleri	  c              3      #    U R                  S5         [        R                  v   S S S 5        g ! , (       d  f       g = f7f)Nr}  )r  r   r  r|  s     r9   r}  hDecoratedStreamingRequestFlowControlTest.get_handlers.<locals>.DecoratedFlowControlHandler.data_received	  s&     ^^O4**$ 544s   A0	A
>ArL   N)rO   rP   rQ   rR   r   r   r}  rT   rL   r;   r9   DecoratedFlowControlHandlerr  	  s    ]]% %r;   r  rY   r   r  rq   )rD   r  s     r9   r@   5DecoratedStreamingRequestFlowControlTest.get_handlers	  s&    	%*@ 	% 14T?CDDr;   rL   NrO   rP   rQ   rR   r@   rT   rL   r;   r9   r  r  	  s    Er;   r  c                       \ rS rSrS rSrg)%NativeStreamingRequestFlowControlTesti	  c                 :     " S S[         5      nSU[        U S94/$ )Nc                       \ rS rSrS rSrg)TNativeStreamingRequestFlowControlTest.get_handlers.<locals>.NativeFlowControlHandleri	  c                    #    U R                  S5         SS KnUR                  S5      I S h  vN   S S S 5        g  N! , (       d  f       g = f7f)Nr}  r   )r  asyncior  )rD   ro  r  s      r9   r}  bNativeStreamingRequestFlowControlTest.get_handlers.<locals>.NativeFlowControlHandler.data_received	  s;     ^^O4"!--*** 54 + 54s%   A=;=	A=
AArL   N)rO   rP   rQ   rR   r}  rT   rL   r;   r9   NativeFlowControlHandlerr  	  s    +r;   r  rY   r   r  )rD   r  s     r9   r@   2NativeStreamingRequestFlowControlTest.get_handlers	  s&    	+'= 	+ .$@AAr;   rL   Nr  rL   r;   r9   r  r  	  s    Br;   r  c                   &    \ rS rSrS rS rS rSrg)IncorrectContentLengthTesti	  c                 n   ^ U mS U l          " U4S jS[        5      n " U4S jS[        5      nSU4SU4/$ )Nc                   "   > \ rS rSrU 4S jrSrg)8IncorrectContentLengthTest.get_handlers.<locals>.TooHighi	  c                    > U R                  SS5         U R                  S5        g ! [         a  nUTl        e S nAff = f)Nr|  rH  r7  rP  r   r  server_errorrD   r-  r   s     r9   re   <IncorrectContentLengthTest.get_handlers.<locals>.TooHigh.get	  s>     0$7KK%  ()D%   ' 
>9>rL   Nrg   r   s   r9   TooHighr  	       r;   r  c                   "   > \ rS rSrU 4S jrSrg)7IncorrectContentLengthTest.get_handlers.<locals>.TooLowi	  c                    > U R                  SS5         U R                  S5        g ! [         a  nUTl        e S nAff = f)Nr|  r  rb   r  r  s     r9   re   ;IncorrectContentLengthTest.get_handlers.<locals>.TooLow.get	  s>     0#6KK(  ()D%r  rL   Nrg   r   s   r9   TooLowr  	  r  r;   r  /high/low)r  r   )rD   r  r  r   s      @r9   r@   'IncorrectContentLengthTest.get_handlers	  s?     	n 		^ 	 '"VV$455r;   c                 t   [        [        S5         [        [        S5         U R                  [        5         U R                  SSS9  S S S 5        S S S 5        S S S 5        U R                  [        U R                  5      S5        g ! , (       d  f       ND= f! , (       d  f       NM= f! , (       d  f       NV= f)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  rC   s    r9   test_content_length_too_high7IncorrectContentLengthTest.test_content_length_too_high	  s     w LM5
 &&7JJwDJ9 8 N 	!!"$V	
 87  NM9   B)BB	BB)
BB
B&	"B))
B7c                 t   [        [        S5         [        [        S5         U R                  [        5         U R                  SSS9  S S S 5        S S S 5        S S S 5        U R                  [        U R                  5      S5        g ! , (       d  f       ND= f! , (       d  f       NM= f! , (       d  f       NV= f)Nr  r  r  Tr  z,Tried to write more data than Content-Lengthr
  rC   s    r9   test_content_length_too_low6IncorrectContentLengthTest.test_content_length_too_low
  s     w LM5
 &&7JJv4J8 8 N 	!!"$R	
 87  NMr  )r  N)rO   rP   rQ   rR   r@   r  r  rT   rL   r;   r9   r  r  	  s    62
 
r;   r  c                   0    \ rS rSr " S S\5      rS rSrg)ClientCloseTesti
  c                       \ rS rSrS rSrg)ClientCloseTest.Handleri
  c                     U R                   R                  R                  S5      (       a@  U R                   R                  R                  R                  5         U R                  S5        g U R                  S5        g )NzHTTP/1rb   requires HTTP/1.x)r  r   rp  
connectionr  r  rd   rC   s    r9   re   ClientCloseTest.Handler.get
  sV    ||##..x88 ''..446

7# 

./r;   rL   Nrg   rL   r;   r9   r[   r  
  s    	0r;   r[   c                    U R                  [        [        R                  45         U R	                  SSS9nUR
                  S:X  a  U R                  S5        U R                  UR                  S5        S S S 5        g ! , (       d  f       g = f)NrY   Tr  s   requires HTTP/1.xr  iW  )	r  r   r  SkipTestr   r   skipTestr   r   r   s     r9   test_client_close!ClientCloseTest.test_client_close'
  sh    1B1BCDzz#4z8H}} 4412X]]C0	 EDDs   AA==
BrL   N)rO   rP   rQ   rR   r   r[   r  rT   rL   r;   r9   r  r  
  s    0. 01r;   r  c                   l    \ rS rSrSrSSSS.rS rS rS	 rS
 r	S r
S rS rS rS rS rS rS rSrg)SignedValueTesti/
  zIt's a secret to everybody	asdfbasdf123123122342342)r   r   r   c                 (    U R                  5       S-
  $ )Ni 0* )presentrC   s    r9   pastSignedValueTest.past3
  s    ||~
**r;   c                     g)Ni m|MrL   rC   s    r9   r%  SignedValueTest.present6
  s    r;   c                 &   [        [        R                  SSSU R                  S9nU R	                  US5        [        [        R                  SSSU R                  S9nU R	                  US5        [        [        R                  SSU R                  S9nU R	                  X25        [        [        R                  SUSU R                  S	9nU R	                  US
5        [        [        R                  SUSU R                  S	9nU R	                  US
5        g )Nr  rz   r   )r   clocks<   dmFsdWU=|1300000000|31c934969f53e48164c50768b40cbd7e2daaaa4fr   se   2|1:0|10:1300000000|3:key|8:dmFsdWU=|3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e152r+  )r   r+     value)r'   r   SECRETr%  r   r(   )rD   	signed_v1	signed_v2signed_default
decoded_v1
decoded_v2s         r9   test_known_values!SignedValueTest.test_known_values9
  s   '""E7AT\\
	 	V	
 (""E7AT\\
	 	P	
 -""E7$,,
 	3(""E9!4<<

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

 	X.r;   c                 h   [        [        R                  SSU R                  S9n[        [        R                  SSU R                  S9n[	        [        R                  SXR                  S9nU R                  US 5        [	        [        R                  SX R                  S9nU R                  US 5        g )Nkey1rz   r,  key2)r'   r   r.  r%  r(   assertIs)rD   signed1signed2decoded1decoded2s        r9   test_name_swapSignedValueTest.test_name_swapY
  s    %""FG4<<
 &""FG4<<
 '""FG<<
 	h%&""FG<<
 	h%r;   c                     [        [        R                  SSU R                  S9n[	        [        R                  SXR                  S9nU R                  US5        [	        [        R                  SXR                  S9nU R                  US 5        g )Nr7  rz   r,  r-  )r'   r   r.  r&  r(   r   r%  r9  )rD   signeddecoded_pastdecoded_presents       r9   test_expiredSignedValueTest.test_expiredj
  sy    $""FG499
 +""FF))
 	x0-""FF,,
 	ot,r;   c                    ^ ^ SmU U4S jnT R                  U" S5      5        T R                  U" S5      5        T R                  U" S5      5        T R                  U" S5      5        g )N@3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e152c                 X   > S[        [        R                  SU T-   TR                  S9:H  $ Nr-  r  r,  r(   r   r.  r%  )prefixrD   r   s    r9   validate8SignedValueTest.test_payload_tampering.<locals>.validate{
  /    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)rD   rL  r   s   ` @r9   test_payload_tampering&SignedValueTest.test_payload_tamperingw
  s]    P	
 	!HIJ"IJK"HIJ"JKLr;   c                 .  ^ ^ SmUU 4S jnT R                  U" S5      5        T R                  U" S5      5        T R                  U" S5      5        T R                  U" S5      5        T R                  U" S5      5        T R                  U" S5      5        g )	NrO  c                 X   > S[        [        R                  STU -   TR                  S9:H  $ rI  rJ  )r   rK  rD   s    r9   rL  :SignedValueTest.test_signature_tampering.<locals>.validate
  rN  r;   rG   00000000000000000000000000000000@4d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e152@3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e153?3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e15A3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e1538rP  )rD   rL  rK  s   ` @r9   test_signature_tampering(SignedValueTest.test_signature_tampering
  s    8	
 	WX	
 	(+,WX	
 	WX	
 	VW	
 	S	
r;   c                     Sn[        [        R                  SXR                  S9n[	        [        R                  SX R                  S9nU R                  X5        g )Nr   r  r,  )r'   r   r.  r%  r(   r   rD   rz   rA  decodeds       r9   test_non_asciiSignedValueTest.test_non_ascii
  sO    $""E5
 &""E6
 	(r;   c                     Sn[        [        R                  SXR                  SS9n[	        [        R                  SX R                  S9nU R                  X5        g Nr   r  r   r+  ro   r,  r'   r   SECRET_DICTr%  r(   r   r_  s       r9   *test_key_versioning_read_write_default_key:SignedValueTest.test_key_versioning_read_write_default_key
  R    $''\\WX
 &''ll
 	(r;   c                     Sn[        [        R                  SXR                  SS9n[	        [        R                  SX R                  S9nU R                  X5        g )Nr   r  r   re  r,  rf  r_  s       r9   .test_key_versioning_read_write_non_default_key>SignedValueTest.test_key_versioning_read_write_non_default_key
  rj  r;   c                     Sn[        [        R                  SXR                  SS9n[        R                  R	                  5       nUR                  S5        [        USX R                  S9nU R                  S U5        g rd  )r'   r   rg  r%  r   r   r(   r   )rD   rz   rA  newkeysr`  s        r9   test_key_versioning_invalid_key/SignedValueTest.test_key_versioning_invalid_key
  sh    $''\\WX
 "--224A%gufLLQw'r;   c                     Sn[        [        R                  SXR                  SS9n[	        U5      nU R                  SU5        g )Nr   r  r   re  )r'   r   rg  r%  r)   r   )rD   rz   rA  ro   s       r9   test_key_version_retrieval*SignedValueTest.test_key_version_retrieval
  sA    $''\\WX
 07K(r;   rL   N)rO   rP   rQ   rR   r.  rg  r&  r%  r4  r>  rD  rR  r\  ra  rh  rl  rp  rs  rT   rL   r;   r9   r   r   /
  sR    )F!jY?K+/@&"-M"
@)))()r;   r   c                      ^  \ rS rSr " S S\5      rS rU 4S jrSS jrSS jr	S r
S	 rS
 rS rS rS rS rS rS rS rS rS rS rS rSrU =r$ )XSRFTesti
  c                        \ rS rSrS rS rSrg)XSRFTest.Handleri
  c                     [        U R                  SS5      5      nXR                  S'   U R                  U R                  5        g )Nr   r  xsrf_cookie_version)r  r  rm   rd   r  )rD   r   s     r9   re   XSRFTest.Handler.get
  s8    $++Is;<G 4;MM/0JJt'r;   c                 &    U R                  S5        g r6  rc   rC   s    r9   r   XSRFTest.Handler.post
      JJtr;   rL   NrO   rP   rQ   rR   re   r   rT   rL   r;   r9   r[   rx  
  s    	(	r;   r[   c                     [        SS9$ r  r   rC   s    r9   rA   XSRFTest.get_app_kwargs
  r  r;   c                 L   > [         TU ]  5         U R                  5       U l        g r2   r  setUp	get_tokenr  r  s    r9   r  XSRFTest.setUp
      ..*r;   c                     Ub  U R                  U5      nOS nU R                  Uc  SOSU-  US9nUR                  5         [        UR                  5      $ )NrY   z/?version=%dra  cookie_headersr   r  r	   r   )rD   	old_tokenr   rZ  r   s        r9   r  XSRFTest.get_token
  s]     )))4GG::?C')AG  
 	(--((r;   c                 .    Uc  U R                   nSSU-   0$ )Nr_  z_xsrf=r  rD   tokens     r9   r  XSRFTest.cookie_headers
  s     =OOE(U*++r;   c                     [        [        S5         U R                  SSSS9nS S S 5        U R                  WR                  S5        g ! , (       d  f       N+= fN.*'_xsrf' argument missingrY   r   r;   r   r  r  r   s     r9   test_xsrf_fail_no_token XSRFTest.test_xsrf_fail_no_token
  C    w <=zz#f3z?H >, >=   A
Ac                    [        [        S5         U R                  SS[        R                  R                  [        U R                  S95      S9nS S S 5        U R                  WR                  S5        g ! , (       d  f       N+= fN!.*XSRF cookie does not match POSTrY   r   _xsrfr   r  
r   r   r   r  r  r  rq   r  r   r   r   s     r9   test_xsrf_fail_body_no_cookie&XSRFTest.test_xsrf_fail_body_no_cookie  g    w CDzz\\++Dt,GH " H E 	, ED   A A66
Bc                    [        [        S5         U R                  SSU R                  5       [        R
                  R                  [        SS95      S9nS S S 5        U R                  WR                  S5        g ! , (       d  f       N+= f)Nz%.*'_xsrf' argument has invalid formatrY   r   3|r  r  r  )
r   r   r   r  r  r  r  rq   r   r   r   s     r9   &test_xsrf_fail_argument_invalid_format/XSRFTest.test_xsrf_fail_argument_invalid_format
  so    w GHzz++-\\++Dt,<=	 " H I 	, IHs   AA;;
B	c                 *   [        [        S5         U R                  SSU R                  SS9[        R
                  R                  [        U R                  S95      S9nS S S 5        U R                  WR                  S5        g ! , (       d  f       N+= f)	Nr  rY   r   r  r  r  r  r  )r   r   r   r  r  r  r  rq   r  r   r   r   s     r9   $test_xsrf_fail_cookie_invalid_format-XSRFTest.test_xsrf_fail_cookie_invalid_format  sx    w CDzz++$+7\\++Dt,GH	 " H E 	, EDs   AB
Bc                     [        [        S5         U R                  SSSU R                  5       S9nS S S 5        U R	                  WR
                  S5        g ! , (       d  f       N+= f)Nr  rY   r   r;   r   r   rZ  r  )r   r   r   r  r   r   r   s     r9   test_xsrf_fail_cookie_no_body&XSRFTest.test_xsrf_fail_cookie_no_body  sV    w <=zzFd6I6I6K " H > 	,	 >=s   !A
A%c           
          U R                  SS[        R                  R                  [	        SS95      U R                  SS9S9nU R                  UR                  S5        g )NrY   r   deadbeefr  r  r  r   r   r  r  r  rq   r  r   r   r   s     r9   test_xsrf_success_short_token&XSRFTest.test_xsrf_success_short_token%  sY    ::'':(>?''j'9	  
 	,r;   c           
          U R                  SS[        R                  R                  [	        SS95      U R                  SS9S9nU R                  UR                  S5        g )NrY   r   xoxor  r  r  r   r  r   s     r9   test_xsrf_success_non_hex_token(XSRFTest.test_xsrf_success_non_hex_token.  sY    ::''6(:;''f'5	  
 	,r;   c           
          U R                  SS[        R                  R                  [	        U R
                  S95      U R                  5       S9nU R                  UR                  S5        g NrY   r   r  r  r   	r   r  r  r  rq   r  r  r   r   r   s     r9   test_xsrf_success_post_body$XSRFTest.test_xsrf_success_post_body7  sX    ::''4??(CD'')	  
 	,r;   c           	          U R                  S[        R                  R                  [	        U R
                  S95      -   SSU R                  5       S9nU R                  UR                  S5        g )Nz/?r  r   r;   r  r   r  r   s     r9   test_xsrf_success_query_string'XSRFTest.test_xsrf_success_query_string@  s]    ::6<<))$T__*EFF'')	  
 	,r;   c                     U R                  SSS[        SU R                  040 U R                  5       D6S9nU R	                  UR
                  S5        g )NrY   r   r;   zX-Xsrftokenr  r   )r   rq   r  r  r   r   r   s     r9   test_xsrf_success_header!XSRFTest.test_xsrf_success_headerI  sY    ::0%%'	  
 	,r;   c                     Sn[        5       n[        U5       H"  nUR                  U R                  5       5        M$     U R	                  [        U5      U5        g )Nr5  )r  rangerq  r  r   rl  )rD   
NUM_TOKENStokensr  s       r9   test_distinct_tokensXSRFTest.test_distinct_tokensU  sD    
z"AJJt~~'( #Vj1r;   c                 n   U R                  5       nU R                  U4 Hd  nU R                  SS[        R                  R                  [        US95      U R                  U5      S9nU R                  UR                  S5        Mf     U R                  U4XR                  44 H  u  pE[        [        S5         U R                  SS[        R                  R                  [        US95      U R                  U5      S9nS S S 5        U R                  WR                  S5        M     g ! , (       d  f       N/= f)NrY   r   r  r  r   r  r  )r  r  r   r  r  r  rq   r  r   r   r   r   )rD   token2r  r   cookie_token
body_tokens         r9   test_cross_userXSRFTest.test_cross_user]  s   !oov.Ezz\\++Du,=>++E2	 " H X]]C0 / __f%__%)
$L 7$GH::!//:0FG //=	 &  I X]]C0)
 IHs   7AD&&
D4	c                    U R                   n[        U/5      n[        S5       H  nU R                  U5      nUR	                  U5        U R                  SS[        R                  R                  [        U R                   S95      U R                  U5      S9nU R                  UR                  S5        M     U R                  [        U5      S5        g )N   rY   r   r  r  r      )r  r  r  r  rq  r   r  r  r  rq   r  r   r   rl  )rD   r  tokens_seenr  r   s        r9   test_refresh_tokenXSRFTest.test_refresh_tokenv  s    5'l
 qANN5)EOOE"zz\\++Dt,GH++E2	 " H X]]C0  	[)1-r;   c                 B   U R                  U R                  SS9U R                  SS95        U R                  SS9n[        S5       H#  nU R                  U R                  USS9U5        M%     U R                  U5      nU R                  X5        U R                  X0R                  U5      5        X4X144 Hf  u  pEU R	                  SS[
        R                  R                  [        US95      U R                  U5      S9nU R                  UR                  S5        Mh     g )	Nr   r   r  rY   r   r  r  r   )assertNotEqualr  r  r   r   r  r  r  rq   r  r   )rD   v1_tokenr  v2_tokenr  r  r   s          r9   test_versioningXSRFTest.test_versioning  s	   DNN1N5t~~a~7PQ >>!>,qAT^^Ha^@(K  >>(+H/HnnX&>? +3)=?S(T$Lzz\\++Dz,BC++L9	 " H X]]C0 )Ur;   r  rJ  r2   )rO   rP   rQ   rR   r   r[   rA   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rT   r  r  s   @r9   rv  rv  
  sn    	. 	'+	),
-
--------
-212.(1 1r;   rv  c                   j   ^  \ rS rSr " S S\5      rS rU 4S jrSS jrSS jr	S r
S	 rS
 rSrU =r$ )XSRFCookieNameTesti  c                        \ rS rSrS rS rSrg)XSRFCookieNameTest.Handleri  c                 :    U R                  U R                  5        g r2   rd   r  rC   s    r9   re   XSRFCookieNameTest.Handler.get      JJt'r;   c                 &    U R                  S5        g r6  rc   rC   s    r9   r   XSRFCookieNameTest.Handler.post  r~  r;   rL   Nr  rL   r;   r9   r[   r    s    	(	r;   r[   c                     [        SSSS0S9$ )NTz__Host-xsrfrB  )r  xsrf_cookie_namexsrf_cookie_kwargsr   rC   s    r9   rA   !XSRFCookieNameTest.get_app_kwargs  s    * ($/
 	
r;   c                 L   > [         TU ]  5         U R                  5       U l        g r2   r  r  s    r9   r  XSRFCookieNameTest.setUp  r  r;   c                     Ub  U R                  U5      nOS nU R                  SUS9nUR                  5         [        UR                  5      $ )NrY   ra  r  )rD   r  rZ  r   s       r9   r  XSRFCookieNameTest.get_token  sJ     )))4GG::c7:3(--((r;   c                 .    Uc  U R                   nSSU-   0$ )Nr_  z__Host-xsrf=r  r  s     r9   r  !XSRFCookieNameTest.cookie_headers  s     =OOE.5011r;   c                     [        [        S5         U R                  SSSS9nS S S 5        U R                  WR                  S5        g ! , (       d  f       N+= fr  r  r   s     r9   r  *XSRFCookieNameTest.test_xsrf_fail_no_token  r  r  c                    [        [        S5         U R                  SS[        R                  R                  [        U R                  S95      S9nS S S 5        U R                  WR                  S5        g ! , (       d  f       N+= fr  r  r   s     r9   r  0XSRFCookieNameTest.test_xsrf_fail_body_no_cookie  r  r  c           
          U R                  SS[        R                  R                  [	        U R
                  S95      U R                  5       S9nU R                  UR                  S5        g r  r  r   s     r9   r  .XSRFCookieNameTest.test_xsrf_success_post_body  sX    ::''4??(CD'')  
 	,r;   r  r2   )rO   rP   rQ   rR   r   r[   rA   r  r  r  r  r  r  rT   r  r  s   @r9   r  r    s7    . 
+)2
-
-- -r;   r  c                   6    \ rS rSr " S S\5      rS rS rSrg)XSRFCookieKwargsTesti  c                       \ rS rSrS rSrg)XSRFCookieKwargsTest.Handleri  c                 :    U R                  U R                  5        g r2   r  rC   s    r9   re    XSRFCookieKwargsTest.Handler.get  r  r;   rL   Nrg   rL   r;   r9   r[   r    s    	(r;   r[   c                 &    [        S[        SSS9S9$ )NTr   )rC  r{   )r  r  r   rC   s    r9   rA   #XSRFCookieKwargsTest.get_app_kwargs  s    $ST2U
 	
r;   c                    U R                  S5      nU R                  SUR                  S   R                  5       5        U R                  SUR                  S   R                  5       5        UR                  R	                  S5      nUc   e[
        R                  " SU5      nUc   e[        R                  R                  [        R                  R                  5      [        R                  " SS9-   n[        R                  R                  UR                  5       S   5      nUR                   c'  UR#                  [        R                  R                  S	9nU R%                  ['        XE-
  R)                  5       5      S
:  5        g )NrY   z	httponly;rX  zexpires=z.*; expires=(?P<expires>.+);.*r   r}  r  )tzinfor5  )r   rP  rZ  r  re   r   r   r  r  r  r  r  r  r  r  r  r  replacer   r  r  r  s         r9   test_xsrf_httponly'XSRFCookieKwargsTest.test_xsrf_httponly  s9   ::c?k8#3#3L#A#G#G#IJj("2"2<"@"F"F"HI!!%%l3!!!96B   ##''(9(9(=(=>ASASB
 
 ::5??;LY;WX  (+338;L;L;P;P3QNW5DDFG"LMr;   rL   N)	rO   rP   rQ   rR   r   r[   rA   r   rT   rL   r;   r9   r  r    s    (. (

Nr;   r  c                   0    \ rS rSr " S S\5      rS rSrg)FinishExceptionTesti  c                       \ rS rSrS rSrg)FinishExceptionTest.Handleri  c                     U R                  S5        U R                  SS5        U R                  SS5      (       a  [        S5      eU R	                  S5        [        5       e)Nr  WWW-AuthenticateBasic realm="something"finish_valuer  zauthentication required)r  rP  r  r+   rd   rC   s    r9   re   FinishExceptionTest.Handler.get  sQ    OOC OO.0IJ  44677

45hr;   rL   Nrg   rL   r;   r9   r[   r    s    	r;   r[   c                     S Hw  nU R                  U5      nU R                  UR                  S5        U R                  SUR                  R	                  S5      5        U R                  SUR
                  5        My     g )N)rY   z/?finish_value=1r  r  r  s   authentication required)r   r   r   rZ  re   r   )rD   ur   s      r9   test_finish_exception)FinishExceptionTest.test_finish_exception  si    *Azz!}HX]]C0)8+;+;+?+?@R+S 7G +r;   rL   N)rO   rP   rQ   rR   r   r[   r  rT   rL   r;   r9   r  r    s    . Hr;   r  c                   &    \ rS rSrS rS rS rSrg)DecoratorTesti  c                 N     " S S[         5      n " S S[         5      nSU4SU4/$ )Nc                   $    \ rS rSr\S 5       rSrg)6DecoratorTest.get_handlers.<locals>.RemoveSlashHandleri  c                     g r2   rL   rC   s    r9   re   :DecoratorTest.get_handlers.<locals>.RemoveSlashHandler.get      r;   rL   N)rO   rP   rQ   rR   r-   re   rT   rL   r;   r9   RemoveSlashHandlerr    s     r;   r  c                   $    \ rS rSr\S 5       rSrg)3DecoratorTest.get_handlers.<locals>.AddSlashHandleri  c                     g r2   rL   rC   s    r9   re   7DecoratorTest.get_handlers.<locals>.AddSlashHandler.get  r  r;   rL   N)rO   rP   rQ   rR   r.   re   rT   rL   r;   r9   AddSlashHandlerr    s     r;   r  /removeslash/	/addslashr   )rD   r  r  s      r9   r@   DecoratorTest.get_handlers  s2    	 	
	n 	
 !"45_7UVVr;   c                 0   U R                  SSS9nU R                  UR                  S5        U R                  UR                  S   S5        U R                  SSS9nU R                  UR                  S5        U R                  UR                  S   S5        g )	Nr  Fr  r  r  z/removeslashz/removeslash/?foo=barz/removeslash?foo=barr  r   s     r9   test_removeslashDecoratorTest.test_removeslash  s    ::o:F,))*5~F::5:N,))*57MNr;   c                 0   U R                  SSS9nU R                  UR                  S5        U R                  UR                  S   S5        U R                  SSS9nU R                  UR                  S5        U R                  UR                  S   S5        g )	Nr  Fr  r  r  z
/addslash/z/addslash?foo=barz/addslash/?foo=barr  r   s     r9   test_addslashDecoratorTest.test_addslash'  s    ::kE:B,))*5|D::1E:J,))*57KLr;   rL   N)rO   rP   rQ   rR   r@   r!  r$  rT   rL   r;   r9   r  r    s    WOMr;   r  c                   V    \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rS rS rSrg)	CacheTesti1  c                 *     " S S[         5      nSU4/$ )Nc                        \ rS rSrS rS rSrg)+CacheTest.get_handlers.<locals>.EtagHandleri3  c                 &    U R                  U5        g r2   rc   )rD   computed_etags     r9   re   /CacheTest.get_handlers.<locals>.EtagHandler.get4  s    

=)r;   c                      U R                   S   $ r  )_write_bufferrC   s    r9   compute_etag8CacheTest.get_handlers.<locals>.EtagHandler.compute_etag7  s    ))!,,r;   rL   N)rO   rP   rQ   rR   re   r0  rT   rL   r;   r9   EtagHandlerr*  3  s    *-r;   r2  z
/etag/(.*)r   )rD   r2  s     r9   r@   CacheTest.get_handlers2  s    	-. 	- {+,,r;   c                 0    SnSnU R                  XS5        g )N"xyzzy"*r{  
_test_etagrD   r,  etagss      r9   test_wildcard_etagCacheTest.test_wildcard_etag<  s    !c2r;   c                 0    SnSnU R                  XS5        g )Nr5  r{  r7  r9  s      r9   test_strong_etag_match CacheTest.test_strong_etag_matchA  s    !c2r;   c                 0    SnSnU R                  XS5        g )N"xyzzy1""xyzzy1", "xyzzy2"r{  r7  r9  s      r9   test_multiple_strong_etag_match)CacheTest.test_multiple_strong_etag_matchF  s    "$c2r;   c                 0    SnSnU R                  XS5        g )Nr5  rA  r   r7  r9  s      r9   test_strong_etag_not_match$CacheTest.test_strong_etag_not_matchK  s    !c2r;   c                 0    SnSnU R                  XS5        g )Nr5  rB  r   r7  r9  s      r9   #test_multiple_strong_etag_not_match-CacheTest.test_multiple_strong_etag_not_matchP  s    !$c2r;   c                 0    SnSnU R                  XS5        g )NrA  
W/"xyzzy1"r{  r7  r9  s      r9   test_weak_etag_matchCacheTest.test_weak_etag_matchU      "c2r;   c                 0    SnSnU R                  XS5        g )N"xyzzy2"W/"xyzzy1", W/"xyzzy2"r{  r7  r9  s      r9   test_multiple_weak_etag_match'CacheTest.test_multiple_weak_etag_matchZ      "(c2r;   c                 0    SnSnU R                  XS5        g )NrQ  rL  r   r7  r9  s      r9   test_weak_etag_not_match"CacheTest.test_weak_etag_not_match_  rO  r;   c                 0    SnSnU R                  XS5        g )Nz"xyzzy3"rR  r   r7  r9  s      r9   !test_multiple_weak_etag_not_match+CacheTest.test_multiple_weak_etag_not_matchd  rU  r;   c                 f    U R                  SU-   SU0S9nU R                  UR                  U5        g )Nz/etag/r  ra  r  )rD   r,  r:  r  r   s        r9   r8  CacheTest._test_etagi  s:    ::}$.F  
 	4r;   rL   N)rO   rP   rQ   rR   r@   r;  r>  rC  rF  rI  rM  rS  rW  rZ  r8  rT   rL   r;   r9   r'  r'  1  s9    -3
3
3
3
3
3
3
3
3
5r;   r'  c                   0    \ rS rSr " S S\5      rS rSrg)RequestSummaryTestip  c                       \ rS rSrS rSrg)RequestSummaryTest.Handleriq  c                 d    S U R                   l        U R                  U R                  5       5        g r2   )r  	remote_ipr   r  rC   s    r9   re   RequestSummaryTest.Handler.getr  s%     &*DLL"KK--/0r;   rL   Nrg   rL   r;   r9   r[   ra  q  s    	1r;   r[   c                 ^    U R                  S5      nU R                  UR                  S5        g )NrY   s   GET / (None)rc  rk  s     r9   test_missing_remote_ip)RequestSummaryTest.test_missing_remote_ipy  s#    zz#O4r;   rL   N)rO   rP   rQ   rR   r   r[   rf  rT   rL   r;   r9   r_  r_  p  s    1. 15r;   r_  c                       \ rS rSrS rSrg)HTTPErrorTesti~  c                     [        SSS9n[        R                  " U5      nU R                  X5        U R                  UR                  UR                  5        U R                  UR
                  UR
                  5        g )Nr  zGo awayr  )r!   r   assertIsNotr   r  r  )rD   r-  e2s      r9   	test_copyHTTPErrorTest.test_copy  sY    c),YYq\7299-r;   rL   N)rO   rP   rQ   rR   rm  rT   rL   r;   r9   ri  ri  ~  s    .r;   ri  c                       \ rS rSrS rSrg)ApplicationTesti  c                 Z    [        / 5      nUR                  SSS9nUR                  5         g )Nr   r  )address)r   listenr  )rD   rB   servers      r9   test_listenApplicationTest.test_listen  s&    "oA{3r;   rL   N)rO   rP   rQ   rR   ru  rT   rL   r;   r9   rp  rp    s    r;   rp  c                   &    \ rS rSrS rS rS rSrg)URLSpecReverseTesti  c                     U R                  S[        SS 5      R                  5       5        U R                  S[        SS 5      R                  5       5        g )Nz/favicon.icoz/favicon\.icoz^/favicon\.ico$r   r%   reverserC   s    r9   test_reverseURLSpecReverseTest.test_reverse  sD    -=t)D)L)L)NO-?)F)N)N)PQr;   c                     S/nU H9  n[        US 5      n UR                  5       nU R                  SU< SU< 35        M;     g ! [         a     MK  f = f)Nz^/api/v\d+/foo/(\w+)$z.did not get expected exception when reversing z
. result: )r%   r{  r  rc  )rD   pathsr4   url_specr?  s        r9   test_non_reversible&URLSpecReverseTest.test_non_reversible  s^    
 **D4H!))+		$(&2   s   )A
AAc                     U R                  S[        SS 5      R                  S5      5        U R                  S[        SS 5      R                  S5      5        g )Nz/api/v1/foo/barz^/api/v1/foo/(\w+)$r4  z/api.v1/foo/5/icon.pngz/api\.v1/foo/([0-9]+)/icon\.pngr  rz  rC   s    r9   test_reverse_arguments)URLSpecReverseTest.test_reverse_arguments  sQ    s#94@HHO	
 	$2D9AA!D	
r;   rL   N)rO   rP   rQ   rR   r|  r  r  rT   rL   r;   r9   rx  rx    s    R$
r;   rx  c                   2    \ rS rSrS rS rS rS rS rSr	g)	RedirectHandlerTesti  c                 B    S[         SS04S[         SS04S[         SS04/$ )N/srcr%   /dstz/src2z/dst2?foo=barz/(.*?)/(.*?)/(.*)z/{1}/{0}/{2})r  rC   s    r9   r@    RedirectHandlerTest.get_handlers  s;    '%9(5/*BC!#5~7NO
 	
r;   c                     U R                  SSS9nU R                  UR                  S5        U R                  UR                  S   S5        g )Nr  Fr  r  r  r  r  r   s     r9   test_basic_redirect'RedirectHandlerTest.test_basic_redirect  sC    ::fu:=,))*5v>r;   c                     U R                  SSS9nU R                  UR                  S5        U R                  UR                  S   S5        g )Nz/src?foo=barFr  r  r  z/dst?foo=barr  r   s     r9   test_redirect_with_argument/RedirectHandlerTest.test_redirect_with_argument  sC    ::nu:E,))*5~Fr;   c                     U R                  SSS9nU R                  UR                  S5        U R                  UR                  S   S5        g )Nz/src2?foo2=bar2Fr  r  r  z/dst2?foo=bar&foo2=bar2r  r   s     r9   %test_redirect_with_appending_argument9RedirectHandlerTest.test_redirect_with_appending_argument  sE    ::/%:H,))*57PQr;   c                     U R                  SSS9nU R                  UR                  S5        U R                  UR                  S   S5        g )Nz/a/b/cFr  r  r  z/b/a/cr  r   s     r9   test_redirect_pattern)RedirectHandlerTest.test_redirect_pattern  sC    ::h:?,))*5x@r;   rL   N)
rO   rP   rQ   rR   r@   r  r  r  r  rT   rL   r;   r9   r  r    s    
?
G
R
Ar;   r  c                   0    \ rS rSrSrS rS rS rS rSr	g)	AcceptLanguageTesti  z)Test evaluation of Accept-Language headerc                     [         R                  " [        R                  R	                  [        R                  R                  [        5      S5      S5         " S S[        5      nSU4/$ )Ngettext_translationstornado_testc                       \ rS rSrS rSrg)>AcceptLanguageTest.get_handlers.<locals>.AcceptLanguageHandleri  c                     U R                  SU R                  5       R                  R                  SS5      5        U R	                  S5        g )Nr  _-r;   )rP  get_browser_localer   r  r   rC   s    r9   re   BAcceptLanguageTest.get_handlers.<locals>.AcceptLanguageHandler.get  s>    &(?(?(A(F(F(N(NsTW(X C r;   rL   Nrg   rL   r;   r9   AcceptLanguageHandlerr    s    !r;   r  rY   )r   load_gettext_translationsr3   r4   r5   r6   r7   r   )rD   r  s     r9   r@   AcceptLanguageTest.get_handlers  sT    ((GGLL24JK	

	!N 	! '(
 	
r;   c                     U R                  SSS0S9nU R                  UR                  S   S5        U R                  SSS0S9nU R                  UR                  S   S5        g )NrY   r  zfr-FR;q=0.9ra  r  zfr-FRzfr-FR; q=0.9r   r   rZ  r   s     r9   test_accept_language'AcceptLanguageTest.test_accept_language  sj    ::c,=}+M:N))*<=wG::c,=~+N:O))*<=wGr;   c                 f    U R                  SSS0S9nU R                  UR                  S   S5        g )NrY   r  z	fr-FR;q=0ra  r  en-USr  r   s     r9   test_accept_language_ignore.AcceptLanguageTest.test_accept_language_ignore  s6    ::c,={+K:L))*<=wGr;   c                 f    U R                  SSS0S9nU R                  UR                  S   S5        g )NrY   r  z
fr-FR;q=-1ra  r  r  r  r   s     r9   test_accept_language_invalid/AcceptLanguageTest.test_accept_language_invalid  s6    ::c,=|+L:M))*<=wGr;   rL   N)
rO   rP   rQ   rR   rS   r@   r  r  r  rT   rL   r;   r9   r  r    s    3
"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    r  r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r   r  r   r  email.utilsr  r  ior0   rn  rm  r3   r   r  r~  r  urllib.parser  r:   r=   rV   r^   ri   TestCaser   r   r   r   r  r  r  r  r  r  r  r+  r:  rA  rG  rK  rZ  r`  rg  rp  rw  r  r  r#  r  r  r  r  r\  rx  r  r  r  r  r  r  r  r  r  r  r2  r  r?  rB  rb  rn  r  r  r  r  r	  r  r'  r7  rB  rJ  rY  rc  rp  r  objectr  r  r  r  r  r   rv  r  r  r  r  r'  r_  ri  rp  rx  r  r  rL   r;   r9   <module>r     s   %   / - %   ( ; ' Q Q 0 1     ,          	 	    7# $	%K 	%> 
$~ $,1S** 1Sj,E** ,E^.9k .9b\= \=~
 

{ 
8
(^ 
(+ 0
. 
6--+ --`)U~ )UXY~ Y*B^ B
1n 1
#. #
( (Hn H 	^ 	. .
. 
JOk JOZ/k /?1 ?1D_-[ _-DO O*"-K "-J;[ ;@C; @CF'0{ '0T0k 0D0[ 0&8+ 8
@) 
@F) F*5, 58
* 
C/ C,-; -&7
( 7
tHK H2
/ 
$	i 	,10 ,1^, +
0 +
\
0 
">1 >,Y1 Y1x
1#8 
1-*? -$:. :&2+ 2*1/ 1 
[ 
@K @$-+ -. .$[ { [ D /^ / />J
& J
Z
E'
EB'B8
!6 8
v1+ 1.g)h'' g)TH1$ H1X7-. 7-tN0 N8H/ H*MK MB<5 <5~5. 5.H%% .m 
** 
BA+ A:!H !Hr;   