
    g00                     2   d dl Z d dlZd dlmZmZmZmZmZmZm	Z	m
Z
mZmZ d dlmZ d dlmZmZmZmZmZ g di dfdi dfd	i d
fdi dfdi dfdi dfdi dfdi dfdi dfdi dfdi dfdi dfdi dfdi d fd!i d"fd#i d$fd%i d&fd'd(d)d*gid+fd,d(d*gid-fd.i d/fd0i d1fd2i d3fd4i d5fd6d(d)d7gid8fd9i d:fd;i d<fd=i d>fd=d?d@id=fdAd@d@dBdCfdDdEd@idFfdGi dHfdGd(dIgidJfdKdLdMidNfdOdLdP idQfdKdLdR idNfZ G dS dTe j,                        Zy)U    N)
utf8xhtml_escapexhtml_unescape
url_escapeurl_unescape
to_unicodejson_decodejson_encodesqueezerecursive_unicode)unicode_type)ListTupleUnionDictAnyzhello http://world.com/!z8hello <a href="http://world.com/">http://world.com/</a>!z0hello http://world.com/with?param=true&stuff=yeszqhello <a href="http://world.com/with?param=true&amp;stuff=yes">http://world.com/with?param=true&amp;stuff=yes</a>z>http://url.com/w(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaz]<a href="http://url.com/w">http://url.com/w</a>(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaz>http://url.com/withmany.......................................zd<a href="http://url.com/withmany">http://url.com/withmany</a>.......................................z;http://url.com/withmany((((((((((((((((((((((((((((((((((a)za<a href="http://url.com/withmany">http://url.com/withmany</a>((((((((((((((((((((((((((((((((((a)zhttp://foo.com/blah_blahz?<a href="http://foo.com/blah_blah">http://foo.com/blah_blah</a>zhttp://foo.com/blah_blah/zA<a href="http://foo.com/blah_blah/">http://foo.com/blah_blah/</a>z)(Something like http://foo.com/blah_blah)zP(Something like <a href="http://foo.com/blah_blah">http://foo.com/blah_blah</a>)z$http://foo.com/blah_blah_(wikipedia)zW<a href="http://foo.com/blah_blah_(wikipedia)">http://foo.com/blah_blah_(wikipedia)</a>z+http://foo.com/blah_(blah)_(wikipedia)_blahze<a href="http://foo.com/blah_(blah)_(wikipedia)_blah">http://foo.com/blah_(blah)_(wikipedia)_blah</a>z5(Something like http://foo.com/blah_blah_(wikipedia))zh(Something like <a href="http://foo.com/blah_blah_(wikipedia)">http://foo.com/blah_blah_(wikipedia)</a>)zhttp://foo.com/blah_blah.z@<a href="http://foo.com/blah_blah">http://foo.com/blah_blah</a>.zhttp://foo.com/blah_blah/.zB<a href="http://foo.com/blah_blah/">http://foo.com/blah_blah/</a>.z<http://foo.com/blah_blah>zG&lt;<a href="http://foo.com/blah_blah">http://foo.com/blah_blah</a>&gt;z<http://foo.com/blah_blah/>zI&lt;<a href="http://foo.com/blah_blah/">http://foo.com/blah_blah/</a>&gt;zhttp://foo.com/blah_blah,z@<a href="http://foo.com/blah_blah">http://foo.com/blah_blah</a>,z&http://www.example.com/wpstyle/?p=364.zZ<a href="http://www.example.com/wpstyle/?p=364">http://www.example.com/wpstyle/?p=364</a>.zrdar://1234permitted_protocolshttprdarz%<a href="rdar://1234">rdar://1234</a>z
rdar:/1234z#<a href="rdar:/1234">rdar:/1234</a>z'http://userid:password@example.com:8080z]<a href="http://userid:password@example.com:8080">http://userid:password@example.com:8080</a>zhttp://userid@example.comzA<a href="http://userid@example.com">http://userid@example.com</a>zhttp://userid@example.com:8080zK<a href="http://userid@example.com:8080">http://userid@example.com:8080</a>z"http://userid:password@example.comzS<a href="http://userid:password@example.com">http://userid:password@example.com</a>zFmessage://%3c330e7f8409726r6a4ba78dkf1fd71420c1bf6ff@mail.gmail.com%3emessagez<a href="message://%3c330e7f8409726r6a4ba78dkf1fd71420c1bf6ff@mail.gmail.com%3e">message://%3c330e7f8409726r6a4ba78dkf1fd71420c1bf6ff@mail.gmail.com%3e</a>u   http://➡.ws/䨹u1   <a href="http://➡.ws/䨹">http://➡.ws/䨹</a>z<tag>http://example.com</tag>zJ&lt;tag&gt;<a href="http://example.com">http://example.com</a>&lt;/tag&gt;zJust a www.example.com link.zAJust a <a href="http://www.example.com">www.example.com</a> link.require_protocolTz:A http://reallylong.com/link/that/exceedsthelenglimit.html)r   shortenzA <a href="http://reallylong.com/link/that/exceedsthelenglimit.html" title="http://reallylong.com/link/that/exceedsthelenglimit.html">http://reallylong.com/link...</a>z6A http://reallylongdomainnamethatwillbetoolong.com/hi!r   zA <a href="http://reallylongdomainnamethatwillbetoolong.com/hi" title="http://reallylongdomainnamethatwillbetoolong.com/hi">http://reallylongdomainnametha...</a>!z/A file:///passwords.txt and http://web.com linkzLA file:///passwords.txt and <a href="http://web.com">http://web.com</a> linkfilezSA <a href="file:///passwords.txt">file:///passwords.txt</a> and http://web.com linkzwww.external-link.comextra_paramsrel="nofollow" class="external"z`<a href="http://www.external-link.com" rel="nofollow" class="external">www.external-link.com</a>z;www.external-link.com and www.internal-link.com/blogs extrac                 ,    | j                  d      rdS dS )Nzhttp://www.internal-link.comzclass="internal"r   )
startswithhrefs    M/var/www/openai/venv/lib/python3.12/site-packages/tornado/test/escape_test.py<lambda>r!      s!    ??#AB # 767    z<a href="http://www.external-link.com" rel="nofollow" class="external">www.external-link.com</a> and <a href="http://www.internal-link.com/blogs" class="internal">www.internal-link.com/blogs</a> extrac                      y)Nz%    rel="nofollow" class="external"   r   s    r    r!   r!      s    &Mr"   c                   N    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zy)EscapeTestCasec                     t         D ]8  \  }}}t        j                  j                  |fi |}| j	                  ||       : y )N)linkify_teststornadoescapelinkifyassertEqual)selftextkwargshtmllinkeds        r    test_linkifyzEscapeTestCase.test_linkify   s<    "/D&$^^++D;F;FVT* #0r"   c           	          g d}|D ]_  \  }}| j                  t        t        |            t        |             | j                  t        |      t        t        |                   a y )N)z<foo>z&lt;foo&gt;r4   )s   <foo>s   &lt;foo&gt;)z<>&"'z&lt;&gt;&amp;&quot;&#x27;)z&amp;z	&amp;amp;)u   <é>u
   &lt;é&gt;)s   <é>s
   &lt;é&gt;)r,   r   r   r   r-   tests	unescapedescapeds       r    test_xhtml_escapez EscapeTestCase.test_xhtml_escape   sV    
 #(IwT,y"9:DMJT)_d>'3J.KL #(r"   c                 V    g d}|D ]   \  }}| j                  |t        |             " y )N))zfoo&#32;barfoo bar)zfoo&#x20;barr;   )zfoo&#X20;barr;   )zfoo&#xabc;baru	   foo઼bar)foo&#xyz;barr<   )	foo&#;barr=   )
foo&#x;barr>   )r,   r   )r-   r6   r8   r7   s       r    test_xhtml_unescape_numericz*EscapeTestCase.test_xhtml_unescape_numeric   s/    
 #(GYYw(?@ #(r"   c                     dj                  d      dfdj                  d      dfdg}|D ]   \  }}| j                  t        |      |       " y )N   ér   %C3%A9latin1z%E9)rA   rB   )encoder,   r   r5   s       r    test_url_escape_unicodez&EscapeTestCase.test_url_escape_unicode   sV     __V$h/__X&. 
 #(IwZ	2G< #(r"   c                     dddt        d      d fg}|D ]P  \  }}}| j                  t        t        |      |      |       | j                  t        t        |      |      |       R y )N)rB   rA   r   )rB   u   Ã©rC   rB   rA   )r   r,   r   r   )r-   r6   r8   r7   encodings        r    test_url_unescape_unicodez(EscapeTestCase.test_url_unescape_unicode  si    (0tH~t,

 -2(GY \*W*=xH)T\$w-BIN -2r"   c                    d}d}d}| j                  t        |      |       | j                  t        |d      |       | j                  t        |      |       | j                  t        |d      |       | j                  t        |d       t        |             | j                  t        |d d      t        |             y )Nz+ #%z
%2B+%23%25z%2B%20%23%25F)plus)rG   )rG   rJ   )r,   r   r   r   )r-   r7   plus_escapedr8   s       r    test_url_escape_quote_plusz)EscapeTestCase.test_url_escape_quote_plus  s    	# I.=IE:GDl3Y?gE:IFlTBDOT4e<d9o	
r"   c                     | j                  t        t        d            t               | j                  t        t        d            t               y )Nfoo)r,   typer   strr   r-   s    r    test_escape_return_typesz'EscapeTestCase.test_escape_return_types  s8     	l512C8l512LAr"   c                     | j                  t        d      d       | j                  t        d      d       | j                  t        t        d            d       y )Ns   "foo"rN   z"foo"u   "é"rA   )r,   r	   r   rQ   s    r    test_json_decodezEscapeTestCase.test_json_decode"  sJ     	X.6W-u5 	T*%56Ar"   c           	          | j                  t        t        d            d       t        t        u rI| j                  t        t        t        d                  d       | j                  t        t        d       y y )NrA      )r,   r	   r
   bytesrP   r   assertRaisesUnicodeDecodeErrorrQ   s    r    test_json_encodezEscapeTestCase.test_json_encode+  s[     	[%:;XFC<[T(^)DExP0+wG r"   c                 :    | j                  t        d      d       y )Nz&sequences     of    whitespace   charszsequences of whitespace chars)r,   r   rQ   s    r    test_squeezezEscapeTestCase.test_squeeze4  s    <=+	
r"   c                    ddiddgddd}| j                  t        |d         ddi       | j                  t        |d         ddg       | j                  t        |d	         d
       | j                  t        |d         d       y )N   foo   bar)r^   r_   )dictlisttuplerW   r`   rN   barra   rb   )rN   rc   rW   )r,   r   )r-   r6   s     r    test_recursive_unicodez%EscapeTestCase.test_recursive_unicode:  s    V$V$%	
 	*5=9E5>J*5=9E5>J*5>:NK*5>:EBr"   N)__name__
__module____qualname__r2   r9   r?   rE   rH   rL   rR   rT   rZ   r\   rd   r$   r"   r    r&   r&      s@    +
MA	=O
BBH

Cr"   r&   )unittestr)   tornado.escaper   r   r   r   r   r   r	   r
   r   r   tornado.utilr   typingr   r   r   r   r   r(   TestCaser&   r$   r"   r    <module>rm      s       & 0 0 	#
B 	;
{ 	I
g( 	I
n'2 	F
k1@ 	#
I?J 	$
KIT 	4
ZS^ 	/
a]h 	6
ogr 	@
rq| 	$
J{F 	%
LEP 	%
QOZ 	&
SYd 	$
Jcn 	1
dmx 		 01/wB 		)-AL 	2
gKV 	$
KU` 	)
U_j 	-
]it 	Q	 34	Us@ 	"
GJ 	(
TIT 	'
KS^ 	'	T"&]h 	E!d3	ngt 	A	D	ns@ 	:
VJ 	:	)]IT 	 	:;jS^ 	F 	
	s]v 	 	MNjuDnCX&& nCr"   