Your IP : 216.73.216.196


Current Path : /opt/alt/python37/lib64/python3.7/test/__pycache__/
Upload File :
Current File : //opt/alt/python37/lib64/python3.7/test/__pycache__/test_httpservers.cpython-37.opt-1.pyc

B

� f?��@s�dZddlmZmZmZmZddlmZmZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZddlmZmZddlZddlm Z Gdd	�d	�Z!Gd
d�dej"�Z#Gdd
�d
ej$�Z%Gdd�de%�Z&Gdd�de%�Z'Gdd�de%�Z(dZ)dZ*dZ+e�,e-e	d��o\e	�.�dkd�Gdd�de%��Z/Gdd�de�Z0Gdd�de0�Z1Gdd �d �Z2Gd!d"�d"ej$�Z3Gd#d$�d$ej$�Z4Gd%d&�d&ej$�Z5d*d'd(�Z6e7d)k�r�e6�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.
�)�BaseHTTPRequestHandler�
HTTPServer�SimpleHTTPRequestHandler�CGIHTTPRequestHandler)�server�
HTTPStatusN)�mock)�BytesIO�StringIO)�supportc@seZdZdd�Zddd�ZdS)�NoLogRequestHandlercGsdS)N�)�self�argsr
r
�:/opt/alt/python37/lib64/python3.7/test/test_httpservers.py�log_message"szNoLogRequestHandler.log_messageNcCsdS)N�r
)r�nr
r
r�read&szNoLogRequestHandler.read)N)�__name__�
__module__�__qualname__rrr
r
r
rr!src@s$eZdZdd�Zdd�Zdd�ZdS)�TestServerThreadcCstj�|�||_||_dS)N)�	threading�Thread�__init__�request_handler�test_object)rrrr
r
rr+szTestServerThread.__init__cCsZtd|j�|_|jj��\|j_|j_|jj�	�d|_z|j�
d�Wd|j��XdS)N)Z	localhostrg�������?)rrrZsocketZgetsocknamer�HOST�PORT�server_started�setZ
serve_foreverZserver_close)rr
r
r�run0szTestServerThread.runcCs|j��|��dS)N)rZshutdown�join)rr
r
r�stop:s
zTestServerThread.stopN)rrrrr"r$r
r
r
rr*s
rc@s,eZdZdd�Zdd�Zddifdd�ZdS)	�BaseTestCasecCsDt��|_t��t_t��|_t	||j
�|_|j��|j�
�dS)N)rZthreading_setup�_threadsZEnvironmentVarGuard�os�environrZEventr rr�thread�start�wait)rr
r
r�setUp@s



zBaseTestCase.setUpcCs*|j��d|_tj��tj|j�dS)N)r)r$r'r(�__exit__rZthreading_cleanupr&)rr
r
r�tearDownHs

zBaseTestCase.tearDown�GETNcCs0tj�|j|j�|_|j�||||�|j��S)N)�http�client�HTTPConnectionrrZ
connection�request�getresponse)rZuri�method�body�headersr
r
rr3NszBaseTestCase.request)rrrr,r.r3r
r
r
rr%?sr%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_handlerzHTTP/1.1cCs0|�tj�|�dd�|�dd�|��dS)NzContent-Typez	text/html�
Connection�close)�
send_responser�
NO_CONTENT�send_header�end_headers)rr
r
r�do_TESTYsz.BaseHTTPServerTestCase.request_handler.do_TESTcCs0|�tj�|�dd�|�dd�|��dS)NzContent-Typez	text/htmlr9z
keep-alive)r;rr<r=r>)rr
r
r�do_KEEP_sz.BaseHTTPServerTestCase.request_handler.do_KEEPcCs|�d�dS)Ni�)�
send_error)rr
r
r�do_KEYERROResz2BaseHTTPServerTestCase.request_handler.do_KEYERRORcCs|�tj�dS)N)rAr�	NOT_FOUND)rr
r
r�do_NOTFOUNDhsz2BaseHTTPServerTestCase.request_handler.do_NOTFOUNDcCs|�ddd�dS)Ni�z
Short MessagezThis is a long 
 explanation)rA)rr
r
r�do_EXPLAINERRORksz6BaseHTTPServerTestCase.request_handler.do_EXPLAINERRORcCs.|�d�|�dd�|�dd�|��dS)Ni�zContent-Typez	text/htmlr9r:)r;r=r>)rr
r
r�	do_CUSTOMos
z0BaseHTTPServerTestCase.request_handler.do_CUSTOMcCsJ|�d�|�dd�|�dd�|��|jd�d�}|j�|�dS)Ni�z	X-SpecialuDängerous Mindr9r:zx-special-incomingzutf-8)r;r=r>r7�encode�wfile�write)rr6r
r
r�do_LATINONEHEADERus
z8BaseHTTPServerTestCase.request_handler.do_LATINONEHEADERcCs|�t|jdd���dS)N�)rA�int�path)rr
r
r�
do_SEND_ERROR}sz4BaseHTTPServerTestCase.request_handler.do_SEND_ERRORcCs|�t|jdd���dS)NrK)rArLrM)rr
r
r�do_HEAD�sz.BaseHTTPServerTestCase.request_handler.do_HEADN)rrr�protocol_version�default_request_versionr?r@rBrDrErFrJrNrOr
r
r
rrUsrcCs,t�|�tj�|j|j�|_|j��dS)N)	r%r,r0r1r2rr�con�connect)rr
r
rr,�s
zBaseHTTPServerTestCase.setUpcCs,|j�dd�|j��}|�|jtj�dS)Nr/�/)rRr3r4�assertEqual�statusr�NOT_IMPLEMENTED)r�resr
r
r�test_command�s
z#BaseHTTPServerTestCase.test_commandcCs>d|j_|j�dd�|j��|j��}|�|jtj�dS)Nz	HTTP/1.1
ZXYZBOGUSrT)	rR�
_http_vsn_str�
putrequest�
endheadersr4rUrVrrW)rrXr
r
r�test_request_line_trimming�s


z1BaseHTTPServerTestCase.test_request_line_trimmingcCs>d|j_|j�dd�|j��|j��}|�|jtj�dS)NZFUBARr/rT)	rRrZr[r\r4rUrVr�BAD_REQUEST)rrXr
r
r�test_version_bogus�s


z)BaseHTTPServerTestCase.test_version_boguscCs>d|j_|j�dd�|j��|j��}|�|jtj�dS)Nz
HTTP/9.9.9r/rT)	rRrZr[r\r4rUrVrr^)rrXr
r
r�test_version_digits�s


z*BaseHTTPServerTestCase.test_version_digitscCs>d|j_|j�dd�|j��|j��}|�|jtj�dS)Nrr/rT)	rRrZr[r\r4rUrVrrW)rrXr
r
r�test_version_none_get�s


z,BaseHTTPServerTestCase.test_version_none_getcCs>d|j_|j�dd�|j��|j��}|�|jtj�dS)Nr�CUSTOMrT)	rRrZr[r\r4rUrVrr^)rrXr
r
r�test_version_none�s


z(BaseHTTPServerTestCase.test_version_nonecCsFd|j_d|j_|j�dd�|j��|j��}|�|jtj	�dS)N�czHTTP/9.9r/rT)
rRZ	_http_vsnrZr[r\r4rUrVrZHTTP_VERSION_NOT_SUPPORTED)rrXr
r
r�test_version_invalid�s

z+BaseHTTPServerTestCase.test_version_invalidcCs>d|j_|j�dd�|j��|j��}|�|jtj�dS)Nr)	rRrZr[r\r4rUrVrr^)rrXr
r
r�test_send_blank�s


z&BaseHTTPServerTestCase.test_send_blankcCsD|j�dd�|j�dd�|j��|j��}|�|jtj�dS)Nr/rTr9r:)	rRr[�	putheaderr\r4rUrVrrW)rrXr
r
r�test_header_close�s


z(BaseHTTPServerTestCase.test_header_closecCsLd|j_|j�dd�|j�dd�|j��|j��}|�|jtj	�dS)NzHTTP/1.1r/rTr9z
keep-alive)
rRrZr[rgr\r4rUrVrrW)rrXr
r
r�test_header_keep_alive�s

z-BaseHTTPServerTestCase.test_header_keep_alivecCs,|j�dd�|j��}|�|jtj�dS)N�TESTrT)rRr3r4rUrVrr<)rrXr
r
r�test_handler�s
z#BaseHTTPServerTestCase.test_handlercCsJ|j�dd�|j��}|�|�d�d�|j�dd�|�|jj�dS)NZKEEPrTr9z
keep-aliverj)rRr3r4rU�	getheaderZ
addCleanupr:)rrXr
r
r�test_return_header_keep_alive�s

z4BaseHTTPServerTestCase.test_return_header_keep_alivecCs*|j�dd�|j��}|�|jd�dS)NZKEYERRORrTi�)rRr3r4rUrV)rrXr
r
r�test_internal_key_error�s
z.BaseHTTPServerTestCase.test_internal_key_errorcCs*|j�dd�|j��}|�|jd�dS)NrbrTi�)rRr3r4rUrV)rrXr
r
r�test_return_custom_status�s
z0BaseHTTPServerTestCase.test_return_custom_statuscCs>|j�dd�|j��}|�|jd�|�t|�d���dS)NZEXPLAINERRORrTi�zContent-Length)rRr3r4rUrV�
assertTruerLrl)rrXr
r
r�test_return_explain_error�s
z0BaseHTTPServerTestCase.test_return_explain_errorcCsL|jjddddid�|j��}|�|�d�d�|�|��d�d��dS)	NZLATINONEHEADERrTzX-Special-IncominguÄrger mit Unicode)r7z	X-SpecialuDängerous Mindzutf-8)rRr3r4rUrlrrG)rrXr
r
r�test_latin1_header�s


z)BaseHTTPServerTestCase.test_latin1_headercCsN|j�dd�|j��}|�|jtj�|��}|�t|�	d��t
|��dS)NZNOTFOUNDrTzContent-Length)rRr3r4rUrVrrCrrLrl�len)rrX�datar
r
r�test_error_content_length�s

z0BaseHTTPServerTestCase.test_error_content_lengthcCs�tjtjf}x�tjtjtjtjtjfD]�}|j�dd�|��|j�	�}|�
||j�|�
d|�d��|�
d|�d��||kr�|�
d|�d��|�
�}|�
d|�q&WdS)NZ
SEND_ERRORz/{}zContent-LengthzContent-TypezTransfer-Encoding�)r�NOT_MODIFIED�
RESET_CONTENTr<Z
PROCESSING�SWITCHING_PROTOCOLSrRr3�formatr4rUrVrlr)r�allow_transfer_encoding_codes�coderXrtr
r
r�test_send_error�s

z&BaseHTTPServerTestCase.test_send_errorcCs�tjtjf}x�tjtjtjtjtjfD]�}|j�dd�|��|j�	�}|�
||j�|tjkr�|�t
|�d��dk�|�d|�d��n$|�
d|�d��|�
d|�d��||kr�|�
d|�d��|��}|�
d|�q&WdS)	N�HEADz/{}zContent-Lengthrz	text/htmlzContent-TypezTransfer-Encodingrv)rrwrx�OKr<ryrRr3rzr4rUrVrprLrl�assertInr)rr{r|rXrtr
r
r�test_head_via_send_error
s"


z/BaseHTTPServerTestCase.test_head_via_send_errorN)rrrrrrr,rYr]r_r`rarcrerfrhrirkrmrnrorqrrrur}r�r
r
r
rr8Ts*.	r8c@s,eZdZGdd�de�Zdd�Zdd�ZdS)�RequestHandlerLoggingTestCasec@s$eZdZdZdZdd�Zdd�ZdS)z-RequestHandlerLoggingTestCase.request_handlerzHTTP/1.1cCs|�tj�|��dS)N)r;rrr>)rr
r
r�do_GET(sz4RequestHandlerLoggingTestCase.request_handler.do_GETcCs|�tjd�dS)NzFile not found)rArrC)rr
r
r�do_ERROR,sz6RequestHandlerLoggingTestCase.request_handler.do_ERRORN)rrrrPrQr�r�r
r
r
rr$src	Csbtj�|j|j�|_|j��t���}|j�	dd�|j�
�WdQRX|�|���
d��dS)Nr/rTz"GET / HTTP/1.1" 200 -
)r0r1r2rrrRrSr�captured_stderrr3r4rp�getvalue�endswith)r�errr
r
r�test_get/s

z&RequestHandlerLoggingTestCase.test_getc	Cs�tj�|j|j�|_|j��t���}|j�	dd�|j�
�WdQRX|���d�}|�
|d�d��|�
|d�d��dS)NZERRORrT�
rz code 404, message File not foundrKz"ERROR / HTTP/1.1" 404 -)r0r1r2rrrRrSrr�r3r4r��splitrpr�)rr��linesr
r
r�test_err:s

z&RequestHandlerLoggingTestCase.test_errN)rrrrrr�r�r
r
r
rr�#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)rrrr
r
r
rrHsrc	s�t���t��|_t��}t�|�d|_tj	|d�|_
tj�|j
�|_
d|j
|_tj�|j
d�}t|d��}|�|j�|��WdQRXt�|�j}tj�|tjj�}|jdd�|_tjj|��dd	�|_dS)
NsWe are the knights who say Ni!)�dirrT�test�wbr)ZmicrosecondT)�usegmt) �superr,r'�getcwd�cwd�tempfileZ
gettempdir�chdirrt�mkdtemp�tempdirrM�basename�tempdir_name�base_urlr#�openrI�flush�stat�st_mtime�datetimeZ
fromtimestampZtimezoneZutc�replace�last_modif_datetime�email�utilsZ
formatdate�	timestamp�last_modif_header)rZbasetempdirZtempnameZtemp�mtimeZ
last_modif)�	__class__r
rr,Ks$



zSimpleHTTPServerTestCase.setUpcs@z.t�|j�yt�|j�WnYnXWdt���XdS)N)r'r�r��shutilZrmtreer�r�r.)r)r�r
rr.`s
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�responser
r�
close_connkszDSimpleHTTPServerTestCase.check_status_and_reason.<locals>.close_conn�
r9r:�rvzConnection should be closed)Z_close_connrrprUrV�assertIsNotNone�reason�version�msg�getr:)rr�rVrtr�r6r
)r�r�r�check_status_and_reasonjs
z0SimpleHTTPServerTestCase.check_status_and_reason�darwinz2undecodable name cannot always be decoded on macOSZwin32z+undecodable name cannot be decoded on win32zneed support.TESTFN_UNDECODABLEc	Cst��}t�tj�d}ttj�|j	|�d��}|�
tj�WdQRX|�|jd�}tj
dkr�x"t�|j	�D]}|dkrn|}PqnW|�|tj�}tjj|dd�}|�d|�|d	�|�|�d
tj|dd��|d	�|�|�|jd|�}|j|tjtjd
�dS)Nz.txtr�rTr�r��
surrogatepass)�errorsz	href="%s"�surrogateescapez>%s<F)�quote)rt)�sys�getfilesystemencodingr'�fsdecoder�TESTFN_UNDECODABLEr�rMr#r�rIr3r��platform�listdirr�rr�urllib�parser�r�rG�html�escape)r�enc�filename�fr��namer6Z
quotednamer
r
r�test_undecodable_filename�s&

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=�)r3r�rZassertRegexrG)rr�r
r
r�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_directoryrT�Locationznon-attack failed!)r�z//zcExpected Location header to start with a single / and end with a / as this is a directory redirect.zhttps://pypi.org/N)r'�mkdirrMr#r�r�r3r�r�MOVED_PERMANENTLYrlrU�assertFalse�
startswithrp)	rZurlZexpected_locationr��locationZ
attack_urlZattack3_urlZattack_scheme_netloc_2slash_urlZexpected_scheme_netloc_locationr
r
r�3test_get_dir_redirect_location_domain_injection_bug�s0	











zLSimpleHTTPServerTestCase.test_get_dir_redirect_location_domain_injection_bugc
Cs�|�|jd�}|j|tj|jd�|�|jd�}|�|tj�|�|jd�}|�|tj�|�|j�}|�|tj�|�|jd�}|�|tj�|�|jd�}|�|tj�|�|�	d�|jd�|�d	�}|�|tj�|�d
�}|�|tj�d}t
tj�
|jd�d
��}|�|�WdQRX|�|jd�}|�|tj|�tjdk�r�t��dk�r�t�|jd�z"|�|jd�}|�|tj�Wdt�|jd�XdS)Nz/test)rtz/test/rTz/?hi=2z?hi=1r�z/?hi=1z/ThisDoesNotExistz/ThisDoesNotExist/sDummy index file
z
index.htmlr��posixri�)r3r�r�rrrtrCr�rUrlr�r'rMr#r�rIr��geteuid�chmodr�)rr�rtr�r
r
rr��s:

z!SimpleHTTPServerTestCase.test_getcCsT|j|jddd�}|�|tj�|�|�d�tt|j	���|�|�d�d�dS)Nz/testr~)r5zcontent-lengthzcontent-typezapplication/octet-stream)
r3r�r�rrrUrl�strrsrt)rr�r
r
r�	test_head�s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
        zIf-Modified-Sincez/test)r7rK)ZhoursT)r�N)r��message�Messager�r3r�r�rrwr�r��	timedeltar��format_datetime)rr7r�Znew_dtr
r
r�test_browser_caches


z+SimpleHTTPServerTestCase.test_browser_cachecCsZ|j}|tjdd�}tj��}tjj|dd�|d<|j|j	d|d�}|�
|tj�dS)Nim)ZdaysT)r�zIf-Modified-Sincez/test)r7)
r�r�r�r�r�r�r�r�r3r�r�rr)rZdtZold_dtr7r�r
r
r�test_browser_cache_file_changeds
z8SimpleHTTPServerTestCase.test_browser_cache_file_changedcCsBtj��}|j|d<d|d<|j|jd|d�}|�|tj�dS)NzIf-Modified-Since�*z
If-None-Matchz/test)r7)	r�r�r�r�r3r�r�rr)rr7r�r
r
r�,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)NrTZFOO)r5ZcustomZGETs)r3r�rrW)rr�r
r
r�test_invalid_requests.s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
        z/test)rtz
Last-modifiedN)	r3r�r�rrrtr7rUr�)rr�r�r
r
r�test_last_modified7s
z+SimpleHTTPServerTestCase.test_last_modifiedcCs�|�|jd�}|j|tj|jd�|�|jd�}|�|tj�|�|jd�}|�|tj�|�|j�}|�|tj�|�|jd�}|�|tj�|�|jd�}|�|tj�|�|�	d�|jd�dS)	Nz/test)rtz/test/rTz/?hi=2z?hi=1r�z/?hi=1)
r3r�r�rrrtrCr�rUrl)rr�r
r
r�test_path_without_leading_slash@sz8SimpleHTTPServerTestCase.test_path_without_leading_slashc	Cs�d}tj�|j|�}yt|d���Wn"tk
rHt�d|��YnXz,|�	|j
d�}|�|tj
�}|j��}Wdt�|�X|�|�dtj|dd�}|�|�|�|�dS)Nz<test&>.txt�wz-Can not create file %s on current file systemrTz>%s<F)r�)r'rMr#r�r�r:�OSError�unittestZSkipTestr3r�r�rrr7Zget_content_charset�unlinkr�r�r�r�rG)rr�Zfullpathr�r6r�Z	html_textr
r
r�test_html_escape_filenamePs
z2SimpleHTTPServerTestCase.test_html_escape_filename)N)rrrrrrr,r.r�r��skipIfr�r�Z
skipUnlessrr�r�r�r�r�r�r�r�r�r�r�r�r��
__classcell__r
r
)r�rr�Gs*

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"])
r�z7This 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 S)!�CGIHTTPServerTestCasec@seZdZdS)z%CGIHTTPServerTestCase.request_handlerN)rrrr
r
r
rr�sr�asciic	Cspt�|�t��|_t��|_tj�	|jd�|_
tj�	|j
d�|_t�|j
�t�|j�d|_
d|_d|_d|_d|_t��r�tj�	|jd�|_t�tj|j�ntj|_y|j�d�Wn&tk
r�|��|�d�YnXtj�	|jd�|_
t|j
d��}|�t|j�WdQRXt�|j
d�tj�	|j
d	�|_t|jddd
��}|�t|j�WdQRXt�|jd�tj�	|j
d�|_t|jddd
��}|�t |j�WdQRXt�|jd�tj�	|jd�|_t|jddd
��}|�t|j�WdQRXt�|jd�tj�	|j
d
�|_t|jddd
��}|�t!|jdf�WdQRXt�|jd�t�"|j�dS)Nzcgi-binz	child-dir�pythonzutf-8z0Python executable path is not encodable to utf-8znocgi.pyr�i�zfile1.py)�encodingzfile2.pyzfile3.pyzfile4.pyZQUERY_STRING)#r%r,r'r�r�r�r��
parent_dirrMr#�cgi_dir�
cgi_child_dirr��
nocgi_path�
file1_path�
file2_path�
file3_path�
file4_pathrZcan_symlink�	pythonexe�symlinkr��
executablerG�UnicodeEncodeErrorr.ZskipTestr�rI�	cgi_file1r��	cgi_file2�	cgi_file4r�)rr�Zfile1Zfile2Zfile3Zfile4r
r
rr,�sT


zCGIHTTPServerTestCase.setUpc	Cs�z�t�|j�|jtjkr&t�|j�|jr8t�|j�|jrJt�|j�|j	r\t�|j	�|j
rnt�|j
�|jr�t�|j�t�|j
�t�|j�t�|j�Wdt�|�XdS)N)r'r�r�r�r�r��remover�r�r�r�r��rmdirr�r�r�r%r.)rr
r
rr.�s$zCGIHTTPServerTestCase.tearDowncCs�dttddddddddddddddddd	d
d
tddtddd
�}x^|��D]R\}}t|t�rvt|t�rv|�|tj|�qHt�|�}|j	||d|||fd�qHWdS)Nz//z//\z/cgi-bin/file1.pyz//az/C:/z/a/bz/a/b/z/a/b/dz/a/b/d/fz/a/b/fz/a/fz//f)rz..z/.//..rTz//z/\z/.//zcgi-bin/file1.pyz/cgi-bin/file1.py�az/az//az./az./C:/z/a/bz/a/b/z/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: %r)r�)
�
IndexError�items�
isinstance�type�
issubclass�	Exception�assertRaisesrZ_url_collapse_pathrU)rZtest_vectorsrM�expectedZactualr
r
r�test_url_collapse_path�sH
z,CGIHTTPServerTestCase.test_url_collapse_pathcCs:|�d�}|�|��|�d�|jfd|jdtjf�dS)Nz/cgi-bin/file1.pyzContent-typesHello Worldz	text/html)r3rUrrlrV�lineseprr)rrXr
r
r�test_headers_and_contents
z.CGIHTTPServerTestCase.test_headers_and_contentcCs|�d�}|�|jtj�dS)Nz)///////////nocgi.py/../cgi-bin/nothere.sh)r3rUrVrrC)rrXr
r
r�test_issue19435s
z%CGIHTTPServerTestCase.test_issue19435cCsFtj�dddd��}ddi}|�dd||�}|�|��d	|j�dS)
NrKr�i@�)ZspamZeggsZbaconzContent-typez!application/x-www-form-urlencodedz/cgi-bin/file2.pyZPOSTs1, python, 123456)r�r�Z	urlencoder3rUrr
)rZparamsr7rXr
r
r�	test_posts
zCGIHTTPServerTestCase.test_postcCs&|�d�}|��|�|jtj�dS)Nz/cgi-bin/invalid)r3rrUrVrrC)rrXr
r
r�test_invaliduris
z%CGIHTTPServerTestCase.test_invaliduricCsRddt�d�i}|jdd|d�}|�d|jdtjf|��|�d	�|j	f�dS)
Ns
AuthorizationsBasic s
username:passz/cgi-bin/file1.pyr/)r7sHello Worldz	text/htmlzContent-type)
�base64Z	b64encoder3rUr
rrrrlrV)rr7rXr
r
r�test_authorizationsz(CGIHTTPServerTestCase.test_authorizationcCs:|�d�}|�d|jdtjf|��|�d�|jf�dS)Nzcgi-bin/file1.pysHello Worldz	text/htmlzContent-type)r3rUr
rrrrlrV)rrXr
r
r�test_no_leading_slash%s
z+CGIHTTPServerTestCase.test_no_leading_slashcCsZd}|tjd<|�d�}|�d|jdtjf|��|�d�|j	f�|�tjd|�dS)NzTest CGI ServerZSERVER_SOFTWAREz/cgi-bin/file1.pysHello Worldz	text/htmlzContent-type)
r'r(r3rUr
rrrrlrV)rZ	signaturerXr
r
r�test_os_environ_is_not_altered,s

z4CGIHTTPServerTestCase.test_os_environ_is_not_alteredcCs:|�d�}|�d|jdtjf|��|�d�|jf�dS)Nz/cgi-bin%2ffile1.pysHello Worldz	text/htmlzContent-type)r3rUr
rrrrlrV)rrXr
r
r�#test_urlquote_decoding_in_cgi_check5s
z9CGIHTTPServerTestCase.test_urlquote_decoding_in_cgi_checkcCs:|�d�}|�d|jdtjf|��|�d�|jf�dS)Nz/cgi-bin/child-dir/file3.pysHello Worldz	text/htmlzContent-type)r3rUr
rrrrlrV)rrXr
r
r�test_nested_cgi_path_issue21323;s
z5CGIHTTPServerTestCase.test_nested_cgi_path_issue21323cCs:|�d�}|�d|jdtjf|��|�d�|jf�dS)Nz/cgi-bin/file4.py?a=b?c=dsa=b?c=dz	text/htmlzContent-type)r3rUr
rrrrlrV)rrXr
r
r�&test_query_with_multiple_question_markAs
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//z	text/htmlzContent-type)r3rUr
rrrrlrV)rrXr
r
r�"test_query_with_continuous_slashesGs

z8CGIHTTPServerTestCase.test_query_with_continuous_slashesN)rrrrrrr'r
rGr,r.r	rrr
rrrrrrrrr
r
r
rr��s :*	r�cs,eZdZ�fdd�Zdd�Zdd�Z�ZS)�SocketlessRequestHandlercs2t��}t�|j_t��|dd�d|_d|_dS)NFzHTTP/1.1)	rZMockr	ZmakefileZreturn_valuer�r�
get_calledrP)rr�kwargsr3)r�r
rrPs

z!SocketlessRequestHandler.__init__cCs6d|_|�tj�|�dd�|��|j�d�dS)NTzContent-Typez	text/htmls <html><body>Data</body></html>
)rr;rrr=r>rHrI)rr
r
rr�Xs
zSocketlessRequestHandler.do_GETcGsdS)Nr
)rrzrr
r
rr_sz$SocketlessRequestHandler.log_message)rrrrr�rr�r
r
)r�rrOsrc@seZdZdd�ZdS)�!RejectingSocketlessRequestHandlercCs|�tj�dS)NF)rArZEXPECTATION_FAILED)rr
r
r�handle_expect_100csz3RejectingSocketlessRequestHandler.handle_expect_100N)rrrrr
r
r
rrbsrc@s0eZdZdd�Zdd�Zdd�Zedd��Zd	S)
�AuditableBytesIOcCs
g|_dS)N)�datas)rr
r
rrjszAuditableBytesIO.__init__cCs|j�|�dS)N)r�append)rrtr
r
rrImszAuditableBytesIO.writecCsd�|j�S)Nrv)r#r)rr
r
r�getDatapszAuditableBytesIO.getDatacCs
t|j�S)N)rsr)rr
r
r�	numWritessszAuditableBytesIO.numWritesN)rrrrrIr�propertyr r
r
r
rrhsrc@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�|_dS)N)r�handler)rr
r
rr,�sz$BaseHTTPRequestHandlerTestCase.setUpcCs:t|�}t�}||j_||j_|j��|�d�|��S)Nr)r	r#�rfilerH�handle_one_request�seek�	readlines)rr��input�outputr
r
r�send_typical_request�s

z3BaseHTTPRequestHandlerTestCase.send_typical_requestcCs|�|jj�dS)N)rpr#r)rr
r
r�verify_get_called�sz0BaseHTTPRequestHandlerTestCase.verify_get_calledcs0x*dD]"�|�t�fdd�|D��d�qWdS)N)sServer: sDate: sContent-Type: c3s|]}|���VqdS)N)r�)�.0�h)�	fieldNamer
r�	<genexpr>�szIBaseHTTPRequestHandlerTestCase.verify_expected_headers.<locals>.<genexpr>rK)rU�sum)rr7r
)r.r�verify_expected_headers�s
z6BaseHTTPRequestHandlerTestCase.verify_expected_headerscCs|j�|�}|�|�dS)N)�HTTPResponseMatch�searchr�)rr��matchr
r
r�verify_http_server_response�sz:BaseHTTPRequestHandlerTestCase.verify_http_server_responsec	Cs�d|j_tj}tj�tdt���:}||jd�||jd�||jdd�||jdd�WdQRX|�	�}|�
d|�|�
d	|�|��}|�d|d
�|�d|d�|�d
|d�|�d|d�dS)N)z	127.0.0.1i9�stderrz/fooz/barz	/spam %s.ruŸ beans��rz/\x1bbar\x00\x1brKz/spam a.�u/spam \x1b\x7f\x9f beans.�)
r#Zclient_addressrrrZpatch�objectr�r
r�ZassertNotIn�
splitlinesr�)rrZfake_stderrr6r�r
r
r�test_unprintable_not_logged�sz:BaseHTTPRequestHandlerTestCase.test_unprintable_not_loggedcCs�|�d�}|�|d�|�|dd��|��|�|dd�|�|jjd�|�|jjd�|�|jjd�|�|jj	d	�|�
|jj��d
�dS)NsGET / HTTP/1.1

rrK���s <html><body>Data</body></html>
zGET / HTTP/1.1r/rTzHTTP/1.1r
)
r*r5r1r+rUr#�requestline�commandrM�request_version�assertSequenceEqualr7r)r�resultr
r
r�
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

rrKr>s <html><body>Data</body></html>
zGET / HTTP/1.0r/rTzHTTP/1.0r
)
r*r5r1r+rUr#r?r@rMrArBr7r)rrCr
r
r�
test_http_1_0�s
z,BaseHTTPRequestHandlerTestCase.test_http_1_0cCs6|�d�}|�t|�d�|�|dd�|��dS)NsGET / HTTP/0.9

rKrs <html><body>Data</body></html>
)r*rUrsr+)rrCr
r
r�
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 rKs
)r*rpr�r1�indexr�r#r)rrCr
r
r�test_extra_space�s
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

rrKr>s <html><body>Data</body></html>
zGET / HTTP/1.0r/rTzHTTP/1.0))�Expectz100-continue)
r*r5r1r+rUr#r?r@rMrArBr7r)rrCr7r
r
r�test_with_continue_1_0�s
z5BaseHTTPRequestHandlerTestCase.test_with_continue_1_0cCs�|�d�}|�|dd�|�|dd�|�|dd�|�|dd��|��|�|dd	�|�|jjd
�|�|jjd�|�|jjd�|�|jjd
�d}|�	|jj
��|�dS)Ns(GET / HTTP/1.1
Expect: 100-continue

rsHTTP/1.1 100 Continue
rKs
r9sHTTP/1.1 200 OK
r>s <html><body>Data</body></html>
zGET / HTTP/1.1r/rTzHTTP/1.1))rIz100-continue)r*rUr1r+r#r?r@rMrArBr7r)rrCr7r
r
r�test_with_continue_1_1�s
z5BaseHTTPRequestHandlerTestCase.test_with_continue_1_1cCsNtd�}t�}t�}||_||_d|_d|_d|_|�d�|�	|j
d�dS)NsGET / HTTP/1.1

zHTTP/1.1ri�r9)r	rrr$rHrAr?r@rArUr )rr(r)r#r
r
r�#test_header_buffering_of_send_error�s
zBBaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_errorcCsXtd�}t�}t�}||_||_d|_|�d�|�|jd�|�	�|�|jd�dS)NsGET / HTTP/1.1

zHTTP/1.1i�rrK)
r	rrr$rHrAZsend_response_onlyrUr r>)rr(r)r#r
r
r�+test_header_buffering_of_send_response_only�s
zJBaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_response_onlycCsvtd�}t�}t�}||_||_d|_|�dd�|�dd�|�|jd�|�	�|�|�
�d�|�|jd�dS)	NsGET / HTTP/1.1

zHTTP/1.1ZFooZfooZbarrsFoo: foo
bar: bar

rK)r	rrr$rHrAr=rUr r>r)rr(r)r#r
r
r�$test_header_buffering_of_send_header
s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�|��}|�|�|S)Nr)�tellr&r)r��posrtr
r
r�_readAndReseeks


z[BaseHTTPRequestHandlerTestCase.test_header_unbuffered_when_continue.<locals>._readAndReseeks(GET / HTTP/1.1
Expect: 100-continue

zHTTP/1.1rvs
rsHTTP/1.1 100 ContinuerKr9sHTTP/1.1 200 OK)	r	r#r$rHrAr%ZassertNotEqualr�rU)rrQr(r)rCr
r
r�$test_header_unbuffered_when_continues
zCBaseHTTPRequestHandlerTestCase.test_header_unbuffered_when_continuecCst|j}t�|_|�d�}|�|dd�|�|dd��|�|jj�|�tdd�|dd�D��d�||_dS)Ns(GET / HTTP/1.1
Expect: 100-continue

rs!HTTP/1.1 417 Expectation Failed
rKr>css|]}|dkVqdS)sConnection: close
Nr
)r,�rr
r
rr/9szMBaseHTTPRequestHandlerTestCase.test_with_continue_rejected.<locals>.<genexpr>)r#rr*rUr1r�rr0)rZ
usual_handlerrCr
r
r�test_with_continue_rejected0s
"z:BaseHTTPRequestHandlerTestCase.test_with_continue_rejectedcCsD|�ddd�}|�|dd�|�|jj�|�|jjt�dS)NsGET �xirs#HTTP/1.1 414 Request-URI Too Long
)r*rUr�r#rZassertIsInstancer?r�)rrCr
r
r�test_request_length<sz2BaseHTTPRequestHandlerTestCase.test_request_lengthcCsH|�dddd�}|�|dd�|�|jj�|�|jjd�dS)NsGET / HTTP/1.1
X-Foo: bar�ris

rsHTTP/1.1 431 Line too long
zGET / HTTP/1.1)r*rUr�r#rr?)rrCr
r
r�test_header_lengthDs
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
zGET / HTTP/1.1)r*rUr�r#rr?)rrCr
r
r�test_too_many_headersLs
z4BaseHTTPRequestHandlerTestCase.test_too_many_headerscCs8|�d�}d�|�}d}|�tj|dd��d�|�dS)Ns*<script>alert("hello")</script> / HTTP/1.1rvz<script>alert("hello")</script>F)r�r�)r*r#r�r�r�rG)rrC�textr
r
r�test_html_escape_on_errorSs

z8BaseHTTPRequestHandlerTestCase.test_html_escape_on_errorcsZ��fdd�}|�j_td���j����tt��td���j����tt��dS)Ncst���j_dS)N)�nextr#Zclose_connectionr
)�close_valuesrr
rr%]szPBaseHTTPRequestHandlerTestCase.test_close_connection.<locals>.handle_one_request)T)FFT)r#r%�iterZhandler�
StopIterationr\)rr%r
)r]rr�test_close_connectionZs

z4BaseHTTPRequestHandlerTestCase.test_close_connectionc	Csdt��}t�|�\	}}}}}}}}	}
d|jj|||jj|||||f}|�|jj|d�|�dS)Nz#%s, %02d %3s %4d %02d:%02d:%02d GMT)r�)�timeZgmtimer#ZweekdaynameZ	monthnamerUZdate_time_string)rZnowZyearZmonthZdayZhhZmmZssZwd�y�zrr
r
r�test_date_time_stringis

z4BaseHTTPRequestHandlerTestCase.test_date_time_stringN)rrr�__doc__�re�compiler2r,r*r+r1r5r=rDrErFrHrJrKrLrMrNrRrTrVrXrYr[r`rdr
r
r
rr"xs2
	

r"c@s0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)� SimpleHTTPRequestHandlerTestCasez Test url parsing cCs(t��|_tj�|jd�|_t�|_dS)Nr�)r'r��
translatedrMr#rr#)rr
r
rr,xs
z&SimpleHTTPRequestHandlerTestCase.setUpcCsR|j�d�}|�||j�|j�d�}|�||j�|j�d�}|�||j�dS)Nz	/filenamez/filename?foo=barz/filename?a=b&spam=eggs#zot)r#�translate_pathrUri)rrMr
r
r�test_query_arguments}sz5SimpleHTTPRequestHandlerTestCase.test_query_argumentscCs8|j�d�}|�||j�|j�d�}|�||j�dS)Nz
//filenamez//filename?foo=bar)r#rjrUri)rrMr
r
r�test_start_with_double_slash�sz=SimpleHTTPRequestHandlerTestCase.test_start_with_double_slashc	Cs�t�tjdt���|j�d�}|�tjtj�}|�	||j
�|j�d�}|�tjtj�}|�	||j
�|j�d�}|�tjtj�}|�	||j
�|j�d�}|�tjtj�}|�	||j
�WdQRXdS)NrMzc:c:c:foo/filenamez\c:../filenamezc:\c:..\foo/filenamezc:c:foo\c:c:bar/filename)rZ	swap_attrrr'�ntpathr#rjr��seprUri)rrMr
r
r�test_windows_colon�sz3SimpleHTTPRequestHandlerTestCase.test_windows_colonN)rrrrer,rkrlror
r
r
rrhvs
rhc@seZdZdd�ZdS)�MiscTestCasecCsjg}dddh}xHtt�D]<}|�d�s||kr0qtt|�}t|dd�dkr|�|�qW|�tj|�dS)Nr�Z
nobody_uidr��_rzhttp.server)r�rr��getattrrZassertCountEqual�__all__)rrZ	blacklistr�Z
module_objectr
r
r�test_all�s

zMiscTestCase.test_allN)rrrrtr
r
r
rrp�srpc	Cs4t��}zt�tttttt	t
�Wdt�|�XdS)N)r'r�rZrun_unittestr�r"r8r�r�rhrpr�)�verboser�r
r
r�	test_main�s
rv�__main__)N)8reZhttp.serverrrrrr0rrr'r�rfrrmr�Z
email.messager�Zemail.utilsr�Zhttp.clientZurllib.parser�r�rar�rr�r�ior	r
r�rrrrZTestCaser%r8r�r�r�r�r�r��hasattrr�r�rrrr"rhrprvrr
r
r
r�<module>s`	P$'
I(