a
    äze¯Ú  ã                   @   s.  d Z ddlm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ZddlZddlZddlmZ ddl m!Z!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/dZ0e 1e2edƒo„e 3¡ dkd¡G dd„ de)ƒƒZ4G dd„ deƒZ5G dd „ d e5ƒZ6G d!d"„ d"ƒZ7G d#d$„ d$ej(ƒZ8G d%d&„ d&ej(ƒZ9G d'd(„ d(ej(ƒZ:G d)d*„ d*ej(ƒZ;d+d,„ Z<e=d-kr*e >¡  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.
é    )ÚOrderedDict)ÚBaseHTTPRequestHandlerÚ
HTTPServerÚSimpleHTTPRequestHandlerÚCGIHTTPRequestHandler)ÚserverÚ
HTTPStatusN)Úmock)ÚBytesIOÚStringIO)Ú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.9/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 r   )Ú	threadingÚThreadÚ__init__Úrequest_handlerÚtest_object)r   r    r   r   r   r   r   -   s    zTestServerThread.__init__c                 C   sd   t d| jƒ| _| jj ¡ \| j_| j_| jj 	¡  d | _z| j 
d¡ W | j ¡  n| j ¡  0 d S )N)Ú	localhostr   gš™™™™™©?)r   r   r   ÚsocketÚgetsocknamer    ÚHOSTÚPORTÚserver_startedÚsetZserve_foreverZserver_close©r   r   r   r   Úrun2   s    zTestServerThread.runc                 C   s   | j  ¡  |  ¡  d S r   )r   ÚshutdownÚjoinr(   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 r   )r   Zthreading_setupÚ_threadsZEnvironmentVarGuardÚosÚenvironr   ÚEventr&   r   r   ÚthreadÚstartÚwaitr(   r   r   r   ÚsetUpB   s    



zBaseTestCase.setUpc                 C   s*   | j  ¡  d | _ tj ¡  tj| jŽ  d S r   )r2   r,   r/   r0   Ú__exit__r   Zthreading_cleanupr.   r(   r   r   r   ÚtearDownJ   s    

zBaseTestCase.tearDownÚGETNc                 C   s0   t j | j| j¡| _| j ||||¡ | j ¡ S r   )ÚhttpÚclientÚHTTPConnectionr$   r%   Ú
connectionÚrequestÚgetresponse)r   ZuriÚmethodÚbodyÚheadersr   r   r   r=   P   s    zBaseTestCase.request)r   r   r   r5   r7   r=   r   r   r   r   r-   A   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_handlerúHTTP/1.1c                 C   s0   |   tj¡ |  dd¡ |  dd¡ |  ¡  d S )NúContent-Typeú	text/htmlÚ
ConnectionÚclose©Úsend_responser   Ú
NO_CONTENTÚsend_headerÚend_headersr(   r   r   r   Údo_TEST[   s    z.BaseHTTPServerTestCase.request_handler.do_TESTc                 C   s0   |   tj¡ |  dd¡ |  dd¡ |  ¡  d S )NrD   rE   rF   ú
keep-aliverH   r(   r   r   r   Údo_KEEPa   s    z.BaseHTTPServerTestCase.request_handler.do_KEEPc                 C   s   |   d¡ d S )Néç  ©Ú
send_errorr(   r   r   r   Údo_KEYERRORg   s    z2BaseHTTPServerTestCase.request_handler.do_KEYERRORc                 C   s   |   tj¡ d S r   ©rR   r   Ú	NOT_FOUNDr(   r   r   r   Údo_NOTFOUNDj   s    z2BaseHTTPServerTestCase.request_handler.do_NOTFOUNDc                 C   s   |   ddd¡ d S )NrP   zShort MessagezThis is a long 
 explanationrQ   r(   r   r   r   Údo_EXPLAINERRORm   s    ÿz6BaseHTTPServerTestCase.request_handler.do_EXPLAINERRORc                 C   s.   |   d¡ |  dd¡ |  dd¡ |  ¡  d S )NrP   rD   rE   rF   rG   )rI   rK   rL   r(   r   r   r   Ú	do_CUSTOMq   s    
z0BaseHTTPServerTestCase.request_handler.do_CUSTOMc                 C   sJ   |   d¡ |  dd¡ |  dd¡ |  ¡  | jd  d¡}| j |¡ d S )NrP   ú	X-Specialõ   DÃ¤ngerous MindrF   rG   zx-special-incomingúutf-8)rI   rK   rL   rA   ÚencodeÚwfileÚwrite)r   r@   r   r   r   Údo_LATINONEHEADERw   s    
z8BaseHTTPServerTestCase.request_handler.do_LATINONEHEADERc                 C   s   |   t| jdd … ƒ¡ d S ©Né   ©rR   ÚintÚpathr(   r   r   r   Údo_SEND_ERROR   s    z4BaseHTTPServerTestCase.request_handler.do_SEND_ERRORc                 C   s   |   t| jdd … ƒ¡ d S r`   rb   r(   r   r   r   Údo_HEAD‚   s    z.BaseHTTPServerTestCase.request_handler.do_HEADN)r   r   r   Úprotocol_versionÚdefault_request_versionrM   rO   rS   rV   rW   rX   r_   re   rf   r   r   r   r   r   W   s   r   c                 C   s,   t  | ¡ tj | j| j¡| _| j ¡  d S r   )	r-   r5   r9   r:   r;   r$   r%   ÚconÚconnectr(   r   r   r   r5   …   s    
zBaseHTTPServerTestCase.setUpc                 C   s,   | j  dd¡ | j  ¡ }|  |jtj¡ d S )Nr8   ú/)ri   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XYZBOGUSrk   ©	ri   Ú_http_vsn_strÚ
putrequestÚ
endheadersr>   rl   rm   r   rn   ro   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FUBARr8   rk   ©	ri   rs   rt   ru   r>   rl   rm   r   ZBAD_REQUESTro   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.9r8   rk   rw   ro   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   r8   rk   rr   ro   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   ÚCUSTOMrk   rw   ro   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.9r8   rk   )
ri   Z	_http_vsnrs   rt   ru   r>   rl   rm   r   ZHTTP_VERSION_NOT_SUPPORTEDro   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 r   rw   ro   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 )Nr8   rk   rF   rG   )	ri   rt   Ú	putheaderru   r>   rl   rm   r   rn   ro   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 )NrC   r8   rk   rF   rN   )
ri   rs   rt   r€   ru   r>   rl   rm   r   rn   ro   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ÚTESTrk   )ri   r=   r>   rl   rm   r   rJ   ro   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KEEPrk   rF   rN   rƒ   )ri   r=   r>   rl   Ú	getheaderZ
addCleanuprG   ro   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KEYERRORrk   rP   ©ri   r=   r>   rl   rm   ro   r   r   r   Útest_internal_key_errorÝ   s    
z.BaseHTTPServerTestCase.test_internal_key_errorc                 C   s*   | j  dd¡ | j  ¡ }|  |jd¡ d S )Nr{   rk   rP   r‡   ro   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EXPLAINERRORrk   rP   úContent-Length)ri   r=   r>   rl   rm   Ú
assertTruerc   r…   ro   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LATINONEHEADERrk   zX-Special-Incomingu   Ã„rger mit Unicode©rA   rY   rZ   r[   )ri   r=   r>   rl   r…   r   r\   ro   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NOTFOUNDrk   rŠ   )ri   r=   r>   rl   rm   r   rU   r   rc   r…   Úlen)r   rp   Údatar   r   r   Útest_error_content_lengthõ   s
    
z0BaseHTTPServerTestCase.test_error_content_lengthc                 C   s¬   t jt jf}t jt jt jt jt jfD ]‚}| j dd |¡¡ | j 	¡ }|  
||j¡ |  
d | d¡¡ |  
d | d¡¡ ||vr’|  
d | d¡¡ | ¡ }|  
d|¡ q$d S )NZ
SEND_ERRORú/{}rŠ   rD   úTransfer-Encodingó    )r   ÚNOT_MODIFIEDÚRESET_CONTENTrJ   Z
PROCESSINGÚSWITCHING_PROTOCOLSri   r=   Úformatr>   rl   rm   r…   r   ©r   Zallow_transfer_encoding_codesÚcoderp   r   r   r   r   Útest_send_errorþ   s     ÿþ
z&BaseHTTPServerTestCase.test_send_errorc                 C   sâ   t jt jf}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¡¡ ||vrÈ|  
d | d¡¡ | ¡ }|  
d|¡ q$d S )	NÚHEADr’   rŠ   r   rE   rD   r“   r”   )r   r•   r–   ÚOKrJ   r—   ri   r=   r˜   r>   rl   rm   r‹   rc   r…   ÚassertInr   r™   r   r   r   Útest_head_via_send_error  s&    ÿþ

z/BaseHTTPServerTestCase.test_head_via_send_errorN)r   r   r   r   r   r   r5   rq   rv   rx   ry   rz   r|   r~   r   r   r‚   r„   r†   rˆ   r‰   rŒ   rŽ   r‘   r›   rŸ   r   r   r   r   rB   V   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_handlerrC   c                 C   s   |   tj¡ |  ¡  d S r   )rI   r   r   rL   r(   r   r   r   Údo_GET*  s    z4RequestHandlerLoggingTestCase.request_handler.do_GETc                 C   s   |   tjd¡ d S )NzFile not foundrT   r(   r   r   r   Údo_ERROR.  s    z6RequestHandlerLoggingTestCase.request_handler.do_ERRORN)r   r   r   rg   rh   r¡   r¢   r   r   r   r   r   &  s   r   c                 C   sv   t j | j| j¡| _| j ¡  t ¡ (}| j 	dd¡ | j 
¡  W d   ƒ n1 sT0    Y  |  | ¡  d¡¡ d S )Nr8   rk   z"GET / HTTP/1.1" 200 -
)r9   r:   r;   r$   r%   ri   rj   r   Úcaptured_stderrr=   r>   r‹   ÚgetvalueÚendswith)r   Úerrr   r   r   Útest_get1  s    

(ÿz&RequestHandlerLoggingTestCase.test_getc                 C   s˜   t j | j| j¡| _| j ¡  t ¡ (}| j 	dd¡ | j 
¡  W d   ƒ n1 sT0    Y  | ¡  d¡}|  |d  d¡¡ |  |d  d¡¡ d S )NÚERRORrk   Ú
r   z code 404, message File not foundra   z"ERROR / HTTP/1.1" 404 -)r9   r:   r;   r$   r%   ri   rj   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‡ fdd„Z‡ f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#d$„ Zd%d&„ Z‡  ZS )(ÚSimpleHTTPServerTestCasec                   @   s   e Zd ZdS )z(SimpleHTTPServerTestCase.request_handlerN©r   r   r   r   r   r   r   r   J  s   r   c                    sê   t ƒ  ¡  t ¡ | _t ¡ }t |¡ d| _tj	|d| _
tj | j
¡| _d| j | _tj | j
d¡}t|dƒ$}| | j¡ | ¡  W d   ƒ n1 sš0    Y  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!)Údirrk   ÚtestÚwbr   )ZmicrosecondT©Zusegmt) Úsuperr5   r/   ÚgetcwdÚcwdÚtempfileÚ
gettempdirÚchdirr   ÚmkdtempÚtempdirrd   ÚbasenameÚtempdir_nameÚbase_urlr+   Úopenr^   ÚflushÚstatÚst_mtimeÚdatetimeZfromtimestampÚtimezoneZutcÚreplaceÚlast_modif_datetimeÚemailÚutilsZ
formatdateÚ	timestampÚlast_modif_header)r   ZbasetempdirZtempnameZtempÚmtimeZ
last_modif©Ú	__class__r   r   r5   M  s(    


&ÿÿzSimpleHTTPServerTestCase.setUpc                    sJ   z8t  | j¡ zt | j¡ W n   Y n0 W tƒ  ¡  ntƒ  ¡  0 d S r   )r/   r¸   rµ   ÚshutilÚrmtreerº   r³   r7   r(   rË   r   r   r7   b  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_connm  s    zDSimpleHTTPServerTestCase.check_status_and_reason.<locals>.close_conné
   rF   rG   é   r”   zConnection should be closed)Z_close_connr   r‹   rl   rm   ÚassertIsNotNoneÚreasonÚversionÚmsgÚgetrG   )r   rÒ   rm   r   rÓ   r@   r   rÐ   r   Úcheck_status_and_reasonl  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   ƒ n1 sP0    Y  |  | jd ¡}t jdkr–t | j	¡D ]}|dkr€|} q–q€|  |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±   rk   rÜ   r°   Úsurrogatepass)Úerrorsz	href="%s"Úsurrogateescapeú>%s<F©Úquote©r   )ÚsysÚgetfilesystemencodingr/   Úfsdecoder   ÚTESTFN_UNDECODABLEr¾   rd   r+   rº   r^   r=   r½   ÚplatformÚlistdirrÛ   r   r   ÚurllibÚparserã   rž   r\   ÚhtmlÚescape)r   ÚencÚfilenameÚfrÒ   Únamer@   Z
quotednamer   r   r   Útest_undecodable_filename…  s4    *
ÿÿÿÿ
ÿz2SimpleHTTPServerTestCase.test_undecodable_filenamec                 C   sd   |   | jd ¡ ¡ }|  |d| j› d d¡¡ |   | jd ¡ ¡ }|  |d| j› d d¡¡ d S )Nz/?x=123zlisting for z/\?x=123Úlatin1z/?x=%bbu   /\?x=Ã¯Â¿Â½)r=   r½   r   ZassertRegexr\   ©r   rÒ   r   r   r   Útest_undecodable_parameter¢  s    z3SimpleHTTPServerTestCase.test_undecodable_parameterc           	      C   s2  t  t j | jd¡¡ d| j› d}|› d}|  |¡}|  |tj	¡ | 
d¡}| j||dd d|› }|  |¡}|  |tj	¡ | 
d¡}| j| d¡|d | j||d	d d|› }|  |¡}|  |tj	¡ |  | 
d¡|¡ d
|› }|› d}|  |¡}|  |tj	¡ | 
d¡}| j| d
¡|d dS )aI  Ensure //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.
        Zexisting_directoryz2/python.org/..%2f..%2f..%2f..%2f..%2f../%0a%0d/../z/existing_directoryrk   ÚLocationznon-attack failed!©rÙ   ú//zcExpected Location header to start with a single / and end with a / as this is a directory redirect.zhttps://pypi.org/N)r/   Úmkdirrd   r+   rº   r¼   r=   rÛ   r   ÚMOVED_PERMANENTLYr…   rl   ÚassertFalseÚ
startswithr‹   )	r   ÚurlZexpected_locationrÒ   ÚlocationZ
attack_urlZattack3_urlZattack_scheme_netloc_2slash_urlZexpected_scheme_netloc_locationr   r   r   Ú3test_get_dir_redirect_location_domain_injection_bugª  s2    	





ÿ





zLSimpleHTTPServerTestCase.test_get_dir_redirect_location_domain_injection_bugc              
   C   sä  |   | jd ¡}| j|tj| jd |   | jd ¡}|  |tj¡ |   | jd ¡}|  |tj¡ |   | j¡}|  |tj¡ |  | 	d¡d¡ |   | 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   ƒ n1 sL0    Y  |   | jd ¡}|  |tj|¡ tjdkràt ¡ dkràt | jd¡ z0|   | jd ¡}|  |tj¡ W t | jd¡ nt | jd¡ 0 d S )Nú/testrä   ú/test/rk   rŠ   Ú0ú/?hi=2ú?hi=1r÷   ú/?hi=1z/ThisDoesNotExistz/ThisDoesNotExist/s   Dummy index file
z
index.htmlr±   Úposixr   ií  )r=   r½   rÛ   r   r   r   rU   rû   rl   r…   r¾   r/   rd   r+   r¼   r^   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 )Nr  rœ   ©r?   zcontent-lengthzcontent-typezapplication/octet-stream)
r=   r½   rÛ   r   r   rl   r…   Ústrr   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
        úIf-Modified-Sincer  r   ra   )ZhoursTr²   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  )ZdaysTr²   r  r  r   )rÅ   rÂ   r  rÆ   r  r  rÇ   r  r=   r½   rÛ   r   r   )r   Z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 )Nr  Ú*zIf-None-Matchr  r   )	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 )Nrk   ZFOOr
  ZcustomZGETs)r=   rÛ   r   rn   rõ   r   r   r   Útest_invalid_requests1  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
        r  rä   zLast-modifiedN)	r=   r½   rÛ   r   r   r   rA   rl   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 )	Nr  rä   r  rk   r  r  r÷   r  )
r=   r¼   rÛ   r   r   r   rU   rû   rl   r…   rõ   r   r   r   Útest_path_without_leading_slashC  s    ÿz8SimpleHTTPServerTestCase.test_path_without_leading_slashc              	   C   s¾   d}t j | j|¡}zt|dƒ ¡  W n  tyF   t d| ¡‚Y n0 z6|  	| j
d ¡}|  |tj¡}|j ¡ }W t  |¡ nt  |¡ 0 |  |¡ dtj|dd }|  | |¡|¡ d S )Nz<test&>.txtÚwz-Can not create file %s on current file systemrk   rá   Frâ   )r/   rd   r+   rº   r¾   rG   ÚOSErrorÚunittestZSkipTestr=   r½   rÛ   r   r   rA   Zget_content_charsetÚunlinkrÖ   rí   rî   rž   r\   )r   rð   ÚfullpathrÒ   r@   rï   Z	html_textr   r   r   Útest_html_escape_filenameS  s     ÿ
z2SimpleHTTPServerTestCase.test_html_escape_filename)N)r   r   r   r   r   r   r5   r7   rÛ   r  ÚskipIfrå   ré   Z
skipUnlessr   rè   ró   rö   r   r§   r  r  r  r  r  r  r  r  Ú__classcell__r   r   rË   r   r­   I  s2   

ÿÿÿ1'				r­   zD#!%s

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

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

form = cgi.FieldStorage()
print("%%s, %%s, %%s" %% (form.getfirst("spam"), form.getfirst("eggs"),
                          form.getfirst("bacon")))
zR#!%s
import os

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

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

print("X-ambv: was here")
print("Content-type: text/html")
print()
print("<pre>")
for k, v in os.environ.items():
    try:
        k.encode('ascii')
        v.encode('ascii')
    except UnicodeEncodeError:
        continue  # see: BPO-44647
    print(f"{k}={v}")
print("</pre>")
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 d!„ Zd"d#„ Zd$S )%ÚCGIHTTPServerTestCasec                   @   s   e Zd ZdS )z%CGIHTTPServerTestCase.request_handlerNr®   r   r   r   r   r     s   r   Úasciic                 C   s  t  | ¡ t ¡ | _t ¡ | _tj 	| jd¡| _
tj 	| j
d¡| _tj 	| jd¡| _tj 	| jd¡| _tj 	| jd¡| _t | j
¡ t | j¡ t | j¡ t | j¡ t | j¡ d | _d | _d | _d | _d | _d | _d | _t ¡ rtj 	| jd¡| _t | j¡ ¡ | _ntj| _z| j d¡ W n& tyL   |   ¡  |  !d¡ Y n0 tj 	| jd¡| _t"| jd	ƒ }| #t$| j ¡ W d   ƒ n1 s”0    Y  t %| jd
¡ tj 	| j
d¡| _t"| jd	dd }| #t$| j ¡ W d   ƒ n1 sö0    Y  t %| jd
¡ tj 	| j
d¡| _t"| jd	dd }| #t&| j ¡ W d   ƒ n1 sX0    Y  t %| jd
¡ tj 	| jd¡| _t"| jd	dd }| #t$| j ¡ W d   ƒ n1 sº0    Y  t %| jd
¡ tj 	| j
d¡| _t"| jd	dd$}| #t'| jdf ¡ W d   ƒ n1 s 0    Y  t %| jd
¡ tj 	| jd¡| _t"| jd	dd }| #t$| j ¡ W d   ƒ n1 s‚0    Y  t %| jd
¡ tj 	| j
d¡| _(t"| j(d	dd }| #t)| j ¡ W d   ƒ n1 sä0    Y  t %| j(d
¡ t *| j¡ d S )Nzcgi-binz	child-dirÚsubr¯   Úpythonr[   z0Python executable path is not encodable to utf-8znocgi.pyr  iÿ  zfile1.py)Úencodingzfile2.pyzfile3.pyzfile4.pyZQUERY_STRINGzfile5.pyzfile6.py)+r-   r5   r/   r´   rµ   r¶   r¹   Ú
parent_dirrd   r+   Úcgi_dirÚcgi_child_dirÚ	sub_dir_1Ú	sub_dir_2Úcgi_dir_in_sub_dirrú   Ú
nocgi_pathÚ
file1_pathÚ
file2_pathÚ
file3_pathÚ
file4_pathÚ
file5_pathÚ_pythonexe_symlinkr   Zcan_symlinkZ	pythonexeZPythonSymlinkÚ	__enter__rå   Ú
executabler\   ÚUnicodeEncodeErrorr7   ZskipTestr¾   r^   Ú	cgi_file1r	  Ú	cgi_file2Ú	cgi_file4Ú
file6_pathÚ	cgi_file6r¸   )r   rÏ   Zfile1Zfile2Zfile3Zfile4Zfile5Zfile6r   r   r   r5   ¢  st    



0000400zCGIHTTPServerTestCase.setUpc              	   C   s  zöt  | j¡ | jr$| j d d d ¡ | jr6t  | j¡ | jrHt  | j¡ | jrZt  | j¡ | j	rlt  | j	¡ | j
r~t  | j
¡ | jrt  | j¡ | jr¢t  | j¡ t  | j¡ t  | j¡ t  | j¡ t  | j¡ t  | j¡ t  | j¡ W t | ¡ nt | ¡ 0 d S r   )r/   r¸   rµ   r2  r6   r,  Úremover-  r.  r/  r0  r1  r9  Úrmdirr(  r'  r+  r*  r)  r&  r-   r7   r(   r   r   r   r7   î  s2    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œ}| ¡ D ]R\}}t|tƒrtt|tƒrt|  |tj|¡ qFt |¡}| j	||d|||f d qFd S )Nrù   z//\ú/cgi-bin/file1.pyú//az/C:/ú/a/bú/a/b/z/a/b/dz/a/b/d/fz/a/b/fz/a/fz//f)r   z..z/.//..rk   rù   z/\z/.//úcgi-bin/file1.pyr=  Úaz/ar>  z./az./C:/r?  r@  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: %rrø   )
Ú
IndexErrorÚitemsÚ
isinstanceÚtypeÚ
issubclassÚ	ExceptionÚassertRaisesr   Z_url_collapse_pathrl   )r   Ztest_vectorsrd   ÚexpectedÚactualr   r   r   Útest_url_collapse_path
  sP    äÿ
ÿÿz,CGIHTTPServerTestCase.test_url_collapse_pathc                 C   s:   |   d¡}|  | ¡ | d¡|jfd| j dtjf¡ d S )Nr=  úContent-typeó   Hello WorldrE   )r=   rl   r   r…   rm   Úlinesepr   r   ro   r   r   r   Útest_headers_and_content4  s
    
þz.CGIHTTPServerTestCase.test_headers_and_contentc                 C   s   |   d¡}|  |jtj¡ d S )Nz)///////////nocgi.py/../cgi-bin/nothere.sh)r=   rl   rm   r   rU   ro   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 )
Nra   r$  i@â )ZspamZeggsZbaconrM  z!application/x-www-form-urlencodedz/cgi-bin/file2.pyZPOSTs   1, python, 123456)rë   rì   Ú	urlencoder=   rl   r   rO  )r   ÚparamsrA   rp   r   r   r   Ú	test_post>  s    
ÿzCGIHTTPServerTestCase.test_postc                 C   s&   |   d¡}| ¡  |  |jtj¡ d S )Nz/cgi-bin/invalid)r=   r   rl   rm   r   rU   ro   r   r   r   Útest_invaliduriF  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:passr=  r8   r   rN  rE   rM  )
Úbase64Z	b64encoder=   rl   rO  r   r   r   r…   rm   )r   rA   rp   r   r   r   Útest_authorizationK  s    ÿþz(CGIHTTPServerTestCase.test_authorizationc                 C   s:   |   d¡}|  d| j dtjf| ¡ | d¡|jf¡ d S )NrA  rN  rE   rM  ©r=   rl   rO  r   r   r   r…   rm   ro   r   r   r   Útest_no_leading_slashS  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_SOFTWAREr=  rN  rE   rM  )
r/   r0   r=   rl   rO  r   r   r   r…   rm   )r   Z	signaturerp   r   r   r   Útest_os_environ_is_not_alteredZ  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.pyrN  rE   rM  rX  ro   r   r   r   Ú#test_urlquote_decoding_in_cgi_checkc  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.pyrN  rE   rM  rX  ro   r   r   r   Útest_nested_cgi_path_issue21323i  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=drE   rM  rX  ro   r   r   r   Ú&test_query_with_multiple_question_marko  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//rE   rM  rX  ro   r   r   r   Ú"test_query_with_continuous_slashesu  s    
ÿýz8CGIHTTPServerTestCase.test_query_with_continuous_slashesc              	   C   sf   zRt j d¡ |  d¡}|  d| j dtjf| ¡ | 	d¡|j
f¡ W t j d¡ nt j d¡ 0 d S )Nz/sub/dir/cgi-binz/sub/dir/cgi-bin/file5.pyrN  rE   rM  )r   Zcgi_directoriesÚappendr=   rl   rO  r   r   r   r…   rm   r;  ro   r   r   r   Ú test_cgi_path_in_sub_directories|  s    
þz6CGIHTTPServerTestCase.test_cgi_path_in_sub_directoriesc              	   C   sž   d}d|ff|fddf}|D ]|\}}t |ƒ}|  |¡R | jdd|d}|  tjj|j¡ d|›  d	¡}|  	|| 
¡ ¡ W d   ƒ q1 sŽ0    Y  qd S )
Nz?text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8ÚAccept)r   r   )))ra  rE   )ZACCEPTz
text/plainztext/html,text/plainz/cgi-bin/file6.pyr8   r   zHTTP_ACCEPT=r"  )r   ZsubTestr=   rl   r9   r   r   rm   r\   rž   r   )r   Zbrowser_acceptZtestsrA   rJ  rp   r   r   r   Útest_accept†  s    ÿüz!CGIHTTPServerTestCase.test_acceptN)r   r   r   r   r   r   r/   rO  r\   r5   r7   rL  rP  rQ  rT  rU  rW  rY  rZ  r[  r\  r]  r^  r`  rb  r   r   r   r   r!  š  s$   L*	
r!  c                       s.   e Zd Zd‡ fdd„	Zdd„ Zdd„ Z‡  ZS )	ÚSocketlessRequestHandlerNc                    s6   t  ¡ }tƒ |j_tƒ j|d d |d d| _d| _d S )N©Ú	directoryFrC   )	r	   ZMockr
   ÚmakefileÚreturn_valuer³   r   Ú
get_calledrg   )r   re  r=   rË   r   r   r   š  s
    
z!SocketlessRequestHandler.__init__c                 C   s6   d| _ |  tj¡ |  dd¡ |  ¡  | j d¡ d S )NTrD   rE   ó    <html><body>Data</body></html>
)rh  rI   r   r   rK   rL   r]   r^   r(   r   r   r   r¡   ¢  s
    zSocketlessRequestHandler.do_GETc                 G   s   d S r   r   )r   r˜   r   r   r   r   r   ©  s    z$SocketlessRequestHandler.log_message)N)r   r   r   r   r¡   r   r   r   r   rË   r   rc  ™  s   rc  c                   @   s   e Zd Zdd„ ZdS )Ú!RejectingSocketlessRequestHandlerc                 C   s   |   tj¡ dS )NF)rR   r   ZEXPECTATION_FAILEDr(   r   r   r   Úhandle_expect_100­  s    z3RejectingSocketlessRequestHandler.handle_expect_100N)r   r   r   rk  r   r   r   r   rj  ¬  s   rj  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 r   )Údatasr(   r   r   r   r   ´  s    zAuditableBytesIO.__init__c                 C   s   | j  |¡ d S r   )rm  r_  )r   r   r   r   r   r^   ·  s    zAuditableBytesIO.writec                 C   s   d  | j¡S )Nr”   )r+   rm  r(   r   r   r   ÚgetDataº  s    zAuditableBytesIO.getDatac                 C   s
   t | jƒS r   )r   rm  r(   r   r   r   Ú	numWrites½  s    zAuditableBytesIO.numWritesN)r   r   r   r   r^   rn  Úpropertyro  r   r   r   r   rl  ²  s
   rl  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/d0„ Zd1S )2Ú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 r   )rc  Úhandlerr(   r   r   r   r5   Ê  s    z$BaseHTTPRequestHandlerTestCase.setUpc                 C   s:   t |ƒ}t ƒ }|| j_|| j_| j ¡  | d¡ | ¡ S ©Nr   )r
   rr  Úrfiler]   Úhandle_one_requestÚseekÚ	readlines)r   r  ÚinputÚoutputr   r   r   Úsend_typical_requestÍ  s    

z3BaseHTTPRequestHandlerTestCase.send_typical_requestc                 C   s   |   | jj¡ d S r   )r‹   rr  rh  r(   r   r   r   Úverify_get_calledÖ  s    z0BaseHTTPRequestHandlerTestCase.verify_get_calledc                    s,   dD ]"‰ |   t‡ fdd„|D ƒƒd¡ qd S )N)s   Server: s   Date: s   Content-Type: c                 3   s   | ]}|  ˆ ¡V  qd S r   )rý   )Ú.0Úh©Z	fieldNamer   r   Ú	<genexpr>Û  r”   zIBaseHTTPRequestHandlerTestCase.verify_expected_headers.<locals>.<genexpr>ra   )rl   Úsum)r   rA   r   r~  r   Úverify_expected_headersÙ  s    z6BaseHTTPRequestHandlerTestCase.verify_expected_headersc                 C   s   | j  |¡}|  |¡ d S r   )ÚHTTPResponseMatchÚsearchrÖ   )r   rÒ   Úmatchr   r   r   Úverify_http_server_responseÝ  s    z:BaseHTTPRequestHandlerTestCase.verify_http_server_responsec                 C   sà   d| j _tj}tj tdtƒ ¡D}|| j dƒ || j dƒ || j ddƒ || j ddƒ W d   ƒ n1 sj0    Y  | 	¡ }|  
d|¡ |  
d	|¡ | ¡ }|  d|d
 ¡ |  d|d ¡ |  d|d ¡ |  d|d ¡ d S )N)ú	127.0.0.1i9  Ústderrz/fooz/bar z	/spam %s.rB  u   ÂŸÂ beansúú r   z/\x1bbar\x00\x1bra   z/spam a.é   u   /spam \x1b\x7f\x9fÂ beans.é   )rr  Zclient_addressr   r   r	   ÚpatchÚobjectrå   r   r¤   ZassertNotInÚ
splitlinesrž   )r   r   Zfake_stderrr‡  r«   r   r   r   Útest_unprintable_not_loggedá  s    ,z:BaseHTTPRequestHandlerTestCase.test_unprintable_not_loggedc                 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 )Nó   GET / HTTP/1.1

r   ra   éÿÿÿÿri  úGET / HTTP/1.1r8   rk   rC   r   ©rz  r…  r  r{  rl   rr  ÚrequestlineÚcommandrd   Úrequest_versionÚassertSequenceEqualrA   rD  ©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   ra   r‘  ri  úGET / HTTP/1.0r8   rk   úHTTP/1.0r   r“  r˜  r   r   r   Útest_http_1_0   s    
z,BaseHTTPRequestHandlerTestCase.test_http_1_0c                 C   s6   |   d¡}|  t|ƒd¡ |  |d d¡ |  ¡  d S )Ns   GET / HTTP/0.9

ra   r   ri  )rz  rl   r   r{  r˜  r   r   r   Útest_http_0_9  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 ra   ó   
)rz  r‹   rý   r  Úindexrü   rr  rh  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   ra   r‘  ri  r›  r8   rk   rœ  ©)ZExpectz100-continuer“  ©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 )Nó(   GET / HTTP/1.1
Expect: 100-continue

r   s   HTTP/1.1 100 Continue
ra   rŸ  rŠ  s   HTTP/1.1 200 OK
r‘  ri  r’  r8   rk   rC   r¢  )rz  rl   r  r{  rr  r”  r•  rd   r–  r—  rA   rD  r£  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 )Nr  rC   r   é¢  rŠ  )r
   rl  rc  rt  r]   r–  r”  r•  rR   rl   ro  ©r   rx  ry  rr  r   r   r   Ú#test_header_buffering_of_send_error8  s    
zBBaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_errorc                 C   sX   t dƒ}tƒ }tƒ }||_||_d|_| d¡ |  |jd¡ | 	¡  |  |jd¡ d S )Nr  rC   r§  r   ra   )
r
   rl  rc  rt  r]   r–  Zsend_response_onlyrl   ro  rL   r¨  r   r   r   Ú+test_header_buffering_of_send_response_onlyF  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 )	Nr  rC   ZFooÚfooÚbarr   s   Foo: foo
bar: bar

ra   )r
   rl  rc  rt  r]   r–  rK   rl   ro  rL   rn  r¨  r   r   r   Ú$test_header_buffering_of_send_headerT  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 rs  )Útellrv  r   )rñ   Úposr   r   r   r   Ú_readAndReseekf  s
    

z[BaseHTTPRequestHandlerTestCase.test_header_unbuffered_when_continue.<locals>._readAndReseekr¥  rC   r”   rŸ  r   s   HTTP/1.1 100 Continuera   rŠ  s   HTTP/1.1 200 OK)	r
   rr  rt  r]   r–  ru  ZassertNotEqualrª   rl   )r   r°  rx  ry  r™  r   r   r   Ú$test_header_unbuffered_when_continued  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 )Nr¥  r   s!   HTTP/1.1 417 Expectation Failed
ra   r‘  c                 s   s   | ]}|d kV  qdS )s   Connection: close
Nr   )r|  Úrr   r   r   r  ƒ  r”   zMBaseHTTPRequestHandlerTestCase.test_with_continue_rejected.<locals>.<genexpr>)rr  rj  rz  rl   r  rü   rh  r€  )r   Zusual_handlerr™  r   r   r   Útest_with_continue_rejectedz  s    
"z:BaseHTTPRequestHandlerTestCase.test_with_continue_rejectedc                 C   sD   |   ddd  ¡}|  |d d¡ |  | jj¡ |  | jjt¡ d S )Ns   GET ó   xé  r   s#   HTTP/1.1 414 Request-URI Too Long
)rz  rl   rü   rr  rh  ZassertIsInstancer”  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ó   rrµ  s   

r   s   HTTP/1.1 431 Line too long
r’  ©rz  rl   rü   rr  rh  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
r’  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>Frâ   r"  )rz  r+   rž   rí   rî   r\   )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 r   )Únextrr  Zclose_connectionr   ©Zclose_valuesr   r   r   ru  §  s    zPBaseHTTPRequestHandlerTestCase.test_close_connection.<locals>.handle_one_request)T)FFT)rr  ru  ÚiterÚhandlerI  ÚStopIterationr½  )r   ru  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Úgmtimerr  ZweekdaynameZ	monthnamerl   Zdate_time_string)r   ZnowZyearZmonthZdayZhhZmmÚssZwdÚyÚzrJ  r   r   r   Útest_date_time_string³  s    

üz4BaseHTTPRequestHandlerTestCase.test_date_time_stringN)r   r   r   Ú__doc__ÚreÚcompiler‚  r5   rz  r{  r  r…  r  rš  r  rž  r¡  r¤  r¦  r©  rª  r­  r±  r³  r¶  r¹  rº  r¼  rÂ  rÈ  r   r   r   r   rq  Â  s2   
	
rq  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 j t  ¡ d¡| _t j dd¡| _t j dd¡| _tƒ | _tdd| _	tt
 d¡d| _d S )Nrð   r«  r¬  rd  )r/   rd   r+   r´   Útranslated_1Útranslated_2Útranslated_3rc  Ú	handler_1Ú	handler_2ÚpathlibÚPurePathÚ	handler_3r(   r   r   r   r5   Â  s    z&SimpleHTTPRequestHandlerTestCase.setUpc                 C   sî   | j  d¡}|  || j¡ | j d¡}|  || j¡ | j d¡}|  || j¡ | j  d¡}|  || j¡ | j d¡}|  || j¡ | j d¡}|  || j¡ | j  d¡}|  || j¡ | j d¡}|  || j¡ | j d¡}|  || j¡ d S )Nz	/filenamez/filename?foo=barz/filename?a=b&spam=eggs#zot©rÐ  Útranslate_pathrl   rÍ  rÑ  rÎ  rÔ  rÏ  ©r   rd   r   r   r   Útest_query_argumentsÊ  s$    z5SimpleHTTPRequestHandlerTestCase.test_query_argumentsc                 C   s    | j  d¡}|  || j¡ | j d¡}|  || j¡ | j d¡}|  || j¡ | j  d¡}|  || j¡ | j d¡}|  || j¡ | j d¡}|  || j¡ d S )Nz
//filenamez//filename?foo=barrÕ  r×  r   r   r   Útest_start_with_double_slashà  s    z=SimpleHTTPRequestHandlerTestCase.test_start_with_double_slashc                 C   s0  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
¡ | 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¡ | 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   ƒ n1 s"0    Y  d S )Nrd   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Ð  rÖ  rÄ   Úseprl   rÍ  rÑ  rÎ  rÔ  rÏ  r×  r   r   r   Útest_windows_colonï  sJ    z3SimpleHTTPRequestHandlerTestCase.test_windows_colonN)r   r   r   rÉ  r5   rØ  rÙ  rÜ  r   r   r   r   rÌ  À  s
   rÌ  c                   @   s   e Zd Zdd„ ZdS )ÚMiscTestCasec                 C   sd   g }h d£}t tƒD ]<}| d¡s||v r,qtt|ƒ}t|dd ƒdkr| |¡ q|  tj|¡ d S )N>   Z
nobody_uidr4  r°   Ú_r   zhttp.server)r¯   r   rý   Úgetattrr_  ZassertCountEqualÚ__all__)r   rJ  Z	blacklistrò   Zmodule_objectr   r   r   Útest_all  s    
zMiscTestCase.test_allN)r   r   r   rá  r   r   r   r   rÝ    s   rÝ  c                   @   sd   e Zd Zdd„ Ze d¡dd„ ƒZe d¡dd„ ƒZdZd	Z	e d¡d
d„ ƒZ
e d¡dd„ ƒZdS )ÚScriptTestCasec                 C   s0   t jt jt jt jt jdd„ dddddS )Nc                   S   s   dS )N)r   r   r   r   r   r   r   Ú<lambda>/  r”   z2ScriptTestCase.mock_server_class.<locals>.<lambda>)r#   )r"   )rg  )r3  )r	   Z	MagicMockr(   r   r   r   Úmock_server_class)  s    ÿÿÿÿÿz ScriptTestCase.mock_server_classzbuiltins.printc                 C   s0   |   ¡ }tj|d d |  |jtjtjf¡ d S ©N©ZServerClassÚbind©rä  r   r°   rž   Úaddress_familyr"   ÚAF_INET6ÚAF_INET©r   rÞ  Úmock_serverr   r   r   Útest_server_test_unspec6  s    
þz&ScriptTestCase.test_server_test_unspecc                 C   s0   |   ¡ }tj|dd |  |jtjtjf¡ d S )Nr!   ræ  rè  rì  r   r   r   Útest_server_test_localhost?  s    
þz)ScriptTestCase.test_server_test_localhost)z::z'2001:0db8:85a3:0000:0000:8a2e:0370:7334z::1)z0.0.0.0z8.8.8.8r†  c                 C   s6   | j D ]*}|  ¡ }tj||d |  |jtj¡ qd S rå  )Ú
ipv6_addrsrä  r   r°   rl   ré  r"   rê  ©r   rÞ  rç  rí  r   r   r   Útest_server_test_ipv6T  s    
z$ScriptTestCase.test_server_test_ipv6c                 C   s6   | j D ]*}|  ¡ }tj||d |  |jtj¡ qd S rå  )Ú
ipv4_addrsrä  r   r°   rl   ré  r"   rë  rñ  r   r   r   Útest_server_test_ipv4[  s    
z$ScriptTestCase.test_server_test_ipv4N)r   r   r   rä  r	   rŒ  rî  rï  rð  ró  rò  rô  r   r   r   r   râ  '  s   


râ  c                   C   s   t  tjt ¡ ¡ d S r   )r  ZaddModuleCleanupr/   r¸   r´   r   r   r   r   ÚsetUpModulec  s    rõ  Ú__main__)?rÉ  Úcollectionsr   Zhttp.serverr   r   r   r   r9   r   r   r/   r"   rå   rÊ  rV  rÚ  rÒ  rÍ   Zemail.messagerÆ   Zemail.utilsrí   Zhttp.clientÚurllib.parserë   r¶   rÃ  rÂ   r   r  r	   Úior
   r   r°   r   r   r   r   ZTestCaser-   rB   r    r­   r6  r7  r8  r:  r  Úhasattrr  r!  rc  rj  rl  rq  rÌ  rÝ  râ  rõ  r   Úmainr   r   r   r   Ú<module>   sl   	 P$  "
ÿ ~   Z<
