HEX
Server: Microsoft-IIS/10.0
System: Windows NT ITPWINWEBSVR22 10.0 build 20348 (Windows Server 2022) AMD64
User: www.conferencesearch.co.uk (0)
PHP: 8.3.30
Disabled: NONE
Upload Files
File: D:/Python311/Lib/test/__pycache__/test_httpservers.cpython-311.opt-2.pyc
�

��Vc}����	ddlmZddlmZmZmZmZddlmZm	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZddlm Z ddlZddl!m"Z"ddl#m$Z$dd	l#m%Z%e"j&d
���Gd�d
��Z'Gd�dej(��Z)Gd�dej*��Z+Gd�de+��Z,Gd�de+��Z-Gd�de+��Z.dZ/dZ0dZ1dZ2ej3e4e
d��oe
j5��dkd��Gd�de+����Z6Gd �d!e��Z7Gd"�d#e7��Z8Gd$�d%��Z9Gd&�d'ej*��Z:Gd(�d)ej*��Z;Gd*�d+ej*��Z<Gd,�d-ej*��Z=d.�Z>e?d/krej@��dSdS)0�)�OrderedDict)�BaseHTTPRequestHandler�
HTTPServer�SimpleHTTPRequestHandler�CGIHTTPRequestHandler)�server�
HTTPStatusN)�mock)�BytesIO)�support)�	os_helper)�threading_helperT)�modulec��eZdZd�Zdd�ZdS)�NoLogRequestHandlerc��dS�N�)�self�argss  �)D:\Python311\Lib\test\test_httpservers.py�log_messagezNoLogRequestHandler.log_message's����Nc��dS�N�r)r�ns  r�readzNoLogRequestHandler.read+s���rrr)�__name__�
__module__�__qualname__rrrrrrr&s7������
�
�
������rrc� �eZdZd�Zd�Zd�ZdS)�TestServerThreadc�`�tj�|��||_||_dSr)�	threading�Thread�__init__�request_handler�test_object)rr)r(s   rr'zTestServerThread.__init__0s/����!�!�$�'�'�'�.���&����rc��td|j��|_|jj���\|j_|j_|jj�	��d|_	|j�
d��|j���dS#|j���wxYw)N)�	localhostrg�������?)rr(r�socket�getsocknamer)�HOST�PORT�server_started�set�
serve_forever�server_close�rs r�runzTestServerThread.run5s��� �!1�4�3G�H�H���7;�{�7I�7U�7U�7W�7W�4����t�/�4���'�+�+�-�-�-����	'��K�%�%�d�+�+�+��K�$�$�&�&�&�&�&��D�K�$�$�&�&�&�&���s�6B+�+Cc�`�|j���|���dSr)r�shutdown�joinr4s r�stopzTestServerThread.stop?s'����������	�	�����rN)rr r!r'r5r9rrrr#r#/sA������'�'�'�
'�'�'�����rr#c�(�eZdZd�Zd�Zddifd�ZdS)�BaseTestCasec�8�tj��|_tj��t
_tj��|_	t||j��|_|j�
��|j	���dSr)r�threading_setup�_threadsr
�EnvironmentVarGuard�os�environr%�Eventr0r#r(�thread�start�waitr4s r�setUpzBaseTestCase.setUpEsu��(�8�:�:��
��2�4�4��
�'�o�/�/���&�t�T�-A�B�B������������ � �"�"�"�"�"rc��|j���d|_tj���tj|j�dSr)rCr9r@rA�__exit__r�threading_cleanupr>r4s r�tearDownzBaseTestCase.tearDownMsG������������
�
�������*�D�M�:�:�:�:r�GETNc���tj�|j|j��|_|j�||||��|j���Sr)�http�client�HTTPConnectionr.r/�
connection�request�getresponse)r�uri�method�body�headerss     rrQzBaseTestCase.requestSsO���+�4�4�T�Y��	�J�J���������T�7�;�;�;���*�*�,�,�,r)rr r!rFrJrQrrrr;r;DsO������#�#�#�;�;�;�#(�d�B�-�-�-�-�-�-rr;c��eZdZGd�dee��Zd�Zd�Zd�Zd�Z	d�Z
d�Zd	�Zd
�Z
d�Zd�Zd
�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�ZdS)�BaseHTTPServerTestCasec�L�eZdZdZdZd�Zd�Zd�Zd�Zd�Z	d�Z
d�Zd	�Zd
�Z
dS)�&BaseHTTPServerTestCase.request_handler�HTTP/1.1c���|�tj��|�dd��|�dd��|���dS)N�Content-Type�	text/html�
Connection�close��
send_responser	�
NO_CONTENT�send_header�end_headersr4s r�do_TESTz.BaseHTTPServerTestCase.request_handler.do_TEST^s]�����z�4�5�5�5����^�[�9�9�9����\�7�3�3�3��������rc���|�tj��|�dd��|�dd��|���dS)Nr]r^r_�
keep-aliverar4s r�do_KEEPz.BaseHTTPServerTestCase.request_handler.do_KEEPds]�����z�4�5�5�5����^�[�9�9�9����\�<�8�8�8��������rc�0�|�d��dS)N����
send_errorr4s r�do_KEYERRORz2BaseHTTPServerTestCase.request_handler.do_KEYERRORjs���O�O�C� � � � � rc�D�|�tj��dSr�rmr	�	NOT_FOUNDr4s r�do_NOTFOUNDz2BaseHTTPServerTestCase.request_handler.do_NOTFOUNDms���O�O�J�0�1�1�1�1�1rc�4�|�ddd��dS)Nrkz
Short MessagezThis is a long 
 explanationrlr4s r�do_EXPLAINERRORz6BaseHTTPServerTestCase.request_handler.do_EXPLAINERRORps)���O�O�C��;�
=�
=�
=�
=�
=rc��|�d��|�dd��|�dd��|���dS)Nrkr]r^r_r`)rbrdrer4s r�	do_CUSTOMz0BaseHTTPServerTestCase.request_handler.do_CUSTOMtsZ�����s�#�#�#����^�[�9�9�9����\�7�3�3�3��������rc�$�|�d��|�dd��|�dd��|���|jd�d��}|j�|��dS)Nrk�	X-Special�Dängerous Mindr_r`zx-special-incoming�utf-8)rbrdrerV�encode�wfile�write)rrUs  r�do_LATINONEHEADERz8BaseHTTPServerTestCase.request_handler.do_LATINONEHEADERzs������s�#�#�#����[�*;�<�<�<����\�7�3�3�3��������<� 4�5�<�<�W�E�E�D��J���T�"�"�"�"�"rc�d�|�t|jdd�����dS�N��rm�int�pathr4s r�
do_SEND_ERRORz4BaseHTTPServerTestCase.request_handler.do_SEND_ERROR��,���O�O�C��	�!�"�"�
�.�.�/�/�/�/�/rc�d�|�t|jdd�����dSr�r�r4s r�do_HEADz.BaseHTTPServerTestCase.request_handler.do_HEAD�r�rN)rr r!�protocol_version�default_request_versionrfrirnrrrtrvr~r�r�rrrr(rZZs�������%��",��	�	�	�	�	�	�	!�	!�	!�	2�	2�	2�	=�	=�	=�	�	�	�	#�	#�	#�	0�	0�	0�	0�	0�	0�	0�	0rr(c���t�|��tj�|j|j��|_|j���dSr)	r;rFrMrNrOr.r/�con�connectr4s rrFzBaseHTTPServerTestCase.setUp�sM�����4� � � ��;�-�-�d�i���C�C�����������rc��|j�dd��|j���}|�|jt
j��dS)NrK�/)r�rQrR�assertEqual�statusr	�NOT_IMPLEMENTED�r�ress  r�test_commandz#BaseHTTPServerTestCase.test_command�sN��������$�$�$��h�"�"�$�$�������Z�%?�@�@�@�@�@rc��d|j_|j�dd��|j���|j���}|�|jtj��dS)Nz	HTTP/1.1
�XYZBOGUSr��	r��
_http_vsn_str�
putrequest�
endheadersrRr�r�r	r�r�s  r�test_request_line_trimmingz1BaseHTTPServerTestCase.test_request_line_trimming�sl��!-��������J��,�,�,���������h�"�"�$�$�������Z�%?�@�@�@�@�@rc��d|j_|j�dd��|j���|j���}|�|jtj��dS)N�FUBARrKr��	r�r�r�r�rRr�r�r	�BAD_REQUESTr�s  r�test_version_bogusz)BaseHTTPServerTestCase.test_version_bogus�sl��!(��������E�3�'�'�'���������h�"�"�$�$�������Z�%;�<�<�<�<�<rc��d|j_|j�dd��|j���|j���}|�|jtj��dS)Nz
HTTP/9.9.9rKr�r�r�s  r�test_version_digitsz*BaseHTTPServerTestCase.test_version_digits�sl��!-��������E�3�'�'�'���������h�"�"�$�$�������Z�%;�<�<�<�<�<rc��d|j_|j�dd��|j���|j���}|�|jtj��dS)NrrKr�r�r�s  r�test_version_none_getz,BaseHTTPServerTestCase.test_version_none_get�sl��!#��������E�3�'�'�'���������h�"�"�$�$�������Z�%?�@�@�@�@�@rc��d|j_|j�dd��|j���|j���}|�|jtj��dS)Nr�CUSTOMr�r�r�s  r�test_version_nonez(BaseHTTPServerTestCase.test_version_none�sl��!#��������H�c�*�*�*���������h�"�"�$�$�������Z�%;�<�<�<�<�<rc��d|j_d|j_|j�dd��|j���|j���}|�|jtj	��dS)N�czHTTP/9.9rKr�)
r��	_http_vsnr�r�r�rRr�r�r	�HTTP_VERSION_NOT_SUPPORTEDr�s  r�test_version_invalidz+BaseHTTPServerTestCase.test_version_invalid�sv������!+��������E�3�'�'�'���������h�"�"�$�$�������Z�%J�K�K�K�K�Krc��d|j_|j�dd��|j���|j���}|�|jtj��dSrr�r�s  r�test_send_blankz&BaseHTTPServerTestCase.test_send_blank�sl��!#��������B��#�#�#���������h�"�"�$�$�������Z�%;�<�<�<�<�<rc� �|j�dd��|j�dd��|j���|j���}|�|jtj��dS)NrKr�r_r`)	r�r��	putheaderr�rRr�r�r	r�r�s  r�test_header_closez(BaseHTTPServerTestCase.test_header_close�sz������E�3�'�'�'�����<��1�1�1���������h�"�"�$�$�������Z�%?�@�@�@�@�@rc�8�d|j_|j�dd��|j�dd��|j���|j���}|�|jtj	��dS)Nr[rKr�r_rh)
r�r�r�r�r�rRr�r�r	r�r�s  r�test_header_keep_alivez-BaseHTTPServerTestCase.test_header_keep_alive�s���!+��������E�3�'�'�'�����<��6�6�6���������h�"�"�$�$�������Z�%?�@�@�@�@�@rc��|j�dd��|j���}|�|jt
j��dS)N�TESTr�)r�rQrRr�r�r	rcr�s  r�test_handlerz#BaseHTTPServerTestCase.test_handler�sN��������%�%�%��h�"�"�$�$�������Z�%:�;�;�;�;�;rc�4�|j�dd��|j���}|�|�d��d��|j�dd��|�|jj��dS)N�KEEPr�r_rhr�)r�rQrRr��	getheader�
addCleanupr`r�s  r�test_return_header_keep_alivez4BaseHTTPServerTestCase.test_return_header_keep_alive�s���������%�%�%��h�"�"�$�$��������|�4�4�l�C�C�C�������%�%�%�������'�'�'�'�'rc��|j�dd��|j���}|�|jd��dS)N�KEYERRORr�rk�r�rQrRr�r�r�s  r�test_internal_key_errorz.BaseHTTPServerTestCase.test_internal_key_error�sK�������S�)�)�)��h�"�"�$�$�������S�)�)�)�)�)rc��|j�dd��|j���}|�|jd��dS)Nr�r�rkr�r�s  r�test_return_custom_statusz0BaseHTTPServerTestCase.test_return_custom_status�sK�������3�'�'�'��h�"�"�$�$�������S�)�)�)�)�)rc��|j�dd��|j���}|�|jd��|�t
|�d������dS)N�EXPLAINERRORr�rk�Content-Length)r�rQrRr�r��
assertTruer�r�r�s  r�test_return_explain_errorz0BaseHTTPServerTestCase.test_return_explain_error�sr��������-�-�-��h�"�"�$�$�������S�)�)�)�����C�M�M�*:�;�;�<�<�=�=�=�=�=rc�>�|j�ddddi���|j���}|�|�d��d��|�|���d�d����dS)	N�LATINONEHEADERr�zX-Special-IncominguÄrger mit Unicode�rVrxryrz)r�rQrRr�r�rr{r�s  r�test_latin1_headerz)BaseHTTPServerTestCase.test_latin1_header�s�������)�3� �(<�9
��	�	�	��h�"�"�$�$��������{�3�3�5F�G�G�G���������%9�%@�%@��%I�%I�J�J�J�J�Jrc�f�|j�dd��|j���}|�|jt
j��|���}|�t|�	d����t|����dS)N�NOTFOUNDr�r�)r�rQrRr�r�r	rqrr�r��len)rr��datas   r�test_error_content_lengthz0BaseHTTPServerTestCase.test_error_content_length�s��������S�)�)�)��h�"�"�$�$�������Z�%9�:�:�:��x�x�z�z������S�]�]�+;�<�<�=�=�s�4�y�y�I�I�I�I�Irc���tjtjf}tjtjtjtjtjfD�]}|j�dd�|����|j�	��}|�
||j��|�
d|�d����|�
d|�d����||vr)|�
d|�d����|�
��}|�
d|����dS)N�
SEND_ERROR�/{}r�r]�Transfer-Encodingr)r	�NOT_MODIFIED�
RESET_CONTENTrc�
PROCESSING�SWITCHING_PROTOCOLSr�rQ�formatrRr�r�r�r�r�allow_transfer_encoding_codes�coder�r�s     r�test_send_errorz&BaseHTTPServerTestCase.test_send_errors<��)3�)@�)3�)A�)C�%��*�J�,C��*�J�,D��3�5�	(�	(�D�
�H���\�5�<�<��+=�+=�>�>�>��(�&�&�(�(�C����T�3�:�.�.�.����T�3�=�=�1A�#B�#B�C�C�C����T�3�=�=��#@�#@�A�A�A��8�8�
K�� � ��s�}�}�5H�'I�'I�J�J�J��8�8�:�:�D����S�$�'�'�'�'�	(�	(rc��tjtjf}tjtjtjtjtjfD�]�}|j�dd�|����|j�	��}|�
||j��|tjkrc|�t|�d����dk��|�d|�d����nR|�
d|�d����|�
d|�d����||vr)|�
d|�d����|���}|�
d|�����dS)	N�HEADr�r�rr^r]r�r)r	r�r��OKrcr�r�rQr�rRr�r�r�r�r��assertInrr�s     r�test_head_via_send_errorz/BaseHTTPServerTestCase.test_head_via_send_errors���)3�)@�)3�)A�)C�%��]�J�$9��,�j�.F��3�5�	(�	(�D�
�H���V�U�\�\�$�%7�%7�8�8�8��(�&�&�(�(�C����T�3�:�.�.�.��z�}�$�
F�����C�M�M�2B�$C�$C� D� D�q� H�I�I�I��
�
�k�3�=�=��+H�+H�I�I�I�I�� � ��s�}�}�5E�'F�'F�G�G�G�� � ��s�}�}�^�'D�'D�E�E�E��8�8�
K�� � ��s�}�}�5H�'I�'I�J�J�J��8�8�:�:�D����S�$�'�'�'�'�!	(�	(rN)rr r!rrr(rFr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrXrXYs�������,0�,0�,0�,0�,0�-�/E�,0�,0�,0�\���
A�A�A�
A�A�A�=�=�=�=�=�=�A�A�A�=�=�=�L�L�L�=�=�=�A�A�A�A�A�A�<�<�<�
(�(�(�*�*�*�
*�*�*�
>�>�>�K�K�K�J�J�J�(�(�(�"(�(�(�(�(rrXc�6�eZdZGd�de��Zd�Zd�ZdS)�RequestHandlerLoggingTestCasec�"�eZdZdZdZd�Zd�ZdS)�-RequestHandlerLoggingTestCase.request_handlerr[c�l�|�tj��|���dSr)rbr	r�rer4s r�do_GETz4RequestHandlerLoggingTestCase.request_handler.do_GET-s0�����z�}�-�-�-��������rc�F�|�tjd��dS)NzFile not foundrpr4s r�do_ERRORz6RequestHandlerLoggingTestCase.request_handler.do_ERROR1s ���O�O�J�0�2B�C�C�C�C�CrN)rr r!r�r�r�r�rrrr(r�)sC������%��",��	�	�	�	D�	D�	D�	D�	Drr(c���tj�|j|j��|_|j���tj��5}|j�	dd��|j�
��ddd��n#1swxYwY|�|����
d����dS)NrKr�z"GET / HTTP/1.1" 200 -
)rMrNrOr.r/r�r�r�captured_stderrrQrRr��getvalue�endswith)r�errs  r�test_getz&RequestHandlerLoggingTestCase.test_get4s���;�-�-�d�i���C�C����������
�
$�
&�
&�	#�#��H���U�C�(�(�(��H� � �"�"�"�	#�	#�	#�	#�	#�	#�	#�	#�	#�	#�	#����	#�	#�	#�	#�	
����L�L�N�N�#�#�$>�?�?�	A�	A�	A�	A�	A��5B�B!�$B!c�Z�tj�|j|j��|_|j���tj��5}|j�	dd��|j�
��ddd��n#1swxYwY|����d��}|�
|d�d����|�
|d�d����dS)N�ERRORr��
rz code 404, message File not foundr�z"ERROR / HTTP/1.1" 404 -)rMrNrOr.r/r�r�rr�rQrRr��splitr�r�)rr��liness   r�test_errz&RequestHandlerLoggingTestCase.test_err?s-���;�-�-�d�i���C�C����������
�
$�
&�
&�	#�#��H���W�c�*�*�*��H� � �"�"�"�	#�	#�	#�	#�	#�	#�	#�	#�	#�	#�	#����	#�	#�	#�	#������$�$�T�*�*������a��)�)�*L�M�M�N�N�N�����a��)�)�*D�E�E�F�F�F�F�Fr�N)rr r!rr(r�r�rrrr�r�(sm������	D�	D�	D�	D�	D�0�	D�	D�	D�	A�	A�	A�
G�
G�
G�
G�
Grr�c�H��eZdZGd�dee��Z�fd�Z�fd�Zdd�Ze	j
ejdkd��e	j
ejd	kd
��e	j
ejd��d�������Zd
�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Z�xZS)�SimpleHTTPServerTestCasec��eZdZdS)�(SimpleHTTPServerTestCase.request_handlerN�rr r!rrrr(r�M��������rr(c���t�����tj��|_tj��}tj|��d|_tj	|���|_
tj�|j
��|_
d|j
z|_tj�|j
d��}t!|d��5}|�|j��|���ddd��n#1swxYwYtj|��j}t*j�|t*jj��}|�d���|_t6j�|���d�	��|_dS)
NsWe are the knights who say Ni!)�dirr��test�wbr)�microsecondT��usegmt) �superrFr@�getcwd�cwd�tempfile�
gettempdir�chdirr��mkdtemp�tempdirr��basename�tempdir_name�base_urlr8�openr}�flush�stat�st_mtime�datetime�
fromtimestamp�timezone�utc�replace�last_modif_datetime�email�utils�
formatdate�	timestamp�last_modif_header)r�basetempdir�tempname�temp�mtime�
last_modif�	__class__s      �rrFzSimpleHTTPServerTestCase.setUpPs����
���
�
�����9�;�;����)�+�+��
������5��	��'�K�8�8�8����G�,�,�T�\�:�:����d�/�/��
��7�<�<���f�5�5��
�(�D�
!�
!�	�T��J�J�t�y�!�!�!��J�J�L�L�L�	�	�	�	�	�	�	�	�	�	�	����	�	�	�	����!�!�*���&�4�4�U���!�#�#�
�#-�#5�#5�!�#5�#D�#D�� �!&��!7�!7�� � �"�"�4�"8�"1�"1����s�//D*�*D.�1D.c�
��	tj|j��	tj|j��n#YnxYwt
�����dS#t
�����wxYwr)r@r
r�shutil�rmtreerrrJ)rr$s �rrJz!SimpleHTTPServerTestCase.tearDownesz���	��H�T�X����
��
�d�l�+�+�+�+��
�������G�G���������E�G�G���������s�A �7�A �;�A � "BNc�$�����fd�}d�|�_����}|����|��j|��|��j��|r|�||��|��jd��|��j�	dd��d��|���d��dd����
��|S)Nc�&��	�j�d�_dSr)�fp)�reader�responses��r�
close_connzDSimpleHTTPServerTestCase.check_status_and_reason.<locals>.close_connps���
��[�F��H�K�K�Kr�
r_r`�rzConnection should be closed)�_close_connrr�r�r��assertIsNotNone�reason�version�msg�getr`)rr,r�r�r-rUr+s `    @r�check_status_and_reasonz0SimpleHTTPServerTestCase.check_status_and_reasonos����	�	�	�	�	�	���)����}�}��������!�!�!������&�1�1�1����X�_�-�-�-��	)����T�4�(�(�(�	
����)�2�.�.�.������)�)�,��@�@�'�J�J�J�������R���#�/L�M�M�M��������r�darwinz2undecodable name cannot always be decoded on macOS�win32z+undecodable name cannot be decoded on win32z!need os_helper.TESTFN_UNDECODABLEc���tj��}tjtj��dz}t
tj�|j	|��d��5}|�
tj��ddd��n#1swxYwY|�|jdz��}tj
dkr&tj|j	��D]}|dkr|}n�
|�|t j��}t$j�|d���}|�d|z�|d	��|��|�d
t/j|d���z�|d	��|��|�|jdz|z��}|�|t jtj�
��dS)Nz.txtrr�r7r�
surrogatepass)�errorsz	href="%s"�surrogateescape�>%s<F��quote�r�)�sys�getfilesystemencodingr@�fsdecoder
�TESTFN_UNDECODABLErr�r8rr}rQr�platform�listdirr6r	r��urllib�parser?r�r{�html�escape)r�enc�filename�fr,�namerU�
quotednames        r�test_undecodable_filenamez2SimpleHTTPServerTestCase.test_undecodable_filename�s���'�)�)���;�y�;�<�<�v�E��
�"�'�,�,�t�|�X�6�6��
=�
=�	2��
�G�G�I�0�1�1�1�	2�	2�	2�	2�	2�	2�	2�	2�	2�	2�	2����	2�	2�	2�	2��<�<��
�� 3�4�4���<�8�#�	��
�4�<�0�0�
�
���6�>��#�H��E���+�+�H�j�m�D�D���\�'�'���'�I�I�
��
�
�{�Z�/��v�c�#4�5�5�t�	=�	=�	=��
�
�v���H�E� B� B� B�B��v�c�#4�5�5�t�	=�	=�	=��<�<��
�� 3�j� @�A�A���$�$�X�z�}�*3�*F�	%�	H�	H�	H�	H�	Hs�( B�B�Bc�>�	tjtj�|jd����d|j�d�}|�d�}|�|��}|�|tj	��|�
d��}|�||d���d|��}|�|��}|�|tj	��|�
d��}|�|�
d��|���|�||d	���d|��}|�|��}|�|tj	��|�|�
d��|��d
|��}|�d�}|�|��}|�|tj	��|�
d��}|�|�
d
��|���dS)N�existing_directoryz2/python.org/..%2f..%2f..%2f..%2f..%2f../%0a%0d/../z/existing_directoryr��Locationznon-attack failed!�r4�//zcExpected Location header to start with a single / and end with a / as this is a directory redirect.zhttps://pypi.org/)r@�mkdirr�r8rrrQr6r	�MOVED_PERMANENTLYr�r��assertFalse�
startswithr�)	r�url�expected_locationr,�location�
attack_url�attack3_url�attack_scheme_netloc_2slash_url�expected_scheme_netloc_locations	         r�3test_get_dir_redirect_location_domain_injection_bugzLSimpleHTTPServerTestCase.test_get_dir_redirect_location_domain_injection_bug�s*��	�	������d�l�,@�A�A�B�B�B�i�4�CT�i�i�i��"�I�I�I���<�<��$�$���$�$�X�z�/K�L�L�L��%�%�j�1�1������#4�:N��O�O�O���Y�Y�
��<�<�
�+�+���$�$�X�z�/K�L�L�L��%�%�j�1�1������,�,�T�2�2���A�A�A�����#4�@�	�	A�	A�	A�
!�3�j�j���<�<��,�,���$�$�X�z�/K�L�L�L�����+�+�J�7�7�9J�K�K�K�+D�c�*C�*C�'�-L�*O�*O�*O�'��<�<� ?�@�@���$�$�X�z�/K�L�L�L��%�%�j�1�1��	
����+�+�,?�@�@�h��O�O�O�O�Orc�*�|�|jdz��}|�|tj|j���|�|jdz��}|�|tj��|�|jdz��}|�|tj��|�|j��}|�|tj��|�|�	d��d��|�|jdz��}|�|tj��|�|jdz��}|�|tj��|�|�	d	��|jd
z��|�d��}|�|tj��|�d��}|�|tj��d
}ttj�
|jd��d��5}|�|��ddd��n#1swxYwY|�|jdz��}|�|tj|��tjdkr�tj��dkr�tj|jd��	|�|jdz��}|�|tj��tj|jd��dS#tj|jd��wxYwdSdS)N�/testr@�/test/r�r��0�/?hi=2�?hi=1rS�/?hi=1z/ThisDoesNotExistz/ThisDoesNotExist/sDummy index file
z
index.htmlr�posixri�)rQrr6r	r�r�rqrWr�r�rr@r�r8rr}rN�geteuid�chmodr)rr,r�rMs    rr�z!SimpleHTTPServerTestCase.test_get�sD���<�<��
�� 7�8�8���$�$�X�z�}�4�9�$�M�M�M��<�<��
�� 8�9�9���$�$�X�z�/C�D�D�D��<�<��
�� 3�4�4���$�$�X�z�}�=�=�=��<�<��
�.�.���$�$�X�z�/K�L�L�L�����+�+�,<�=�=�s�C�C�C��<�<��
�� 8�9�9���$�$�X�z�}�=�=�=��<�<��
�� 7�8�8���$�$�X�z�/K�L�L�L�����+�+�J�7�7����1�	3�	3�	3��<�<� 3�4�4���$�$�X�z�/C�D�D�D��<�<� >�?�?���$�$�X�z�/C�D�D�D�&��
�"�'�,�,�t�0�,�?�?��
F�
F�	�!�
�G�G�D�M�M�M�	�	�	�	�	�	�	�	�	�	�	����	�	�	�	��<�<��
�� 3�4�4���$�$�X�z�}�d�C�C�C��7�g��	.�"�*�,�,�!�"3�	.��H�T�\�1�%�%�%�
.��<�<��
��(;�<�<���,�,�X�z�7K�L�L�L�����u�-�-�-�-�-������u�-�-�-�-����
	.�	.�	.�	.s�,J�J�J�=M2�2Nc�f�|�|jdzd���}|�|tj��|�|�d��tt|j	������|�|�d��d��dS)Nrcr��rTzcontent-lengthzcontent-typezapplication/octet-stream)
rQrr6r	r�r�r��strr�r��rr,s  r�	test_headz"SimpleHTTPServerTestCase.test_head�s����<�<��M�G�#�F� �4�4���$�$�X�z�}�=�=�=�����+�+�,<�=�=��S���^�^�,�,�	.�	.�	.�����+�+�N�;�;�3�	5�	5�	5�	5�	5rc��	tj���}|j|d<|�|jdz|���}|�|tj��|j	tjd���z}tj���}tj�
|d���|d<|�|jdz|���}|�|tj��dS)N�If-Modified-Sincercr�r�)�hoursTr)r�message�MessagerrQrr6r	r�rr�	timedeltar�format_datetime)rrVr,�new_dts    r�test_browser_cachez+SimpleHTTPServerTestCase.test_browser_caches���	��-�'�'�)�)��'+�'=��#�$��<�<��
�� 7��<�I�I���$�$�X�z�/F�G�G�G��)�H�,>�Q�,G�,G�,G�G���-�'�'�)�)��',�{�'B�'B�6��(C�(�(��#�$��<�<��
�� 7��<�I�I���$�$�X�z�/F�G�G�G�G�Grc�F�|j}|tjd���z
}tj���}tj�|d���|d<|�|j	dz|���}|�
|tj��dS)Nim)�daysTrrrrcr�)
rrrvrrtrurrwrQrr6r	r�)r�dt�old_dtrVr,s     r�test_browser_cache_file_changedz8SimpleHTTPServerTestCase.test_browser_cache_file_changeds���
�
%���h�(�c�2�2�2�2���-�'�'�)�)��',�{�'B�'B�6��(C�(�(��#�$��<�<��
�� 7��<�I�I���$�$�X�z�}�=�=�=�=�=rc���tj���}|j|d<d|d<|�|jdz|���}|�|tj��dS)Nrr�*z
If-None-Matchrcr�)	rrtrurrQrr6r	r�)rrVr,s   r�,test_browser_cache_with_If_None_Match_headerzESimpleHTTPServerTestCase.test_browser_cache_with_If_None_Match_header#si���-�'�'�)�)��'+�'=��#�$�#&��� ��<�<��
�� 7��<�I�I���$�$�X�z�}�=�=�=�=�=rc�P�|�dd���}|�|tj��|�dd���}|�|tj��|�dd���}|�|tj��dS)Nr��FOOrm�custom�GETs)rQr6r	r�ros  r�test_invalid_requestsz.SimpleHTTPServerTestCase.test_invalid_requests,s����<�<��E�<�2�2���$�$�X�z�/I�J�J�J��<�<��H�<�5�5���$�$�X�z�/I�J�J�J��<�<��F�<�3�3���$�$�X�z�/I�J�J�J�J�Jrc���	|�|jdz��}|�|tj|j���|jd}|�||j��dS)Nrcr@z
Last-modified)	rQrr6r	r�r�rVr�r)rr,rs   r�test_last_modifiedz+SimpleHTTPServerTestCase.test_last_modified5sn��	��<�<��
�� 7�8�8���$�$�X�z�}�4�9�$�M�M�M�$�,�_�=�����*�D�,B�C�C�C�C�Crc�L�|�|jdz��}|�|tj|j���|�|jdz��}|�|tj��|�|jdz��}|�|tj��|�|j��}|�|tj��|�|jdz��}|�|tj��|�|jdz��}|�|tj��|�|�	d��|jdz��dS)	Nrcr@rdr�rfrgrSrh)
rQrr6r	r�r�rqrWr�r�ros  r�test_path_without_leading_slashz8SimpleHTTPServerTestCase.test_path_without_leading_slash>sj���<�<�� 1�G� ;�<�<���$�$�X�z�}�4�9�$�M�M�M��<�<�� 1�H� <�=�=���$�$�X�z�/C�D�D�D��<�<�� 1�C� 7�8�8���$�$�X�z�}�=�=�=��<�<�� 1�2�2���$�$�X�z�/K�L�L�L��<�<�� 1�H� <�=�=���$�$�X�z�}�=�=�=��<�<�� 1�G� ;�<�<���$�$�X�z�/K�L�L�L�����+�+�J�7�7��*�X�5�	7�	7�	7�	7�	7rc��d}tj�|j|��}	t	|d�����n%#t$rtjd|z���wxYw	|�	|j
dz��}|�|tj
��}|j���}tj|��n#tj|��wxYw|�|��dt%j|d���z}|�|�|��|��dS)Nz<test&>.txtrz-Can not create file %s on current file systemr�r=Fr>)r@r�r8rrr`�OSError�unittest�SkipTestrQrr6r	r�rV�get_content_charset�unlinkr1rIrJr�r{)rrL�fullpathr,rUrK�	html_texts       r�test_html_escape_filenamez2SimpleHTTPServerTestCase.test_html_escape_filenameNsE�� ���7�<�<���h�7�7��	9���4� � �&�&�(�(�(�(���	9�	9�	9��#�%-�/7�%8�9�9�
9�	9����	 ��|�|�D�M�C�$7�8�8�H��/�/��*�-�H�H�D��"�6�6�8�8�C��I�h������B�I�h�����������S�!�!�!��T�[���?�?�?�?�	��
�
�i�&�&�s�+�+�T�2�2�2�2�2s�"A�"A.�2AC�C3r)rr r!rrr(rFrJr6r��skipIfrArE�
skipUnlessr
rDrPrar�rpryr~r�r�r�r�r��
__classcell__�r$s@rr�r�Ls��������
�
�
�
�
�-�/G�
�
�
�1�1�1�1�1�*���������2�X�_�S�\�X�-�I�K�K��X�_�S�\�W�,�B�D�D��X���5�<�>�>�H�H�>�>�D�D�K�K�H�./P�/P�/P�b%.�%.�%.�N5�5�5�H�H�H�$	>�	>�	>�>�>�>�K�K�K�D�D�D�7�7�7� 3�3�3�3�3�3�3rr�zD#!%s

print("Content-type: text/html")
print()
print("Hello World")
a�#!%s
import os
import sys
import urllib.parse

print("Content-type: text/html")
print()

content_length = int(os.environ["CONTENT_LENGTH"])
query_string = sys.stdin.buffer.read(content_length)
params = {key.decode("utf-8"): val.decode("utf-8")
            for key, val in urllib.parse.parse_qsl(query_string)}

print("%%s, %%s, %%s" %% (params["spam"], params["eggs"], params["bacon"]))
zR#!%s
import os

print("Content-type: text/html")
print()

print(os.environ["%s"])
a'#!%s
import os

print("X-ambv: was here")
print("Content-type: text/html")
print()
print("<pre>")
for k, v in os.environ.items():
    try:
        k.encode('ascii')
        v.encode('ascii')
    except UnicodeEncodeError:
        continue  # see: BPO-44647
    print(f"{k}={v}")
print("</pre>")
rjz7This test can't be run reliably as root (issue #13308).c��eZdZGd�dee��Zej�d��Zd�Z	d�Z
d�Zd�Zd�Z
d	�Zd
�Zd�Zd�Zd
�Zd�Zd�Zd�Zd�Zd�Zd�ZdS)�CGIHTTPServerTestCasec��eZdZdS)�%CGIHTTPServerTestCase.request_handlerNr�rrrr(r��r�rr(�asciic�
�t�|��tj��|_tj��|_tj�	|jd��|_
tj�	|j
d��|_tj�	|jd��|_tj�	|jd��|_
tj�	|j
d��|_tj|j
��tj|j��tj|j��tj|j
��tj|j��d|_d|_d|_d|_d|_d|_d|_t/j��r[tj�	|jd��|_t5j|j�����|_nt:j|_	|j�d��n9#t@$r,|�!��|�"d��YnwxYwtj�	|jd��|_tG|jd	d�
��5}|�$tJ|jz��ddd��n#1swxYwYtj&|jd��tj�	|j
d��|_tG|jd	d�
��5}|�$tJ|jz��ddd��n#1swxYwYtj&|jd��tj�	|j
d
��|_tG|jd	d�
��5}|�$tN|jz��ddd��n#1swxYwYtj&|jd��tj�	|jd��|_tG|jd	d�
��5}|�$tJ|jz��ddd��n#1swxYwYtj&|jd��tj�	|j
d��|_tG|jd	d�
��5}|�$tP|jdfz��ddd��n#1swxYwYtj&|jd��tj�	|jd��|_tG|jd	d�
��5}|�$tJ|jz��ddd��n#1swxYwYtj&|jd��tj�	|j
d��|_)tG|j)d	d�
��5}|�$tT|jz��ddd��n#1swxYwYtj&|j)d��tj+|j��dS)Nzcgi-binz	child-dir�subr��pythonrzz0Python executable path is not encodable to utf-8znocgi.py�w)�encodingi�zfile1.pyzfile2.pyzfile3.pyzfile4.py�QUERY_STRINGzfile5.pyzfile6.py),r;rFr@rrrr�
parent_dirr�r8�cgi_dir�
cgi_child_dir�	sub_dir_1�	sub_dir_2�cgi_dir_in_sub_dirrV�
nocgi_path�
file1_path�
file2_path�
file3_path�
file4_path�
file5_path�_pythonexe_symlinkr
�can_symlink�	pythonexer�
PythonSymlink�	__enter__rA�
executabler{�UnicodeEncodeErrorrJ�skipTestrr}�	cgi_file1rk�	cgi_file2�	cgi_file4�
file6_path�	cgi_file6r
)rr*�file1�file2�file3�file4�file5�file6s        rrFzCGIHTTPServerTestCase.setUp�s������4� � � ��9�;�;���"�*�,�,����w�|�|�D�O�Y�?�?����W�\�\�$�,��D�D�������d�o�u�=�=�������d�n�e�<�<���"$�'�,�,�t�~�y�"I�"I���
�������
���#�$�$�$�
���� � � �
���� � � �
���(�)�)�)�������������������#'���� �"�"�	,��W�\�\�$�/�8�D�D�D�N�&-�&;�D�N�&K�&K�&U�&U�&W�&W�D�#�#� �^�D�N�	N�
�N�!�!�'�*�*�*�*��!�	N�	N�	N��M�M�O�O�O��M�M�L�M�M�M�M�M�	N�����'�,�,�t��
�C�C���
�$�/�3��
9�
9�
9�	1�R��H�H�Y���/�0�0�0�	1�	1�	1�	1�	1�	1�	1�	1�	1�	1�	1����	1�	1�	1�	1�
����%�(�(�(��'�,�,�t�|�Z�@�@���
�$�/�3��
9�
9�
9�	4�U��K�K�	�D�N�2�3�3�3�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4����	4�	4�	4�	4�
����%�(�(�(��'�,�,�t�|�Z�@�@���
�$�/�3��
9�
9�
9�	4�U��K�K�	�D�N�2�3�3�3�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4����	4�	4�	4�	4�
����%�(�(�(��'�,�,�t�'9�:�F�F���
�$�/�3��
9�
9�
9�	4�U��K�K�	�D�N�2�3�3�3�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4����	4�	4�	4�	4�
����%�(�(�(��'�,�,�t�|�Z�@�@���
�$�/�3��
9�
9�
9�	F�U��K�K�	�T�^�^�$D�D�E�E�E�	F�	F�	F�	F�	F�	F�	F�	F�	F�	F�	F����	F�	F�	F�	F�
����%�(�(�(��'�,�,�t�'>�
�K�K���
�$�/�3��
9�
9�
9�	4�U��K�K�	�D�N�2�3�3�3�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4����	4�	4�	4�	4�
����%�(�(�(��'�,�,�t�|�Z�@�@���
�$�/�3��
9�
9�
9�	4�U��K�K�	�D�N�2�3�3�3�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4����	4�	4�	4�	4�
����%�(�(�(�
����!�!�!�!�!s��I&�&3J�J� #L�L�L�5#N$�$N(�+N(�
#P9�9P=�P=�#S�S�S�4%U%�%U)�,U)�#W:�:W>�W>� #Z�Z�Zc���	tj|j��|jr|j�ddd��|jrtj|j��|jrtj|j��|jrtj|j��|j	rtj|j	��|j
rtj|j
��|jrtj|j��|jrtj|j��tj
|j��tj
|j��tj
|j��tj
|j��tj
|j��tj
|j��t(�|��dS#t(�|��wxYwr)r@r
rr�rHr��remover�r�r�r�r�r��rmdirr�r�r�r�r�r�r;rJr4s rrJzCGIHTTPServerTestCase.tearDown�s���	(��H�T�X�����&�
C��'�0�0��t�T�B�B�B���
+��	�$�/�*�*�*���
+��	�$�/�*�*�*���
+��	�$�/�*�*�*���
+��	�$�/�*�*�*���
+��	�$�/�*�*�*���
+��	�$�/�*�*�*���
+��	�$�/�*�*�*��H�T�'�(�(�(��H�T�\�"�"�"��H�T�,�-�-�-��H�T�^�$�$�$��H�T�^�$�$�$��H�T�_�%�%�%��!�!�$�'�'�'�'�'��L�!�!�$�'�'�'�'���s�F2G�G,c
���idd�dt�dt�dd�dd�dd�dd�d	d
�d
d
�dd�d
d�dd�dd�dd�dd�dd�dd�dddddtddtddd��}|���D]�\}}t|t��r7t	|t
��r"|�|tj|���Qtj|��}|�	||d|�d|�d|�������dS)NrrUz..z/.//..r�z/\z//\z/.//�cgi-bin/file1.py�/cgi-bin/file1.py�az//az/az./az./C:/z/C:/z/a/bz/a/b/z/a/b/.z/a/b/dz/a/b/d/fz/a/b/fz/a/fz//f)z	/a/b/c/..z/a/b/c/../dz/a/b/c/../d/e/../fz/a/b/c/../d/e/../../fz/a/b/c/../d/e/.././././..//fz../a/b/c/../d/e/.././././..//fz/a/b/c/../d/e/../../../fz/a/b/c/../d/e/../../../../fz/a/b/c/../d/e/../../../../../fz/a/b/c/../d/e/../../../../f/..z /a/b/c/../d/e/../../../../f/../.zpath = z	
Got:    z	
Wanted: rT)
�
IndexError�items�
isinstance�type�
issubclass�	Exception�assertRaisesr�_url_collapse_pathr�)r�test_vectorsr��expected�actuals     r�test_url_collapse_pathz,CGIHTTPServerTestCase.test_url_collapse_path
s���
���
��*�
�
�j�
�
��	
�

�$�
�
�6�

�
�D�
�
� 3�
�
 �!4�
�
��
�
�%�
�
�5�
�
�5�
�
�V�
�
�F�
� 
�W�!
�"
�g�#
�$!�#�",�%-�,4�.8�(.�+0�.8�.2�04�9
�
�
��<+�0�0�2�2�	;�	;�N�D�(��(�D�)�)�
;�j��9�.M�.M�
;��!�!�(�"(�";�T�C�C�C�C� �2�4�8�8��� � ��6�6�"&�$�$������&:�!�;�;�;�;�
	;�	;rc���|�d��}|�|���|�d��|jfd|jzdtjf��dS)Nr��Content-type�Hello Worldr^)rQr�rr�r��linesepr	r�r�s  r�test_headers_and_contentz.CGIHTTPServerTestCase.test_headers_and_content4sn���l�l�.�/�/�����
�X�X�Z�Z����~�6�6��
�C�
�d�l�
*�K���G�	I�	I�	I�	I�	Irc�z�|�d��}|�|jtj��dS)Nz)///////////nocgi.py/../cgi-bin/nothere.sh)rQr�r�r	rqr�s  r�test_issue19435z%CGIHTTPServerTestCase.test_issue19435:s5���l�l�F�G�G�������Z�%9�:�:�:�:�:rc���tj�dddd���}ddi}|�dd||��}|�|���d	|jz��dS)
Nr�r�i@�)�spam�eggs�baconr�z!application/x-www-form-urlencodedz/cgi-bin/file2.py�POSTs1, python, 123456)rGrH�	urlencoderQr�rr�)r�paramsrVr�s    r�	test_postzCGIHTTPServerTestCase.test_post>su����'�'��(�f�=�=�?�?��!�$G�H���l�l�.����H�H����������%9�D�L�%H�I�I�I�I�Irc��|�d��}|���|�|jtj��dS)Nz/cgi-bin/invalid)rQrr�r�r	rqr�s  r�test_invaliduriz%CGIHTTPServerTestCase.test_invaliduriFsB���l�l�-�.�.�����
�
�
������Z�%9�:�:�:�:�:rc��ddtjd��zi}|�dd|���}|�d|jzdt
jf|���|�d	��|j	f��dS)
Ns
AuthorizationsBasic s
username:passr�rKr�r�r^r�)
�base64�	b64encoderQr�r�r	r�rr�r�)rrVr�s   r�test_authorizationz(CGIHTTPServerTestCase.test_authorizationKs���#�i��#�$4�5�5�'6�7���l�l�.��w�l�G�G�����
�d�l�
*�K���G�
�X�X�Z�Z����~�6�6��
�C�	E�	E�	E�	E�	Erc���|�d��}|�d|jzdtjf|���|�d��|jf��dS)Nr�r�r^r��rQr�r�r	r�rr�r�r�s  r�test_no_leading_slashz+CGIHTTPServerTestCase.test_no_leading_slashSsn���l�l�-�.�.�����
�d�l�
*�K���G�
�X�X�Z�Z����~�6�6��
�C�	E�	E�	E�	E�	Erc�N�d}|tjd<|�d��}|�d|jzdt
jf|���|�d��|j	f��|�tjd|��dS)NzTest CGI Server�SERVER_SOFTWAREr�r�r^r�)
r@rArQr�r�r	r�rr�r�)r�	signaturer�s   r�test_os_environ_is_not_alteredz4CGIHTTPServerTestCase.test_os_environ_is_not_alteredZs���%�	�(1��
�$�%��l�l�.�/�/�����
�d�l�
*�K���G�
�X�X�Z�Z����~�6�6��
�C�	E�	E�	E�	
�����$5�6�	�B�B�B�B�Brc���|�d��}|�d|jzdtjf|���|�d��|jf��dS)Nz/cgi-bin%2ffile1.pyr�r^r�r�r�s  r�#test_urlquote_decoding_in_cgi_checkz9CGIHTTPServerTestCase.test_urlquote_decoding_in_cgi_checkcsn���l�l�0�1�1�����
�d�l�
*�K���G�
�X�X�Z�Z����~�6�6��
�C�	E�	E�	E�	E�	Erc���|�d��}|�d|jzdtjf|���|�d��|jf��dS)Nz/cgi-bin/child-dir/file3.pyr�r^r�r�r�s  r�test_nested_cgi_path_issue21323z5CGIHTTPServerTestCase.test_nested_cgi_path_issue21323isn���l�l�8�9�9�����
�d�l�
*�K���G�
�X�X�Z�Z����~�6�6��
�C�	E�	E�	E�	E�	Erc���|�d��}|�d|jzdtjf|���|�d��|jf��dS)Nz/cgi-bin/file4.py?a=b?c=dsa=b?c=dr^r�r�r�s  r�&test_query_with_multiple_question_markz<CGIHTTPServerTestCase.test_query_with_multiple_question_markosn���l�l�6�7�7�����
�$�,�
&��Z�]�C�
�X�X�Z�Z����~�6�6��
�C�	E�	E�	E�	E�	Erc���|�d��}|�d|jzdtjf|���|�d��|jf��dS)Nz0/cgi-bin/file4.py?k=aa%2F%2Fbb&//q//p//=//a//b//sk=aa%2F%2Fbb&//q//p//=//a//b//r^r�r�r�s  r�"test_query_with_continuous_slashesz8CGIHTTPServerTestCase.test_query_with_continuous_slashesusq���l�l�M�N�N�����
.���
=�
�*�-�
)�
�X�X�Z�Z����~�6�6��
�C�	E�	E�	E�	E�	Erc��	tj�d��|�d��}|�d|jzdtjf|���|�	d��|j
f��tj�d��dS#tj�d��wxYw)Nz/sub/dir/cgi-binz/sub/dir/cgi-bin/file5.pyr�r^r�)r�cgi_directories�appendrQr�r�r	r�rr�r�r�r�s  r� test_cgi_path_in_sub_directoriesz6CGIHTTPServerTestCase.test_cgi_path_in_sub_directories|s���	M�!�1�8�8�9K�L�L�L��,�,�:�;�;�C�����$�,�.��Z�]�K������S�]�]�>�:�:�C�J�G�
I�
I�
I�
"�1�8�8�9K�L�L�L�L�L��!�1�8�8�9K�L�L�L�L���s�BB/�/!Cc��d}d|ff|fddf}|D]�\}}t|��}|�|��5|�dd|���}|�tjj|j��d|���d	��}|�	||�
����ddd��n#1swxYwY��dS)
Nz?text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8�Accept)rr)))r�r^)�ACCEPTz
text/plainztext/html,text/plainz/cgi-bin/file6.pyrKr�zHTTP_ACCEPT=r�)r�subTestrQr�rMr	r�r�r{r�r)r�browser_accept�testsrVr�r�s      r�test_acceptz!CGIHTTPServerTestCase.test_accept�s,��U�	���(�
*�N�;��
'�	
��"'�	4�	4��G�X�!�'�*�*�G����g�&�&�
4�
4��l�l�#6��w�l�O�O��� � ���!3�S�Z�@�@�@�4�(�4�4�;�;�G�D�D���
�
�h����
�
�3�3�3�	
4�
4�
4�
4�
4�
4�
4�
4�
4�
4�
4����
4�
4�
4�
4��	4�	4s�BC�C	�C	N)rr r!rrr(r@r�r{rFrJr�r�r�r�r�r�r�r�r�r�r�r�r�rrrrr�r��sl������
�
�
�
�
�-�/D�
�
�
��j����(�(�G�J"�J"�J"�X(�(�(�8(;�(;�(;�TI�I�I�;�;�;�J�J�J�;�;�;�
E�E�E�E�E�E�C�C�C�E�E�E�E�E�E�E�E�E�E�E�E�M�M�M�4�4�4�4�4rr�c�,��eZdZd�fd�	Zd�Zd�Z�xZS)�SocketlessRequestHandlerNc����tj��}t��|j_t���|dd|���d|_d|_dS)N��	directoryFr[)	r
�Mockr�makefile�return_valuerr'�
get_calledr�)rrrQr$s   �rr'z!SocketlessRequestHandler.__init__�sS����)�+�+��(/�	�	���%�
������$��	��B�B�B���� *����rc���d|_|�tj��|�dd��|���|j�d��dS)NTr]r^� <html><body>Data</body></html>
)rrbr	r�rdrer|r}r4s rr�zSocketlessRequestHandler.do_GET�sd��������:�=�)�)�)������5�5�5��������
���>�?�?�?�?�?rc��dSrr)rr�rs   rrz$SocketlessRequestHandler.log_message�s���rr)rr r!r'r�rr�r�s@rrr�s^�������+�+�+�+�+�+�@�@�@�
�
�
�
�
�
�
rrc��eZdZd�ZdS)�!RejectingSocketlessRequestHandlerc�D�|�tj��dS)NF)rmr	�EXPECTATION_FAILEDr4s r�handle_expect_100z3RejectingSocketlessRequestHandler.handle_expect_100�s�����
�5�6�6�6��urN)rr r!rrrrrr�s#����������rrc�6�eZdZd�Zd�Zd�Zed���ZdS)�AuditableBytesIOc��g|_dSr)�datasr4s rr'zAuditableBytesIO.__init__�s
����
�
�
rc�:�|j�|��dSr)rr�)rr�s  rr}zAuditableBytesIO.write�s���
���$�����rc�6�d�|j��S)Nr)r8rr4s r�getDatazAuditableBytesIO.getData�s���x�x��
�#�#�#rc�*�t|j��Sr)r�rr4s r�	numWriteszAuditableBytesIO.numWrites�s���4�:���rN)rr r!r'r}r�propertyrrrrrr�s\��������� � � �$�$�$�����X���rrc��eZdZ	ejd��Zd�Zd�Zd�Zd�Z	d�Z
d�Zd�Zd	�Z
d
�Zd�Zd�Zd
�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�ZdS)�BaseHTTPRequestHandlerTestCasesHTTP/1.[0-9]+ 200 OKc�,�t��|_dSr)r�handlerr4s rrFz$BaseHTTPRequestHandlerTestCase.setUp�s��/�1�1����rc���t|��}t��}||j_||j_|j���|�d��|���S�Nr)rr"�rfiler|�handle_one_request�seek�	readlines)rrt�input�outputs    r�send_typical_requestz3BaseHTTPRequestHandlerTestCase.send_typical_request�sa���� � ������"����#������'�'�)�)�)����A�������!�!�!rc�D�|�|jj��dSr)r�r"rr4s r�verify_get_calledz0BaseHTTPRequestHandlerTestCase.verify_get_called�s�������/�0�0�0�0�0rc�p��dD]1�|�t�fd�|D����d���2dS)N)sServer: sDate: sContent-Type: c3�B�K�|]}|����V��dSr)rY)�.0�h�	fieldNames  �r�	<genexpr>zIBaseHTTPRequestHandlerTestCase.verify_expected_headers.<locals>.<genexpr>�s/����� J� J�Q����i�!8�!8� J� J� J� J� J� Jrr�)r��sum)rrVr2s  @r�verify_expected_headersz6BaseHTTPRequestHandlerTestCase.verify_expected_headers�sV���B�	O�	O�I����S� J� J� J� J�'� J� J� J�J�J�A�N�N�N�N�	O�	Orc�d�|j�|��}|�|��dSr)�HTTPResponseMatch�searchr1)rr,�matchs   r�verify_http_server_responsez:BaseHTTPRequestHandlerTestCase.verify_http_server_response�s2���&�-�-�h�7�7�����U�#�#�#�#�#rc�d�|�d��}|�|d��|�|dd���|���|�|dd��|�|jjd��|�|jjd��|�|jjd��|�|jj	d	��|�
|jj���d
��dS)N�GET / HTTP/1.1

rr����r�GET / HTTP/1.1rKr�r[r�
r+r:r5r-r�r"�requestline�commandr��request_version�assertSequenceEqualrVr��r�results  r�
test_http_1_1z,BaseHTTPRequestHandlerTestCase.test_http_1_1�����*�*�+D�E�E���(�(����3�3�3��$�$�V�A�b�D�\�2�2�2���� � � �������%J�K�K�K������1�3C�D�D�D������-�u�5�5�5������*�C�0�0�0������5�z�B�B�B�� � ���!5�!;�!;�!=�!=�r�B�B�B�B�Brc�d�|�d��}|�|d��|�|dd���|���|�|dd��|�|jjd��|�|jjd��|�|jjd��|�|jj	d	��|�
|jj���d
��dS)NsGET / HTTP/1.0

rr�r=r�GET / HTTP/1.0rKr��HTTP/1.0rr?rDs  r�
test_http_1_0z,BaseHTTPRequestHandlerTestCase.test_http_1_0�rGrc���|�d��}|�t|��d��|�|dd��|���dS)NsGET / HTTP/0.9

r�rr)r+r�r�r-rDs  r�
test_http_0_9z,BaseHTTPRequestHandlerTestCase.test_http_0_9�se���*�*�+D�E�E������V���a�(�(�(�������$I�J�J�J���� � � � � rc�*�|�d��}|�|d�d����|�|d|�d�����|�|jj��dS)Ns)GET /spaced out HTTP/1.1
Host: dummy

rs
HTTP/1.1 400 r��
)r+r�rYr5�indexrXr"rrDs  r�test_extra_spacez/BaseHTTPRequestHandlerTestCase.test_extra_space�s����*�*�
�
�
��
	
����q�	�,�,�-=�>�>�?�?�?��$�$�V�A�f�l�l�7�.C�.C�,C�%D�E�E�E������0�1�1�1�1�1rc�h�|�d��}|�|d��|�|dd���|���|�|dd��|�|jjd��|�|jjd��|�|jjd��|�|jj	d	��d
}|�
|jj���|��dS)Ns(GET / HTTP/1.0
Expect: 100-continue

rr�r=rrIrKr�rJ�)�Expectz100-continuer?�rrErVs   r�test_with_continue_1_0z5BaseHTTPRequestHandlerTestCase.test_with_continue_1_0	s���*�*�+\�]�]���(�(����3�3�3��$�$�V�A�b�D�\�2�2�2���� � � �������%J�K�K�K������1�3C�D�D�D������-�u�5�5�5������*�C�0�0�0������5�z�B�B�B�/��� � ���!5�!;�!;�!=�!=�w�G�G�G�G�Grc���|�d��}|�|dd��|�|dd��|�|dd��|�|dd���|���|�|dd	��|�|jjd
��|�|jjd��|�|jjd��|�|jjd
��d}|�	|jj
���|��dS)N�(GET / HTTP/1.1
Expect: 100-continue

rsHTTP/1.1 100 Continue
r�rO�sHTTP/1.1 200 OK
r=rr>rKr�r[rS)r+r�r5r-r"r@rAr�rBrCrVr�rUs   r�test_with_continue_1_1z5BaseHTTPRequestHandlerTestCase.test_with_continue_1_1sN���*�*�+\�]�]��������$@�A�A�A�������G�,�,�,�������$:�;�;�;��$�$�V�A�b�D�\�2�2�2���� � � �������%J�K�K�K������1�3C�D�D�D������-�u�5�5�5������*�C�0�0�0������5�z�B�B�B�/��� � ���!5�!;�!;�!=�!=�w�G�G�G�G�Grc��td��}t��}t��}||_||_d|_d|_d|_|�d��|�	|j
d��dS)Nr<r[r�rY)rrrr%r|rBr@rArmr�r�rr)r*r"s    r�#test_header_buffering_of_send_errorzBBaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_error%s~���1�2�2��!�#�#��*�,�,����
���
�",��� ���������3��������)�1�-�-�-�-�-rc�D�td��}t��}t��}||_||_d|_|�d��|�|jd��|�	��|�|jd��dS)Nr<r[r\rr�)
rrrr%r|rB�send_response_onlyr�rrer]s    r�+test_header_buffering_of_send_response_onlyzJBaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_response_only3s����1�2�2��!�#�#��*�,�,����
���
�",����"�"�3�'�'�'�����)�1�-�-�-�����������)�1�-�-�-�-�-rc���td��}t��}t��}||_||_d|_|�dd��|�dd��|�|jd��|�	��|�|�
��d��|�|jd��dS)	Nr<r[�Foo�foo�barrsFoo: foo
bar: bar

r�)rrrr%r|rBrdr�rrerr]s    r�$test_header_buffering_of_send_headerzCBaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_headerAs����1�2�2��!�#�#��*�,�,����
���
�",������E�5�)�)�)����E�5�)�)�)�����)�1�-�-�-�������������)�)�+J�K�K�K�����)�1�-�-�-�-�-rc���d�}td��}t��}||j_||j_d|j_|j���|�||��d��||���d��}|�|dd��|�|dd��|�|d	d
��dS)Nc��|���}|�d��|���}|�|��|Sr$)�tellr'r)rM�posr�s   r�_readAndReseekz[BaseHTTPRequestHandlerTestCase.test_header_unbuffered_when_continue.<locals>._readAndReseekSs?���&�&�(�(�C�
�F�F�1�I�I�I��6�6�8�8�D�
�F�F�3�K�K�K��KrrXr[rrOrsHTTP/1.1 100 Continuer�rYsHTTP/1.1 200 OK)	rr"r%r|rBr&�assertNotEqualr�r�)rrkr)r*rEs     r�$test_header_unbuffered_when_continuezCBaseHTTPRequestHandlerTestCase.test_header_unbuffered_when_continueQs���	�	�	��I�J�J������"����#����'1���$���'�'�)�)�)����N�N�6�2�2�C�8�8�8����'�'�-�-�g�6�6��������$<�=�=�=�������C�(�(�(�������$6�7�7�7�7�7rc��|j}t��|_|�d��}|�|dd��|�|dd���|�|jj��|�td�|dd�D����d��||_dS)NrXrs!HTTP/1.1 417 Expectation Failed
r�r=c3�"K�|]
}|dkV��dS)sConnection: close
Nr)r0�rs  rr3zMBaseHTTPRequestHandlerTestCase.test_with_continue_rejected.<locals>.<genexpr>ps(����Q�Q�q�Q�":�:�Q�Q�Q�Q�Q�Qr)r"rr+r�r5rXrr4)r�
usual_handlerrEs   r�test_with_continue_rejectedz:BaseHTTPRequestHandlerTestCase.test_with_continue_rejectedgs�����
�8�:�:����*�*�+\�]�]��������$J�K�K�K��$�$�V�A�b�D�\�2�2�2�	
�����0�1�1�1�����Q�Q�F�1�R�4�L�Q�Q�Q�Q�Q�ST�U�U�U�$����rc��|�dddzz��}|�|dd��|�|jj��|�|jjt��dS)NsGET �x�rs#HTTP/1.1 414 Request-URI Too Long
)r+r�rXr"r�assertIsInstancer@rnrDs  r�test_request_lengthz2BaseHTTPRequestHandlerTestCase.test_request_lengthssu���*�*�7�T�E�\�+A�B�B��������$L�M�M�M������0�1�1�1����d�l�6��<�<�<�<�<rc��|�dddzzdz��}|�|dd��|�|jj��|�|jjd��dS)NsGET / HTTP/1.1
X-Foo: bar�rrus

rsHTTP/1.1 431 Line too long
r>�r+r�rXr"rr@rDs  r�test_header_lengthz1BaseHTTPRequestHandlerTestCase.test_header_length{s����*�*�+�d�U�l�:�[�H�J�J��������$E�F�F�F������0�1�1�1������1�3C�D�D�D�D�Drc���|�d��}|�|dd��|�|jj��|�|jjd��dS)Ns�GET / HTTP/1.1
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar

rsHTTP/1.1 431 Too many headers
r>rzrDs  r�test_too_many_headersz4BaseHTTPRequestHandlerTestCase.test_too_many_headers�sr���*�*�E�G�G��������$H�I�I�I������0�1�1�1������1�3C�D�D�D�D�Drc���|�d��}d�|��}d}|�tj|d����d��|��dS)Ns*<script>alert("hello")</script> / HTTP/1.1rz<script>alert("hello")</script>Fr>r�)r+r8r�rIrJr{)rrE�texts   r�test_html_escape_on_errorz8BaseHTTPRequestHandlerTestCase.test_html_escape_on_error�sg���*�*�9�;�;�����&�!�!��0���
�
�d�k�$�e�4�4�4�;�;�G�D�D�f�M�M�M�M�Mrc�R�����fd�}|�j_td����j�����t
t���td����j�����t
t���dS)Nc�:��t����j_dSr)�nextr"�close_connection)�close_valuesrs��rr&zPBaseHTTPRequestHandlerTestCase.test_close_connection.<locals>.handle_one_request�s���,0��,>�,>�D�L�)�)�)r)T)FFT)r"r&�iter�handler��
StopIterationr�)rr&r�s` @r�test_close_connectionz4BaseHTTPRequestHandlerTestCase.test_close_connection�s�����	?�	?�	?�	?�	?�	?�*<���'��G�}�}������������-��|�<�<�<��0�1�1������������-��|�<�<�<�<�<rc	��tj��}tj|��\	}}}}}}}}	}
d|jj|||jj|||||fz}|�|j�|���|��dS)Nz#%s, %02d %3s %4d %02d:%02d:%02d GMT)r)�time�gmtimer"�weekdayname�	monthnamer��date_time_string)r�now�year�month�day�hh�mm�ss�wd�y�zr�s            r�test_date_time_stringz4BaseHTTPRequestHandlerTestCase.test_date_time_string�s����i�k�k��15��S�1A�1A�.��e�S�"�b�"�b�!�Q�8��L�$�R�(���L�"�5�)��"�b�"�	<
�
��	
�����6�6��6�E�E�x�P�P�P�P�PrN)rr r!�re�compiler7rFr+r-r5r:rFrKrMrQrVrZr^rarfrmrrrwr{r}r�r�r�rrrr r �s��������
#��
�#:�;�;��2�2�2�"�"�"�1�1�1�O�O�O�$�$�$�
C�
C�
C�
C�
C�
C�!�!�!�2�2�2�H�H�H�
H�
H�
H�.�.�.�.�.�.�.�.�.� 8�8�8�,
%�
%�
%�=�=�=�E�E�E�E�E�E�N�N�N�
=�
=�
=�
Q�
Q�
Q�
Q�
Qrr c�(�eZdZ	d�Zd�Zd�Zd�ZdS)� SimpleHTTPRequestHandlerTestCasec��tj�tj��d��|_tj�dd��|_tj�dd��|_t��|_td���|_	ttjd�����|_dS)NrLrdrer)
r@r�r8r�translated_1�translated_2�translated_3r�	handler_1�	handler_2�pathlib�PurePath�	handler_3r4s rrFz&SimpleHTTPRequestHandlerTestCase.setUp�s����G�L�L�����j�A�A����G�L�L��
�;�;����G�L�L��
�;�;���1�3�3���1�E�B�B�B���1�G�<L�U�<S�<S�T�T�T����rc��|j�d��}|�||j��|j�d��}|�||j��|j�d��}|�||j��|j�d��}|�||j��|j�d��}|�||j��|j�d��}|�||j��|j�d��}|�||j��|j�d��}|�||j��|j�d��}|�||j��dS)Nz	/filenamez/filename?foo=barz/filename?a=b&spam=eggs#zot�r��translate_pathr�r�r�r�r�r��rr�s  r�test_query_argumentsz5SimpleHTTPRequestHandlerTestCase.test_query_arguments�s����~�,�,�[�9�9������t�0�1�1�1��~�,�,�[�9�9������t�0�1�1�1��~�,�,�[�9�9������t�0�1�1�1��~�,�,�-@�A�A������t�0�1�1�1��~�,�,�-@�A�A������t�0�1�1�1��~�,�,�-@�A�A������t�0�1�1�1��~�,�,�-J�K�K������t�0�1�1�1��~�,�,�-J�K�K������t�0�1�1�1��~�,�,�-J�K�K������t�0�1�1�1�1�1rc��|j�d��}|�||j��|j�d��}|�||j��|j�d��}|�||j��|j�d��}|�||j��|j�d��}|�||j��|j�d��}|�||j��dS)Nz
//filenamez//filename?foo=barr�r�s  r�test_start_with_double_slashz=SimpleHTTPRequestHandlerTestCase.test_start_with_double_slash�s���~�,�,�\�:�:������t�0�1�1�1��~�,�,�\�:�:������t�0�1�1�1��~�,�,�\�:�:������t�0�1�1�1��~�,�,�-A�B�B������t�0�1�1�1��~�,�,�-A�B�B������t�0�1�1�1��~�,�,�-A�B�B������t�0�1�1�1�1�1rc�j	�tjtjdt��5|j�d��}|�tjtj��}|�	||j
��|j�d��}|�tjtj��}|�	||j��|j
�d��}|�tjtj��}|�	||j��|j�d��}|�tjtj��}|�	||j
��|j�d��}|�tjtj��}|�	||j��|j
�d��}|�tjtj��}|�	||j��|j�d��}|�tjtj��}|�	||j
��|j�d��}|�tjtj��}|�	||j��|j
�d��}|�tjtj��}|�	||j��|j�d��}|�tjtj��}|�	||j
��|j�d��}|�tjtj��}|�	||j��|j
�d��}|�tjtj��}|�	||j��ddd��dS#1swxYwYdS)Nr�zc:c:c:foo/filenamez\c:../filenamezc:\c:..\foo/filenamezc:c:foo\c:c:bar/filename)r�	swap_attrrr@�ntpathr�r�r�sepr�r�r�r�r�r�r�s  r�test_windows_colonz3SimpleHTTPRequestHandlerTestCase.test_windows_colon�s���
�
�v�y�&�&�
9�
9�'	6�'	6��>�0�0�1E�F�F�D��<�<��
�B�F�3�3�D����T�4�#4�5�5�5��>�0�0�1E�F�F�D��<�<��
�B�F�3�3�D����T�4�#4�5�5�5��>�0�0�1E�F�F�D��<�<��
�B�F�3�3�D����T�4�#4�5�5�5��>�0�0�1B�C�C�D��<�<��
�B�F�3�3�D����T�4�#4�5�5�5��>�0�0�1B�C�C�D��<�<��
�B�F�3�3�D����T�4�#4�5�5�5��>�0�0�1B�C�C�D��<�<��
�B�F�3�3�D����T�4�#4�5�5�5��>�0�0�1I�J�J�D��<�<��
�B�F�3�3�D����T�4�#4�5�5�5��>�0�0�1I�J�J�D��<�<��
�B�F�3�3�D����T�4�#4�5�5�5��>�0�0�1I�J�J�D��<�<��
�B�F�3�3�D����T�4�#4�5�5�5��>�0�0�1L�M�M�D��<�<��
�B�F�3�3�D����T�4�#4�5�5�5��>�0�0�1L�M�M�D��<�<��
�B�F�3�3�D����T�4�#4�5�5�5��>�0�0�1L�M�M�D��<�<��
�B�F�3�3�D����T�4�#4�5�5�5�O'	6�'	6�'	6�'	6�'	6�'	6�'	6�'	6�'	6�'	6�'	6�'	6����'	6�'	6�'	6�'	6�'	6�'	6s�Q5R(�(R,�/R,N)rr r!rFr�r�r�rrrr�r��sV�������U�U�U�2�2�2�,
2�
2�
2�(6�(6�(6�(6�(6rr�c��eZdZd�ZdS)�MiscTestCasec�2�g}hd�}tt��D][}|�d��s||vr�tt|��}t|dd��dkr|�|���\|�tj|��dS)N>rr��
nobody_uid�_r zhttp.server)r�rrY�getattrr��assertCountEqual�__all__)rr��denylistrN�
module_objects     r�test_allzMiscTestCase.test_alls�����7�7�7����K�K�	&�	&�D����s�#�#�
�t�x�'7�
��#�F�D�1�1�M��}�l�D�9�9�]�J�
&�����%�%�%�����f�n�h�7�7�7�7�7rN)rr r!r�rrrr�r�s#������	8�	8�	8�	8�	8rr�c���eZdZd�Zejd��d���Zejd��d���ZdZdZ	ejd��d���Z
ejd��d���Zd	S)
�ScriptTestCasec���tjtjtjtjtjd����������������S)Nc��dS)N)rrrrrr�<lambda>z2ScriptTestCase.mock_server_class.<locals>.<lambda>s���r)r-)r,)r)r�)r
�	MagicMockr4s r�mock_server_classz ScriptTestCase.mock_server_classsp���~����.�!%��#�~�(7�� � � �"�"�"�������

�

�

�
	
rzbuiltins.printc��|���}tj|d���|�|jt
jt
jf��dS�N��ServerClass�bind�r�rrr��address_familyr,�AF_INET6�AF_INET�rr��mock_servers   r�test_server_test_unspecz&ScriptTestCase.test_server_test_unspec#sZ���,�,�.�.�����$�7�7�7�7��
�
��&�
�_�f�n�-�	
�	
�	
�	
�	
rc��|���}tj|d���|�|jt
jt
jf��dS)Nr+r�r�r�s   r�test_server_test_localhostz)ScriptTestCase.test_server_test_localhost,sZ���,�,�.�.�����+�>�>�>�>��
�
��&�
�_�f�n�-�	
�	
�	
�	
�	
r)z::z'2001:0db8:85a3:0000:0000:8a2e:0370:7334z::1)z0.0.0.0z8.8.8.8z	127.0.0.1c��|jD]Q}|���}tj||���|�|jtj���RdSr�)�
ipv6_addrsr�rrr�r�r,r��rr�r�r�s    r�test_server_test_ipv6z$ScriptTestCase.test_server_test_ipv6Ase���O�	J�	J�D��0�0�2�2�K��K�K�d�;�;�;�;����[�7���I�I�I�I�	J�	Jrc��|jD]Q}|���}tj||���|�|jtj���RdSr�)�
ipv4_addrsr�rrr�r�r,r�r�s    r�test_server_test_ipv4z$ScriptTestCase.test_server_test_ipv4Hse���O�	I�	I�D��0�0�2�2�K��K�K�d�;�;�;�;����[�7���H�H�H�H�	I�	IrN)rr r!r�r
�patchr�r�r�r�r�r�rrrr�r�s�������
�
�
��T�Z� �!�!�
�
�"�!�
��T�Z� �!�!�
�
�"�!�
��J��J��T�Z� �!�!�J�J�"�!�J��T�Z� �!�!�I�I�"�!�I�I�Irr�c�f�tjtjtj����dSr)r��addModuleCleanupr@r
rrrr�setUpModuler�Ps#����b�h��	���4�4�4�4�4r�__main__)A�collectionsr�http.serverrrrrrMrr	r@r,rAr�r�r�r�r&�
email.messager�email.utilsrI�http.client�urllib.parserGrr�rr%r�r
�iorrr�test.supportr
r�requires_working_socketrr&r#�TestCaser;rXr�r�r�r�r�r�r��hasattrrjr�rrrr r�r�r�r�r�mainrrr�<module>r�s����
$�#�#�#�#�#�5�5�5�5�5�5�5�5�5�5�5�5�#�#�#�#�#�#�#�#�	�	�	�	�
�
�
�
�
�
�
�
�	�	�	�	�
�
�
�
�
�
�
�
�����
�
�
�
���������������������������������������������������������������"�"�"�"�"�"�)�)�)�)�)�)����t�,�,�,�,��������������y�'����*-�-�-�-�-�8�$�-�-�-�*L(�L(�L(�L(�L(�\�L(�L(�L(�^!G�!G�!G�!G�!G�L�!G�!G�!G�HU3�U3�U3�U3�U3�|�U3�U3�U3�p
�	�
�	�"
�	�
�	�&������Y�'�'�=�J�B�J�L�L�A�,=�A�C�C�z4�z4�z4�z4�z4�L�z4�z4�C�C�z4�z
�
�
�
�
�7�
�
�
�&�����(@����
�
�
�
�
�
�
�
� hQ�hQ�hQ�hQ�hQ�X�%6�hQ�hQ�hQ�VW6�W6�W6�W6�W6�x�'8�W6�W6�W6�t
8�
8�
8�
8�
8�8�$�
8�
8�
8�9I�9I�9I�9I�9I�X�&�9I�9I�9I�x5�5�5��z����H�M�O�O�O�O�O��r