a
    ¼3j»É  ã                   @   s&  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  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Z.e /e0e
dƒo|e
 1¡ d kd¡G dd„ de'ƒƒZ2G dd„ deƒZ3G dd„ de3ƒZ4G d d!„ d!ƒZ5G d"d#„ d#ej&ƒZ6G d$d%„ d%ej&ƒZ7G d&d'„ d'ej&ƒZ8G d(d)„ d)ej&ƒZ9d*d+„ Z:e;d,kr"e <¡  dS )-é    )ÚOrderedDict)Ú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   úQ/www/server/python_manager/versions/3.9.10/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   )r1   r+   r.   r/   Ú__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   r4   r6   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 )NrC   rD   rE   ú
keep-aliverG   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   ©rQ   r   Ú	NOT_FOUNDr'   r   r   r   Údo_NOTFOUNDj   s    z2BaseHTTPServerTestCase.request_handler.do_NOTFOUNDc                 C   s   |   ddd¡ d S )NrO   zShort MessagezThis is a long 
 explanationrP   r'   r   r   r   Údo_EXPLAINERRORm   s    ÿz6BaseHTTPServerTestCase.request_handler.do_EXPLAINERRORc                 C   s.   |   d¡ |  dd¡ |  dd¡ |  ¡  d S )NrO   rC   rD   rE   rF   )rH   rJ   rK   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 )NrO   ú	X-Specialõ   DÃ¤ngerous MindrE   rF   zx-special-incomingúutf-8)rH   rJ   rK   r@   Ú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é   ©rQ   ÚintÚpathr'   r   r   r   Údo_SEND_ERROR   s    z4BaseHTTPServerTestCase.request_handler.do_SEND_ERRORc                 C   s   |   t| jdd … ƒ¡ d S r_   ra   r'   r   r   r   Údo_HEAD‚   s    z.BaseHTTPServerTestCase.request_handler.do_HEADN)r   r   r   Úprotocol_versionÚdefault_request_versionrL   rN   rR   rU   rV   rW   r^   rd   re   r   r   r   r   r   W   s   r   c                 C   s,   t  | ¡ tj | j| j¡| _| j ¡  d S r   )	r,   r4   r8   r9   r:   r#   r$   ÚconÚconnectr'   r   r   r   r4   …   s    
zBaseHTTPServerTestCase.setUpc                 C   s,   | j  dd¡ | j  ¡ }|  |jtj¡ d S )Nr7   ú/)rh   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XYZBOGUSrj   ©	rh   Ú_http_vsn_strÚ
putrequestÚ
endheadersr=   rk   rl   r   rm   rn   r   r   r   Útest_request_line_trimming   s
    

z1BaseHTTPServerTestCase.test_request_line_trimmingc                 C   s>   d| j _| j  dd¡ | j  ¡  | j  ¡ }|  |jtj¡ d S )NZFUBARr7   rj   ©	rh   rr   rs   rt   r=   rk   rl   r   ZBAD_REQUESTrn   r   r   r   Útest_version_bogus–   s
    

z)BaseHTTPServerTestCase.test_version_bogusc                 C   s>   d| j _| j  dd¡ | j  ¡  | j  ¡ }|  |jtj¡ d S )Nz
HTTP/9.9.9r7   rj   rv   rn   r   r   r   Útest_version_digits   s
    

z*BaseHTTPServerTestCase.test_version_digitsc                 C   s>   d| j _| j  dd¡ | j  ¡  | j  ¡ }|  |jtj¡ d S )Nr   r7   rj   rq   rn   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   ÚCUSTOMrj   rv   rn   r   r   r   Útest_version_none«   s
    

z(BaseHTTPServerTestCase.test_version_nonec                 C   sF   d| j _d| j _| j  dd¡ | j  ¡  | j  ¡ }|  |jtj	¡ d S )Néc   zHTTP/9.9r7   rj   )
rh   Z	_http_vsnrr   rs   rt   r=   rk   rl   r   ZHTTP_VERSION_NOT_SUPPORTEDrn   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   rv   rn   r   r   r   Útest_send_blank»   s
    

z&BaseHTTPServerTestCase.test_send_blankc                 C   sD   | j  dd¡ | j  dd¡ | j  ¡  | j  ¡ }|  |jtj¡ d S )Nr7   rj   rE   rF   )	rh   rs   Ú	putheaderrt   r=   rk   rl   r   rm   rn   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 )NrB   r7   rj   rE   rM   )
rh   rr   rs   r   rt   r=   rk   rl   r   rm   rn   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ÚTESTrj   )rh   r<   r=   rk   rl   r   rI   rn   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KEEPrj   rE   rM   r‚   )rh   r<   r=   rk   Ú	getheaderZ
addCleanuprF   rn   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KEYERRORrj   rO   ©rh   r<   r=   rk   rl   rn   r   r   r   Útest_internal_key_errorÝ   s    
z.BaseHTTPServerTestCase.test_internal_key_errorc                 C   s*   | j  dd¡ | j  ¡ }|  |jd¡ d S )Nrz   rj   rO   r†   rn   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EXPLAINERRORrj   rO   úContent-Length)rh   r<   r=   rk   rl   Ú
assertTruerb   r„   rn   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LATINONEHEADERrj   zX-Special-Incomingu   Ã„rger mit Unicode©r@   rX   rY   rZ   )rh   r<   r=   rk   r„   r   r[   rn   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NOTFOUNDrj   r‰   )rh   r<   r=   rk   rl   r   rT   r   rb   r„   Úlen)r   ro   Ú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‰   rC   úTransfer-Encodingó    )r   ÚNOT_MODIFIEDÚRESET_CONTENTrI   Z
PROCESSINGÚSWITCHING_PROTOCOLSrh   r<   Úformatr=   rk   rl   r„   r   ©r   Zallow_transfer_encoding_codesÚcodero   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   rD   rC   r’   r“   )r   r”   r•   ÚOKrI   r–   rh   r<   r—   r=   rk   rl   rŠ   rb   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   r4   rp   ru   rw   rx   ry   r{   r}   r~   r€   r   rƒ   r…   r‡   rˆ   r‹   r   r   rš   rž   r   r   r   r   rA   V   s*   .	rA   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_handlerrB   c                 C   s   |   tj¡ |  ¡  d S r   )rH   r   rœ   rK   r'   r   r   r   Údo_GET*  s    z4RequestHandlerLoggingTestCase.request_handler.do_GETc                 C   s   |   tjd¡ d S )NzFile not foundrS   r'   r   r   r   Údo_ERROR.  s    z6RequestHandlerLoggingTestCase.request_handler.do_ERRORN)r   r   r   rf   rg   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 )Nr7   rj   z"GET / HTTP/1.1" 200 -
)r8   r9   r:   r#   r$   rh   ri   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ÚERRORrj   Ú
r   z code 404, message File not foundr`   z"ERROR / HTTP/1.1" 404 -)r8   r9   r:   r#   r$   rh   ri   r   r¢   r<   r=   r£   ÚsplitrŠ   r¤   )r   r¥   Úlinesr   r   r   Útest_err<  s    

(z&RequestHandlerLoggingTestCase.test_errN)r   r   r   r   r   r¦   r«   r   r   r   r   rŸ   %  s   rŸ   c                   @   sº   e Zd ZG dd„ deeƒZdd„ Zdd„ Zd#dd	„Ze	 
ejd
kd¡e	 
ejdkd¡e	 ejd¡dd„ ƒƒƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ ZdS )$ÚSimpleHTTPServerTestCasec                   @   s   e Zd ZdS )z(SimpleHTTPServerTestCase.request_handlerN©r   r   r   r   r   r   r   r   J  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   ƒ 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!)Údirrj   ÚtestÚwbr   )ZmicrosecondT©Zusegmt) r,   r4   r.   ÚgetcwdÚcwdÚtempfileÚ
gettempdirÚchdirr   ÚmkdtempÚtempdirrc   Ú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_modifr   r   r   r4   M  s(    


&ÿÿzSimpleHTTPServerTestCase.setUpc              	   C   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,   r6   r'   r   r   r   r6   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 r   )Úfpr   ©ÚreaderÚresponser   r   Ú
close_connm  s    zDSimpleHTTPServerTestCase.check_status_and_reason.<locals>.close_conné
   rE   rF   é   r“   zConnection should be closed)Z_close_connr   rŠ   rk   rl   ÚassertIsNotNoneÚreasonÚversionÚmsgÚgetrF   )r   rÎ   rl   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°   rj   rØ   r¯   Úsurrogatepass)Úerrorsz	href="%s"Úsurrogateescapeú>%s<F©Úquote©r   )ÚsysÚgetfilesystemencodingr.   Úfsdecoder   ÚTESTFN_UNDECODABLEr¼   rc   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   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/rj   r‰   Ú0ú/?hi=2ú?hi=1ÚLocationú/?hi=1z/ThisDoesNotExistz/ThisDoesNotExist/s   Dummy index file
z
index.htmlr°   Úposixr   ií  )r<   r»   r×   r   rœ   r   rT   ÚMOVED_PERMANENTLYrk   r„   r¼   r.   rc   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œ   rk   r„   ÚstrrŽ   r   ©r   rÎ   r   r   r   Ú	test_headÉ  s    
ÿÿÿz"SimpleHTTPServerTestCase.test_headc                 C   sŒ   t j ¡ }| j|d< | j| jd |d}|  |tj¡ | j	t
jdd }t j ¡ }t jj|dd|d< | j| jd |d}|  |tj¡ d S )NúIf-Modified-Sincerð   rŒ   r`   )ZhoursTr±   )rÄ   ÚmessageÚMessagerÇ   r<   r»   r×   r   r”   rÃ   rÀ   Ú	timedeltarÅ   Úformat_datetime)r   r@   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_dtr@   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   r@   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 )Nrj   ZFOOrû   ZcustomZGETs)r<   r×   r   rm   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 )Nrð   rà   zLast-modified)	r<   r»   r×   r   rœ   r   r@   rk   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ñ   rj   ró   rô   rõ   rö   )
r<   rº   r×   r   rœ   r   rT   rø   rk   r„   rý   r   r   r   Útest_path_without_leading_slash
  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 systemrj   rÝ   FrÞ   )r.   rc   r*   r¸   r¼   rF   ÚOSErrorÚunittestZSkipTestr<   r»   r×   r   rœ   r@   Zget_content_charsetÚunlinkrÒ   ré   rê   r   r[   )r   rì   ÚfullpathrÎ   r?   rë   Z	html_textr   r   r   Útest_html_escape_filename  s     ÿ
z2SimpleHTTPServerTestCase.test_html_escape_filename)N)r   r   r   r   r   r   r4   r6   r×   r  ÚskipIfrá   rå   Z
skipUnlessr   rä   rï   r¦   rþ   r  r  r  r  r	  r
  r  r   r   r   r   r¬   I  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"])
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   d  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®   ÚpythonrZ   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,   r4   r.   r²   r³   r´   r·   Ú
parent_dirrc   r*   Úcgi_dirÚcgi_child_dirÚ	sub_dir_1Ú	sub_dir_2Úcgi_dir_in_sub_dirÚmkdirÚ
nocgi_pathÚ
file1_pathÚ
file2_pathÚ
file3_pathÚ
file4_pathÚ
file5_pathÚ_pythonexe_symlinkr   Zcan_symlinkZ	pythonexeZPythonSymlinkÚ	__enter__rá   Ú
executabler[   ÚUnicodeEncodeErrorr6   ZskipTestr¼   r]   Ú	cgi_file1rú   Ú	cgi_file2Ú	cgi_file4Ú
file6_pathÚ	cgi_file6r¶   )r   rË   Zfile1Zfile2Zfile3Zfile4Zfile5Zfile6r   r   r   r4   i  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³   r$  r5   r  Úremover  r   r!  r"  r#  r+  Úrmdirr  r  r  r  r  r  r,   r6   r'   r   r   r   r6   µ  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 )Nú//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/.//..rj   r/  z/\z/.//úcgi-bin/file1.pyr0  Úaz/ar1  z./az./C:/r2  r3  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_pathrk   )r   Ztest_vectorsrc   Ú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 )Nr0  úContent-typeó   Hello WorldrD   )r<   rk   r   r„   rl   Úlinesepr   rœ   rn   r   r   r   Útest_headers_and_contentû  s
    
þz.CGIHTTPServerTestCase.test_headers_and_contentc                 C   s   |   d¡}|  |jtj¡ d S )Nz)///////////nocgi.py/../cgi-bin/nothere.sh)r<   rk   rl   r   rT   rn   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 )
Nr`   r  i@â )ZspamZeggsZbaconr@  z!application/x-www-form-urlencodedz/cgi-bin/file2.pyZPOSTs   1, python, 123456)rç   rè   Ú	urlencoder<   rk   r   rB  )r   Úparamsr@   ro   r   r   r   Ú	test_post  s    
ÿzCGIHTTPServerTestCase.test_postc                 C   s&   |   d¡}| ¡  |  |jtj¡ d S )Nz/cgi-bin/invalid)r<   r   rk   rl   r   rT   rn   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:passr0  r7   rŒ   rA  rD   r@  )
Úbase64Z	b64encoder<   rk   rB  r   rœ   r   r„   rl   )r   r@   ro   r   r   r   Útest_authorization  s    ÿþz(CGIHTTPServerTestCase.test_authorizationc                 C   s:   |   d¡}|  d| j dtjf| ¡ | d¡|jf¡ d S )Nr4  rA  rD   r@  ©r<   rk   rB  r   rœ   r   r„   rl   rn   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_SOFTWAREr0  rA  rD   r@  )
r.   r/   r<   rk   rB  r   rœ   r   r„   rl   )r   Z	signaturero   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.pyrA  rD   r@  rK  rn   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.pyrA  rD   r@  rK  rn   r   r   r   Útest_nested_cgi_path_issue213230  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=drD   r@  rK  rn   r   r   r   Ú&test_query_with_multiple_question_mark6  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//rD   r@  rK  rn   r   r   r   Ú"test_query_with_continuous_slashes<  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.pyrA  rD   r@  )r   Zcgi_directoriesÚappendr<   rk   rB  r   rœ   r   r„   rl   r-  rn   r   r   r   Ú test_cgi_path_in_sub_directoriesC  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   )))rT  rD   )ZACCEPTz
text/plainztext/html,text/plainz/cgi-bin/file6.pyr7   rŒ   zHTTP_ACCEPT=r  )r   ZsubTestr<   rk   r8   r   rœ   rl   r[   r   r   )r   Zbrowser_acceptZtestsr@   r=  ro   r   r   r   Útest_acceptM  s    ÿüz!CGIHTTPServerTestCase.test_acceptN)r   r   r   r   r   r   r.   rB  r[   r4   r6   r?  rC  rD  rG  rH  rJ  rL  rM  rN  rO  rP  rQ  rS  rU  r   r   r   r   r  a  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©Ú	directoryFrB   )	r	   ZMockr
   ÚmakefileÚreturn_valueÚsuperr   Ú
get_calledrf   )r   rX  r<   ©Ú	__class__r   r   r   a  s
    
z!SocketlessRequestHandler.__init__c                 C   s6   d| _ |  tj¡ |  dd¡ |  ¡  | j d¡ d S )NTrC   rD   ó    <html><body>Data</body></html>
)r\  rH   r   rœ   rJ   rK   r\   r]   r'   r   r   r   r    i  s
    zSocketlessRequestHandler.do_GETc                 G   s   d S r   r   )r   r—   r   r   r   r   r   p  s    z$SocketlessRequestHandler.log_message)N)r   r   r   r   r    r   Ú__classcell__r   r   r]  r   rV  `  s   rV  c                   @   s   e Zd Zdd„ ZdS )Ú!RejectingSocketlessRequestHandlerc                 C   s   |   tj¡ dS )NF)rQ   r   ZEXPECTATION_FAILEDr'   r   r   r   Úhandle_expect_100t  s    z3RejectingSocketlessRequestHandler.handle_expect_100N)r   r   r   rb  r   r   r   r   ra  s  s   ra  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   )rd  rR  )r   r   r   r   r   r]   ~  s    zAuditableBytesIO.writec                 C   s   d  | j¡S )Nr“   )r*   rd  r'   r   r   r   ÚgetData  s    zAuditableBytesIO.getDatac                 C   s
   t | jƒS r   )rŽ   rd  r'   r   r   r   Ú	numWrites„  s    zAuditableBytesIO.numWritesN)r   r   r   r   r]   re  Úpropertyrf  r   r   r   r   rc  y  s
   rc  c                   @   sÆ   e 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 )/ÚBaseHTTPRequestHandlerTestCases   HTTP/1.[0-9]+ 200 OKc                 C   s   t ƒ | _d S r   )rV  Úhandlerr'   r   r   r   r4   ‘  s    z$BaseHTTPRequestHandlerTestCase.setUpc                 C   s:   t |ƒ}t ƒ }|| j_|| j_| j ¡  | d¡ | ¡ S ©Nr   )r
   ri  Ú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Š   ri  r\  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   )Ú
startswith)Ú.0Úh©Z	fieldNamer   r   Ú	<genexpr>¢  r“   zIBaseHTTPRequestHandlerTestCase.verify_expected_headers.<locals>.<genexpr>r`   )rk   Úsum)r   r@   r   rv  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¡}|  |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   r`   éÿÿÿÿr_  úGET / HTTP/1.1r7   rj   rB   r   ©rq  r}  ry  rr  rk   ri  ÚrequestlineÚcommandrc   Úrequest_versionÚassertSequenceEqualr@   r7  ©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   r`   r  r_  úGET / HTTP/1.0r7   rj   ú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

r`   r   r_  )rq  rk   rŽ   rr  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 r`   ó   
)rq  rŠ   rs  ry  ÚindexÚassertFalseri  r\  r†  r   r   r   Útest_extra_spaceÆ  s    ÿz/BaseHTTPRequestHandlerTestCase.test_extra_spacec                 C   sž   |   d¡}|  |d ¡ |  |dd… ¡ |  ¡  |  |d d¡ |  | jjd¡ |  | jjd¡ |  | jjd¡ |  | jj	d	¡ d
}|  
| jj ¡ |¡ d S )Ns(   GET / HTTP/1.0
Expect: 100-continue

r   r`   r  r_  r‰  r7   rj   rŠ  ©)ZExpectz100-continuer  ©r   r‡  r@   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
r`   r  é   s   HTTP/1.1 200 OK
r  r_  r€  r7   rj   rB   r‘  )rq  rk   ry  rr  ri  r‚  rƒ  rc   r„  r…  r@   r7  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~  rB   r   é¢  r•  )r
   rc  rV  rk  r\   r„  r‚  rƒ  rQ   rk   rf  ©r   ro  rp  ri  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 )Nr~  rB   r—  r   r`   )
r
   rc  rV  rk  r\   r„  Zsend_response_onlyrk   rf  rK   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 )	Nr~  rB   ZFooÚfooÚbarr   s   Foo: foo
bar: bar

r`   )r
   rc  rV  rk  r\   r„  rJ   rk   rf  rK   re  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 rj  )Útellrm  r   )rí   Úposr   r   r   r   Ú_readAndReseek  s
    

z[BaseHTTPRequestHandlerTestCase.test_header_unbuffered_when_continue.<locals>._readAndReseekr”  rB   r“   r  r   s   HTTP/1.1 100 Continuer`   r•  s   HTTP/1.1 200 OK)	r
   ri  rk  r\   r„  rl  ZassertNotEqualr©   rk   )r   r   ro  rp  r‡  r   r   r   Ú$test_header_unbuffered_when_continue  s    
zCBaseHTTPRequestHandlerTestCase.test_header_unbuffered_when_continuec                 C   st   | j }tƒ | _ |  d¡}|  |d d¡ |  |dd… ¡ |  | j j¡ |  tdd„ |dd… D ƒƒd¡ || _ d S )Nr”  r   s!   HTTP/1.1 417 Expectation Failed
r`   r  c                 s   s   | ]}|d kV  qdS )s   Connection: close
Nr   )rt  Úrr   r   r   rw  7  r“   zMBaseHTTPRequestHandlerTestCase.test_with_continue_rejected.<locals>.<genexpr>)ri  ra  rq  rk   ry  r  r\  rx  )r   Zusual_handlerr‡  r   r   r   Útest_with_continue_rejected.  s    
"z:BaseHTTPRequestHandlerTestCase.test_with_continue_rejectedc                 C   sD   |   ddd  ¡}|  |d d¡ |  | jj¡ |  | jjt¡ d S )Ns   GET ó   xé  r   s#   HTTP/1.1 414 Request-URI Too Long
)rq  rk   r  ri  r\  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€  ©rq  rk   r  ri  r\  r‚  r†  r   r   r   Útest_header_lengthB  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_headersJ  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  )rq  r*   r   ré   rê   r[   )r   r‡  Útextr   r   r   Útest_html_escape_on_errorQ  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   )Únextri  Zclose_connectionr   ©Zclose_valuesr   r   r   rl  [  s    zPBaseHTTPRequestHandlerTestCase.test_close_connection.<locals>.handle_one_request)T)FFT)ri  rl  ÚiterÚhandler<  ÚStopIterationr­  )r   rl  r   r®  r   Útest_close_connectionX  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Úgmtimeri  ZweekdaynameZ	monthnamerk   Zdate_time_string)r   ZnowZyearZmonthZdayZhhZmmÚssZwdÚyÚzr=  r   r   r   Útest_date_time_stringg  s    

üz4BaseHTTPRequestHandlerTestCase.test_date_time_stringN)r   r   r   ÚreÚcompilerz  r4   rq  rr  ry  r}  rˆ  r‹  rŒ  r  r“  r–  r™  rš  r  r¡  r£  r¦  r©  rª  r¬  r²  r¸  r   r   r   r   rh  ‰  s.   
	
rh  c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
Ú SimpleHTTPRequestHandlerTestCasec                 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œ  rW  )r.   rc   r*   r²   Útranslated_1Útranslated_2Útranslated_3rV  Ú	handler_1Ú	handler_2ÚpathlibÚPurePathÚ	handler_3r'   r   r   r   r4   v  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_pathrk   r¼  rÀ  r½  rÃ  r¾  ©r   rc   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 )Nrc   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Â   Úseprk   r¼  rÀ  r½  rÃ  r¾  rÆ  r   r   r   Útest_windows_colon£  sJ    z3SimpleHTTPRequestHandlerTestCase.test_windows_colonN)r   r   r   r4   rÇ  rÈ  rË  r   r   r   r   r»  t  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>   r&  r¯   Z
nobody_uidÚ_r   zhttp.server)r®   r   rs  ÚgetattrrR  ZassertCountEqualÚ__all__)r   r=  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!   )rZ  )r%  )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_unspecê  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.8z	127.0.0.1c                 C   s6   | j D ]*}|  ¡ }tj||d |  |jtj¡ qd S rÔ  )Ú
ipv6_addrsrÓ  r   r¯   rk   rØ  r!   rÙ  ©r   rÍ  rÖ  rÜ  r   r   r   Útest_server_test_ipv6  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¯   rk   rØ  r!   rÚ  rà  r   r   r   Útest_server_test_ipv4  s    
z$ScriptTestCase.test_server_test_ipv4N)r   r   r   rÓ  r	   ZpatchrÝ  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   ÚsetUpModule  s    rä  Ú__main__)=Úcollectionsr   Zhttp.serverr   r   r   r   r8   r   r   r.   r!   rá   r¹  rI  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   ZTestCaser,   rA   rŸ   r¬   r(  r)  r*  r,  r  Úhasattrrù   r  rV  ra  rc  rh  r»  rÌ  rÑ  rä  r   Úmainr   r   r   r   Ú<module>   sf   	 P$ h
ÿ ~ lZ<
