Your IP : 216.73.216.85


Current Path : /opt/alt/python39/lib64/python3.9/test/__pycache__/
Upload File :
Current File : //opt/alt/python39/lib64/python3.9/test/__pycache__/test_httpservers.cpython-39.opt-1.pyc

a

XC?h���@s.dZddlmZddlmZmZmZmZddlm	Z	m
Z
ddlZddlZddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZddl m!Z!m"Z"ddlZddl#m$Z$Gd	d
�d
�Z%Gdd�dej&�Z'Gd
d�dej(�Z)Gdd�de)�Z*Gdd�de)�Z+Gdd�de)�Z,dZ-dZ.dZ/dZ0e�1e2ed��o�e�3�dkd�Gdd�de)��Z4Gdd�de�Z5Gdd �d e5�Z6Gd!d"�d"�Z7Gd#d$�d$ej(�Z8Gd%d&�d&ej(�Z9Gd'd(�d(ej(�Z:Gd)d*�d*ej(�Z;d+d,�Z<e=d-k�r*e�>�dS).z�Unittests for the various HTTPServer modules.

Written by Cody A.W. Somerville <cody-somerville@ubuntu.com>,
Josip Dzolonga, and Michael Otteneder for the 2007/08 GHOP contest.
�)�OrderedDict)�BaseHTTPRequestHandler�
HTTPServer�SimpleHTTPRequestHandler�CGIHTTPRequestHandler)�server�
HTTPStatusN)�mock)�BytesIO�StringIO)�supportc@seZdZdd�Zddd�ZdS)�NoLogRequestHandlercGsdS�N�)�self�argsrr�:/opt/alt/python39/lib64/python3.9/test/test_httpservers.py�log_message$szNoLogRequestHandler.log_messageNcCsdS�N�r)r�nrrr�read(szNoLogRequestHandler.read)N)�__name__�
__module__�__qualname__rrrrrrr
#sr
c@s$eZdZdd�Zdd�Zdd�ZdS)�TestServerThreadcCstj�|�||_||_dSr)�	threading�Thread�__init__�request_handler�test_object)rr rrrrr-szTestServerThread.__init__cCsdtd|j�|_|jj��\|j_|j_|jj�	�d|_z|j�
d�W|j��n|j��0dS)N)�	localhostrg�������?)rrr�socket�getsocknamer �HOST�PORT�server_started�setZ
serve_foreverZserver_close�rrrr�run2szTestServerThread.runcCs|j��|��dSr)rZshutdown�joinr(rrr�stop<s
zTestServerThread.stopN)rrrrr)r+rrrrr,s
rc@s,eZdZdd�Zdd�Zddifdd�ZdS)	�BaseTestCasecCsDt��|_t��t_t��|_t	||j
�|_|j��|j�
�dSr)rZthreading_setup�_threadsZEnvironmentVarGuard�os�environrZEventr&rr�thread�start�waitr(rrr�setUpBs



zBaseTestCase.setUpcCs*|j��d|_tj��tj|j�dSr)r0r+r.r/�__exit__rZthreading_cleanupr-r(rrr�tearDownJs

zBaseTestCase.tearDown�GETNcCs0tj�|j|j�|_|j�||||�|j��Sr)�http�client�HTTPConnectionr$r%Z
connection�request�getresponse)rZuri�method�body�headersrrrr:PszBaseTestCase.request)rrrr3r5r:rrrrr,Asr,c@s�eZdZGdd�dee�Zdd�Zdd�Zdd�Zd	d
�Z	dd�Z
d
d�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+S),�BaseHTTPServerTestCasec@s\eZdZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Z	dd
�Z
dd�Zdd�Zdd�Z
dS)z&BaseHTTPServerTestCase.request_handler�HTTP/1.1cCs0|�tj�|�dd�|�dd�|��dS)N�Content-Type�	text/html�
Connection�close��
send_responser�
NO_CONTENT�send_header�end_headersr(rrr�do_TEST[sz.BaseHTTPServerTestCase.request_handler.do_TESTcCs0|�tj�|�dd�|�dd�|��dS)NrArBrC�
keep-aliverEr(rrr�do_KEEPasz.BaseHTTPServerTestCase.request_handler.do_KEEPcCs|�d�dS)N����
send_errorr(rrr�do_KEYERRORgsz2BaseHTTPServerTestCase.request_handler.do_KEYERRORcCs|�tj�dSr�rOr�	NOT_FOUNDr(rrr�do_NOTFOUNDjsz2BaseHTTPServerTestCase.request_handler.do_NOTFOUNDcCs|�ddd�dS)NrMz
Short MessagezThis is a long 
 explanationrNr(rrr�do_EXPLAINERRORms�z6BaseHTTPServerTestCase.request_handler.do_EXPLAINERRORcCs.|�d�|�dd�|�dd�|��dS)NrMrArBrCrD)rFrHrIr(rrr�	do_CUSTOMqs
z0BaseHTTPServerTestCase.request_handler.do_CUSTOMcCsJ|�d�|�dd�|�dd�|��|jd�d�}|j�|�dS)NrM�	X-Special�Dängerous MindrCrDzx-special-incoming�utf-8)rFrHrIr>�encode�wfile�write)rr=rrr�do_LATINONEHEADERws
z8BaseHTTPServerTestCase.request_handler.do_LATINONEHEADERcCs|�t|jdd���dS�N��rO�int�pathr(rrr�
do_SEND_ERRORsz4BaseHTTPServerTestCase.request_handler.do_SEND_ERRORcCs|�t|jdd���dSr]r_r(rrr�do_HEAD�sz.BaseHTTPServerTestCase.request_handler.do_HEADN)rrr�protocol_version�default_request_versionrJrLrPrSrTrUr\rbrcrrrrrWsrcCs,t�|�tj�|j|j�|_|j��dSr)	r,r3r7r8r9r$r%�con�connectr(rrrr3�s
zBaseHTTPServerTestCase.setUpcCs,|j�dd�|j��}|�|jtj�dS)Nr6�/)rfr:r;�assertEqual�statusr�NOT_IMPLEMENTED�r�resrrr�test_command�s
z#BaseHTTPServerTestCase.test_commandcCs>d|j_|j�dd�|j��|j��}|�|jtj�dS)Nz	HTTP/1.1
ZXYZBOGUSrh�	rf�
_http_vsn_str�
putrequest�
endheadersr;rirjrrkrlrrr�test_request_line_trimming�s


z1BaseHTTPServerTestCase.test_request_line_trimmingcCs>d|j_|j�dd�|j��|j��}|�|jtj�dS)NZFUBARr6rh�	rfrprqrrr;rirjrZBAD_REQUESTrlrrr�test_version_bogus�s


z)BaseHTTPServerTestCase.test_version_boguscCs>d|j_|j�dd�|j��|j��}|�|jtj�dS)Nz
HTTP/9.9.9r6rhrtrlrrr�test_version_digits�s


z*BaseHTTPServerTestCase.test_version_digitscCs>d|j_|j�dd�|j��|j��}|�|jtj�dS)Nrr6rhrorlrrr�test_version_none_get�s


z,BaseHTTPServerTestCase.test_version_none_getcCs>d|j_|j�dd�|j��|j��}|�|jtj�dS)Nr�CUSTOMrhrtrlrrr�test_version_none�s


z(BaseHTTPServerTestCase.test_version_nonecCsFd|j_d|j_|j�dd�|j��|j��}|�|jtj	�dS)N�czHTTP/9.9r6rh)
rfZ	_http_vsnrprqrrr;rirjrZHTTP_VERSION_NOT_SUPPORTEDrlrrr�test_version_invalid�s

z+BaseHTTPServerTestCase.test_version_invalidcCs>d|j_|j�dd�|j��|j��}|�|jtj�dSrrtrlrrr�test_send_blank�s


z&BaseHTTPServerTestCase.test_send_blankcCsD|j�dd�|j�dd�|j��|j��}|�|jtj�dS)Nr6rhrCrD)	rfrq�	putheaderrrr;rirjrrkrlrrr�test_header_close�s


z(BaseHTTPServerTestCase.test_header_closecCsLd|j_|j�dd�|j�dd�|j��|j��}|�|jtj	�dS)Nr@r6rhrCrK)
rfrprqr}rrr;rirjrrkrlrrr�test_header_keep_alive�s

z-BaseHTTPServerTestCase.test_header_keep_alivecCs,|j�dd�|j��}|�|jtj�dS)N�TESTrh)rfr:r;rirjrrGrlrrr�test_handler�s
z#BaseHTTPServerTestCase.test_handlercCsJ|j�dd�|j��}|�|�d�d�|j�dd�|�|jj�dS)NZKEEPrhrCrKr�)rfr:r;ri�	getheaderZ
addCleanuprDrlrrr�test_return_header_keep_alive�s

z4BaseHTTPServerTestCase.test_return_header_keep_alivecCs*|j�dd�|j��}|�|jd�dS)NZKEYERRORrhrM�rfr:r;rirjrlrrr�test_internal_key_error�s
z.BaseHTTPServerTestCase.test_internal_key_errorcCs*|j�dd�|j��}|�|jd�dS)NrxrhrMr�rlrrr�test_return_custom_status�s
z0BaseHTTPServerTestCase.test_return_custom_statuscCs>|j�dd�|j��}|�|jd�|�t|�d���dS)NZEXPLAINERRORrhrM�Content-Length)rfr:r;rirj�
assertTruer`r�rlrrr�test_return_explain_error�s
z0BaseHTTPServerTestCase.test_return_explain_errorcCsL|jjddddid�|j��}|�|�d�d�|�|��d�d��dS)	NZLATINONEHEADERrhzX-Special-IncominguÄrger mit Unicode�r>rVrWrX)rfr:r;rir�rrYrlrrr�test_latin1_header�s
�
z)BaseHTTPServerTestCase.test_latin1_headercCsN|j�dd�|j��}|�|jtj�|��}|�t|�	d��t
|��dS)NZNOTFOUNDrhr�)rfr:r;rirjrrRrr`r��len)rrm�datarrr�test_error_content_length�s

z0BaseHTTPServerTestCase.test_error_content_lengthcCs�tjtjf}tjtjtjtjtjfD]�}|j�dd�|��|j�	�}|�
||j�|�
d|�d��|�
d|�d��||vr�|�
d|�d��|�
�}|�
d|�q$dS)NZ
SEND_ERROR�/{}r�rA�Transfer-Encoding�)r�NOT_MODIFIED�
RESET_CONTENTrGZ
PROCESSING�SWITCHING_PROTOCOLSrfr:�formatr;rirjr�r�rZallow_transfer_encoding_codes�codermr�rrr�test_send_error�s ��
z&BaseHTTPServerTestCase.test_send_errorcCs�tjtjf}tjtjtjtjtjfD]�}|j�dd�|��|j�	�}|�
||j�|tjkr�|�t
|�d��dk�|�d|�d��n$|�
d|�d��|�
d|�d��||vr�|�
d|�d��|��}|�
d|�q$dS)	N�HEADr�r�rrBrAr�r�)rr�r��OKrGr�rfr:r�r;rirjr�r`r��assertInrr�rrr�test_head_via_send_errors&��

z/BaseHTTPServerTestCase.test_head_via_send_errorN)rrrr
rrr3rnrsrurvrwryr{r|r~rr�r�r�r�r�r�r�r�r�rrrrr?Vs*.	r?c@s,eZdZGdd�de�Zdd�Zdd�ZdS)�RequestHandlerLoggingTestCasec@s$eZdZdZdZdd�Zdd�ZdS)z-RequestHandlerLoggingTestCase.request_handlerr@cCs|�tj�|��dSr)rFrr�rIr(rrr�do_GET*sz4RequestHandlerLoggingTestCase.request_handler.do_GETcCs|�tjd�dS)NzFile not foundrQr(rrr�do_ERROR.sz6RequestHandlerLoggingTestCase.request_handler.do_ERRORN)rrrrdrer�r�rrrrr&srcCsvtj�|j|j�|_|j��t���(}|j�	dd�|j�
�Wd�n1sT0Y|�|���
d��dS)Nr6rhz"GET / HTTP/1.1" 200 -
)r7r8r9r$r%rfrgr�captured_stderrr:r;r��getvalue�endswith)r�errrrr�test_get1s

(�z&RequestHandlerLoggingTestCase.test_getcCs�tj�|j|j�|_|j��t���(}|j�	dd�|j�
�Wd�n1sT0Y|���d�}|�
|d�d��|�
|d�d��dS)NZERRORrh�
rz code 404, message File not foundr^z"ERROR / HTTP/1.1" 404 -)r7r8r9r$r%rfrgrr�r:r;r��splitr�r�)rr��linesrrr�test_err<s

(z&RequestHandlerLoggingTestCase.test_errN)rrrrrr�r�rrrrr�%sr�cs�eZdZGdd�dee�Z�fdd�Z�fdd�Zd'dd	�Ze	�
ejd
kd�e	�
ejdkd
�e	�
ejd�dd����Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Z�ZS)(�SimpleHTTPServerTestCasec@seZdZdS)z(SimpleHTTPServerTestCase.request_handlerN�rrrrrrrrJsrcs�t���t��|_t��}t�|�d|_tj	|d�|_
tj�|j
�|_
d|j
|_tj�|j
d�}t|d��$}|�|j�|��Wd�n1s�0Yt�|�j}tj�|tjj�}|jdd�|_tjj|��dd	�|_dS)
NsWe are the knights who say Ni!)�dirrh�test�wbr)ZmicrosecondT�Zusegmt) �superr3r.�getcwd�cwd�tempfileZ
gettempdir�chdirr��mkdtemp�tempdirra�basename�tempdir_name�base_urlr*�openr[�flush�stat�st_mtime�datetimeZ
fromtimestamp�timezoneZutc�replace�last_modif_datetime�email�utilsZ
formatdate�	timestamp�last_modif_header)rZbasetempdirZtempnameZtemp�mtimeZ
last_modif��	__class__rrr3Ms(


&��zSimpleHTTPServerTestCase.setUpcsJz8t�|j�zt�|j�WnYn0Wt���nt���0dSr)r.r�r��shutilZrmtreer�r�r5r(r�rrr5bsz!SimpleHTTPServerTestCase.tearDownNcs���fdd�}d�|�_���}|���|��j|�|��j�|rT|�||�|��jd�|��j�	dd�d�|���d�dd���
�|S)	Ncs�j�d�_dS)zWDon't close reader yet so we can check if there was leftover
            buffered inputN)�fpr��reader�responserr�
close_connmszDSimpleHTTPServerTestCase.check_status_and_reason.<locals>.close_conn�
rCrD�r�zConnection should be closed)Z_close_connrr�rirj�assertIsNotNone�reason�version�msg�getrD)rr�rjr�r�r=rr�r�check_status_and_reasonls
z0SimpleHTTPServerTestCase.check_status_and_reason�darwinz2undecodable name cannot always be decoded on macOSZwin32z+undecodable name cannot be decoded on win32zneed support.TESTFN_UNDECODABLEcCst��}t�tj�d}ttj�|j	|�d��}|�
tj�Wd�n1sP0Y|�|jd�}tj
dkr�t�|j	�D]}|dkr�|}q�q�|�|tj�}tjj|dd�}|�d|�|d	�|�|�d
tj|dd��|d	�|�|�|jd|�}|j|tjtjd
�dS)Nz.txtr�rhr�r��
surrogatepass)�errorsz	href="%s"�surrogateescape�>%s<F��quote�r�)�sys�getfilesystemencodingr.�fsdecoder�TESTFN_UNDECODABLEr�rar*r�r[r:r��platform�listdirr�rr��urllib�parser�r�rY�html�escape)r�enc�filename�fr��namer=Z
quotednamerrr�test_undecodable_filename�s4*
����
�z2SimpleHTTPServerTestCase.test_undecodable_filenamecCsd|�|jd���}|�|d|j�d��d��|�|jd���}|�|d|j�d��d��dS)Nz/?x=123zlisting for z/\?x=123�latin1z/?x=%bbu/\?x=�)r:r�rZassertRegexrY�rr�rrr�test_undecodable_parameter�sz3SimpleHTTPServerTestCase.test_undecodable_parameterc	Cs2t�tj�|jd��d|j�d�}|�d�}|�|�}|�|tj	�|�
d�}|j||dd�d|��}|�|�}|�|tj	�|�
d�}|j|�
d�|d�|j||d	d�d|��}|�|�}|�|tj	�|�|�
d�|�d
|��}|�d�}|�|�}|�|tj	�|�
d�}|j|�
d
�|d�dS)aIEnsure //evil.co/..%2f../../X does not put //evil.co/ in Location.

        //netloc/ in a Location header is a redirect to a new host.
        https://github.com/python/cpython/issues/87389

        This checks that a path resolving to a directory on our server cannot
        resolve into a redirect to another server.
        Zexisting_directoryz2/python.org/..%2f..%2f..%2f..%2f..%2f../%0a%0d/../z/existing_directoryrh�Locationznon-attack failed!�r��//zcExpected Location header to start with a single / and end with a / as this is a directory redirect.zhttps://pypi.org/N)r.�mkdirrar*r�r�r:r�r�MOVED_PERMANENTLYr�ri�assertFalse�
startswithr�)	rZurlZexpected_locationr��locationZ
attack_urlZattack3_urlZattack_scheme_netloc_2slash_urlZexpected_scheme_netloc_locationrrr�3test_get_dir_redirect_location_domain_injection_bug�s2	





�





zLSimpleHTTPServerTestCase.test_get_dir_redirect_location_domain_injection_bugc
Cs�|�|jd�}|j|tj|jd�|�|jd�}|�|tj�|�|jd�}|�|tj�|�|j�}|�|tj�|�|�	d�d�|�|jd�}|�|tj�|�|jd�}|�|tj�|�|�	d	�|jd
�|�d�}|�|tj�|�d�}|�|tj�d
}t
tj�
|jd�d��}|�|�Wd�n1�sL0Y|�|jd�}|�|tj|�tjdk�r�t��dk�r�t�|jd�z0|�|jd�}|�|tj�Wt�|jd�nt�|jd�0dS)N�/testr��/test/rhr��0�/?hi=2�?hi=1r��/?hi=1z/ThisDoesNotExistz/ThisDoesNotExist/sDummy index file
z
index.htmlr��posixri�)r:r�r�rr�r�rRr�rir�r�r.rar*r�r[r��geteuid�chmodr�)rr�r�r�rrrr��s>�

*z!SimpleHTTPServerTestCase.test_getcCsT|j|jddd�}|�|tj�|�|�d�tt|j	���|�|�d�d�dS)Nr�r��r<zcontent-lengthzcontent-typezapplication/octet-stream)
r:r�r�rr�rir��strr�r�r�rrr�	test_heads
���z"SimpleHTTPServerTestCase.test_headcCs�tj��}|j|d<|j|jd|d�}|�|tj�|j	t
jdd�}tj��}tjj
|dd�|d<|j|jd|d�}|�|tj�dS)	z�Check that when a request to /test is sent with the request header
        If-Modified-Since set to date of last modification, the server returns
        status code 304, not 200
        �If-Modified-Sincer�r�r^)ZhoursTr�N)r��message�Messager�r:r�r�rr�r�r��	timedeltar��format_datetime)rr>r�Znew_dtrrr�test_browser_caches


�
z+SimpleHTTPServerTestCase.test_browser_cachecCsZ|j}|tjdd�}tj��}tjj|dd�|d<|j|j	d|d�}|�
|tj�dS)Nim)ZdaysTr�rr�r�)
r�r�rr�rrr�r	r:r�r�rr�)rZdtZold_dtr>r�rrr�test_browser_cache_file_changeds
�
z8SimpleHTTPServerTestCase.test_browser_cache_file_changedcCsBtj��}|j|d<d|d<|j|jd|d�}|�|tj�dS)Nr�*z
If-None-Matchr�r�)	r�rrr�r:r�r�rr�)rr>r�rrr�,test_browser_cache_with_If_None_Match_header(s


zESimpleHTTPServerTestCase.test_browser_cache_with_If_None_Match_headercCsX|jddd�}|�|tj�|jddd�}|�|tj�|jddd�}|�|tj�dS)NrhZFOOrZcustomZGETs)r:r�rrkr�rrr�test_invalid_requests1sz.SimpleHTTPServerTestCase.test_invalid_requestscCs@|�|jd�}|j|tj|jd�|jd}|�||j�dS)z�Checks that the datetime returned in Last-Modified response header
        is the actual datetime of last modification, rounded to the second
        r�r�z
Last-modifiedN)	r:r�r�rr�r�r>rir�)rr�r�rrr�test_last_modified:s
z+SimpleHTTPServerTestCase.test_last_modifiedcCs�|�|jd�}|j|tj|jd�|�|jd�}|�|tj�|�|jd�}|�|tj�|�|j�}|�|tj�|�|jd�}|�|tj�|�|jd�}|�|tj�|�|�	d�|jd�dS)	Nr�r�r�rhr�r�r�r�)
r:r�r�rr�r�rRr�rir�r�rrr�test_path_without_leading_slashCs�z8SimpleHTTPServerTestCase.test_path_without_leading_slashc	Cs�d}tj�|j|�}zt|d���Wn tyFt�d|��Yn0z6|�	|j
d�}|�|tj
�}|j��}Wt�|�nt�|�0|�|�dtj|dd�}|�|�|�|�dS)Nz<test&>.txt�wz-Can not create file %s on current file systemrhr�Fr�)r.rar*r�r�rD�OSError�unittestZSkipTestr:r�r�rr�r>Zget_content_charset�unlinkr�r�r�r�rY)rr��fullpathr�r=r�Z	html_textrrr�test_html_escape_filenameSs �
z2SimpleHTTPServerTestCase.test_html_escape_filename)N)rrrr
rrr3r5r�r�skipIfr�r�Z
skipUnlessrr�r�r�r�r�rr
rr
rrrr�
__classcell__rrr�rr�Is2

���1'				r�zD#!%s

print("Content-type: text/html")
print()
print("Hello World")
z�#!%s
import cgi

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

form = cgi.FieldStorage()
print("%%s, %%s, %%s" %% (form.getfirst("spam"), form.getfirst("eggs"),
                          form.getfirst("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>")
rz7This test can't be run reliably as root (issue #13308).c@s�eZdZGdd�dee�Zej�d�Zdd�Z	dd�Z
dd	�Zd
d�Zdd
�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�Zd$S)%�CGIHTTPServerTestCasec@seZdZdS)z%CGIHTTPServerTestCase.request_handlerNr�rrrrr�sr�asciicCst�|�t��|_t��|_tj�	|jd�|_
tj�	|j
d�|_tj�	|jd�|_tj�	|jd�|_
tj�	|j
d�|_t�|j
�t�|j�t�|j�t�|j
�t�|j�d|_d|_d|_d|_d|_d|_d|_t���rtj�	|jd�|_t�|j���|_ntj|_z|j�d�Wn&t�yL|� �|�!d�Yn0tj�	|jd�|_t"|jd	�� }|�#t$|j�Wd�n1�s�0Yt�%|jd
�tj�	|j
d�|_t"|jd	dd�� }|�#t$|j�Wd�n1�s�0Yt�%|jd
�tj�	|j
d
�|_t"|jd	dd�� }|�#t&|j�Wd�n1�sX0Yt�%|jd
�tj�	|jd�|_t"|jd	dd�� }|�#t$|j�Wd�n1�s�0Yt�%|jd
�tj�	|j
d�|_t"|jd	dd��$}|�#t'|jdf�Wd�n1�s 0Yt�%|jd
�tj�	|jd�|_t"|jd	dd�� }|�#t$|j�Wd�n1�s�0Yt�%|jd
�tj�	|j
d�|_(t"|j(d	dd�� }|�#t)|j�Wd�n1�s�0Yt�%|j(d
�t�*|j�dS)Nzcgi-binz	child-dir�subr��pythonrXz0Python executable path is not encodable to utf-8znocgi.pyri�zfile1.py)�encodingzfile2.pyzfile3.pyzfile4.pyZQUERY_STRINGzfile5.pyzfile6.py)+r,r3r.r�r�r�r��
parent_dirrar*�cgi_dir�
cgi_child_dir�	sub_dir_1�	sub_dir_2�cgi_dir_in_sub_dirr��
nocgi_path�
file1_path�
file2_path�
file3_path�
file4_path�
file5_path�_pythonexe_symlinkrZcan_symlinkZ	pythonexeZ
PythonSymlink�	__enter__r��
executablerY�UnicodeEncodeErrorr5ZskipTestr�r[�	cgi_file1r�	cgi_file2�	cgi_file4�
file6_path�	cgi_file6r�)rr�Zfile1Zfile2Zfile3Zfile4Zfile5Zfile6rrrr3�st



0000400zCGIHTTPServerTestCase.setUpc	Csz�t�|j�|jr$|j�ddd�|jr6t�|j�|jrHt�|j�|jrZt�|j�|j	rlt�|j	�|j
r~t�|j
�|jr�t�|j�|jr�t�|j�t�
|j�t�
|j�t�
|j�t�
|j�t�
|j�t�
|j�Wt�|�nt�|�0dSr)r.r�r�r*r4r$�remover%r&r'r(r)r1�rmdirr rr#r"r!rr,r5r(rrrr5�s2zCGIHTTPServerTestCase.tearDowncCs�dttddddddddddddddddd	d
d
tddtddd
�}|��D]R\}}t|t�rtt|t�rt|�|tj|�qFt�|�}|j	||d|||fd�qFdS)Nr�z//\�/cgi-bin/file1.py�//az/C:/�/a/b�/a/b/z/a/b/dz/a/b/d/fz/a/b/fz/a/fz//f)rz..z/.//..rhr�z/\z/.//�cgi-bin/file1.pyr5�az/ar6z./az./C:/r7r8z/a/b/.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 = %r
Got:    %r
Wanted: %rr�)
�
IndexError�items�
isinstance�type�
issubclass�	Exception�assertRaisesrZ_url_collapse_pathri)rZtest_vectorsra�expectedZactualrrr�test_url_collapse_path
sP��
��z,CGIHTTPServerTestCase.test_url_collapse_pathcCs:|�d�}|�|��|�d�|jfd|jdtjf�dS)Nr5�Content-type�Hello WorldrB)r:rirr�rj�lineseprr�rlrrr�test_headers_and_content4s

�z.CGIHTTPServerTestCase.test_headers_and_contentcCs|�d�}|�|jtj�dS)Nz)///////////nocgi.py/../cgi-bin/nothere.sh)r:rirjrrRrlrrr�test_issue19435:s
z%CGIHTTPServerTestCase.test_issue19435cCsFtj�dddd��}ddi}|�dd||�}|�|��d	|j�dS)
Nr^ri@�)ZspamZeggsZbaconrDz!application/x-www-form-urlencodedz/cgi-bin/file2.pyZPOSTs1, python, 123456)r�r�Z	urlencoder:rirrF)r�paramsr>rmrrr�	test_post>s
�zCGIHTTPServerTestCase.test_postcCs&|�d�}|��|�|jtj�dS)Nz/cgi-bin/invalid)r:rrirjrrRrlrrr�test_invaliduriFs
z%CGIHTTPServerTestCase.test_invaliduricCsRddt�d�i}|jdd|d�}|�d|jdtjf|��|�d	�|j	f�dS)
Ns
AuthorizationsBasic s
username:passr5r6r�rErBrD)
�base64Z	b64encoder:rirFrr�rr�rj)rr>rmrrr�test_authorizationKs��z(CGIHTTPServerTestCase.test_authorizationcCs:|�d�}|�d|jdtjf|��|�d�|jf�dS)Nr9rErBrD�r:rirFrr�rr�rjrlrrr�test_no_leading_slashSs

�z+CGIHTTPServerTestCase.test_no_leading_slashcCsZd}|tjd<|�d�}|�d|jdtjf|��|�d�|j	f�|�tjd|�dS)NzTest CGI ServerZSERVER_SOFTWAREr5rErBrD)
r.r/r:rirFrr�rr�rj)rZ	signaturermrrr�test_os_environ_is_not_alteredZs

�z4CGIHTTPServerTestCase.test_os_environ_is_not_alteredcCs:|�d�}|�d|jdtjf|��|�d�|jf�dS)Nz/cgi-bin%2ffile1.pyrErBrDrNrlrrr�#test_urlquote_decoding_in_cgi_checkcs

�z9CGIHTTPServerTestCase.test_urlquote_decoding_in_cgi_checkcCs:|�d�}|�d|jdtjf|��|�d�|jf�dS)Nz/cgi-bin/child-dir/file3.pyrErBrDrNrlrrr�test_nested_cgi_path_issue21323is

�z5CGIHTTPServerTestCase.test_nested_cgi_path_issue21323cCs:|�d�}|�d|jdtjf|��|�d�|jf�dS)Nz/cgi-bin/file4.py?a=b?c=dsa=b?c=drBrDrNrlrrr�&test_query_with_multiple_question_markos

�z<CGIHTTPServerTestCase.test_query_with_multiple_question_markcCs:|�d�}|�d|jdtjf|��|�d�|jf�dS)Nz0/cgi-bin/file4.py?k=aa%2F%2Fbb&//q//p//=//a//b//sk=aa%2F%2Fbb&//q//p//=//a//b//rBrDrNrlrrr�"test_query_with_continuous_slashesus
��z8CGIHTTPServerTestCase.test_query_with_continuous_slashesc	CsfzRtj�d�|�d�}|�d|jdtjf|��|�	d�|j
f�Wtj�d�ntj�d�0dS)Nz/sub/dir/cgi-binz/sub/dir/cgi-bin/file5.pyrErBrD)rZcgi_directories�appendr:rirFrr�rr�rjr3rlrrr� test_cgi_path_in_sub_directories|s
�z6CGIHTTPServerTestCase.test_cgi_path_in_sub_directoriesc	Cs�d}d|ff|fddf}|D]|\}}t|�}|�|��R|jdd|d�}|�tjj|j�d|���d	�}|�	||�
��Wd�q1s�0YqdS)
Nz?text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8�Accept)rr)))rWrB)ZACCEPTz
text/plainztext/html,text/plainz/cgi-bin/file6.pyr6r�zHTTP_ACCEPT=r)rZsubTestr:rir7rr�rjrYr�r)rZbrowser_acceptZtestsr>rBrmrrr�test_accept�s��z!CGIHTTPServerTestCase.test_acceptN)rrrr
rrr.rFrYr3r5rCrGrHrJrKrMrOrPrQrRrSrTrVrXrrrrr�s$L*	
rcs.eZdZd�fdd�	Zdd�Zdd�Z�ZS)	�SocketlessRequestHandlerNcs6t��}t�|j_t�j|dd|d�d|_d|_dS)N��	directoryFr@)	r	ZMockr
Zmakefile�return_valuer�r�
get_calledrd)rr[r:r�rrr�s

z!SocketlessRequestHandler.__init__cCs6d|_|�tj�|�dd�|��|j�d�dS)NTrArB� <html><body>Data</body></html>
)r]rFrr�rHrIrZr[r(rrrr��s
zSocketlessRequestHandler.do_GETcGsdSrr)rr�rrrrr�sz$SocketlessRequestHandler.log_message)N)rrrrr�rrrrr�rrY�srYc@seZdZdd�ZdS)�!RejectingSocketlessRequestHandlercCs|�tj�dS)NF)rOrZEXPECTATION_FAILEDr(rrr�handle_expect_100�sz3RejectingSocketlessRequestHandler.handle_expect_100N)rrrr`rrrrr_�sr_c@s0eZdZdd�Zdd�Zdd�Zedd��Zd	S)
�AuditableBytesIOcCs
g|_dSr)�datasr(rrrr�szAuditableBytesIO.__init__cCs|j�|�dSr)rbrU)rr�rrrr[�szAuditableBytesIO.writecCsd�|j�S)Nr�)r*rbr(rrr�getData�szAuditableBytesIO.getDatacCs
t|j�Sr)r�rbr(rrr�	numWrites�szAuditableBytesIO.numWritesN)rrrrr[rc�propertyrdrrrrra�s
rac@s�eZdZdZe�d�Zdd�Zdd�Zdd�Z	d	d
�Z
dd�Zd
d�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Zd-d.�Zd/d0�Zd1S)2�BaseHTTPRequestHandlerTestCasezrTest the functionality of the BaseHTTPServer.

       Test the support for the Expect 100-continue header.
       sHTTP/1.[0-9]+ 200 OKcCst�|_dSr)rY�handlerr(rrrr3�sz$BaseHTTPRequestHandlerTestCase.setUpcCs:t|�}t�}||j_||j_|j��|�d�|��S�Nr)r
rg�rfilerZ�handle_one_request�seek�	readlines)rr�input�outputrrr�send_typical_request�s

z3BaseHTTPRequestHandlerTestCase.send_typical_requestcCs|�|jj�dSr)r�rgr]r(rrr�verify_get_called�sz0BaseHTTPRequestHandlerTestCase.verify_get_calledcs,dD]"�|�t�fdd�|D��d�qdS)N)sServer: sDate: sContent-Type: c3s|]}|���VqdSr)r�)�.0�h�Z	fieldNamerr�	<genexpr>�r�zIBaseHTTPRequestHandlerTestCase.verify_expected_headers.<locals>.<genexpr>r^)ri�sum)rr>rrsr�verify_expected_headers�sz6BaseHTTPRequestHandlerTestCase.verify_expected_headerscCs|j�|�}|�|�dSr)�HTTPResponseMatch�searchr�)rr��matchrrr�verify_http_server_response�sz:BaseHTTPRequestHandlerTestCase.verify_http_server_responsecCs�d|j_tj}tj�tdt���D}||jd�||jd�||jdd�||jdd�Wd�n1sj0Y|�	�}|�
d|�|�
d	|�|��}|�d|d
�|�d|d�|�d
|d�|�d|d�dS)N)�	127.0.0.1i9�stderrz/fooz/barz	/spam %s.r:uŸ beans��rz/\x1bbar\x00\x1br^z/spam a.�u/spam \x1b\x7f\x9f beans.�)
rgZclient_addressrrr	�patch�objectr�rr�ZassertNotIn�
splitlinesr�)rrZfake_stderrr|r�rrr�test_unprintable_not_logged�s,z:BaseHTTPRequestHandlerTestCase.test_unprintable_not_loggedcCs�|�d�}|�|d�|�|dd��|��|�|dd�|�|jjd�|�|jjd�|�|jjd�|�|jj	d	�|�
|jj��d
�dS)N�GET / HTTP/1.1

rr^���r^�GET / HTTP/1.1r6rhr@r�
rorzrvrprirg�requestline�commandra�request_version�assertSequenceEqualr>r<�r�resultrrr�
test_http_1_1�s
z,BaseHTTPRequestHandlerTestCase.test_http_1_1cCs�|�d�}|�|d�|�|dd��|��|�|dd�|�|jjd�|�|jjd�|�|jjd�|�|jj	d	�|�
|jj��d
�dS)NsGET / HTTP/1.0

rr^r�r^�GET / HTTP/1.0r6rh�HTTP/1.0rr�r�rrr�
test_http_1_0s
z,BaseHTTPRequestHandlerTestCase.test_http_1_0cCs6|�d�}|�t|�d�|�|dd�|��dS)NsGET / HTTP/0.9

r^rr^)rorir�rpr�rrr�
test_http_0_9s
z,BaseHTTPRequestHandlerTestCase.test_http_0_9cCsH|�d�}|�|d�d��|�|d|�d���|�|jj�dS)Ns)GET /spaced out HTTP/1.1
Host: dummy

rs
HTTP/1.1 400 r^�
)ror�r�rv�indexr�rgr]r�rrr�test_extra_spaces�z/BaseHTTPRequestHandlerTestCase.test_extra_spacecCs�|�d�}|�|d�|�|dd��|��|�|dd�|�|jjd�|�|jjd�|�|jjd�|�|jj	d	�d
}|�
|jj��|�dS)Ns(GET / HTTP/1.0
Expect: 100-continue

rr^r�r^r�r6rhr��)ZExpectz100-continuer��rr�r>rrr�test_with_continue_1_0s
z5BaseHTTPRequestHandlerTestCase.test_with_continue_1_0cCs�|�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^r�rsHTTP/1.1 200 OK
r�r^r�r6rhr@r�)rorirvrprgr�r�rar�r�r>r<r�rrr�test_with_continue_1_1)s
z5BaseHTTPRequestHandlerTestCase.test_with_continue_1_1cCsNtd�}t�}t�}||_||_d|_d|_d|_|�d�|�	|j
d�dS)Nr�r@r�r)r
rarYrirZr�r�r�rOrird�rrmrnrgrrr�#test_header_buffering_of_send_error8s
zBBaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_errorcCsXtd�}t�}t�}||_||_d|_|�d�|�|jd�|�	�|�|jd�dS)Nr�r@r�rr^)
r
rarYrirZr�Zsend_response_onlyrirdrIr�rrr�+test_header_buffering_of_send_response_onlyFs
zJBaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_response_onlycCsvtd�}t�}t�}||_||_d|_|�dd�|�dd�|�|jd�|�	�|�|�
�d�|�|jd�dS)	Nr�r@ZFoo�foo�barrsFoo: foo
bar: bar

r^)r
rarYrirZr�rHrirdrIrcr�rrr�$test_header_buffering_of_send_headerTszCBaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_headercCs�dd�}td�}t�}||j_||j_d|j_|j��|�||�d�||��d�}|�|dd�|�|d	d�|�|d
d�dS)NcSs(|��}|�d�|��}|�|�|Srh)�tellrkr)r��posr�rrr�_readAndReseekfs


z[BaseHTTPRequestHandlerTestCase.test_header_unbuffered_when_continue.<locals>._readAndReseekr�r@r�r�rsHTTP/1.1 100 Continuer^rsHTTP/1.1 200 OK)	r
rgrirZr�rjZassertNotEqualr�ri)rr�rmrnr�rrr�$test_header_unbuffered_when_continueds
zCBaseHTTPRequestHandlerTestCase.test_header_unbuffered_when_continuecCst|j}t�|_|�d�}|�|dd�|�|dd��|�|jj�|�tdd�|dd�D��d�||_dS)Nr�rs!HTTP/1.1 417 Expectation Failed
r^r�css|]}|dkVqdS)sConnection: close
Nr)rq�rrrrrt�r�zMBaseHTTPRequestHandlerTestCase.test_with_continue_rejected.<locals>.<genexpr>)rgr_rorirvr�r]ru)rZ
usual_handlerr�rrr�test_with_continue_rejectedzs
"z:BaseHTTPRequestHandlerTestCase.test_with_continue_rejectedcCsD|�ddd�}|�|dd�|�|jj�|�|jjt�dS)NsGET �x�rs#HTTP/1.1 414 Request-URI Too Long
)rorir�rgr]ZassertIsInstancer�rr�rrr�test_request_length�sz2BaseHTTPRequestHandlerTestCase.test_request_lengthcCsH|�dddd�}|�|dd�|�|jj�|�|jjd�dS)NsGET / HTTP/1.1
X-Foo: bar�rr�s

rsHTTP/1.1 431 Line too long
r��rorir�rgr]r�r�rrr�test_header_length�s�z1BaseHTTPRequestHandlerTestCase.test_header_lengthcCs<|�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�r�r�rrr�test_too_many_headers�s�z4BaseHTTPRequestHandlerTestCase.test_too_many_headerscCs8|�d�}d�|�}d}|�tj|dd��d�|�dS)Ns*<script>alert("hello")</script> / HTTP/1.1r�z<script>alert("hello")</script>Fr�r)ror*r�r�r�rY)rr��textrrr�test_html_escape_on_error�s�
z8BaseHTTPRequestHandlerTestCase.test_html_escape_on_errorcsZ��fdd�}|�j_td���j����tt��td���j����tt��dS)Ncst���j_dSr)�nextrgZclose_connectionr�Zclose_valuesrrrrj�szPBaseHTTPRequestHandlerTestCase.test_close_connection.<locals>.handle_one_request)T)FFT)rgrj�iterZhandlerA�
StopIterationr�)rrjrr�r�test_close_connection�s

z4BaseHTTPRequestHandlerTestCase.test_close_connectionc	Csdt��}t�|�\	}}}}}}}}	}
d|jj|||jj|||||f}|�|jj|d�|�dS)Nz#%s, %02d %3s %4d %02d:%02d:%02d GMT)r�)�time�gmtimergZweekdaynameZ	monthnameriZdate_time_string)rZnowZyearZmonthZdayZhhZmmZssZwd�y�zrBrrr�test_date_time_string�s

�z4BaseHTTPRequestHandlerTestCase.test_date_time_stringN)rrr�__doc__�re�compilerwr3rorprvrzr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrf�s2
	

rfc@s0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)� SimpleHTTPRequestHandlerTestCasez Test url parsing cCs^tj�t��d�|_tj�dd�|_tj�dd�|_t�|_tdd�|_	tt
�d�d�|_dS)Nr�r�r�rZ)
r.rar*r��translated_1�translated_2�translated_3rY�	handler_1�	handler_2�pathlibZPurePath�	handler_3r(rrrr3�sz&SimpleHTTPRequestHandlerTestCase.setUpcCs�|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_pathrir�r�r�r�r��rrarrr�test_query_arguments�s$z5SimpleHTTPRequestHandlerTestCase.test_query_argumentscCs�|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�rrr�test_start_with_double_slash�sz=SimpleHTTPRequestHandlerTestCase.test_start_with_double_slashcCs0t�tjdt���|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�Wd�n1�s"0YdS)Nrazc:c:c:foo/filenamez\c:../filenamezc:\c:..\foo/filenamezc:c:foo\c:c:bar/filename)rZ	swap_attrrr.�ntpathr�r�r��seprir�r�r�r�r�r�rrr�test_windows_colon�sJz3SimpleHTTPRequestHandlerTestCase.test_windows_colonN)rrrr�r3r�r�r�rrrrr��s
r�c@seZdZdd�ZdS)�MiscTestCasecCsdg}hd�}tt�D]<}|�d�s||vr,qtt|�}t|dd�dkr|�|�q|�tj|�dS)N>r�Z
nobody_uidr,�_rzhttp.server)r�rr��getattrrUZassertCountEqual�__all__)rrBZ	blacklistr�Z
module_objectrrr�test_alls
zMiscTestCase.test_allN)rrrr�rrrrr�sr�c@sdeZdZdd�Ze�d�dd��Ze�d�dd��ZdZd	Z	e�d�d
d��Z
e�d�dd
��ZdS)�ScriptTestCasecCs0tjtjtjtjtjdd�d�d�d�d�d�S)NcSsdS)N)rrrrrrr�<lambda>/r�z2ScriptTestCase.mock_server_class.<locals>.<lambda>)r#)r")r\)r+)r	Z	MagicMockr(rrr�mock_server_class)s�����z ScriptTestCase.mock_server_classzbuiltins.printcCs0|��}tj|dd�|�|jtjtjf�dS�N�ZServerClass�bind�r�rr�r��address_familyr"�AF_INET6�AF_INET�rr��mock_serverrrr�test_server_test_unspec6s
�z&ScriptTestCase.test_server_test_unspeccCs0|��}tj|dd�|�|jtjtjf�dS)Nr!r�r�r�rrr�test_server_test_localhost?s
�z)ScriptTestCase.test_server_test_localhost)z::z'2001:0db8:85a3:0000:0000:8a2e:0370:7334z::1)z0.0.0.0z8.8.8.8r{cCs6|jD]*}|��}tj||d�|�|jtj�qdSr�)�
ipv6_addrsr�rr�rir�r"r��rr�r�r�rrr�test_server_test_ipv6Ts
z$ScriptTestCase.test_server_test_ipv6cCs6|jD]*}|��}tj||d�|�|jtj�qdSr�)�
ipv4_addrsr�rr�rir�r"r�r�rrr�test_server_test_ipv4[s
z$ScriptTestCase.test_server_test_ipv4N)rrrr�r	r�r�r�r�r�r�r�rrrrr�'s



r�cCst�tjt���dSr)rZaddModuleCleanupr.r�r�rrrr�setUpModulecsr��__main__)?r��collectionsrZhttp.serverrrrrr7rrr.r"r�r�rLr�r�r�Z
email.messager�Zemail.utilsr�Zhttp.clientZurllib.parser�r�r�r�rrr	�ior
rr�rr
rrZTestCaser,r?r�r�r.r/r0r2r�hasattrrrrYr_rarfr�r�r�r�r�mainrrrr�<module>sl	P$"
�~Z
<