U
    dmJ                     @   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 eeeee f eeee
 f f d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 )zReturn 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   >/tmp/pip-unpacked-wheel-fekwu36z/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   s   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&   s    z-TestUrlConcat.test_url_concat_no_query_paramsc                 C   s   t dddg}| |d d S )Nr   )r   z/yr   z!https://localhost/path?y=%2Fy&z=zr   r    r   r   r   test_url_concat_encode_args*   s    z)TestUrlConcat.test_url_concat_encode_argsc                 C   s   t dddg}| |d d S )Nzhttps://localhost/path?r   r   r   r   r    r   r   r   test_url_concat_trailing_q.   s    z(TestUrlConcat.test_url_concat_trailing_qc                 C   s   t dddg}| |d d S )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   s    z4TestUrlConcat.test_url_concat_q_with_no_trailing_ampc                 C   s   t dddg}| |d d S )Nzhttps://localhost/path?x&r   r   r&   r   r    r   r   r   test_url_concat_trailing_amp6   s    z*TestUrlConcat.test_url_concat_trailing_ampc                 C   s   t dddg}| |d d S )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:   s    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>   s    
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   s    
z)TestUrlConcat.test_url_concat_none_paramsc                 C   s   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   s    z'TestUrlConcat.test_url_concat_with_fragc                 C   s   t dddg}| |d d S )Nr   )r   y1)r   y2z https://localhost/path?y=y1&y=y2r   r    r   r   r   !test_url_concat_multi_same_paramsJ   s    z/TestUrlConcat.test_url_concat_multi_same_paramsc                 C   s   t ddg}| |d d S )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   s    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,   r-   r0   r1   r3   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)r8   3)b2)urllibparseparse_qslistr	   assertIn)r!   ZqsstringqsZqslr   r   r   test_parsingX   s    zQsParseTest.test_parsingN)r4   r5   r6   rC   r   r   r   r   r7   W   s   r7   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   sT   d dd}t \}}td||| |d d }| |d d | |d	 d
 d S )NT   --1234
Content-Disposition: form-data; name="files"; filename="ab.txt"

Foo
--1234--   
   
   1234filesr   filenameab.txtbody   Fooreplacer   r   r   r!   dataargsrI   filer   r   r   test_file_uploadb   s     
z&MultipartFormDataTest.test_file_uploadc                 C   sT   d dd}t \}}td||| |d d }| |d d | |d	 d
 d S )NsP   --1234
Content-Disposition: form-data; name=files; filename=ab.txt

Foo
--1234--rF   rG   rH   rI   r   rJ   rK   rL   rM   rN   rP   r   r   r   test_unquoted_namesq   s     
z)MultipartFormDataTest.test_unquoted_namesc                 C   s   dddddddg}|D ]|}t d| d	|d
ddd }t|dd}t \}}td||| |d d }| |d | | |d d qd S )Nz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\"

rH   rI   r   rJ   rL   rM   )loggingdebugrO   r   r   r   r   )r!   	filenamesrJ   Zstr_datarQ   rR   rI   rS   r   r   r   test_special_filenames   s2    	  

z,MultipartFormDataTest.test_special_filenamesc                 C   sT   d dd}t \}}td||| |d d }| |d d | |d	 d
 d S )Nsr   --1234
Content-Disposition: form-data; name="files"; filename="ab.txt"; filename*=UTF-8''%C3%A1b.txt

Foo
--1234--rF   rG   rH   rI   r   rJ   u   áb.txtrL   rM   rN   rP   r   r   r   test_non_ascii_filename   s     
z-MultipartFormDataTest.test_non_ascii_filenamec                 C   sT   d dd}t \}}td||| |d d }| |d d | |d	 d
 d S )NrE   rF   rG   s   "1234"rI   r   rJ   rK   rL   rM   rN   rP   r   r   r   )test_boundary_starts_and_ends_with_quotes   s     
z?MultipartFormDataTest.test_boundary_starts_and_ends_with_quotesc              	   C   sJ   d dd}t \}}ttd td||| W 5 Q R X | |i  d S )Ns   --1234

Foo
--1234--rF   rG   z#multipart/form-data missing headersrH   rO   r   r   r   r   r   r!   rQ   rR   rI   r   r   r   test_missing_headers   s     
z*MultipartFormDataTest.test_missing_headersc              	   C   sJ   d dd}t \}}ttd td||| W 5 Q R X | |i  d S )NsR   --1234
Content-Disposition: invalid; name="files"; filename="ab.txt"

Foo
--1234--rF   rG   Invalid multipart/form-datarH   r`   ra   r   r   r    test_invalid_content_disposition   s     
z6MultipartFormDataTest.test_invalid_content_dispositionc              	   C   sJ   d dd}t \}}ttd td||| W 5 Q R X | |i  d S )NsS   --1234
Content-Disposition: form-data; name="files"; filename="ab.txt"

Foo--1234--rF   rG   rc   rH   r`   ra   r   r   r   .test_line_does_not_end_with_correct_line_break   s     
zDMultipartFormDataTest.test_line_does_not_end_with_correct_line_breakc              	   C   sJ   d dd}t \}}ttd td||| W 5 Q R X | |i  d S )NsF   --1234
Content-Disposition: form-data; filename="ab.txt"

Foo
--1234--rF   rG   z&multipart/form-data value missing namerH   r`   ra   r   r   r   6test_content_disposition_header_without_name_parameter   s     
zLMultipartFormDataTest.test_content_disposition_header_without_name_parameterc                 C   sT   d dd}t \}}td||| |d d }| |d d | |d	 d
 d S )NsU   --1234
Content-Disposition: form-data; name="files"; filename="ab.txt"

Foo
--1234--
rF   rG   rH   rI   r   rJ   rK   rL   rM   rN   rP   r   r   r   test_data_after_final_boundary   s     	
z4MultipartFormDataTest.test_data_after_final_boundaryN)r4   r5   r6   rT   rU   r]   r^   r_   rb   rd   re   rf   rg   r   r   r   r   rD   a   s   rD   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| dddg d S )Nz>Foo: bar
 baz
Asdf: qwer
	zxcv
Foo: even
     more
     lines
rX   rY   Zasdf	qwer zxcvFoozbar baz,even more linesfoobar bazeven more lines)ZAsdfri   )rj   rl   )rj   rm   )rO   r   r>   r   get_listsortedr@   get_all)r!   rQ   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   r>   )r!   rQ   r   r   r   test_malformed_continuation!  s    z+HTTPHeadersTest.test_malformed_continuationc              
   C   s   dddddddg}|D ]}dD ]}z~z| |}W n tk
rL   Y W qY nX d	| d
 }tt|d}ddt|d d fg}| |t|  W q t	k
r   t
d||  Y qX qqd S )N   u    u    )r   latin1s   Cookie: foo=s   barrz   Cookiezfoo=barzfailed while trying %r in %s)encodeUnicodeEncodeErrorr   r>   r   decoder   r@   rp   	Exceptionr   warning)r!   newlinesnewlineencodingencodedrQ   rq   expectedr   r   r   test_unicode_newlines(  s2    	z%HTTPHeadersTest.test_unicode_newlinesc                 C   s(   t d}| t| dddg d S )Nz&CRLF: crlf
LF: lf
CR: crMore: more
)ZCrzcrMore: more)ZCrlfZcrlf)ZLflf)r   r>   r   ro   rp   r!   rq   r   r   r   test_optional_crP  s
    

z HTTPHeadersTest.test_optional_crc           	      C   s   dddg}t  }|D ]\}}||| q| }t|}t|}||||fD ]}| tt| | qR|||fD ](}| || | |	d|	d qzd S )N)Ar9   )r   r<   )Bcr   )
r   addcopydeepcopyr   r@   ro   rp   ZassertIsNotrn   )	r!   Z	all_pairsh1kvh2h3h4rq   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   ro   rp   items)r!   rq   ZpickledZ	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|   rk   ZbazZquuxxyzzy)rj   r|   )ZQuuxr   )r   r   
setdefaultro   rp   r   r   r   r   test_setdefaultu  s    zHTTPHeadersTest.test_setdefaultc                 C   sH   t  }|dd |dd |dd t t|}| || d S )Nrj   r9   r<   r:   )r   r   r>   strr   )r!   rq   Zheaders2r   r   r   test_string  s    zHTTPHeadersTest.test_stringN)r4   r5   r6   rr   rt   r   r   r   r   r   r   r   r   r   r   rh     s   (

rh   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]AAzSun, 27 Jan 2013 18:43:20 GMTc                 C   s   |  t|| j d S N)r   r   EXPECTED)r!   valuer   r   r   check  s    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  s    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)r4   r5   r6   r   r   r   r   r   r   r   r   r   r   r   r   r     s   r   c                   @   s$   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   ZassertIsInstancerL   bytes)r!   Z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|k d S )Nr   ZCanaryz	Coal Mine)r   rq   )r   r   
assertTruerepr)r!   requestr   r   r   "test_repr_does_not_contain_headers  s
     z8HTTPServerRequestTest.test_repr_does_not_contain_headersN)r4   r5   r6   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!   Z
start_lineZparsed_start_liner   r   r   test_parse_request_start_line  s
    z7ParseRequestStartLineTest.test_parse_request_start_lineN)r4   r5   r6   r   r   r   r   r   r   r   r   r     s   r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )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=fingerZahoyZfinger)ZchipsZviennaz)keebler="E=mc2; L=\"Loves\"; fudge=\012;"z"E=mc2z	\"Loves\"z\012rW   )keeblerLZ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)r8   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)r8   Domainza=b; h=i; a=cr   i)r8   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.
        Zdjango_languagez$abc=def; unnamed; django_language=enza=b; "; c=dr;   rW   r   )r8   r   r   za b c=d e = f; gh=izd e = fr   )za b cZghza   b,c<>@:/[]?{}=d  "  =e,f gza   b,c<>@:/[]?{}zd  "  =e,f gu   saint=André BessetteZsaintu   André Bessettez  =  b  ;  ;  =  ;   c  =  ;  r   )r   r   N)rA   r   keysr   r   r   r   r   r   test_invalid_cookies  s*    
 
 z$ParseCookieTest.test_invalid_cookiesN)r4   r5   r6   r   r   r   r   r   r   r   r     s   	r   )*Ztornado.httputilr   r   r   r   r   r   r   r	   r
   r   Ztornado.escaper   r   Ztornado.logr   Ztornado.testingr   r   r   rZ   r   r   urllib.parser=   Zunittesttypingr   r   r   r   r   r   ZTestCaser   r7   rD   rh   r   r   r   r   r   r   r   r   <module>   s,   0.	2
 & 