o
    Qœ_mJ  ã                   @   sf  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mZ d dlmZ d dlmZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlmZmZmZ deeeee f eeee
 f f fdd	„Z G d
d„ dej!ƒZ"G dd„ dej!ƒZ#G dd„ dej!ƒZ$G dd„ dej!ƒZ%G dd„ dej!ƒZ&G dd„ dej!ƒZ'G dd„ dej!ƒZ(G dd„ dej!ƒZ)dS )é    )
Ú
url_concatÚparse_multipart_form_dataÚHTTPHeadersÚformat_timestampÚHTTPServerRequestÚparse_request_start_lineÚparse_cookieÚ	qs_to_qslÚHTTPInputErrorÚHTTPFile)Úutf8Ú
native_str)Úgen_log)Ú	ExpectLogN)ÚTupleÚDictÚListÚreturnc                   C   s   i i fS )zÇReturn two empty dicts suitable for use with parse_multipart_form_data.

    mypy insists on type annotations for dict literals, so this lets us avoid
    the verbose types throughout this test.
    © r   r   r   ú</usr/lib/python3/dist-packages/tornado/test/httputil_test.pyÚform_data_args   s   r   c                   @   sl   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ ZdS )ÚTestUrlConcatc                 C   ó   t dddgƒ}|  |d¡ d S )Núhttps://localhost/path©Úyr   ©Úzr   úhttps://localhost/path?y=y&z=z©r   ÚassertEqual©ÚselfÚurlr   r   r   Útest_url_concat_no_query_params&   ó   z-TestUrlConcat.test_url_concat_no_query_paramsc                 C   r   )Nr   )r   z/yr   z!https://localhost/path?y=%2Fy&z=zr   r!   r   r   r   Útest_url_concat_encode_args*   r%   z)TestUrlConcat.test_url_concat_encode_argsc                 C   r   )Nzhttps://localhost/path?r   r   r   r   r!   r   r   r   Útest_url_concat_trailing_q.   r%   z(TestUrlConcat.test_url_concat_trailing_qc                 C   r   )Nzhttps://localhost/path?xr   r   ú!https://localhost/path?x=&y=y&z=zr   r!   r   r   r   Ú&test_url_concat_q_with_no_trailing_amp2   r%   z4TestUrlConcat.test_url_concat_q_with_no_trailing_ampc                 C   r   )Nzhttps://localhost/path?x&r   r   r(   r   r!   r   r   r   Útest_url_concat_trailing_amp6   r%   z*TestUrlConcat.test_url_concat_trailing_ampc                 C   r   )Nzhttps://localhost/path?a=1&b=2r   r   z&https://localhost/path?a=1&b=2&y=y&z=zr   r!   r   r   r   Útest_url_concat_mult_params:   r%   z)TestUrlConcat.test_url_concat_mult_paramsc                 C   s   t dg ƒ}|  |d¡ d S ©Nzhttps://localhost/path?r=1&t=2r   r!   r   r   r   Útest_url_concat_no_params>   ó   
z'TestUrlConcat.test_url_concat_no_paramsc                 C   s   t dd ƒ}|  |d¡ d S r,   r   r!   r   r   r   Útest_url_concat_none_paramsB   r.   z)TestUrlConcat.test_url_concat_none_paramsc                 C   ó   t ddgƒ}|  |d¡ d S )Nzhttps://localhost/path#tabr   zhttps://localhost/path?y=y#tabr   r!   r   r   r   Útest_url_concat_with_fragF   ó   z'TestUrlConcat.test_url_concat_with_fragc                 C   r   )Nr   )r   Úy1)r   Úy2z https://localhost/path?y=y1&y=y2r   r!   r   r   r   Ú!test_url_concat_multi_same_paramsJ   r%   z/TestUrlConcat.test_url_concat_multi_same_paramsc                 C   r0   )Nzhttps://localhost/path?r=1&r=2r   z"https://localhost/path?r=1&r=2&y=yr   r!   r   r   r   Ú'test_url_concat_multi_same_query_paramsN   r2   z5TestUrlConcat.test_url_concat_multi_same_query_paramsc                 C   s    t dtdd�ƒ}|  |d¡ d S )Nr   r   )r   zhttps://localhost/path?y=y)r   Údictr    r!   r   r   r   Útest_url_concat_dict_paramsR   s   z)TestUrlConcat.test_url_concat_dict_paramsN)Ú__name__Ú
__module__Ú__qualname__r$   r&   r'   r)   r*   r+   r-   r/   r1   r5   r6   r8   r   r   r   r   r   %   s    r   c                   @   s   e Zd Zdd„ ZdS )ÚQsParseTestc                 C   sD   d}t j |¡}tt|ƒƒ}|  d|¡ |  d|¡ |  d|¡ d S )Nza=1&b=2&a=3)ÚaÚ1)r=   Ú3)ÚbÚ2)ÚurllibÚparseÚparse_qsÚlistr	   ÚassertIn)r"   ÚqsstringÚqsÚqslr   r   r   Útest_parsingX   s   zQsParseTest.test_parsingN)r9   r:   r;   rJ   r   r   r   r   r<   W   s    r<   c                   @   s\   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )ÚMultipartFormDataTestc                 C   óT   d  dd¡}tƒ \}}td|||ƒ |d d }|  |d d¡ |  |d	 d
¡ d S )NóT   --1234
Content-Disposition: form-data; name="files"; filename="ab.txt"

Foo
--1234--ó   
ó   
ó   1234Úfilesr   Úfilenameúab.txtÚbodyó   Foo©Úreplacer   r   r    ©r"   ÚdataÚargsrQ   Úfiler   r   r   Útest_file_uploadb   ó   ÿû
z&MultipartFormDataTest.test_file_uploadc                 C   rL   )NsP   --1234
Content-Disposition: form-data; name=files; filename=ab.txt

Foo
--1234--rN   rO   rP   rQ   r   rR   rS   rT   rU   rV   rX   r   r   r   Útest_unquoted_namesq   s   ÿû
z)MultipartFormDataTest.test_unquoted_namesc                 C   sŽ   g d¢}|D ]>}t  d|¡ d| dd¡ dd¡ }t| dd	¡ƒ}tƒ \}}td
|||ƒ |d d }|  |d |¡ |  |d d¡ qd S )N)za;b.txtza"b.txtza";b.txtza;"b.txtz	a";";.txtza\"b.txtza\b.txtztrying filename %rzP--1234
Content-Disposition: form-data; name="files"; filename="%s"

Foo
--1234--ú\z\\ú"z\"Ú
ú
rP   rQ   r   rR   rT   rU   )ÚloggingÚdebugrW   r   r   r   r    )r"   Ú	filenamesrR   Ústr_datarY   rZ   rQ   r[   r   r   r   Útest_special_filenames�   s$   	ÿÿù

ïz,MultipartFormDataTest.test_special_filenamesc                 C   rL   )Nsr   --1234
Content-Disposition: form-data; name="files"; filename="ab.txt"; filename*=UTF-8''%C3%A1b.txt

Foo
--1234--rN   rO   rP   rQ   r   rR   u   Ã¡b.txtrT   rU   rV   rX   r   r   r   Útest_non_ascii_filenamež   r]   z-MultipartFormDataTest.test_non_ascii_filenamec                 C   rL   )NrM   rN   rO   s   "1234"rQ   r   rR   rS   rT   rU   rV   rX   r   r   r   Ú)test_boundary_starts_and_ends_with_quotes­   r]   z?MultipartFormDataTest.test_boundary_starts_and_ends_with_quotesc                 C   ó^   d  dd¡}tƒ \}}ttdƒ� td|||ƒ W d   ƒ n1 s"w   Y  |  |i ¡ d S )Ns   --1234

Foo
--1234--rN   rO   z#multipart/form-data missing headersrP   ©rW   r   r   r   r   r    ©r"   rY   rZ   rQ   r   r   r   Útest_missing_headers¼   ó   ÿü
ÿz*MultipartFormDataTest.test_missing_headersc                 C   rj   )NsR   --1234
Content-Disposition: invalid; name="files"; filename="ab.txt"

Foo
--1234--rN   rO   úInvalid multipart/form-datarP   rk   rl   r   r   r   Ú test_invalid_content_dispositionÉ   ó   ÿû
ÿz6MultipartFormDataTest.test_invalid_content_dispositionc                 C   rj   )NsS   --1234
Content-Disposition: form-data; name="files"; filename="ab.txt"

Foo--1234--rN   rO   ro   rP   rk   rl   r   r   r   Ú.test_line_does_not_end_with_correct_line_break×   rn   zDMultipartFormDataTest.test_line_does_not_end_with_correct_line_breakc                 C   rj   )NsF   --1234
Content-Disposition: form-data; filename="ab.txt"

Foo
--1234--rN   rO   z&multipart/form-data value missing namerP   rk   rl   r   r   r   Ú6test_content_disposition_header_without_name_parameterä   rq   zLMultipartFormDataTest.test_content_disposition_header_without_name_parameterc                 C   rL   )NsU   --1234
Content-Disposition: form-data; name="files"; filename="ab.txt"

Foo
--1234--
rN   rO   rP   rQ   r   rR   rS   rT   rU   rV   rX   r   r   r   Útest_data_after_final_boundaryò   s   ÿú
	z4MultipartFormDataTest.test_data_after_final_boundaryN)r9   r:   r;   r\   r^   rg   rh   ri   rm   rp   rr   rs   rt   r   r   r   r   rK   a   s    rK   c                   @   sL   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dS )ÚHTTPHeadersTestc                 C   s€   d  dd¡}t |¡}|  |d d¡ |  | d¡dg¡ |  |d d¡ |  | d¡d	d
g¡ |  tt| ¡ ƒƒg d¢¡ d S )Nz>Foo: bar
 baz
Asdf: qwer
	zxcv
Foo: even
     more
     lines
ra   rb   Úasdfú	qwer zxcvÚFoozbar baz,even more linesÚfooúbar bazúeven more lines))ÚAsdfrw   )rx   rz   )rx   r{   )rW   r   rC   r    Úget_listÚsortedrE   Úget_all)r"   rY   Úheadersr   r   r   Útest_multi_line  s   ÿø
þzHTTPHeadersTest.test_multi_linec                 C   s   d}|   ttj|¡ d S )Nz	 Foo: bar)ÚassertRaisesr
   r   rC   )r"   rY   r   r   r   Útest_malformed_continuation!  s   z+HTTPHeadersTest.test_malformed_continuationc              
   C   s¶   g d¢}|D ]R}dD ]M}z<z|  |¡}W n
 ty   Y W q
w d| d }t t| d¡ƒ¡}ddt| d¡ƒ d fg}|  |t| ¡ ƒ¡ W q
 t	yW   t
 d	||¡ ‚ w qd S )
N)úúúúõ   Â…u   â€¨u   â€©)r   Úlatin1s   Cookie: foo=s   barr‰   ÚCookiezfoo=Úbarzfailed while trying %r in %s)ÚencodeÚUnicodeEncodeErrorr   rC   r   Údecoder    rE   r   Ú	Exceptionr   Úwarning)r"   ÚnewlinesÚnewlineÚencodingÚencodedrY   r€   Úexpectedr   r   r   Útest_unicode_newlines(  s,   	þþÿþîþz%HTTPHeadersTest.test_unicode_newlinesc                 C   s&   t  d¡}|  t| ¡ ƒg d¢¡ d S )Nz&CRLF: crlf
LF: lf
CR: crMore: more
))ÚCrzcrMore: more)ÚCrlfÚcrlf)ÚLfÚlf)r   rC   r    r~   r   ©r"   r€   r   r   r   Útest_optional_crP  s
   

þz HTTPHeadersTest.test_optional_crc           	      C   s¦   g d¢}t ƒ }|D ]
\}}| ||¡ q	| ¡ }t |¡}t |¡}||||fD ]}|  tt| ¡ ƒƒ|¡ q(|||fD ]}|  ||¡ |  | 	d¡| 	d¡¡ q<d S )N))ÚAr>   )rž   rA   )ÚBÚcrž   )
r   ÚaddÚcopyÚdeepcopyr    rE   r~   r   ÚassertIsNotr}   )	r"   Ú	all_pairsÚh1ÚkÚvÚh2Úh3Úh4r€   r   r   r   Ú	test_copyZ  s   

ýzHTTPHeadersTest.test_copyc                 C   sz   t ƒ }| dd¡ | dd¡ | dd¡ t |¡}t |¡}|  t| ¡ ƒt| ¡ ƒ¡ |  t| ¡ ƒt| ¡ ƒ¡ d S )Nz
Set-Cookieza=bzc=dzContent-Typez	text/html)	r   r¡   ÚpickleÚdumpsÚloadsr    r~   r   Úitems)r"   r€   ÚpickledÚ	unpickledr   r   r   Útest_pickle_roundtripk  s   

 z%HTTPHeadersTest.test_pickle_roundtripc                 C   sr   t ƒ }d|d< |  | dd¡d¡ |  |d d¡ |  | dd¡d¡ |  |d d¡ |  t| ¡ ƒddg¡ d S )Nr‹   ry   ÚbazÚquuxÚxyzzy)rx   r‹   )ÚQuuxr¶   )r   r    Ú
setdefaultr~   r   rœ   r   r   r   Útest_setdefaultu  s   zHTTPHeadersTest.test_setdefaultc                 C   sH   t ƒ }| dd¡ | dd¡ | dd¡ t  t|ƒ¡}|  ||¡ d S )Nrx   r>   rA   r?   )r   r¡   rC   Ústrr    )r"   r€   Úheaders2r   r   r   Útest_string€  s   zHTTPHeadersTest.test_stringN)r9   r:   r;   r�   rƒ   r–   r�   r¬   r³   r¹   r¼   r   r   r   r   ru     s    (

ru   c                   @   sD   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dS )ÚFormatTimestampTestg*; R]AÔAzSun, 27 Jan 2013 18:43:20 GMTc                 C   s   |   t|ƒ| j¡ d S ©N)r    r   ÚEXPECTED)r"   Úvaluer   r   r   ÚcheckŽ  ó   zFormatTimestampTest.checkc                 C   s   |   | j¡ d S r¾   )rÁ   Ú	TIMESTAMP©r"   r   r   r   Útest_unix_time_float‘  s   z(FormatTimestampTest.test_unix_time_floatc                 C   s   |   t| jƒ¡ d S r¾   )rÁ   ÚintrÃ   rÄ   r   r   r   Útest_unix_time_int”  s   z&FormatTimestampTest.test_unix_time_intc                 C   s   |   t | j¡¡ d S r¾   )rÁ   ÚtimeÚgmtimerÃ   rÄ   r   r   r   Útest_struct_time—  rÂ   z$FormatTimestampTest.test_struct_timec                 C   s.   t t | j¡ƒ}|  dt|ƒ¡ |  |¡ d S )Né	   )ÚtuplerÈ   rÉ   rÃ   r    ÚlenrÁ   )r"   Útupr   r   r   Útest_time_tupleš  s   z#FormatTimestampTest.test_time_tuplec                 C   s   |   tj | j¡¡ d S r¾   )rÁ   ÚdatetimeÚutcfromtimestamprÃ   rÄ   r   r   r   Útest_datetimeŸ  s   z!FormatTimestampTest.test_datetimeN)r9   r:   r;   rÃ   r¿   rÁ   rÅ   rÇ   rÊ   rÏ   rÒ   r   r   r   r   r½   ‰  s    r½   c                   @   ó$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚHTTPServerRequestTestc                 C   s   t dd� d S ©Nú/)Úuri)r   rÄ   r   r   r   Útest_default_constructor¦  s   z.HTTPServerRequestTest.test_default_constructorc                 C   s   t dd�}|  |jt¡ d S rÕ   )r   ÚassertIsInstancerT   Úbytes)r"   Úrequetsr   r   r   Útest_body_is_a_byte_string¬  s   
z0HTTPServerRequestTest.test_body_is_a_byte_stringc                 C   s,   t dtddgiƒd�}|  dt|ƒv¡ d S )NrÖ   ÚCanaryz	Coal Mine)r×   r€   )r   r   Ú
assertTrueÚrepr)r"   Úrequestr   r   r   Ú"test_repr_does_not_contain_headers°  s   ÿz8HTTPServerRequestTest.test_repr_does_not_contain_headersN)r9   r:   r;   rØ   rÜ   rá   r   r   r   r   rÔ   ¥  s    rÔ   c                   @   s    e Zd ZdZdZdZdd„ ZdS )ÚParseRequestStartLineTestÚGETz/foozHTTP/1.1c                 C   sR   d  | j| j| jg¡}t|ƒ}|  |j| j¡ |  |j| j¡ |  |j| j¡ d S )Nú )	ÚjoinÚMETHODÚPATHÚVERSIONr   r    ÚmethodÚpathÚversion)r"   Ú
start_lineÚparsed_start_liner   r   r   Útest_parse_request_start_line¼  s
   z7ParseRequestStartLineTest.test_parse_request_start_lineN)r9   r:   r;   ræ   rç   rè   rî   r   r   r   r   râ   ·  s
    râ   c                   @   rÓ   )ÚParseCookieTestc                 C   sv   |   tdƒdddœ¡ |   tdƒdddd	d
œ¡ |   tdƒddi¡ |   tdƒddi¡ |   tdƒdddddœ¡ dS )zO
        Test cases copied from Python's Lib/test/test_http_cookies.py
        zchips=ahoy; vienna=fingerÚahoyÚfinger)ÚchipsÚviennaz)keebler="E=mc2; L=\"Loves\"; fudge=\012;"z"E=mc2z	\"Loves\"z\012r`   )ÚkeeblerÚLÚfudgeÚ zkeebler=E=mc2rô   zE=mc2zkey:term=value:termzkey:termz
value:termza=b; c=[; d=r; f=hr@   ú[ÚrÚh)r=   r    ÚdÚfN©r    r   rÄ   r   r   r   Útest_python_cookiesÇ  s   þþÿÿz#ParseCookieTest.test_python_cookiesc                 C   s0   |   tdƒdddœ¡ |   tdƒdddœ¡ d S )	Nza=b; Domain=example.comr@   zexample.com)r=   ÚDomainza=b; h=i; a=cr    Úi)r=   rú   rý   rÄ   r   r   r   Útest_cookie_edgecasesà  s   ÿz%ParseCookieTest.test_cookie_edgecasesc                 C   sˆ   |   dtdƒ ¡ ¡ |  tdƒddddœ¡ |  tdƒd	d
dœ¡ |  tdƒddi¡ |  tdƒdtdƒi¡ |  tdƒdddœ¡ dS )zs
        Cookie strings that go against RFC6265 but browsers will send if set
        via document.cookie.
        Údjango_languagez$abc=def; unnamed; django_language=enza=b; "; c=dr@   r`   rû   )r=   r÷   r    za b c=d e = f; gh=izd e = fr   )za b cÚghza   b,c<>@:/[]?{}=d  "  =e,f gza   b,c<>@:/[]?{}zd  "  =e,f gu   saint=AndrÃ© BessetteÚsaintu   AndrÃ© Bessettez  =  b  ;  ;  =  ;   c  =  ;  r÷   )r÷   r    N)rF   r   Úkeysr    r   rÄ   r   r   r   Útest_invalid_cookiesé  s&   
þÿþ
þÿz$ParseCookieTest.test_invalid_cookiesN)r9   r:   r;   rþ   r  r  r   r   r   r   rï   Ä  s    	rï   )*Útornado.httputilr   r   r   r   r   r   r   r	   r
   r   Útornado.escaper   r   Útornado.logr   Útornado.testingr   r¢   rÐ   rc   r­   rÈ   Úurllib.parserB   ÚunittestÚtypingr   r   r   rº   rÚ   r   ÚTestCaser   r<   rK   ru   r½   rÔ   râ   rï   r   r   r   r   Ú<module>   s.   0 .	2
 & 