B
    u9aM­  ã               @   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   ú&/usr/lib/python3.7/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)Z	localhostr   gš™™™™™©?)r   r   r   ZsocketZgetsocknamer   ÚHOSTÚPORTÚserver_startedÚsetZserve_foreverZserver_close)r   r   r   r   Úrun0   s    zTestServerThread.runc             C   s   | j  ¡  |  ¡  d S )N)r   Z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
   Zthreading_setupÚ_threadsZEnvironmentVarGuardÚosÚenvironr   Z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)r(   r#   r&   r'   Ú__exit__r
   Z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   Z
connectionÚrequestÚgetresponse)r   ZuriÚmethodÚbodyÚheadersr   r   r   r2   N   s    zBaseTestCase.request)r   r   r   r+   r-   r2   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/htmlr8   z
keep-alive)r:   r   r;   r<   r=   )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)r@   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)r@   )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/htmlr8   r9   )r:   r<   r=   )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 Mindr8   r9   zx-special-incomingzutf-8)r:   r<   r=   r6   ÚencodeÚwfileÚwrite)r   r5   r   r   r   Údo_LATINONEHEADERu   s    
z8BaseHTTPServerTestCase.request_handler.do_LATINONEHEADERc             C   s   |   t| jdd … ƒ¡ d S )Né   )r@   ÚintÚpath)r   r   r   r   Údo_SEND_ERROR}   s    z4BaseHTTPServerTestCase.request_handler.do_SEND_ERRORc             C   s   |   t| jdd … ƒ¡ d S )NrJ   )r@   rK   rL   )r   r   r   r   Údo_HEAD€   s    z.BaseHTTPServerTestCase.request_handler.do_HEADN)r   r   r   Úprotocol_versionÚdefault_request_versionr>   r?   rA   rC   rD   rE   rI   rM   rN   r   r   r   r   r   U   s   r   c             C   s,   t  | ¡ tj | j| j¡| _| j ¡  d S )N)	r$   r+   r/   r0   r1   r   r   ÚconÚconnect)r   r   r   r   r+   ƒ   s    
zBaseHTTPServerTestCase.setUpc             C   s,   | j  dd¡ | j  ¡ }|  |jtj¡ d S )Nr.   ú/)rQ   r2   r3   Ú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XYZBOGUSrS   )	rQ   Ú_http_vsn_strÚ
putrequestÚ
endheadersr3   rT   rU   r   rV   )r   rW   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FUBARr.   rS   )	rQ   rY   rZ   r[   r3   rT   rU   r   ÚBAD_REQUEST)r   rW   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.9r.   rS   )	rQ   rY   rZ   r[   r3   rT   rU   r   r]   )r   rW   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   r.   rS   )	rQ   rY   rZ   r[   r3   rT   rU   r   rV   )r   rW   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   ÚCUSTOMrS   )	rQ   rY   rZ   r[   r3   rT   rU   r   r]   )r   rW   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.9r.   rS   )
rQ   Z	_http_vsnrY   rZ   r[   r3   rT   rU   r   ZHTTP_VERSION_NOT_SUPPORTED)r   rW   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   )	rQ   rY   rZ   r[   r3   rT   rU   r   r]   )r   rW   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 )Nr.   rS   r8   r9   )	rQ   rZ   Ú	putheaderr[   r3   rT   rU   r   rV   )r   rW   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.1r.   rS   r8   z
keep-alive)
rQ   rY   rZ   rf   r[   r3   rT   rU   r   rV   )r   rW   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ÚTESTrS   )rQ   r2   r3   rT   rU   r   r;   )r   rW   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KEEPrS   r8   z
keep-aliveri   )rQ   r2   r3   rT   Ú	getheaderZ
addCleanupr9   )r   rW   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KEYERRORrS   iç  )rQ   r2   r3   rT   rU   )r   rW   r   r   r   Útest_internal_key_errorÛ   s    
z.BaseHTTPServerTestCase.test_internal_key_errorc             C   s*   | j  dd¡ | j  ¡ }|  |jd¡ d S )Nra   rS   iç  )rQ   r2   r3   rT   rU   )r   rW   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EXPLAINERRORrS   iç  zContent-Length)rQ   r2   r3   rT   rU   Ú
assertTruerK   rk   )r   rW   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LATINONEHEADERrS   zX-Special-Incomingu   Ã„rger mit Unicode)r6   z	X-Specialu   DÃ¤ngerous Mindzutf-8)rQ   r2   r3   rT   rk   r   rF   )r   rW   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NOTFOUNDrS   zContent-Length)rQ   r2   r3   rT   rU   r   rB   r   rK   rk   Úlen)r   rW   Ú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_CONTENTr;   Z
PROCESSINGÚSWITCHING_PROTOCOLSrQ   r2   Úformatr3   rT   rU   rk   r   )r   Úallow_transfer_encoding_codesÚcoderW   rs   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-Encodingru   )r   rv   rw   ÚOKr;   rx   rQ   r2   ry   r3   rT   rU   ro   rK   rk   ÚassertInr   )r   rz   r{   rW   rs   r   r   r   Útest_head_via_send_error  s"    


z/BaseHTTPServerTestCase.test_head_via_send_errorN)r   r   r   r   r   r   r+   rX   r\   r^   r_   r`   rb   rd   re   rg   rh   rj   rl   rm   rn   rp   rq   rt   r|   r€   r   r   r   r   r7   T   s*   .	r7   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)r:   r   r~   r=   )r   r   r   r   Údo_GET(  s    z4RequestHandlerLoggingTestCase.request_handler.do_GETc             C   s   |   tjd¡ d S )NzFile not found)r@   r   rB   )r   r   r   r   Údo_ERROR,  s    z6RequestHandlerLoggingTestCase.request_handler.do_ERRORN)r   r   r   rO   rP   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 )Nr.   rS   z"GET / HTTP/1.1" 200 -
)r/   r0   r1   r   r   rQ   rR   r
   Úcaptured_stderrr2   r3   ro   Ú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 )NZERRORrS   Ú
r   z code 404, message File not foundrJ   z"ERROR / HTTP/1.1" 404 -)r/   r0   r1   r   r   rQ   rR   r
   r„   r2   r3   r…   Úsplitro   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!)ÚdirrS   ÚtestÚwbr   )ZmicrosecondT)Úusegmt) r$   r+   r&   ÚgetcwdÚcwdÚtempfileZ
gettempdirÚchdirrs   ÚmkdtempÚtempdirrL   ÚbasenameÚtempdir_nameÚbase_urlr"   ÚopenrH   ÚflushÚstatÚst_mtimeÚdatetimeZfromtimestampZtimezoneZutcÚreplaceÚlast_modif_datetimeÚemailÚutilsZ
formatdateÚ	timestampÚlast_modif_header)r   ZbasetempdirZtempnameZtempÚmtimeZ
last_modifr   r   r   r+   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“   ÚshutilZrmtreer—   r$   r-   )r   r   r   r   r-   `  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é
   r8   r9   é   ru   zConnection should be closed)Z_close_connr   ro   rT   rU   ÚassertIsNotNoneÚreasonÚversionÚmsgÚgetr9   )r   rª   rU   rs   r«   r5   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   rS   r´   r   Úsurrogatepass)Úerrorsz	href="%s"Úsurrogateescapez>%s<F)Úquote)rs   )ÚsysÚgetfilesystemencodingr&   Úfsdecoder
   ÚTESTFN_UNDECODABLEr›   rL   r"   r—   rH   r2   rš   ÚplatformÚlistdirr³   r   r~   ÚurllibÚparser¹   r   rF   ÚhtmlÚescape)r   ÚencÚfilenameÚfrª   Únamer5   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)rs   z/test/rS   z/?hi=2z?hi=1ÚLocationz/?hi=1z/ThisDoesNotExistz/ThisDoesNotExist/s   Dummy index file
z
index.htmlr   Úposixr   ií  )r2   rš   r³   r   r~   rs   rB   ÚMOVED_PERMANENTLYrT   rk   r›   r&   rL   r"   r™   rH   rÇ   ÚgeteuidÚchmodr—   )r   rª   rs   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}   )r4   zcontent-lengthzcontent-typezapplication/octet-stream)
r2   rš   r³   r   r~   rT   rk   Ústrrr   rs   )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)r6   rJ   )ZhoursT)r‘   N)r¢   ÚmessageÚMessager¥   r2   rš   r³   r   rv   r¡   rŸ   Ú	timedeltar£   Úformat_datetime)r   r6   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  )ZdaysT)r‘   zIf-Modified-Sincez/test)r6   )r¡   rŸ   rÒ   r¢   rÐ   rÑ   r£   rÓ   r2   rš   r³   r   r~   )r   ZdtZold_dtr6   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)r6   )	r¢   rÐ   rÑ   r¥   r2   rš   r³   r   r~   )r   r6   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 )NrS   ZFOO)r4   ZcustomZGETs)r2   r³   r   rV   )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)rs   zLast-modifiedN)	r2   rš   r³   r   r~   rs   r6   rT   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)rs   z/test/rS   z/?hi=2z?hi=1rÉ   z/?hi=1)
r2   r™   r³   r   r~   rs   rB   rË   rT   rk   )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 systemrS   z>%s<F)r¹   )r&   rL   r"   r—   r›   r9   ÚOSErrorÚunittestZSkipTestr2   rš   r³   r   r~   r6   Zget_content_charsetÚunlinkr®   rÂ   rÃ   r   rF   )r   rÅ   Zfullpathrª   r5   rÄ   Z	html_textr   r   r   Útest_html_escape_filename  s    
z2SimpleHTTPServerTestCase.test_html_escape_filename)N)r   r   r   r   r   r   r+   r-   r³   rÝ   ÚskipIfrº   r¾   Z
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.pyZQUERY_STRING)#r$   r+   r&   r’   r“   r”   r–   Ú
parent_dirrL   r"   Úcgi_dirÚcgi_child_dirÚmkdirÚ
nocgi_pathÚ
file1_pathÚ
file2_pathÚ
file3_pathÚ
file4_pathr
   Zcan_symlinkÚ	pythonexeÚsymlinkrº   Ú
executablerF   ÚUnicodeEncodeErrorr-   ZskipTestr›   rH   Ú	cgi_file1rÍ   Ú	cgi_file2Ú	cgi_file4r•   )r   r¨   Zfile1Zfile2Zfile3Zfile4r   r   r   r+   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$   r-   )r   r   r   r   r-   Ž  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/.//..rS   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_pathrT   )r   Ztest_vectorsrL   Ú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)r2   rT   r   rk   rU   Úlinesepr   r~   )r   rW   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)r2   rT   rU   r   rB   )r   rW   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 )
NrJ   rã   i@â )ZspamZeggsZbaconzContent-typez!application/x-www-form-urlencodedz/cgi-bin/file2.pyZPOSTs   1, python, 123456)rÀ   rÁ   Z	urlencoder2   rT   r   r  )r   Úparamsr6   rW   r   r   r   Ú	test_post×  s
    zCGIHTTPServerTestCase.test_postc             C   s&   |   d¡}| ¡  |  |jtj¡ d S )Nz/cgi-bin/invalid)r2   r   rT   rU   r   rB   )r   rW   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.pyr.   )r6   s   Hello Worldz	text/htmlzContent-type)
Úbase64Z	b64encoder2   rT   r  r   r~   r   rk   rU   )r   r6   rW   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)r2   rT   r  r   r~   r   rk   rU   )r   rW   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'   r2   rT   r  r   r~   r   rk   rU   )r   Z	signaturerW   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)r2   rT   r  r   r~   r   rk   rU   )r   rW   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)r2   rT   r  r   r~   r   rk   rU   )r   rW   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)r2   rT   r  r   r~   r   rk   rU   )r   rW   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)r2   rT   r  r   r~   r   rk   rU   )r   rW   r   r   r   Ú"test_query_with_continuous_slashes  s
    
z8CGIHTTPServerTestCase.test_query_with_continuous_slashesN)r   r   r   r   r   r   r&   r  rF   r+   r-   r  r  r  r  r  r	  r
  r  r  r  r  r  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   ZMockr	   ZmakefileZreturn_valueÚsuperr   Ú
get_calledrO   )r   r   Úkwargsr2   )Ú	__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>
)r  r:   r   r~   r<   r=   rG   rH   )r   r   r   r   r‚     s
    zSocketlessRequestHandler.do_GETc             G   s   d S )Nr   )r   ry   r   r   r   r   r   &  s    z$SocketlessRequestHandler.log_message)r   r   r   r   r‚   r   Ú__classcell__r   r   )r  r   r    s   r  c               @   s   e Zd Zdd„ ZdS )Ú!RejectingSocketlessRequestHandlerc             C   s   |   tj¡ dS )NF)r@   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   rs   r   r   r   rH   4  s    zAuditableBytesIO.writec             C   s   d  | j¡S )Nru   )r"   r  )r   r   r   r   ÚgetData7  s    zAuditableBytesIO.getDatac             C   s
   t | jƒS )N)rr   r  )r   r   r   r   Ú	numWrites:  s    zAuditableBytesIO.numWritesN)r   r   r   r   rH   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)r  Úhandler)r   r   r   r   r+   G  s    z$BaseHTTPRequestHandlerTestCase.setUpc             C   s:   t |ƒ}t ƒ }|| j_|| j_| j ¡  | d¡ | ¡ S )Nr   )r	   r  ÚrfilerG   Ú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)ro   r  r  )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>rJ   )rT   Úsum)r   r6   r   )r+  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   rJ   éÿÿÿÿs    <html><body>Data</body></html>
zGET / HTTP/1.1r.   rS   zHTTP/1.1r   )r&  r2  r.  r'  rT   r  ÚrequestlineÚcommandrL   Úrequest_versionÚassertSequenceEqualr6   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   rJ   r3  s    <html><body>Data</body></html>
zGET / HTTP/1.0r.   rS   zHTTP/1.0r   )r&  r2  r.  r'  rT   r  r4  r5  rL   r6  r7  r6   rù   )r   r8  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

rJ   r   s    <html><body>Data</body></html>
)r&  rT   rr   r'  )r   r8  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 rJ   s   
)r&  ro   r(  r.  ÚindexÚassertFalser  r  )r   r8  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   rJ   r3  s    <html><body>Data</body></html>
zGET / HTTP/1.0r.   rS   zHTTP/1.0))ÚExpectz100-continue)r&  r2  r.  r'  rT   r  r4  r5  rL   r6  r7  r6   rù   )r   r8  r6   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
rJ   s   
é   s   HTTP/1.1 200 OK
r3  s    <html><body>Data</body></html>
zGET / HTTP/1.1r.   rS   zHTTP/1.1))r?  z100-continue)r&  rT   r.  r'  r  r4  r5  rL   r6  r7  r6   rù   )r   r8  r6   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¢  rA  )r	   r  r  r   rG   r6  r4  r5  r@   rT   r  )r   r$  r%  r  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   rJ   )
r	   r  r  r   rG   r6  Zsend_response_onlyrT   r  r=   )r   r$  r%  r  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.1ZFooZfooZbarr   s   Foo: foo
bar: bar

rJ   )r	   r  r  r   rG   r6  r<   rT   r  r=   r  )r   r$  r%  r  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   )Útellr"  r   )rÆ   Úposrs   r   r   r   Ú_readAndReseekÐ  s
    

z[BaseHTTPRequestHandlerTestCase.test_header_unbuffered_when_continue.<locals>._readAndReseeks(   GET / HTTP/1.1
Expect: 100-continue

zHTTP/1.1ru   s   
r   s   HTTP/1.1 100 ContinuerJ   rA  s   HTTP/1.1 200 OK)	r	   r  r   rG   r6  r!  ZassertNotEqualrŠ   rT   )r   rH  r$  r%  r8  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
rJ   r3  c             s   s   | ]}|d kV  qdS )s   Connection: close
Nr   )r)  Úrr   r   r   r,  í  s    zMBaseHTTPRequestHandlerTestCase.test_with_continue_rejected.<locals>.<genexpr>)r  r  r&  rT   r.  r=  r  r-  )r   Zusual_handlerr8  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
)r&  rT   r=  r  r  ZassertIsInstancer4  rÎ   )r   r8  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)r&  rT   r=  r  r  r4  )r   r8  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)r&  rT   r=  r  r  r4  )r   r8  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.1ru   z<script>alert("hello")</script>F)r¹   râ   )r&  r"   r   rÂ   rÃ   rF   )r   r8  Ú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)Únextr  Zclose_connectionr   )Úclose_valuesr   r   r   r!    s    zPBaseHTTPRequestHandlerTestCase.test_close_connection.<locals>.handle_one_request)T)FFT)r  r!  ÚiterZhandlerþ   ÚStopIterationrS  )r   r!  r   )rT  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¤   )ÚtimeZgmtimer  ZweekdaynameZ	monthnamerT   Zdate_time_string)r   ZnowZyearZmonthZ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Úcompiler/  r+   r&  r'  r.  r2  r9  r:  r;  r>  r@  rB  rC  rD  rE  rI  rK  rM  rO  rP  rR  rW  r\  r   r   r   r   r  ?  s0   
	
r  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’   Ú
translatedrL   r"   r  r  )r   r   r   r   r+   ,  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)r  Útranslate_pathrT   ra  )r   rL   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)r  rb  rT   ra  )r   rL   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 )NrL   zc:c:c:foo/filenamez\c:../filenamezc:\c:..\foo/filenamezc:c:foo\c:c:bar/filename)r
   Z	swap_attrr   r&   Úntpathr  rb  r    ÚseprT   ra  )r   rL   r   r   r   Útest_windows_colon?  s    z3SimpleHTTPRequestHandlerTestCase.test_windows_colonN)r   r   r   r]  r+   rc  rd  rg  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   r(  Úgetattrr  ZassertCountEqualÚ__all__)r   rÿ   Z	blacklistrÇ   Zmodule_objectr   r   r   Útest_allS  s    

zMiscTestCase.test_allN)r   r   r   rl  r   r   r   r   rh  R  s   rh  c          	   C   s4   t  ¡ }zt tttttt	t
¡ W d t  |¡ X d S )N)r&   r’   r
   Zrun_unittestr   r  r7   r   rá   r`  rh  r•   )Úverboser“   r   r   r   Ú	test_main_  s    
rn  Ú__main__)N)7r]  Zhttp.serverr   r   r   r   r/   r   r   r&   rº   r^  r  re  r§   Zemail.messager¢   Zemail.utilsrÂ   Zhttp.clientZurllib.parserÀ   r”   rX  rŸ   r   rÝ   r   Úior	   r   r
   r   r   r   ZTestCaser$   r7   r   r   rò   ró   rô   rà   ÚhasattrrÌ   rá   r  r  r  r  r`  rh  rn  r   r   r   r   r   Ú<module>   s\   	 P$ m
 I l(

