Ë
    %¹šj¸r  ã                   ó`  — d dl mZmZ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„Z" G d	„ d
ejF                  «      Z$ G d„ dejF                  «      Z% G d„ dejF                  «      Z& G d„ dejF                  «      Z' G d„ dejF                  «      Z( G d„ dejF                  «      Z) G d„ dejF                  «      Z* G d„ dejF                  «      Z+ G d„ dejF                  «      Z,y)é    )Úparse_body_argumentsÚ
url_concatÚparse_multipart_form_dataÚHTTPHeadersÚformat_timestampÚHTTPServerRequestÚparse_request_start_lineÚparse_cookieÚ	qs_to_qslÚHTTPInputErrorÚHTTPFileÚParseMultipartConfig)Úutf8Ú
native_str)Úgen_log)Úignore_deprecationN)ÚTupleÚDictÚListÚreturnc                  ó
   — 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   ó    ú:lib/python3.12/site-packages/tornado/test/httputil_test.pyÚform_data_argsr      s   € ð ˆrˆ6€Mr   c                   óT   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zy)ÚTestUrlConcatc                 óD   — t        dddg«      }| j                  |d«       y )Núhttps://localhost/path©Úyr!   ©Úzr#   úhttps://localhost/path?y=y&z=z©r   ÚassertEqual©ÚselfÚurls     r   Útest_url_concat_no_query_paramsz-TestUrlConcat.test_url_concat_no_query_params(   s%   € ÜÐ1°JÀ
Ð3KÓLˆØ×Ñ˜Ð>Õ?r   c                 óD   — t        dddg«      }| j                  |d«       y )Nr   )r!   z/yr"   z!https://localhost/path?y=%2Fy&z=zr%   r'   s     r   Útest_url_concat_encode_argsz)TestUrlConcat.test_url_concat_encode_args,   s%   € ÜÐ1°KÀÐ3LÓMˆØ×Ñ˜ÐAÕBr   c                 óD   — t        dddg«      }| j                  |d«       y )Nzhttps://localhost/path?r    r"   r$   r%   r'   s     r   Útest_url_concat_trailing_qz(TestUrlConcat.test_url_concat_trailing_q0   s%   € ÜÐ2°ZÀÐ4LÓMˆØ×Ñ˜Ð>Õ?r   c                 óD   — t        dddg«      }| j                  |d«       y )Nzhttps://localhost/path?xr    r"   ú!https://localhost/path?x=&y=y&z=zr%   r'   s     r   Ú&test_url_concat_q_with_no_trailing_ampz4TestUrlConcat.test_url_concat_q_with_no_trailing_amp4   s%   € ÜÐ3°jÀ*Ð5MÓNˆØ×Ñ˜ÐAÕBr   c                 óD   — t        dddg«      }| j                  |d«       y )Nzhttps://localhost/path?x&r    r"   r0   r%   r'   s     r   Útest_url_concat_trailing_ampz*TestUrlConcat.test_url_concat_trailing_amp8   s%   € ÜÐ4°zÀ:Ð6NÓOˆØ×Ñ˜ÐAÕBr   c                 óD   — t        dddg«      }| j                  |d«       y )Nzhttps://localhost/path?a=1&b=2r    r"   z&https://localhost/path?a=1&b=2&y=y&z=zr%   r'   s     r   Útest_url_concat_mult_paramsz)TestUrlConcat.test_url_concat_mult_params<   s%   € ÜÐ9¸JÈ
Ð;SÓTˆØ×Ñ˜ÐFÕGr   c                 ó@   — t        dg «      }| j                  |d«       y ©Nzhttps://localhost/path?r=1&t=2r%   r'   s     r   Útest_url_concat_no_paramsz'TestUrlConcat.test_url_concat_no_params@   s    € ÜÐ9¸2Ó>ˆØ×Ñ˜Ð>Õ?r   c                 ó@   — t        dd «      }| j                  |d«       y r7   r%   r'   s     r   Útest_url_concat_none_paramsz)TestUrlConcat.test_url_concat_none_paramsD   s    € ÜÐ9¸4Ó@ˆØ×Ñ˜Ð>Õ?r   c                 óB   — t        ddg«      }| j                  |d«       y )Nzhttps://localhost/path#tabr    zhttps://localhost/path?y=y#tabr%   r'   s     r   Útest_url_concat_with_fragz'TestUrlConcat.test_url_concat_with_fragH   s"   € ÜÐ5¸
°|ÓDˆØ×Ñ˜Ð>Õ?r   c                 óD   — t        dddg«      }| j                  |d«       y )Nr   )r!   Úy1)r!   Úy2z https://localhost/path?y=y1&y=y2r%   r'   s     r   Ú!test_url_concat_multi_same_paramsz/TestUrlConcat.test_url_concat_multi_same_paramsL   s%   € ÜÐ1°KÀÐ3MÓNˆØ×Ñ˜Ð@ÕAr   c                 óB   — t        ddg«      }| j                  |d«       y )Nzhttps://localhost/path?r=1&r=2r    z"https://localhost/path?r=1&r=2&y=yr%   r'   s     r   Ú'test_url_concat_multi_same_query_paramsz5TestUrlConcat.test_url_concat_multi_same_query_paramsP   s"   € ÜÐ9¸J¸<ÓHˆØ×Ñ˜ÐBÕCr   c                 óT   — t        dt        d¬«      «      }| j                  |d«       y )Nr   r!   )r!   zhttps://localhost/path?y=y)r   Údictr&   r'   s     r   Útest_url_concat_dict_paramsz)TestUrlConcat.test_url_concat_dict_paramsT   s$   € ÜÐ1´4¸#´;Ó?ˆØ×Ñ˜Ð:Õ;r   N)Ú__name__Ú
__module__Ú__qualname__r*   r,   r.   r1   r3   r5   r8   r:   r<   r@   rB   rE   r   r   r   r   r   '   sI   „ ò@òCò@òCòCòHò@ò@ò@òBòDó<r   r   c                   ó   — e Zd Zd„ Zy)ÚQsParseTestc                 óÚ   — d}t         j                  j                  |«      }t        t	        |«      «      }| j                  d|«       | j                  d|«       | j                  d|«       y )Nza=1&b=2&a=3)ÚaÚ1)rL   Ú3)ÚbÚ2)ÚurllibÚparseÚparse_qsÚlistr   ÚassertIn)r(   ÚqsstringÚqsÚqsls       r   Útest_parsingzQsParseTest.test_parsingZ   sS   € Ø ˆÜ�\‰\×"Ñ" 8Ó,ˆÜ”9˜R“=Ó!ˆØ�‰�j #Ô&Ø�‰�j #Ô&Ø�‰�j #Õ&r   N)rF   rG   rH   rY   r   r   r   rJ   rJ   Y   s   „ ó'r   rJ   c                   ó   — e Zd Zd„ Zd„ Zy)ÚUrlEncodedDataTestc                 ó¼   — d}t        «       \  }}t        d|||«       | j                  |d   ddg«       | j                  |d   dg«       | j                  |i «       y )Ns   a=1&b=2&a=3ú!application/x-www-form-urlencodedrL   ó   1ó   3rO   ó   2)r   r   r&   ©r(   ÚdataÚargsÚfiless       r   Útest_urlencoded_dataz'UrlEncodedDataTest.test_urlencoded_datad   s`   € ØˆÜ$Ó&‰ˆˆeÜÐ@À$ÈÈeÔTØ×Ñ˜˜c™ T¨4 LÔ1Ø×Ñ˜˜c™ T FÔ+Ø×Ñ˜ Õ#r   c                 ó  — dj                  d„ t        d«      D «       «      }t        «       \  }}| j                  t        «      5 }t        d|||«       d d d «       | j                  dt        j                  «      «       y # 1 sw Y   Œ/xY w)Nr   c              3   ó    K  — | ]  }d –— Œ y­w)s   a=1&Nr   )Ú.0Ú_s     r   Ú	<genexpr>z8UrlEncodedDataTest.test_max_arguments.<locals>.<genexpr>m   s   è ø€ Ð5© Aœ©ùs   ‚ié  r]   zMax number of fields exceeded)	ÚjoinÚranger   ÚassertRaisesr   r   rU   ÚstrÚ	exception)r(   rb   rc   rd   Úcms        r   Útest_max_argumentsz%UrlEncodedDataTest.test_max_argumentsl   sl   € Ø�x‰xÑ5¬¨t¬Ó5Ó5ˆÜ$Ó&‰ˆˆeØ×Ñœ~Ô.°"Ü Ð!DÀdÈDÐRWÔX÷ /à�‰Ð5´s¸2¿<¹<Ó7HÕI÷ /Ð.ús   ÁBÂB
N)rF   rG   rH   re   rq   r   r   r   r[   r[   c   s   „ ò$óJr   r[   c                   ó`   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zy)ÚMultipartFormDataTestc                 óÂ   — dj                  dd«      }t        «       \  }}t        d|||«       |d   d   }| j                  |d   d«       | j                  |d	   d
«       y )NóT   --1234
Content-Disposition: form-data; name="files"; filename="ab.txt"

Foo
--1234--ó   
ó   
ó   1234rd   r   Úfilenameúab.txtÚbodyó   Foo©Úreplacer   r   r&   ©r(   rb   rc   rd   Úfiles        r   Útest_file_uploadz&MultipartFormDataTest.test_file_uploadu   sp   € ð÷
 ‰GØ�7ó
ð 	ô %Ó&‰ˆˆeÜ! '¨4°°uÔ=Ø�W‰~˜aÑ ˆØ×Ñ˜˜jÑ)¨8Ô4Ø×Ñ˜˜f™ vÕ.r   c                 óÂ   — dj                  dd«      }t        «       \  }}t        d|||«       |d   d   }| j                  |d   d«       | j                  |d	   d
«       y )NsP   --1234
Content-Disposition: form-data; name=files; filename=ab.txt

Foo
--1234--rv   rw   rx   rd   r   ry   rz   r{   r|   r}   r   s        r   Útest_unquoted_namesz)MultipartFormDataTest.test_unquoted_names„   sp   € ð÷
 ‰GØ�7ó
ð 	ô %Ó&‰ˆˆeÜ! '¨4°°uÔ=Ø�W‰~˜aÑ ˆØ×Ñ˜˜jÑ)¨8Ô4Ø×Ñ˜˜f™ vÕ.r   c                 ó`  — g d¢}|D ]¥  }t        j                  d|«       d|j                  dd«      j                  dd«      z  }t        |j                  dd	«      «      }t	        «       \  }}t        d
|||«       |d   d   }| j                  |d   |«       | j                  |d   d«       Œ§ y )N)	za;b.txtza"b.txtza";b.txtza;"b.txtz	a";";.txtza\"b.txtza\b.txtza b.txtza	b.txtztrying filename %rúP--1234
Content-Disposition: form-data; name="files"; filename="%s"

Foo
--1234--Ú\ú\\Ú"ú\"Ú
ú
rx   rd   r   ry   r{   r|   )ÚloggingÚdebugr~   r   r   r   r&   )r(   Ú	filenamesry   Ústr_datarb   rc   rd   r€   s           r   Útest_special_filenamesz,MultipartFormDataTest.test_special_filenames”   s¾   € ò

ˆ	ó "ˆHÜ�M‰MÐ.°Ô9ðð
 ×ÑØ�fóç‰gØ�Uóñ	ˆHô ˜×(Ñ(¨¨vÓ6Ó7ˆDÜ(Ó*‰KˆD�%Ü% g¨t°T¸5ÔAØ˜‘> !Ñ$ˆDØ×Ñ˜T *Ñ-¨xÔ8Ø×Ñ˜T &™\¨6Õ2ñ# "r   c                 ón  — g d¢}|D ]   }d|j                  dd«      j                  dd«      z  }t        |j                  dd«      «      }t        «       \  }}| j                  t        «      5 }t        d	|||«       d d d «       | j                  d
t        j                  «      «       Œ¢ y # 1 sw Y   Œ1xY w)N)zab.txtza b.txtzab.txtr…   r†   r‡   rˆ   r‰   rŠ   r‹   rx   zInvalid header value)	r~   r   r   rm   r   r   rU   rn   ro   )r(   rŽ   ry   r�   rb   rc   rd   rp   s           r   Útest_invalid_charsz(MultipartFormDataTest.test_invalid_chars³   s®   € ò
ˆ	ó
 "ˆHðð
 ×ÑØ�fóç‰gØ�Uóñ	ˆHô ˜×(Ñ(¨¨vÓ6Ó7ˆDÜ(Ó*‰KˆD�%Ø×"Ñ"¤>Ô2°bÜ)¨'°4¸¸uÔE÷ 3à�M‰MÐ0´#°b·l±lÓ2CÕDñ "÷ 3Ð2ús   Á,B+Â+B4	c                 óÂ   — dj                  dd«      }t        «       \  }}t        d|||«       |d   d   }| j                  |d   d«       | j                  |d	   d
«       y )Nsr   --1234
Content-Disposition: form-data; name="files"; filename="ab.txt"; filename*=UTF-8''%C3%A1b.txt

Foo
--1234--rv   rw   rx   rd   r   ry   u   Ã¡b.txtr{   r|   r}   r   s        r   Útest_non_ascii_filename_rfc5987z5MultipartFormDataTest.test_non_ascii_filename_rfc5987Ê   sp   € ð÷
 ‰GØ�7ó
ð 	ô %Ó&‰ˆˆeÜ! '¨4°°uÔ=Ø�W‰~˜aÑ ˆØ×Ñ˜˜jÑ)¨9Ô5Ø×Ñ˜˜f™ vÕ.r   c                 óà   — dj                  d«      j                  dd«      }t        «       \  }}t        d|||«       |d   d   }| j	                  |d   d	«       | j	                  |d
   d«       y )NuX   --1234
Content-Disposition: form-data; name="files"; filename="æµ‹è¯•.txt"

Foo
--1234--zutf-8rv   rw   rx   rd   r   ry   u
   æµ‹è¯•.txtr{   r|   )Úencoder~   r   r   r&   r   s        r   Útest_non_ascii_filename_rawz1MultipartFormDataTest.test_non_ascii_filename_rawÙ   s}   € ð÷
 ‰FØó
ç
‰'Ø�7ó
ð 	ô %Ó&‰ˆˆeÜ! '¨4°°uÔ=Ø�W‰~˜aÑ ˆØ×Ñ˜˜jÑ)¨<Ô8Ø×Ñ˜˜f™ vÕ.r   c                 óÂ   — dj                  dd«      }t        «       \  }}t        d|||«       |d   d   }| j                  |d   d«       | j                  |d	   d
«       y )Nru   rv   rw   s   "1234"rd   r   ry   rz   r{   r|   r}   r   s        r   Ú)test_boundary_starts_and_ends_with_quotesz?MultipartFormDataTest.test_boundary_starts_and_ends_with_quotesê   sp   € ð÷
 ‰GØ�7ó
ð 	ô %Ó&‰ˆˆeÜ! )¨T°4¸Ô?Ø�W‰~˜aÑ ˆØ×Ñ˜˜jÑ)¨8Ô4Ø×Ñ˜˜f™ vÕ.r   c                 óÚ   — dj                  dd«      }t        «       \  }}| j                  t        d¬«      5  t	        d|||«       d d d «       | j                  |i «       y # 1 sw Y   ŒxY w)Ns   --1234

Foo
--1234--rv   rw   z#multipart/form-data missing headers©Úmsgrx   ©r~   r   rm   r   r   r&   ra   s       r   Útest_missing_headersz*MultipartFormDataTest.test_missing_headersù   sv   € ð÷ ‰GØ�7ó
ð	 	ô %Ó&‰ˆˆeØ×ÑÜÐ Eð õ 
ô & g¨t°T¸5ÔA÷
ð 	×Ñ˜ Õ#÷	
ð 
úó   ·A!Á!A*c                 óÚ   — dj                  dd«      }t        «       \  }}| j                  t        d¬«      5  t	        d|||«       d d d «       | j                  |i «       y # 1 sw Y   ŒxY w)NsR   --1234
Content-Disposition: invalid; name="files"; filename="ab.txt"

Foo
--1234--rv   rw   úInvalid multipart/form-datar›   rx   r�   ra   s       r   Ú test_invalid_content_dispositionz6MultipartFormDataTest.test_invalid_content_disposition  sm   € ð÷
 ‰GØ�7ó
ð 	ô %Ó&‰ˆˆeØ×Ñœ~Ð3PÐÕQÜ% g¨t°T¸5ÔA÷ Rà×Ñ˜ Õ#÷ RÐQúrŸ   c                 óÚ   — dj                  dd«      }t        «       \  }}| j                  t        d¬«      5  t	        d|||«       d d d «       | j                  |i «       y # 1 sw Y   ŒxY w)NsS   --1234
Content-Disposition: form-data; name="files"; filename="ab.txt"

Foo--1234--rv   rw   r¡   r›   rx   r�   ra   s       r   Ú.test_line_does_not_end_with_correct_line_breakzDMultipartFormDataTest.test_line_does_not_end_with_correct_line_break  sm   € ð÷ ‰wØ�7ó
ð	 	ô %Ó&‰ˆˆeØ×Ñœ~Ð3PÐÕQÜ% g¨t°T¸5ÔA÷ Rà×Ñ˜ Õ#÷ RÐQúrŸ   c                 óÚ   — dj                  dd«      }t        «       \  }}| j                  t        d¬«      5  t	        d|||«       d d d «       | j                  |i «       y # 1 sw Y   ŒxY w)NsF   --1234
Content-Disposition: form-data; filename="ab.txt"

Foo
--1234--rv   rw   z&multipart/form-data value missing namer›   rx   r�   ra   s       r   Ú6test_content_disposition_header_without_name_parameterzLMultipartFormDataTest.test_content_disposition_header_without_name_parameter#  sv   € ð÷
 ‰GØ�7ó
ð 	ô %Ó&‰ˆˆeØ×ÑÜÐ Hð õ 
ô & g¨t°T¸5ÔA÷
ð 	×Ñ˜ Õ#÷	
ð 
úrŸ   c                 óÂ   — dj                  dd«      }t        «       \  }}t        d|||«       |d   d   }| j                  |d   d«       | j                  |d	   d
«       y )NsU   --1234
Content-Disposition: form-data; name="files"; filename="ab.txt"

Foo
--1234--
rv   rw   rx   rd   r   ry   rz   r{   r|   r}   r   s        r   Útest_data_after_final_boundaryz4MultipartFormDataTest.test_data_after_final_boundary3  sp   € ð÷ �GØ�7ó
ð 	ô %Ó&‰ˆˆeÜ! '¨4°°uÔ=Ø�W‰~˜aÑ ˆØ×Ñ˜˜jÑ)¨8Ô4Ø×Ñ˜˜f™ vÕ.r   c                 ój   — d„ } |d«      } |d«      }||z  dkD  r| j                  d|›d|›�«       y y )Nc                 ó˜   — t        j                  «       }dd| z  z   dz   dz   }i }i }t        d|||«       t        j                  «       |z
  S )Ns+   --1234
Content-Disposition: form-data; x="ó   ;s   "; s1   name="files"; filename="a.txt"

Foo
--1234--
rx   )ÚtimeÚperf_counterr   )ÚnÚstartÚmessagerc   rd   s        r   ÚfzJMultipartFormDataTest.test_disposition_param_linear_performance.<locals>.fJ  sj   € Ü×%Ñ%Ó'ˆEðà˜‘(ñð ñð Oñ	Oð ð ,.ˆDØ/1ˆEÜ% g¨w¸¸eÔDÜ×$Ñ$Ó&¨Ñ.Ð.r   iè  é'  é   z,Disposition param parsing is not linear: d1=ú vs d2=©Úfail©r(   r±   Úd1Úd2s       r   Ú)test_disposition_param_linear_performancez?MultipartFormDataTest.test_disposition_param_linear_performanceF  sE   € ò	/ñ ˆu‹Xˆáˆv‹YˆØ�‰7�RŠ<Ø�I‰IÐEÀ"ÀÀhÈ2È%ÐPÕQð r   c                 ó2  — d}dj                  dd«      }t        «       }t        «       \  }}t        |||||¬«       | j	                  |d   d   d   d	«       t        d¬
«      }| j                  t        «      5 }t        |||||¬«       d d d «       | j                  dt        j                  «      «       t        d¬«      }| j                  t        «      5 }t        |||||¬«       d d d «       | j                  dt        |j                  «      «       t        d¬«      }	| j                  t        «      5 }t        |||||	¬«       d d d «       | j                  dt        |j                  «      «       y # 1 sw Y   ŒíxY w# 1 sw Y   ŒšxY w# 1 sw Y   ŒGxY w)Nrx   sP   --1234
Content-Disposition: form-data; name="files"; filename="ab.txt"

--1234--rv   rw   )Úconfigrd   r   ry   rz   )Ú	max_partsztoo many partsé
   )Úmax_part_header_sizezheader too largeF)Úenabledz'multipart/form-data parsing is disabled)
r~   r   r   r   r&   rm   r   rU   rn   ro   )
r(   Úboundaryr{   r¼   rc   rd   Úconfig_no_partsrp   Úconfig_small_headersÚconfig_disableds
             r   Útest_multipart_configz+MultipartFormDataTest.test_multipart_config^  sg  € Øˆð÷ ‰GØ�7ó
ð 	ô &Ó'ˆÜ$Ó&‰ˆˆeÜ! (¨D°$¸ÀfÕMØ×Ñ˜˜w™¨Ñ*¨:Ñ6¸ÔAä.¸Ô;ˆØ×Ñœ~Ô.°"Ü%Ø˜$  e°Oõ÷ /ð 	�‰Ð&¬¨B¯L©LÓ(9Ô:ä3ÈÔLÐØ×Ñœ~Ô.°"Ü%Ø˜$  eÐ4Hõ÷ /ð 	�‰Ð(¬#¨b¯l©lÓ*;Ô<ä.°uÔ=ˆØ×Ñœ~Ô.°"Ü%Ø˜$  e°Oõ÷ /ð 	�‰Ð?ÄÀRÇ\Á\ÓARÕS÷% /Ð.ú÷ /Ð.ú÷ /Ð.ús$   Á8E5ÃFÄ6FÅ5E>ÆF
ÆFN)rF   rG   rH   r�   rƒ   r�   r’   r”   r—   r™   rž   r¢   r¤   r¦   r¨   rº   rÅ   r   r   r   rs   rs   t   sK   „ ò/ò/ò 3ò>Eò./ò/ò"/ò$ò$ò$ò$ò /ò&Ró0 Tr   rs   c                   óT   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zy)ÚHTTPHeadersTestc                 óä  — dj                  dd«      }t        j                  |«      }| j                  |d   d«       | j                  |j	                  d«      dg«       | j                  |d   d«       | j                  |j	                  d«      d	d
g«       | j                  t        t        |j                  «       «      «      g d¢«       | j                  d|v «       | j                  d|v «       y )Nz>Foo: bar
 baz
Asdf: qwer
	zxcv
Foo: even
     more
     lines
rŠ   r‹   Úasdfú	qwer zxcvÚFoozbar baz,even more linesÚfooúbar bazúeven more lines))ÚAsdfrÊ   )rË   rÍ   )rË   rÎ   rÏ   )	r~   r   rR   r&   Úget_listÚsortedrT   Úget_allÚ
assertTrue©r(   rb   Úheaderss      r   Útest_multi_linezHTTPHeadersTest.test_multi_line‚  sß   € ð
÷ �GØ�&ó
ð 	ô ×#Ñ# DÓ)ˆØ×Ñ˜ ™¨+Ô6Ø×Ñ˜×)Ñ)¨&Ó1°K°=ÔAØ×Ñ˜ ™Ð)BÔCØ×Ñ˜×)Ñ)¨%Ó0°9Ð>OÐ2PÔQØ×ÑÜ”4˜Ÿ™Ó)Ó*Ó+ÚSô	
ð
 	�‰˜ 'Ð)Ô*Ø�‰˜ 'Ð)Õ*r   c                 óø   — d}t        j                  |«      }| j                  |d   d«       d}| j                  t        t         j                  |«       d}| j                  t        t         j                  |«       y )NzFoo: bar
	asdfrË   zbar asdfz	 Foo: barzFoo: bar
asdf)r   rR   r&   rm   r   rÔ   s      r   Útest_continuationz!HTTPHeadersTest.test_continuationŸ  si   € Ø#ˆÜ×#Ñ# DÓ)ˆØ×Ñ˜ ™¨Ô4ð
 ˆØ×Ñœ.¬+×*;Ñ*;¸TÔBð $ˆØ×Ñœ.¬+×*;Ñ*;¸TÕBr   c                 ó  — t        d«      D ]}  }dt        |«      › d�}|dk(  s
|dk\  r=|dk7  r8t        j                  |«      }| j	                  |d   dt        |«      › d	�«       ŒY| j                  t        t        j                  |«       Œ y )
Néÿ   zFoo: barzbaz
é	   é    é   rË   ÚbarÚbaz)rl   Úchrr   rR   r&   rm   r   )r(   Úcrb   rÕ   s       r   Útest_forbidden_ascii_charactersz/HTTPHeadersTest.test_forbidden_ascii_characters¯  s€   € ô �t–ˆAØœc !›f˜X WÐ-ˆDØ�DŠy˜Q $šY¨1°ª9Ü%×+Ñ+¨DÓ1�Ø× Ñ  ¨¡°3´s¸1³v°h¸cÐ1BÕCà×!Ñ!¤.´+×2CÑ2CÀTÕJñ r   c           	      ó¸  — g d¢}|D ]�  }dD ]–  }	 	 |j                  |«      }d|z   dz   }t        j                  t	        |j                  d«      «      «      }ddt	        |j                  d«      «      z   dz   fg}| j                  |t        |j                  «       «      «       Œ˜ ŒŸ y # t        $ r Y Œ§w xY w# t        $ r t        j                  d	||«       ‚ w xY w)
N)ô   Â…u   â€¨u   â€©)r   Úlatin1s   Cookie: foo=s   barrå   ÚCookiezfoo=rÞ   zfailed while trying %r in %s)r–   ÚUnicodeEncodeErrorr   rR   r   Údecoder&   rT   rÒ   Ú	Exceptionr   Úwarning)r(   ÚnewlinesÚnewlineÚencodingÚencodedrb   rÕ   Úexpecteds           r   Útest_unicode_newlinesz%HTTPHeadersTest.test_unicode_newlinesº  sê   € ò
ˆó  ˆGã.�ðð!Ø")§.¡.°Ó":˜ð +¨WÑ4°vÑ=�Dô *×/Ñ/´
¸4¿;¹;ÀxÓ;PÓ0QÓR�Gð %Ø"¤Z°·±¸xÓ0HÓ%IÑIÈEÑQðð �Hð ×$Ñ$ X¬t°G·O±OÓ4EÓ/FÕGñ# /ñ  øô .ò !á ð!ûô !ò Ü—O‘OÐ$BÀGÈXÔVØðús)   ‘B(¢BB7Â(	B4Â1B7Â3B4Â4B7Â7"Cc                 ó¾   — g d¢}|D ]T  \  }}t        j                  d|z  «      }|rdg}ndd|z  fg}| j                  |t        |j	                  «       «      «       ŒV y )N))Ú T)Ú	T)ô   Â F)rä   FzTransfer-Encoding: %schunked)úTransfer-EncodingÚchunkedrõ   z	%schunked)r   rR   r&   rT   rÒ   )r(   Ú
whitespacerá   ÚstrippedrÕ   rï   s         r   Útest_unicode_whitespacez'HTTPHeadersTest.test_unicode_whitespaceå  sg   € ò

ˆ
ó &‰KˆAˆxÜ!×'Ñ'Ð(FÈÑ(JÓKˆGÙØ<Ð=‘à0°+À±/ÐBÐC�Ø×Ñ˜X¤t¨G¯O©OÓ,=Ó'>Õ?ñ &r   c                 ó  — | j                  t        «      5  t        j                  d«       d d d «       t        j                  d«      }| j	                  t        |j                  «       «      g d¢«       y # 1 sw Y   ŒJxY w)Nz&CRLF: crlf
LF: lf
CR: crMore: more
zCRLF: crlf
LF: lf
More: more
))ÚCrlfÚcrlf)ÚLfÚlf)ÚMoreÚmore)rm   r   r   rR   r&   rÑ   rÒ   ©r(   rÕ   s     r   Útest_optional_crz HTTPHeadersTest.test_optional_crø  s`   € à×Ñœ~Õ.Ü×ÑÐLÔM÷ /ô
 ×#Ñ#Ð$JÓKˆØ×ÑÜ�7—?‘?Ó$Ó%Ú>õ	
÷ /Ð.ús   –A5Á5A>c           	      óÞ  — g d¢}t        «       }|D ]  \  }}|j                  ||«       Œ |j                  «       }t        j                  |«      }t        j                  |«      }||||fD ]4  }| j	                  t        t        |j                  «       «      «      |«       Œ6 |||fD ]D  }| j                  ||«       | j                  |j                  d«      |j                  d«      «       ŒF y )N))ÚArM   )r  rP   )ÚBrá   r  )
r   ÚaddÚcopyÚdeepcopyr&   rT   rÑ   rÒ   ÚassertIsNotrÐ   )	r(   Ú	all_pairsÚh1ÚkÚvÚh2Úh3Úh4rÕ   s	            r   Ú	test_copyzHTTPHeadersTest.test_copy  sË   € Ú8ˆ	Ü‹]ˆÛ‰DˆAˆqØ�F‰F�1�a�Lð à�W‰W‹YˆÜ�Y‰Y�r‹]ˆÜ�]‰]˜2ÓˆØ˜B  BÓ'ˆGð ×ÑœT¤&¨¯©Ó):Ó";Ó<¸iÕHð (ð ˜B “|ˆGà×Ñ˜W bÔ)Ø×Ñ˜W×-Ñ-¨cÓ2°B·K±KÀÓ4DÕEñ $r   c                 óØ  — t        «       }|j                  dd«       |j                  dd«       |j                  dd«       t        j                  |«      }t        j                  |«      }| j                  t        |j                  «       «      t        |j                  «       «      «       | j                  t        |j                  «       «      t        |j                  «       «      «       y )Nz
Set-Cookieza=bzc=dzContent-Typez	text/html)	r   r  ÚpickleÚdumpsÚloadsr&   rÑ   rÒ   Úitems)r(   rÕ   ÚpickledÚ	unpickleds       r   Útest_pickle_roundtripz%HTTPHeadersTest.test_pickle_roundtrip  s    € Ü“-ˆØ�‰�L %Ô(Ø�‰�L %Ô(Ø�‰�N KÔ0Ü—,‘,˜wÓ'ˆÜ—L‘L Ó)ˆ	Ø×Ñœ §¡Ó 1Ó2´F¸9×;LÑ;LÓ;NÓ4OÔPØ×Ñœ §¡£Ó0´&¸¿¹Ó9JÓ2KÕLr   c                 óT  — t        «       }d|d<   | j                  |j                  dd«      d«       | j                  |d   d«       | j                  |j                  dd«      d«       | j                  |d   d«       | j                  t        |j	                  «       «      ddg«       y )NrÞ   rÌ   rß   ÚquuxÚxyzzy)rË   rÞ   )ÚQuuxr  )r   r&   Ú
setdefaultrÑ   rÒ   r  s     r   Útest_setdefaultzHTTPHeadersTest.test_setdefault   s–   € Ü“-ˆØˆ�‰à×Ñ˜×+Ñ+¨E°5Ó9¸5ÔAØ×Ñ˜ ™¨Ô/à×Ñ˜×+Ñ+¨F°GÓ<¸gÔFØ×Ñ˜ ™¨'Ô2Ø×Ñœ §¡Ó 1Ó2°^ÐEVÐ4WÕXr   c                 óä   — t        «       }|j                  dd«       |j                  dd«       |j                  dd«       t        j                  t        |«      «      }| j	                  ||«       y )NrË   rM   rP   rN   )r   r  rR   rn   r&   )r(   rÕ   Úheaders2s      r   Útest_stringzHTTPHeadersTest.test_string+  sW   € Ü“-ˆØ�‰�E˜3ÔØ�‰�E˜3ÔØ�‰�E˜3ÔÜ×$Ñ$¤S¨£\Ó2ˆØ×Ñ˜ (Õ+r   c                 ó¦   — g d¢}|D ]<  }t        «       }| j                  t        «      5  |j                  |d«       d d d «       Œ> y # 1 sw Y   ŒIxY w)N)Ú zfoo barzfoo	barzfoo
barzfoo barzfoo z fooô   Ã©rÞ   )r   rm   r   r  )r(   Úinvalid_namesÚnamerÕ   s       r   Útest_invalid_header_namesz)HTTPHeadersTest.test_invalid_header_names3  sG   € ò	
ˆó "ˆDÜ!“mˆGØ×"Ñ"¤>Õ2Ø—‘˜D %Ô(÷ 3Ð2ñ "ç2Ð2ús   ©AÁA	c                 ój   — d„ } |d«      } |d«      }||z  dkD  r| j                  d|›d|›�«       y y )Nc                 ó°   — t        j                  «       }t        «       }t        | «      D ]  }|j	                  dd«       Œ t        j                  «       |z
  S )NzX-FoorÞ   )r¬   r­   r   rl   r  )r®   r¯   rÕ   Úis       r   r±   z2HTTPHeadersTest.test_linear_performance.<locals>.fD  sG   € Ü×%Ñ%Ó'ˆEÜ!“mˆGÜ˜1–X�Ø—‘˜G UÕ+ð ä×$Ñ$Ó&¨Ñ.Ð.r   r²   é † r³   z.HTTPHeaders.add() does not scale linearly: d1=r´   rµ   r·   s       r   Útest_linear_performancez'HTTPHeadersTest.test_linear_performanceC  sE   € ò	/ñ ˆv‹YˆÙˆw‹ZˆØ�‰7�RŠ<à�I‰IÐGÀBÀ5ÈÈRÈEÐRÕSð r   N)rF   rG   rH   rÖ   rØ   râ   rð   rù   r  r  r  r  r"  r(  r-  r   r   r   rÇ   rÇ   �  sF   „ ò+ò:Cò 	Kò)òV@ò&
òFò"Mò	Yò,ò)ó Tr   rÇ   c                   óJ   — e Zd ZdZdZd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zy)ÚFormatTimestampTestg*; R]AÔAzSun, 27 Jan 2013 18:43:20 GMTc                 óN   — | j                  t        |«      | j                  «       y ©N)r&   r   ÚEXPECTED)r(   Úvalues     r   ÚcheckzFormatTimestampTest.checkX  s   € Ø×ÑÔ)¨%Ó0°$·-±-Õ@r   c                 ó:   — | j                  | j                  «       y r1  )r4  Ú	TIMESTAMP©r(   s    r   Útest_unix_time_floatz(FormatTimestampTest.test_unix_time_float[  s   € Ø�
‰
�4—>‘>Õ"r   c                 óL   — | j                  t        | j                  «      «       y r1  )r4  Úintr6  r7  s    r   Útest_unix_time_intz&FormatTimestampTest.test_unix_time_int^  s   € Ø�
‰
”3�t—~‘~Ó&Õ'r   c                 ó`   — | j                  t        j                  | j                  «      «       y r1  )r4  r¬   Úgmtimer6  r7  s    r   Útest_struct_timez$FormatTimestampTest.test_struct_timea  s   € Ø�
‰
”4—;‘;˜tŸ~™~Ó.Õ/r   c                 ó¬   — t        t        j                  | j                  «      «      }| j	                  dt        |«      «       | j                  |«       y )NrÛ   )Útupler¬   r=  r6  r&   Úlenr4  )r(   Útups     r   Útest_time_tuplez#FormatTimestampTest.test_time_tupled  s8   € Ü”D—K‘K §¡Ó/Ó0ˆØ×Ñ˜œC ›HÔ%Ø�
‰
�3�r   c                 óÆ   — | j                  t        j                  j                  | j                  t        j                  j
                  «      j                  d ¬«      «       y )N)Útzinfo)r4  ÚdatetimeÚfromtimestampr6  ÚtimezoneÚutcr~   r7  s    r   Útest_utc_naive_datetimez+FormatTimestampTest.test_utc_naive_datetimei  sC   € Ø�
‰
Ü×Ñ×+Ñ+Ø—‘¤× 1Ñ 1× 5Ñ 5óç‰g˜TˆgÓ"õ	
r   c                 ó²   — t        «       5  | j                  t        j                  j                  | j                  «      «       d d d «       y # 1 sw Y   y xY wr1  )r   r4  rF  Úutcfromtimestampr6  r7  s    r   Ú"test_utc_naive_datetime_deprecatedz6FormatTimestampTest.test_utc_naive_datetime_deprecatedp  s5   € ÜÕ!Ø�J‰J”x×(Ñ(×9Ñ9¸$¿.¹.ÓIÔJ÷ "×!Ñ!ús   ‹9AÁAc                 ó¦   — | j                  t        j                  j                  | j                  t        j                  j
                  «      «       y r1  )r4  rF  rG  r6  rH  rI  r7  s    r   Útest_utc_aware_datetimez+FormatTimestampTest.test_utc_aware_datetimet  s4   € Ø�
‰
Ü×Ñ×+Ñ+¨D¯N©N¼H×<MÑ<M×<QÑ<QÓRõ	
r   c           
      óÄ   — | j                  t        j                  j                  | j                  t        j                  t        j
                  d¬«      «      «      «       y )Néüÿÿÿ)Úhours)r4  rF  rG  r6  rH  Ú	timedeltar7  s    r   Útest_other_aware_datetimez-FormatTimestampTest.test_other_aware_datetimey  sA   € à�
‰
Ü×Ñ×+Ñ+Ø—‘¤× 1Ñ 1´(×2DÑ2DÈ2Ô2NÓ Oóõ	
r   N)rF   rG   rH   r6  r2  r4  r8  r;  r>  rC  rJ  rM  rO  rT  r   r   r   r/  r/  S  s;   „ à!€IØ.€HòAò#ò(ò0òò

òKò
ó

r   r/  c                   ó   — e Zd Zd„ Zd„ Zd„ Zy)ÚHTTPServerRequestTestc                 ó   — t        d¬«       y ©NÚ/)Úuri)r   r7  s    r   Útest_default_constructorz.HTTPServerRequestTest.test_default_constructor…  s   € ô 	˜cÖ"r   c                 ó\   — t        d¬«      }| j                  |j                  t        «       y rX  )r   ÚassertIsInstancer{   Úbytes©r(   Úrequests     r   Útest_body_is_a_byte_stringz0HTTPServerRequestTest.test_body_is_a_byte_string‹  s    € Ü#¨Ô,ˆØ×Ñ˜gŸl™l¬EÕ2r   c                 ól   — t        dt        ddgi«      ¬«      }| j                  dt        |«      «       y )NrY  ÚCanaryz	Coal Mine)rZ  rÕ   )r   r   ÚassertNotInÚreprr_  s     r   Ú"test_repr_does_not_contain_headersz8HTTPServerRequestTest.test_repr_does_not_contain_headers�  s3   € Ü#Øœ[¨(°[°MÐ)BÓCô
ˆð 	×Ñ˜¤4¨£=Õ1r   N)rF   rG   rH   r[  ra  rf  r   r   r   rV  rV  „  s   „ ò#ò3ó2r   rV  c                   ó   — e Zd ZdZdZdZd„ Zy)ÚParseRequestStartLineTestÚGETz/foozHTTP/1.1c                 ób  — dj                  | j                  | j                  | j                  g«      }t	        |«      }| j                  |j                  | j                  «       | j                  |j                  | j                  «       | j                  |j                  | j                  «       y )Nrò   )	rk   ÚMETHODÚPATHÚVERSIONr	   r&   ÚmethodÚpathÚversion)r(   Ú
start_lineÚparsed_start_lines      r   Útest_parse_request_start_linez7ParseRequestStartLineTest.test_parse_request_start_line›  s   € Ø—X‘X˜tŸ{™{¨D¯I©I°t·|±|ÐDÓEˆ
Ü4°ZÓ@ÐØ×ÑÐ*×1Ñ1°4·;±;Ô?Ø×ÑÐ*×/Ñ/°·±Ô;Ø×ÑÐ*×2Ñ2°D·L±LÕAr   N)rF   rG   rH   rk  rl  rm  rs  r   r   r   rh  rh  –  s   „ Ø€FØ€DØ€GóBr   rh  c                   ó*   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚParseCookieTestc                 ó4  — | j                  t        d«      dddœ«       | j                  t        d«      dddd	d
œ«       | j                  t        d«      ddi«       | j                  t        d«      ddi«       | j                  t        d«      dddddœ«       y)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Úfudger$  zkeebler=E=mc2r{  zE=mc2zkey:term=value:termzkey:termz
value:termza=b; c=[; d=r; f=hrO   Ú[ÚrÚh)rL   rá   Údr±   N©r&   r
   r7  s    r   Útest_python_cookiesz#ParseCookieTest.test_python_cookies¦  s§   € ð 	×ÑÜÐ4Ó5Ø¨Ñ1ô	
ð 	×ÑÜÐGÓHØ  }¸wÈCÑPô	
ð
 	×Ñœ oÓ6¸ÀGÐ8LÔMà×ÑÜÐ.Ó/°*¸lÐ1Kô	
ð 	×ÑÜÐ-Ó.°cÀÈ#ÐTWÑ0Xõ	
r   c                 ó|   — | j                  t        d«      dddœ«       | j                  t        d«      dddœ«       y )	Nza=b; Domain=example.comrO   zexample.com)rL   ÚDomainza=b; h=i; a=crá   r+  )rL   r€  r‚  r7  s    r   Útest_cookie_edgecasesz%ParseCookieTest.test_cookie_edgecases¿  s<   € à×ÑÜÐ2Ó3¸3È-Ñ5Xô	
ð
 	×Ñœ oÓ6¸cÈÑ8LÕMr   c                 ó’  — | j                  dt        d«      j                  «       «       | j                  t        d«      ddddœ«       | j                  t        d«      d	d
dœ«       | j                  t        d«      ddi«       | j                  t        d«      dt	        d«      i«       | j                  t        d«      dddœ«       y)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=drO   rˆ   r�  )rL   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)rU   r
   Úkeysr&   r   r7  s    r   Útest_invalid_cookiesz$ParseCookieTest.test_invalid_cookiesÈ  sÉ   € ð 	�‰ØÜÐ?Ó@×EÑEÓGô	
ð
 	×Ñœ mÓ4¸CÀSÈsÑ6SÔTà×ÑÜÐ.Ó/¸9ÈCÑ1Pô	
ð 	×ÑÜÐ9Ó:Ø  .Ð1ô	
ð
 	×ÑÜÐ0Ó1Ø”jÐ!2Ó3Ð4ô	
ð 	×ÑÜÐ9Ó:ÀÈ2Ñ<Nõ	
r   c                 ó¬   — g d¢}|D ]?  \  }}| j                  |«      5  t        |«      }| j                  |d   |«       d d d «       ŒA y # 1 sw Y   ŒLxY w)N))za="b=\""úb=")za="b=\\"úb=\)za="b=\="zb==)za="b=\n"zb=n)z
a="b=\042"rŽ  )z
a="b=\134"r�  )z
a="b=\377"u   b=Ã¿)z
a="b=\400"zb=400)z	a="b=\42"zb=42)za="b=\\042"zb=\042)za="b=\\134"zb=\134)z
a="b=\\\""úb=\")za="b=\\\042"r�  )za="b=\134\""r�  )za="b=\134\042"r�  rL   )ÚsubTestr
   r&   )r(   Úcasesrî   Údecodedrá   s        r   Útest_unquotezParseCookieTest.test_unquoteê  sS   € ò
ˆó" !&ÑˆG�WØ—‘˜gÕ&Ü  Ó)�Ø× Ñ   3¡¨Ô1÷ 'Ð&ñ !&ß&Ð&ús   ž!A
Á
A	c                 ó   — d}dD ]»  }| j                  |«      5  t        j                  «       }d||z  z   dz   }t        |«      d   }t        j                  «       }| j                  |d d d«       | j                  |dd  d	«       | j                  t	        |«      |d
z   «       | j                  ||z
  dd«       d d d «       Œ½ y # 1 sw Y   ŒÈxY w)Nr,  )r‡   z\134za="b=rˆ   rL   é   r�  éýÿÿÿz\\\é   é   zTest took too long)r‘  r¬   r
   r&   rA  Ú
assertLess)r(   r®   rî   r¯   rb   r3  Úends          r   Útest_unquote_largez"ParseCookieTest.test_unquote_large  sÁ   € ð ˆÛ%ˆGØ—‘˜gÕ&ÜŸ	™	›�Ø ¨1¡Ñ,¨sÑ2�Ü$ TÓ*¨3Ñ/�Ü—i‘i“k�Ø× Ñ   r¨ ¨FÔ3Ø× Ñ   r s ¨XÔ6Ø× Ñ ¤ U£¨Q°©UÔ3ð —‘  e¡¨QÐ0DÔE÷ 'Ð&ñ &ß&Ð&ús   ™B CÃC	N)rF   rG   rH   rƒ  r†  rŒ  r”  rœ  r   r   r   ru  ru  £  s   „ ò
ò2Nò 
òD2ó2Fr   ru  )-Útornado.httputilr   r   r   r   r   r   r	   r
   r   r   r   r   Útornado.escaper   r   Útornado.logr   Útornado.test.utilr   r  rF  rŒ   r  r¬   Úurllib.parserQ   ÚunittestÚtypingr   r   r   rn   r^  r   ÚTestCaser   rJ   r[   rs   rÇ   r/  rV  rh  ru  r   r   r   Ú<module>r¥     s'  ð÷÷ ÷ ó ÷ ,Ý Ý 0ã Û Û Û Û Û Û ç $Ñ $ð˜˜d 3¨¨U©Ð#3Ñ4°d¸3ÀÀXÁÐ;NÑ6OÐOÑPó ô/<�H×%Ñ%ô /<ôd'�(×#Ñ#ô 'ôJ˜×*Ñ*ô Jô"JT˜H×-Ñ-ô JTôZOT�h×'Ñ'ô OTôd,
˜(×+Ñ+ô ,
ôb2˜H×-Ñ-ô 2ô$
B × 1Ñ 1ô 
BôsF�h×'Ñ'õ sFr   