B
    18™\M­  ã               @   sð  d Z ddlmZmZmZmZ ddlmZmZ ddl	Z	ddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZ ddlmZ ddlZddlmZ G dd	„ d	ƒZ G d
d„ dej!ƒZ"G dd„ dej#ƒZ$G dd„ de$ƒZ%G dd„ de$ƒZ&G dd„ de$ƒZ'dZ(dZ)dZ*e +e,e	dƒoXe	 -¡ dkd¡G dd„ de$ƒƒZ.G dd„ deƒZ/G dd„ de/ƒZ0G dd „ d ƒZ1G d!d"„ d"ej#ƒZ2G d#d$„ d$ej#ƒZ3G d%d&„ d&ej#ƒZ4d*d'd(„Z5e6d)krìe5ƒ  dS )+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)Úsupportc               @   s   e Zd Zdd„ Zddd„ZdS )ÚNoLogRequestHandlerc             G   s   d S )N© )ÚselfÚargsr   r   úY/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/test/test_httpservers.pyÚlog_message"   s    zNoLogRequestHandler.log_messageNc             C   s   dS )NÚ r   )r   Únr   r   r   Úread&   s    zNoLogRequestHandler.read)N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   !   s   r   c               @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTestServerThreadc             C   s   t j | ¡ || _|| _d S )N)Ú	threadingÚThreadÚ__init__Úrequest_handlerÚtest_object)r   r   r   r   r   r   r   +   s    zTestServerThread.__init__c             C   sZ   t d| jƒ| _| jj ¡ \| j_| j_| jj 	¡  d | _z| j 
d¡ W d | j ¡  X d S )N)Ú	localhostr   gš™™™™™©?)r   r   r   ÚsocketÚgetsocknamer   ÚHOSTÚPORTÚserver_startedÚsetZserve_foreverÚserver_close)r   r   r   r   Úrun0   s    zTestServerThread.runc             C   s   | j  ¡  |  ¡  d S )N)r   ÚshutdownÚjoin)r   r   r   r   Ústop:   s    
zTestServerThread.stopN)r   r   r   r   r%   r(   r   r   r   r   r   *   s   
r   c               @   s,   e Zd Zdd„ Zdd„ Zddi fdd„ZdS )	ÚBaseTestCasec             C   sD   t  ¡ | _t  ¡ t_t ¡ | _t	| | j
ƒ| _| j ¡  | j ¡  d S )N)r
   Úthreading_setupÚ_threadsÚEnvironmentVarGuardÚosÚenvironr   ÚEventr"   r   r   ÚthreadÚstartÚwait)r   r   r   r   ÚsetUp@   s    



zBaseTestCase.setUpc             C   s*   | j  ¡  d | _ tj ¡  tj| jŽ  d S )N)r0   r(   r-   r.   Ú__exit__r
   Úthreading_cleanupr+   )r   r   r   r   ÚtearDownH   s    

zBaseTestCase.tearDownÚGETNc             C   s0   t j | j| j¡| _| j ||||¡ | j ¡ S )N)ÚhttpÚclientÚHTTPConnectionr    r!   Ú
connectionÚrequestÚgetresponse)r   ÚuriÚmethodÚbodyÚheadersr   r   r   r<   N   s    zBaseTestCase.request)r   r   r   r3   r6   r<   r   r   r   r   r)   ?   s   r)   c               @   s¾   e Zd ZG dd„ deeƒZdd„ Zdd„ Zdd„ Zd	d
„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+S ),ÚBaseHTTPServerTestCasec               @   s\   e Zd ZdZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Z	dd„ Z
dd„ Zdd„ Zdd„ ZdS )z&BaseHTTPServerTestCase.request_handlerzHTTP/1.1c             C   s0   |   tj¡ |  dd¡ |  dd¡ |  ¡  d S )NzContent-Typez	text/htmlÚ
ConnectionÚclose)Úsend_responser   Ú
NO_CONTENTÚsend_headerÚend_headers)r   r   r   r   Údo_TESTY   s    z.BaseHTTPServerTestCase.request_handler.do_TESTc             C   s0   |   tj¡ |  dd¡ |  dd¡ |  ¡  d S )NzContent-Typez	text/htmlrC   z
keep-alive)rE   r   rF   rG   rH   )r   r   r   r   Údo_KEEP_   s    z.BaseHTTPServerTestCase.request_handler.do_KEEPc             C   s   |   d¡ d S )Niç  )Ú
send_error)r   r   r   r   Údo_KEYERRORe   s    z2BaseHTTPServerTestCase.request_handler.do_KEYERRORc             C   s   |   tj¡ d S )N)rK   r   Ú	NOT_FOUND)r   r   r   r   Údo_NOTFOUNDh   s    z2BaseHTTPServerTestCase.request_handler.do_NOTFOUNDc             C   s   |   ddd¡ d S )Niç  zShort MessagezThis is a long 
 explanation)rK   )r   r   r   r   Údo_EXPLAINERRORk   s    z6BaseHTTPServerTestCase.request_handler.do_EXPLAINERRORc             C   s.   |   d¡ |  dd¡ |  dd¡ |  ¡  d S )Niç  zContent-Typez	text/htmlrC   rD   )rE   rG   rH   )r   r   r   r   Ú	do_CUSTOMo   s    
z0BaseHTTPServerTestCase.request_handler.do_CUSTOMc             C   sJ   |   d¡ |  dd¡ |  dd¡ |  ¡  | jd  d¡}| j |¡ d S )Niç  z	X-Specialu   DÃ¤ngerous MindrC   rD   zx-special-incomingzutf-8)rE   rG   rH   rA   ÚencodeÚwfileÚwrite)r   r@   r   r   r   Údo_LATINONEHEADERu   s    
z8BaseHTTPServerTestCase.request_handler.do_LATINONEHEADERc             C   s   |   t| jdd … ƒ¡ d S )Né   )rK   ÚintÚpath)r   r   r   r   Údo_SEND_ERROR}   s    z4BaseHTTPServerTestCase.request_handler.do_SEND_ERRORc             C   s   |   t| jdd … ƒ¡ d S )NrU   )rK   rV   rW   )r   r   r   r   Údo_HEAD€   s    z.BaseHTTPServerTestCase.request_handler.do_HEADN)r   r   r   Úprotocol_versionÚdefault_request_versionrI   rJ   rL   rN   rO   rP   rT   rX   rY   r   r   r   r   r   U   s   r   c             C   s,   t  | ¡ tj | j| j¡| _| j ¡  d S )N)	r)   r3   r8   r9   r:   r    r!   ÚconÚconnect)r   r   r   r   r3   ƒ   s    
zBaseHTTPServerTestCase.setUpc             C   s,   | j  dd¡ | j  ¡ }|  |jtj¡ d S )Nr7   ú/)r\   r<   r=   ÚassertEqualÚstatusr   ÚNOT_IMPLEMENTED)r   Úresr   r   r   Útest_commandˆ   s    
z#BaseHTTPServerTestCase.test_commandc             C   s>   d| j _| j  dd¡ | j  ¡  | j  ¡ }|  |jtj¡ d S )Nz	HTTP/1.1
ZXYZBOGUSr^   )	r\   Ú_http_vsn_strÚ
putrequestÚ
endheadersr=   r_   r`   r   ra   )r   rb   r   r   r   Útest_request_line_trimming   s
    

z1BaseHTTPServerTestCase.test_request_line_trimmingc             C   s>   d| j _| j  dd¡ | j  ¡  | j  ¡ }|  |jtj¡ d S )NZFUBARr7   r^   )	r\   rd   re   rf   r=   r_   r`   r   ÚBAD_REQUEST)r   rb   r   r   r   Útest_version_bogus”   s
    

z)BaseHTTPServerTestCase.test_version_bogusc             C   s>   d| j _| j  dd¡ | j  ¡  | j  ¡ }|  |jtj¡ d S )Nz
HTTP/9.9.9r7   r^   )	r\   rd   re   rf   r=   r_   r`   r   rh   )r   rb   r   r   r   Útest_version_digits›   s
    

z*BaseHTTPServerTestCase.test_version_digitsc             C   s>   d| j _| j  dd¡ | j  ¡  | j  ¡ }|  |jtj¡ d S )Nr   r7   r^   )	r\   rd   re   rf   r=   r_   r`   r   ra   )r   rb   r   r   r   Útest_version_none_get¢   s
    

z,BaseHTTPServerTestCase.test_version_none_getc             C   s>   d| j _| j  dd¡ | j  ¡  | j  ¡ }|  |jtj¡ d S )Nr   ÚCUSTOMr^   )	r\   rd   re   rf   r=   r_   r`   r   rh   )r   rb   r   r   r   Útest_version_none©   s
    

z(BaseHTTPServerTestCase.test_version_nonec             C   sF   d| j _d| j _| j  dd¡ | j  ¡  | j  ¡ }|  |jtj	¡ d S )Néc   zHTTP/9.9r7   r^   )
r\   Z	_http_vsnrd   re   rf   r=   r_   r`   r   ZHTTP_VERSION_NOT_SUPPORTED)r   rb   r   r   r   Útest_version_invalid±   s    

z+BaseHTTPServerTestCase.test_version_invalidc             C   s>   d| j _| j  dd¡ | j  ¡  | j  ¡ }|  |jtj¡ d S )Nr   )	r\   rd   re   rf   r=   r_   r`   r   rh   )r   rb   r   r   r   Útest_send_blank¹   s
    

z&BaseHTTPServerTestCase.test_send_blankc             C   sD   | j  dd¡ | j  dd¡ | j  ¡  | j  ¡ }|  |jtj¡ d S )Nr7   r^   rC   rD   )	r\   re   Ú	putheaderrf   r=   r_   r`   r   ra   )r   rb   r   r   r   Útest_header_closeÀ   s
    

z(BaseHTTPServerTestCase.test_header_closec             C   sL   d| j _| j  dd¡ | j  dd¡ | j  ¡  | j  ¡ }|  |jtj	¡ d S )NzHTTP/1.1r7   r^   rC   z
keep-alive)
r\   rd   re   rq   rf   r=   r_   r`   r   ra   )r   rb   r   r   r   Útest_header_keep_aliveÇ   s    

z-BaseHTTPServerTestCase.test_header_keep_alivec             C   s,   | j  dd¡ | j  ¡ }|  |jtj¡ d S )NÚTESTr^   )r\   r<   r=   r_   r`   r   rF   )r   rb   r   r   r   Útest_handlerÏ   s    
z#BaseHTTPServerTestCase.test_handlerc             C   sJ   | j  dd¡ | j  ¡ }|  | d¡d¡ | j  dd¡ |  | j j¡ d S )NZKEEPr^   rC   z
keep-alivert   )r\   r<   r=   r_   Ú	getheaderÚ
addCleanuprD   )r   rb   r   r   r   Útest_return_header_keep_aliveÔ   s
    
z4BaseHTTPServerTestCase.test_return_header_keep_alivec             C   s*   | j  dd¡ | j  ¡ }|  |jd¡ d S )NZKEYERRORr^   iç  )r\   r<   r=   r_   r`   )r   rb   r   r   r   Útest_internal_key_errorÛ   s    
z.BaseHTTPServerTestCase.test_internal_key_errorc             C   s*   | j  dd¡ | j  ¡ }|  |jd¡ d S )Nrl   r^   iç  )r\   r<   r=   r_   r`   )r   rb   r   r   r   Útest_return_custom_statusà   s    
z0BaseHTTPServerTestCase.test_return_custom_statusc             C   s>   | j  dd¡ | j  ¡ }|  |jd¡ |  t| d¡ƒ¡ d S )NZEXPLAINERRORr^   iç  zContent-Length)r\   r<   r=   r_   r`   Ú
assertTruerV   rv   )r   rb   r   r   r   Útest_return_explain_errorå   s    
z0BaseHTTPServerTestCase.test_return_explain_errorc             C   sL   | j jddddid | j  ¡ }|  | d¡d¡ |  | ¡ d d¡¡ d S )	NZLATINONEHEADERr^   zX-Special-Incomingu   Ã„rger mit Unicode)rA   z	X-Specialu   DÃ¤ngerous Mindzutf-8)r\   r<   r=   r_   rv   r   rQ   )r   rb   r   r   r   Útest_latin1_headerë   s
    

z)BaseHTTPServerTestCase.test_latin1_headerc             C   sN   | j  dd¡ | j  ¡ }|  |jtj¡ | ¡ }|  t| 	d¡ƒt
|ƒ¡ d S )NZNOTFOUNDr^   zContent-Length)r\   r<   r=   r_   r`   r   rM   r   rV   rv   Úlen)r   rb   Údatar   r   r   Útest_error_content_lengthó   s
    
z0BaseHTTPServerTestCase.test_error_content_lengthc             C   s°   t jt jf}xžt jt jt jt jt jfD ]‚}| j dd |¡¡ | j 	¡ }|  
||j¡ |  
d | d¡¡ |  
d | d¡¡ ||kr”|  
d | d¡¡ | ¡ }|  
d|¡ q&W d S )NZ
SEND_ERRORz/{}zContent-LengthzContent-TypezTransfer-Encodingó    )r   ÚNOT_MODIFIEDÚRESET_CONTENTrF   Z
PROCESSINGÚSWITCHING_PROTOCOLSr\   r<   Úformatr=   r_   r`   rv   r   )r   Úallow_transfer_encoding_codesÚcoderb   r   r   r   r   Útest_send_errorü   s    

z&BaseHTTPServerTestCase.test_send_errorc             C   sæ   t jt jf}xÔt jt jt jt jt jfD ]¸}| j dd |¡¡ | j 	¡ }|  
||j¡ |t jkrŒ|  t| d¡ƒdk¡ |  d| d¡¡ n$|  
d | d¡¡ |  
d | d¡¡ ||krÊ|  
d | d¡¡ | ¡ }|  
d|¡ q&W d S )	NÚHEADz/{}zContent-Lengthr   z	text/htmlzContent-TypezTransfer-Encodingr   )r   r‚   rƒ   ÚOKrF   r„   r\   r<   r…   r=   r_   r`   r{   rV   rv   ÚassertInr   )r   r†   r‡   rb   r   r   r   r   Útest_head_via_send_error  s"    


z/BaseHTTPServerTestCase.test_head_via_send_errorN)r   r   r   r   r   r   r3   rc   rg   ri   rj   rk   rm   ro   rp   rr   rs   ru   rx   ry   rz   r|   r}   r€   rˆ   rŒ   r   r   r   r   rB   T   s*   .	rB   c               @   s,   e Zd ZG dd„ deƒZdd„ Zdd„ ZdS )ÚRequestHandlerLoggingTestCasec               @   s$   e Zd ZdZdZdd„ Zdd„ ZdS )z-RequestHandlerLoggingTestCase.request_handlerzHTTP/1.1c             C   s   |   tj¡ |  ¡  d S )N)rE   r   rŠ   rH   )r   r   r   r   Údo_GET(  s    z4RequestHandlerLoggingTestCase.request_handler.do_GETc             C   s   |   tjd¡ d S )NzFile not found)rK   r   rM   )r   r   r   r   Údo_ERROR,  s    z6RequestHandlerLoggingTestCase.request_handler.do_ERRORN)r   r   r   rZ   r[   rŽ   r   r   r   r   r   r   $  s   r   c          	   C   sb   t j | j| j¡| _| j ¡  t ¡ }| j 	dd¡ | j 
¡  W d Q R X |  | ¡  d¡¡ d S )Nr7   r^   z"GET / HTTP/1.1" 200 -
)r8   r9   r:   r    r!   r\   r]   r
   Úcaptured_stderrr<   r=   r{   ÚgetvalueÚendswith)r   Úerrr   r   r   Útest_get/  s    

z&RequestHandlerLoggingTestCase.test_getc          	   C   s„   t j | j| j¡| _| j ¡  t ¡ }| j 	dd¡ | j 
¡  W d Q R X | ¡  d¡}|  |d  d¡¡ |  |d  d¡¡ d S )NÚERRORr^   Ú
r   z code 404, message File not foundrU   z"ERROR / HTTP/1.1" 404 -)r8   r9   r:   r    r!   r\   r]   r
   r   r<   r=   r‘   Úsplitr{   r’   )r   r“   Úlinesr   r   r   Útest_err:  s    

z&RequestHandlerLoggingTestCase.test_errN)r   r   r   r   r   r”   r™   r   r   r   r   r   #  s   r   c               @   sº   e Zd ZG dd„ deeƒZdd„ Zdd„ Zd#dd	„Ze	 
ejd
kd¡e	 
ejdkd¡e	 ejd¡dd„ ƒƒƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ ZdS )$ÚSimpleHTTPServerTestCasec               @   s   e Zd ZdS )z(SimpleHTTPServerTestCase.request_handlerN)r   r   r   r   r   r   r   r   H  s   r   c          	   C   sÖ   t  | ¡ t ¡ | _t ¡ }t |¡ d| _tj	|d| _
tj | j
¡| _d| j | _tj | j
d¡}t|dƒ}| | j¡ | ¡  W d Q R X t |¡j}tj |tjj¡}|jdd| _tjj| ¡ dd	| _d S )
Ns   We are the knights who say Ni!)Údirr^   ÚtestÚwbr   )ÚmicrosecondT)Úusegmt) r)   r3   r-   ÚgetcwdÚcwdÚtempfileÚ
gettempdirÚchdirr   ÚmkdtempÚtempdirrW   ÚbasenameÚtempdir_nameÚbase_urlr'   ÚopenrS   ÚflushÚstatÚst_mtimeÚdatetimeÚfromtimestampÚtimezoneÚutcÚreplaceÚlast_modif_datetimeÚemailÚutilsZ
formatdateÚ	timestampÚlast_modif_header)r   ZbasetempdirZtempnameZtempÚmtimeZ
last_modifr   r   r   r3   K  s$    



zSimpleHTTPServerTestCase.setUpc          	   C   s@   z.t  | j¡ yt | j¡ W n   Y nX W d t | ¡ X d S )N)r-   r¤   r¡   ÚshutilÚrmtreer¦   r)   r6   )r   r   r   r   r6   `  s    
z!SimpleHTTPServerTestCase.tearDownNc                s˜   ‡ ‡fdd„}d ‰ |ˆ_ ˆ ¡ }|  ˆ¡ |  ˆj|¡ |  ˆj¡ |rT|  ||¡ |  ˆjd¡ |  ˆj 	dd¡d¡ |  ˆ  d¡dd¡ ˆ  
¡  |S )	Nc                  s   ˆj ‰ dˆ_ dS )zWDon't close reader yet so we can check if there was leftover
            buffered inputN)Úfpr   )ÚreaderÚresponser   r   Ú
close_connk  s    zDSimpleHTTPServerTestCase.check_status_and_reason.<locals>.close_conné
   rC   rD   é   r   zConnection should be closed)Z_close_connr   r{   r_   r`   ÚassertIsNotNoneÚreasonÚversionÚmsgÚgetrD   )r   r½   r`   r   r¾   r@   r   )r¼   r½   r   Úcheck_status_and_reasonj  s    
z0SimpleHTTPServerTestCase.check_status_and_reasonÚdarwinz2undecodable name cannot always be decoded on macOSÚwin32z+undecodable name cannot be decoded on win32zneed support.TESTFN_UNDECODABLEc          	   C   s  t  ¡ }t tj¡d }ttj | j	|¡dƒ}| 
tj¡ W d Q R X |  | jd ¡}t jdkr„x"t | j	¡D ]}|dkrn|}P qnW |  |tj¡}tjj|dd}|  d|  |d	¡|¡ |  d
tj|dd  |d	¡|¡ |  | jd | ¡}| j|tjtjd d S )Nz.txtr   r^   rÇ   rœ   Úsurrogatepass)Úerrorsz	href="%s"Úsurrogateescapez>%s<F)Úquote)r   )ÚsysÚgetfilesystemencodingr-   Úfsdecoder
   ÚTESTFN_UNDECODABLErª   rW   r'   r¦   rS   r<   r©   ÚplatformÚlistdirrÆ   r   rŠ   ÚurllibÚparserÌ   r‹   rQ   ÚhtmlÚescape)r   ÚencÚfilenameÚfr½   Únamer@   Z
quotednamer   r   r   Útest_undecodable_filenameƒ  s&    

z2SimpleHTTPServerTestCase.test_undecodable_filenamec          
   C   s®  |   | jd ¡}| j|tj| jd |   | jd ¡}|  |tj¡ |   | jd ¡}|  |tj¡ |   | j¡}|  |tj¡ |   | jd ¡}|  |tj¡ |   | jd ¡}|  |tj¡ |  | 	d¡| jd ¡ |   d	¡}|  |tj¡ |   d
¡}|  |tj¡ d}t
tj | jd¡dƒ}| |¡ W d Q R X |   | jd ¡}|  |tj|¡ tjdkrªt ¡ dkrªt | jd¡ z"|   | jd ¡}|  |tj¡ W d t | jd¡ X d S )Nz/test)r   z/test/r^   z/?hi=2z?hi=1ÚLocationz/?hi=1z/ThisDoesNotExistz/ThisDoesNotExist/s   Dummy index file
z
index.htmlr   Úposixr   ií  )r<   r©   rÆ   r   rŠ   r   rM   ÚMOVED_PERMANENTLYr_   rv   rª   r-   rW   r'   r¨   rS   rÚ   ÚgeteuidÚchmodr¦   )r   r½   r   rÙ   r   r   r   r”      s:    

z!SimpleHTTPServerTestCase.test_getc             C   sT   | j | jd dd}|  |tj¡ |  | d¡tt| j	ƒƒ¡ |  | d¡d¡ d S )Nz/testr‰   )r?   zcontent-lengthzcontent-typezapplication/octet-stream)
r<   r©   rÆ   r   rŠ   r_   rv   Ústrr~   r   )r   r½   r   r   r   Ú	test_headÆ  s    z"SimpleHTTPServerTestCase.test_headc             C   sŒ   t j ¡ }| j|d< | j| jd |d}|  |tj¡ | j	t
jdd }t j ¡ }t jj|dd|d< | j| jd |d}|  |tj¡ dS )	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
        zIf-Modified-Sincez/test)rA   rU   )ÚhoursT)rŸ   N)r´   ÚmessageÚMessager·   r<   r©   rÆ   r   r‚   r³   r®   Ú	timedeltarµ   Úformat_datetime)r   rA   r½   Znew_dtr   r   r   Útest_browser_cacheÏ  s    


z+SimpleHTTPServerTestCase.test_browser_cachec             C   sZ   | j }|tjdd }tj ¡ }tjj|dd|d< | j| j	d |d}|  
|tj¡ d S )Nim  )ÚdaysT)rŸ   zIf-Modified-Sincez/test)rA   )r³   r®   ræ   r´   rä   rå   rµ   rç   r<   r©   rÆ   r   rŠ   )r   ÚdtZold_dtrA   r½   r   r   r   Útest_browser_cache_file_changedá  s    
z8SimpleHTTPServerTestCase.test_browser_cache_file_changedc             C   sB   t j ¡ }| j|d< d|d< | j| jd |d}|  |tj¡ d S )NzIf-Modified-SinceÚ*zIf-None-Matchz/test)rA   )	r´   rä   rå   r·   r<   r©   rÆ   r   rŠ   )r   rA   r½   r   r   r   Ú,test_browser_cache_with_If_None_Match_headerì  s
    

zESimpleHTTPServerTestCase.test_browser_cache_with_If_None_Match_headerc             C   sX   | j ddd}|  |tj¡ | j ddd}|  |tj¡ | j ddd}|  |tj¡ d S )Nr^   ÚFOO)r?   ZcustomZGETs)r<   rÆ   r   ra   )r   r½   r   r   r   Útest_invalid_requestsõ  s    z.SimpleHTTPServerTestCase.test_invalid_requestsc             C   s@   |   | jd ¡}| j|tj| jd |jd }|  || j¡ dS )z–Checks that the datetime returned in Last-Modified response header
        is the actual datetime of last modification, rounded to the second
        z/test)r   zLast-modifiedN)	r<   r©   rÆ   r   rŠ   r   rA   r_   r·   )r   r½   r·   r   r   r   Útest_last_modifiedþ  s    
z+SimpleHTTPServerTestCase.test_last_modifiedc             C   sÒ   |   | jd ¡}| j|tj| jd |   | jd ¡}|  |tj¡ |   | jd ¡}|  |tj¡ |   | j¡}|  |tj¡ |   | jd ¡}|  |tj¡ |   | jd ¡}|  |tj¡ |  | 	d¡| jd ¡ d S )	Nz/test)r   z/test/r^   z/?hi=2z?hi=1rÜ   z/?hi=1)
r<   r¨   rÆ   r   rŠ   r   rM   rÞ   r_   rv   )r   r½   r   r   r   Útest_path_without_leading_slash  s    z8SimpleHTTPServerTestCase.test_path_without_leading_slashc          	   C   s¶   d}t j | j|¡}yt|dƒ ¡  W n" tk
rH   t d| ¡‚Y nX z,|  	| j
d ¡}|  |tj¡}|j ¡ }W d t  |¡ X |  |¡ dtj|dd }|  | |¡|¡ d S )Nz<test&>.txtÚwz-Can not create file %s on current file systemr^   z>%s<F)rÌ   )r-   rW   r'   r¦   rª   rD   ÚOSErrorÚunittestÚSkipTestr<   r©   rÆ   r   rŠ   rA   Zget_content_charsetÚunlinkrÁ   rÕ   rÖ   r‹   rQ   )r   rØ   Zfullpathr½   r@   r×   Z	html_textr   r   r   Útest_html_escape_filename  s    
z2SimpleHTTPServerTestCase.test_html_escape_filename)N)r   r   r   r   r   r   r3   r6   rÆ   rô   ÚskipIfrÍ   rÑ   Ú
skipUnlessr
   rÐ   rÛ   r”   râ   rè   rë   rí   rï   rð   rñ   r÷   r   r   r   r   rš   G  s&   

&				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š   e Zd ZG dd„ deeƒZej d¡Zdd„ Z	dd„ Z
dd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd S )!ÚCGIHTTPServerTestCasec               @   s   e Zd ZdS )z%CGIHTTPServerTestCase.request_handlerN)r   r   r   r   r   r   r   r   O  s   r   Úasciic          	   C   sp  t  | ¡ t ¡ | _t ¡ | _tj 	| jd¡| _
tj 	| j
d¡| _t | j
¡ t | j¡ d | _d | _d | _d | _d | _t ¡ r¤tj 	| jd¡| _t tj| j¡ ntj| _y| j d¡ W n& tk
râ   |  ¡  |  d¡ Y nX tj 	| jd¡| _t| jdƒ}| t| j ¡ W d Q R X t | jd¡ tj 	| j
d	¡| _t| jddd
}| t| j ¡ W d Q R X t | jd¡ tj 	| j
d¡| _t| jddd
}| t | j ¡ W d Q R X t | jd¡ tj 	| jd¡| _t| jddd
}| t| j ¡ W d Q R X t | jd¡ tj 	| j
d¡| _t| jddd
}| t!| jdf ¡ W d Q R X t | jd¡ t "| j¡ d S )Nzcgi-binz	child-dirÚpythonzutf-8z0Python executable path is not encodable to utf-8znocgi.pyrò   iÿ  zfile1.py)Úencodingzfile2.pyzfile3.pyzfile4.pyÚQUERY_STRING)#r)   r3   r-   r    r¡   r¢   r¥   Ú
parent_dirrW   r'   Úcgi_dirÚcgi_child_dirÚmkdirÚ
nocgi_pathÚ
file1_pathÚ
file2_pathÚ
file3_pathÚ
file4_pathr
   Úcan_symlinkÚ	pythonexeÚsymlinkrÍ   Ú
executablerQ   ÚUnicodeEncodeErrorr6   ÚskipTestrª   rS   Ú	cgi_file1rà   Ú	cgi_file2Ú	cgi_file4r¤   )r   r»   Zfile1Zfile2Zfile3Zfile4r   r   r   r3   T  sT    


zCGIHTTPServerTestCase.setUpc          	   C   s¸   z¦t  | j¡ | jtjkr&t  | j¡ | jr8t  | j¡ | jrJt  | j¡ | j	r\t  | j	¡ | j
rnt  | j
¡ | jr€t  | j¡ t  | j¡ t  | j¡ t  | j¡ W d t | ¡ X d S )N)r-   r¤   r¡   r	  rÍ   r  Úremover  r  r  r  r  Úrmdirr  r   rÿ   r)   r6   )r   r   r   r   r6   Ž  s$    zCGIHTTPServerTestCase.tearDownc             C   s¢   dt t ddddddddddddddddd	d
d
t ddt dddœ}x^| ¡ D ]R\}}t|tƒrvt|tƒrv|  |tj|¡ qHt |¡}| j	||d|||f d qHW d S )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)r   z..z/.//..r^   z//z/\z/.//zcgi-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/../.zpath = %r
Got:    %r
Wanted: %r)rÄ   )
Ú
IndexErrorÚitemsÚ
isinstanceÚtypeÚ
issubclassÚ	ExceptionÚassertRaisesr   Z_url_collapse_pathr_   )r   Ztest_vectorsrW   ÚexpectedÚactualr   r   r   Útest_url_collapse_path£  sH    
z,CGIHTTPServerTestCase.test_url_collapse_pathc             C   s:   |   d¡}|  | ¡ | d¡|jfd| j dtjf¡ d S )Nz/cgi-bin/file1.pyzContent-types   Hello Worldz	text/html)r<   r_   r   rv   r`   Úlinesepr   rŠ   )r   rb   r   r   r   Útest_headers_and_contentÍ  s    
z.CGIHTTPServerTestCase.test_headers_and_contentc             C   s   |   d¡}|  |jtj¡ d S )Nz)///////////nocgi.py/../cgi-bin/nothere.sh)r<   r_   r`   r   rM   )r   rb   r   r   r   Útest_issue19435Ó  s    
z%CGIHTTPServerTestCase.test_issue19435c             C   sF   t j ddddœ¡}ddi}|  dd||¡}|  | ¡ d	| j ¡ d S )
NrU   rü   i@â )ÚspamZeggsZbaconzContent-typez!application/x-www-form-urlencodedz/cgi-bin/file2.pyÚPOSTs   1, python, 123456)rÓ   rÔ   Ú	urlencoder<   r_   r   r  )r   ÚparamsrA   rb   r   r   r   Ú	test_post×  s
    zCGIHTTPServerTestCase.test_postc             C   s&   |   d¡}| ¡  |  |jtj¡ d S )Nz/cgi-bin/invalid)r<   r   r_   r`   r   rM   )r   rb   r   r   r   Útest_invaliduriß  s    
z%CGIHTTPServerTestCase.test_invaliduric             C   sR   ddt  d¡ i}| jdd|d}|  d| j dtjf| ¡ | d	¡|j	f¡ d S )
Ns   Authorizations   Basic s   username:passz/cgi-bin/file1.pyr7   )rA   s   Hello Worldz	text/htmlzContent-type)
Úbase64Ú	b64encoder<   r_   r  r   rŠ   r   rv   r`   )r   rA   rb   r   r   r   Útest_authorizationä  s    z(CGIHTTPServerTestCase.test_authorizationc             C   s:   |   d¡}|  d| j dtjf| ¡ | d¡|jf¡ d S )Nzcgi-bin/file1.pys   Hello Worldz	text/htmlzContent-type)r<   r_   r  r   rŠ   r   rv   r`   )r   rb   r   r   r   Útest_no_leading_slashì  s    
z+CGIHTTPServerTestCase.test_no_leading_slashc             C   sZ   d}|t jd< |  d¡}|  d| j dtjf| ¡ | d¡|j	f¡ |  t jd |¡ d S )NzTest CGI ServerZSERVER_SOFTWAREz/cgi-bin/file1.pys   Hello Worldz	text/htmlzContent-type)
r-   r.   r<   r_   r  r   rŠ   r   rv   r`   )r   Ú	signaturerb   r   r   r   Útest_os_environ_is_not_alteredó  s    

z4CGIHTTPServerTestCase.test_os_environ_is_not_alteredc             C   s:   |   d¡}|  d| j dtjf| ¡ | d¡|jf¡ d S )Nz/cgi-bin%2ffile1.pys   Hello Worldz	text/htmlzContent-type)r<   r_   r  r   rŠ   r   rv   r`   )r   rb   r   r   r   Ú#test_urlquote_decoding_in_cgi_checkü  s    
z9CGIHTTPServerTestCase.test_urlquote_decoding_in_cgi_checkc             C   s:   |   d¡}|  d| j dtjf| ¡ | d¡|jf¡ d S )Nz/cgi-bin/child-dir/file3.pys   Hello Worldz	text/htmlzContent-type)r<   r_   r  r   rŠ   r   rv   r`   )r   rb   r   r   r   Útest_nested_cgi_path_issue21323  s    
z5CGIHTTPServerTestCase.test_nested_cgi_path_issue21323c             C   s:   |   d¡}|  d| j dtjf| ¡ | d¡|jf¡ d S )Nz/cgi-bin/file4.py?a=b?c=ds   a=b?c=dz	text/htmlzContent-type)r<   r_   r  r   rŠ   r   rv   r`   )r   rb   r   r   r   Ú&test_query_with_multiple_question_mark  s    
z<CGIHTTPServerTestCase.test_query_with_multiple_question_markc             C   s:   |   d¡}|  d| j dtjf| ¡ | d¡|jf¡ d S )Nz0/cgi-bin/file4.py?k=aa%2F%2Fbb&//q//p//=//a//b//s   k=aa%2F%2Fbb&//q//p//=//a//b//z	text/htmlzContent-type)r<   r_   r  r   rŠ   r   rv   r`   )r   rb   r   r   r   Ú"test_query_with_continuous_slashes  s
    
z8CGIHTTPServerTestCase.test_query_with_continuous_slashesN)r   r   r   r   r   r   r-   r  rQ   r3   r6   r  r  r   r%  r&  r)  r*  r,  r-  r.  r/  r0  r   r   r   r   rú   L  s    :*	rú   c                   s,   e Zd Z‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚSocketlessRequestHandlerc                s2   t  ¡ }tƒ |j_tƒ  |d d ¡ d| _d| _d S )NFzHTTP/1.1)	r   ÚMockr	   ÚmakefileÚreturn_valueÚsuperr   Ú
get_calledrZ   )r   r   Úkwargsr<   )Ú	__class__r   r   r     s
    
z!SocketlessRequestHandler.__init__c             C   s6   d| _ |  tj¡ |  dd¡ |  ¡  | j d¡ d S )NTzContent-Typez	text/htmls    <html><body>Data</body></html>
)r6  rE   r   rŠ   rG   rH   rR   rS   )r   r   r   r   rŽ     s
    zSocketlessRequestHandler.do_GETc             G   s   d S )Nr   )r   r…   r   r   r   r   r   &  s    z$SocketlessRequestHandler.log_message)r   r   r   r   rŽ   r   Ú__classcell__r   r   )r8  r   r1    s   r1  c               @   s   e Zd Zdd„ ZdS )Ú!RejectingSocketlessRequestHandlerc             C   s   |   tj¡ dS )NF)rK   r   ZEXPECTATION_FAILED)r   r   r   r   Úhandle_expect_100*  s    z3RejectingSocketlessRequestHandler.handle_expect_100N)r   r   r   r;  r   r   r   r   r:  )  s   r:  c               @   s0   e Zd Zdd„ Zdd„ Zdd„ Zedd„ ƒZd	S )
ÚAuditableBytesIOc             C   s
   g | _ d S )N)Údatas)r   r   r   r   r   1  s    zAuditableBytesIO.__init__c             C   s   | j  |¡ d S )N)r=  Úappend)r   r   r   r   r   rS   4  s    zAuditableBytesIO.writec             C   s   d  | j¡S )Nr   )r'   r=  )r   r   r   r   ÚgetData7  s    zAuditableBytesIO.getDatac             C   s
   t | jƒS )N)r~   r=  )r   r   r   r   Ú	numWrites:  s    zAuditableBytesIO.numWritesN)r   r   r   r   rS   r?  Úpropertyr@  r   r   r   r   r<  /  s   r<  c               @   sÊ   e Zd ZdZe d¡Zdd„ Zdd„ Zdd„ Z	d	d
„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/S )0ÚBaseHTTPRequestHandlerTestCasezrTest the functionality of the BaseHTTPServer.

       Test the support for the Expect 100-continue header.
       s   HTTP/1.[0-9]+ 200 OKc             C   s   t ƒ | _d S )N)r1  Úhandler)r   r   r   r   r3   G  s    z$BaseHTTPRequestHandlerTestCase.setUpc             C   s:   t |ƒ}t ƒ }|| j_|| j_| j ¡  | d¡ | ¡ S )Nr   )r	   rC  ÚrfilerR   Úhandle_one_requestÚseekÚ	readlines)r   rä   ÚinputÚoutputr   r   r   Úsend_typical_requestJ  s    

z3BaseHTTPRequestHandlerTestCase.send_typical_requestc             C   s   |   | jj¡ d S )N)r{   rC  r6  )r   r   r   r   Úverify_get_calledS  s    z0BaseHTTPRequestHandlerTestCase.verify_get_calledc                s0   x*dD ]"‰ |   t‡ fdd„|D ƒƒd¡ qW d S )N)s   Server: s   Date: s   Content-Type: c             3   s   | ]}|  ˆ ¡V  qd S )N)Ú
startswith)Ú.0Úh)Ú	fieldNamer   r   ú	<genexpr>X  s    zIBaseHTTPRequestHandlerTestCase.verify_expected_headers.<locals>.<genexpr>rU   )r_   Úsum)r   rA   r   )rO  r   Úverify_expected_headersV  s    
z6BaseHTTPRequestHandlerTestCase.verify_expected_headersc             C   s   | j  |¡}|  |¡ d S )N)ÚHTTPResponseMatchÚsearchrÁ   )r   r½   Úmatchr   r   r   Úverify_http_server_responseZ  s    z:BaseHTTPRequestHandlerTestCase.verify_http_server_responsec             C   sš   |   d¡}|  |d ¡ |  |dd… ¡ |  ¡  |  |d d¡ |  | jjd¡ |  | jjd¡ |  | jjd¡ |  | jj	d	¡ |  
| jj ¡ d
¡ d S )Ns   GET / HTTP/1.1

r   rU   éÿÿÿÿs    <html><body>Data</body></html>
zGET / HTTP/1.1r7   r^   zHTTP/1.1r   )rJ  rV  rR  rK  r_   rC  ÚrequestlineÚcommandrW   Úrequest_versionÚassertSequenceEqualrA   r  )r   Úresultr   r   r   Útest_http_1_1^  s    
z,BaseHTTPRequestHandlerTestCase.test_http_1_1c             C   sš   |   d¡}|  |d ¡ |  |dd… ¡ |  ¡  |  |d d¡ |  | jjd¡ |  | jjd¡ |  | jjd¡ |  | jj	d	¡ |  
| jj ¡ d
¡ d S )Ns   GET / HTTP/1.0

r   rU   rW  s    <html><body>Data</body></html>
zGET / HTTP/1.0r7   r^   zHTTP/1.0r   )rJ  rV  rR  rK  r_   rC  rX  rY  rW   rZ  r[  rA   r  )r   r\  r   r   r   Útest_http_1_0j  s    
z,BaseHTTPRequestHandlerTestCase.test_http_1_0c             C   s6   |   d¡}|  t|ƒd¡ |  |d d¡ |  ¡  d S )Ns   GET / HTTP/0.9

rU   r   s    <html><body>Data</body></html>
)rJ  r_   r~   rK  )r   r\  r   r   r   Útest_http_0_9v  s    
z,BaseHTTPRequestHandlerTestCase.test_http_0_9c             C   sH   |   d¡}|  |d  d¡¡ |  |d| d¡… ¡ |  | jj¡ d S )Ns)   GET /spaced out HTTP/1.1
Host: dummy

r   s   HTTP/1.1 400 rU   s   
)rJ  r{   rL  rR  ÚindexÚassertFalserC  r6  )r   r\  r   r   r   Útest_extra_space|  s
    z/BaseHTTPRequestHandlerTestCase.test_extra_spacec             C   sž   |   d¡}|  |d ¡ |  |dd… ¡ |  ¡  |  |d d¡ |  | jjd¡ |  | jjd¡ |  | jjd¡ |  | jj	d	¡ d
}|  
| jj ¡ |¡ d S )Ns(   GET / HTTP/1.0
Expect: 100-continue

r   rU   rW  s    <html><body>Data</body></html>
zGET / HTTP/1.0r7   r^   zHTTP/1.0))ÚExpectz100-continue)rJ  rV  rR  rK  r_   rC  rX  rY  rW   rZ  r[  rA   r  )r   r\  rA   r   r   r   Útest_with_continue_1_0†  s    
z5BaseHTTPRequestHandlerTestCase.test_with_continue_1_0c             C   sÀ   |   d¡}|  |d d¡ |  |d d¡ |  |d d¡ |  |dd… ¡ |  ¡  |  |d d	¡ |  | jjd
¡ |  | jjd¡ |  | jjd¡ |  | jjd¡ d}|  	| jj
 ¡ |¡ d S )Ns(   GET / HTTP/1.1
Expect: 100-continue

r   s   HTTP/1.1 100 Continue
rU   s   
é   s   HTTP/1.1 200 OK
rW  s    <html><body>Data</body></html>
zGET / HTTP/1.1r7   r^   zHTTP/1.1))rc  z100-continue)rJ  r_   rR  rK  rC  rX  rY  rW   rZ  r[  rA   r  )r   r\  rA   r   r   r   Útest_with_continue_1_1“  s    
z5BaseHTTPRequestHandlerTestCase.test_with_continue_1_1c             C   sN   t dƒ}tƒ }tƒ }||_||_d|_d|_d |_| d¡ |  	|j
d¡ d S )Ns   GET / HTTP/1.1

zHTTP/1.1r   i¢  re  )r	   r<  r1  rD  rR   rZ  rX  rY  rK   r_   r@  )r   rH  rI  rC  r   r   r   Ú#test_header_buffering_of_send_error¢  s    
zBBaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_errorc             C   sX   t dƒ}tƒ }tƒ }||_||_d|_| d¡ |  |jd¡ | 	¡  |  |jd¡ d S )Ns   GET / HTTP/1.1

zHTTP/1.1i¢  r   rU   )
r	   r<  r1  rD  rR   rZ  Zsend_response_onlyr_   r@  rH   )r   rH  rI  rC  r   r   r   Ú+test_header_buffering_of_send_response_only°  s    
zJBaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_response_onlyc             C   sv   t dƒ}tƒ }tƒ }||_||_d|_| dd¡ | dd¡ |  |jd¡ | 	¡  |  | 
¡ d¡ |  |jd¡ d S )	Ns   GET / HTTP/1.1

zHTTP/1.1ÚFooÚfooÚbarr   s   Foo: foo
bar: bar

rU   )r	   r<  r1  rD  rR   rZ  rG   r_   r@  rH   r?  )r   rH  rI  rC  r   r   r   Ú$test_header_buffering_of_send_header¾  s    zCBaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_headerc             C   sŠ   dd„ }t dƒ}t ƒ }|| j_|| j_d| j_| j ¡  |  ||ƒd¡ ||ƒ d¡}|  |d d¡ |  |d	 d¡ |  |d
 d¡ d S )Nc             S   s(   |   ¡ }|  d¡ |  ¡ }|  |¡ |S )Nr   )ÚtellrF  r   )rÙ   Úposr   r   r   r   Ú_readAndReseekÐ  s
    

z[BaseHTTPRequestHandlerTestCase.test_header_unbuffered_when_continue.<locals>._readAndReseeks(   GET / HTTP/1.1
Expect: 100-continue

zHTTP/1.1r   s   
r   s   HTTP/1.1 100 ContinuerU   re  s   HTTP/1.1 200 OK)	r	   rC  rD  rR   rZ  rE  ÚassertNotEqualr—   r_   )r   ro  rH  rI  r\  r   r   r   Ú$test_header_unbuffered_when_continueÎ  s    
zCBaseHTTPRequestHandlerTestCase.test_header_unbuffered_when_continuec             C   st   | j }tƒ | _ |  d¡}|  |d d¡ |  |dd… ¡ |  | j j¡ |  tdd„ |dd… D ƒƒd¡ || _ d S )Ns(   GET / HTTP/1.1
Expect: 100-continue

r   s!   HTTP/1.1 417 Expectation Failed
rU   rW  c             s   s   | ]}|d kV  qdS )s   Connection: close
Nr   )rM  Úrr   r   r   rP  í  s    zMBaseHTTPRequestHandlerTestCase.test_with_continue_rejected.<locals>.<genexpr>)rC  r:  rJ  r_   rR  ra  r6  rQ  )r   Zusual_handlerr\  r   r   r   Útest_with_continue_rejectedä  s    
"z:BaseHTTPRequestHandlerTestCase.test_with_continue_rejectedc             C   sD   |   ddd  ¡}|  |d d¡ |  | jj¡ |  | jjt¡ d S )Ns   GET ó   xi  r   s#   HTTP/1.1 414 Request-URI Too Long
)rJ  r_   ra  rC  r6  ÚassertIsInstancerX  rá   )r   r\  r   r   r   Útest_request_lengthð  s    z2BaseHTTPRequestHandlerTestCase.test_request_lengthc             C   sH   |   ddd  d ¡}|  |d d¡ |  | jj¡ |  | jjd¡ d S )Ns   GET / HTTP/1.1
X-Foo: baró   ri  s   

r   s   HTTP/1.1 431 Line too long
zGET / HTTP/1.1)rJ  r_   ra  rC  r6  rX  )r   r\  r   r   r   Útest_header_lengthø  s
    z1BaseHTTPRequestHandlerTestCase.test_header_lengthc             C   s<   |   d¡}|  |d d¡ |  | jj¡ |  | jjd¡ d S )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

r   s   HTTP/1.1 431 Too many headers
zGET / HTTP/1.1)rJ  r_   ra  rC  r6  rX  )r   r\  r   r   r   Útest_too_many_headers   s
    z4BaseHTTPRequestHandlerTestCase.test_too_many_headersc             C   s8   |   d¡}d |¡}d}|  tj|dd d¡|¡ d S )Ns*   <script>alert("hello")</script> / HTTP/1.1r   z<script>alert("hello")</script>F)rÌ   rû   )rJ  r'   r‹   rÕ   rÖ   rQ   )r   r\  Útextr   r   r   Útest_html_escape_on_error  s
    
z8BaseHTTPRequestHandlerTestCase.test_html_escape_on_errorc                sZ   ‡ ‡fdd„}|ˆj _tdƒ‰ ˆj  ¡  ˆ ttˆ ¡ tdƒ‰ ˆj  ¡  ˆ ttˆ ¡ d S )Nc                  s   t ˆ ƒˆj_d S )N)ÚnextrC  Zclose_connectionr   )Úclose_valuesr   r   r   rE    s    zPBaseHTTPRequestHandlerTestCase.test_close_connection.<locals>.handle_one_request)T)FFT)rC  rE  ÚiterÚhandler  ÚStopIterationr|  )r   rE  r   )r}  r   r   Útest_close_connection  s    

z4BaseHTTPRequestHandlerTestCase.test_close_connectionc          	   C   sd   t   ¡ }t  |¡\	}}}}}}}}	}
d| jj| || jj| ||||f }|  | jj|d|¡ d S )Nz#%s, %02d %3s %4d %02d:%02d:%02d GMT)r¶   )ÚtimeÚgmtimerC  ZweekdaynameZ	monthnamer_   Zdate_time_string)r   ÚnowÚyearÚmonthÚdayZhhZmmÚssZwdÚyÚzr  r   r   r   Útest_date_time_string  s    

z4BaseHTTPRequestHandlerTestCase.test_date_time_stringN)r   r   r   Ú__doc__ÚreÚcompilerS  r3   rJ  rK  rR  rV  r]  r^  r_  rb  rd  rf  rg  rh  rl  rq  rs  rv  rx  ry  r{  r  r‹  r   r   r   r   rB  ?  s0   
	
rB  c               @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )Ú SimpleHTTPRequestHandlerTestCasez Test url parsing c             C   s(   t  ¡ | _t j | jd¡| _tƒ | _d S )NrØ   )r-   r    Ú
translatedrW   r'   r1  rC  )r   r   r   r   r3   ,  s    
z&SimpleHTTPRequestHandlerTestCase.setUpc             C   sR   | j  d¡}|  || j¡ | j  d¡}|  || j¡ | j  d¡}|  || j¡ d S )Nz	/filenamez/filename?foo=barz/filename?a=b&spam=eggs#zot)rC  Útranslate_pathr_   r  )r   rW   r   r   r   Útest_query_arguments1  s    z5SimpleHTTPRequestHandlerTestCase.test_query_argumentsc             C   s8   | j  d¡}|  || j¡ | j  d¡}|  || j¡ d S )Nz
//filenamez//filename?foo=bar)rC  r‘  r_   r  )r   rW   r   r   r   Útest_start_with_double_slash9  s    z=SimpleHTTPRequestHandlerTestCase.test_start_with_double_slashc          	   C   sÈ   t  tjdt¡® | j d¡}| tjtj¡}|  	|| j
¡ | j d¡}| tjtj¡}|  	|| j
¡ | j d¡}| tjtj¡}|  	|| j
¡ | j d¡}| tjtj¡}|  	|| j
¡ W d Q R X d S )NrW   zc:c:c:foo/filenamez\c:../filenamezc:\c:..\foo/filenamezc:c:foo\c:c:bar/filename)r
   Ú	swap_attrr   r-   ÚntpathrC  r‘  r²   Úsepr_   r  )r   rW   r   r   r   Útest_windows_colon?  s    z3SimpleHTTPRequestHandlerTestCase.test_windows_colonN)r   r   r   rŒ  r3   r’  r“  r—  r   r   r   r   r  *  s
   r  c               @   s   e Zd Zdd„ ZdS )ÚMiscTestCasec             C   sj   g }dddh}xHt tƒD ]<}| d¡s||kr0qtt|ƒ}t|dd ƒdkr| |¡ qW |  tj|¡ d S )Nr  Z
nobody_uidrœ   Ú_r   zhttp.server)r›   r   rL  Úgetattrr>  ÚassertCountEqualÚ__all__)r   r  Ú	blacklistrÚ   Zmodule_objectr   r   r   Útest_allS  s    

zMiscTestCase.test_allN)r   r   r   rž  r   r   r   r   r˜  R  s   r˜  c          	   C   s4   t  ¡ }zt tttttt	t
¡ W d t  |¡ X d S )N)r-   r    r
   Úrun_unittestr   rB  rB   rš   rú   r  r˜  r¤   )Úverboser¡   r   r   r   Ú	test_main_  s    
r¡  Ú__main__)N)7rŒ  Zhttp.serverr   r   r   r   r8   r   r   r-   rÍ   r  r'  r•  r¹   Úemail.messager´   Úemail.utilsrÕ   Úhttp.clientÚurllib.parserÓ   r¢   r‚  r®   r   rô   r   Úior	   rœ   r
   r   r   r   ÚTestCaser)   rB   r   rš   r  r  r  rø   Úhasattrrß   rú   r1  r:  r<  rB  r  r˜  r¡  r   r   r   r   r   Ú<module>   s\   	 P$ m
 I l(

