o
    HXîhtÜ  ã                   @   sF  	 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# d dl$m%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Z0dZ1dZ2e 3e4e
dƒoÌe
 5¡ d kd¡G dd„ de+ƒƒZ6G dd„ deƒZ7G d d!„ d!e7ƒZ8G d"d#„ d#ƒZ9G d$d%„ d%ej*ƒZ:G d&d'„ d'ej*ƒZ;G d(d)„ d)ej*ƒZ<G d*d+„ d+ej*ƒZ=d,d-„ Z>e?d.kr!e @¡  dS dS )/é    )ÚOrderedDict)ÚBaseHTTPRequestHandlerÚ
HTTPServerÚSimpleHTTPRequestHandlerÚCGIHTTPRequestHandler)ÚserverÚ
HTTPStatusN)Úmock)ÚBytesIOÚStringIO)Úsupport)Ú	os_helper)Úthreading_helperc                   @   s   e Zd Zdd„ Zddd„ZdS )ÚNoLogRequestHandlerc                 G   ó   d S ©N© )ÚselfÚargsr   r   ú?/opt/python-3.10.19/usr/lib/python3.10/test/test_httpservers.pyÚlog_message&   s   zNoLogRequestHandler.log_messageNc                 C   ó   dS ©NÚ r   )r   Únr   r   r   Úread*   ó   zNoLogRequestHandler.readr   )Ú__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   sb   t d| jƒ| _| jj ¡ \| j_| j_| jj 	¡  d | _z| j 
d¡ W | j ¡  d S | j ¡  w )N)Ú	localhostr   gš™™™™™©?)r   r$   r   ÚsocketÚgetsocknamer%   ÚHOSTÚPORTÚserver_startedÚsetZserve_foreverZserver_close©r   r   r   r   Úrun4   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.   r1   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Ú_threadsr   ZEnvironmentVarGuardÚosÚenvironr!   ÚEventr+   r    r$   ÚthreadÚstartÚwaitr-   r   r   r   ÚsetUpD   s   



zBaseTestCase.setUpc                 C   s*   | j  ¡  d | _ tj ¡  tj| jŽ  d S r   )r7   r1   r4   r5   Ú__exit__r   Zthreading_cleanupr3   r-   r   r   r   ÚtearDownL   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   rB   R   s   
zBaseTestCase.request)r   r   r   r:   r<   rB   r   r   r   r   r2   C   s    r2   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   ó0   |   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]   ó   z.BaseHTTPServerTestCase.request_handler.do_TESTc                 C   rI   )NrJ   rK   rL   ú
keep-aliverN   r-   r   r   r   Údo_KEEPc   rT   z.BaseHTTPServerTestCase.request_handler.do_KEEPc                 C   s   |   d¡ d S )Néç  ©Ú
send_errorr-   r   r   r   Údo_KEYERRORi   s   z2BaseHTTPServerTestCase.request_handler.do_KEYERRORc                 C   s   |   tj¡ d S r   ©rY   r   Ú	NOT_FOUNDr-   r   r   r   Údo_NOTFOUNDl   ó   z2BaseHTTPServerTestCase.request_handler.do_NOTFOUNDc                 C   s   |   ddd¡ d S )NrW   zShort MessagezThis is a long 
 explanationrX   r-   r   r   r   Údo_EXPLAINERRORo   s   ÿz6BaseHTTPServerTestCase.request_handler.do_EXPLAINERRORc                 C   s.   |   d¡ |  dd¡ |  dd¡ |  ¡  d S )NrW   rJ   rK   rL   rM   )rO   rQ   rR   r-   r   r   r   Ú	do_CUSTOMs   s   
z0BaseHTTPServerTestCase.request_handler.do_CUSTOMc                 C   sJ   |   d¡ |  dd¡ |  dd¡ |  ¡  | jd  d¡}| j |¡ d S )NrW   ú	X-Specialõ   DÃ¤ngerous MindrL   rM   zx-special-incomingúutf-8)rO   rQ   rR   rF   ÚencodeÚwfileÚwrite)r   rE   r   r   r   Údo_LATINONEHEADERy   s   
z8BaseHTTPServerTestCase.request_handler.do_LATINONEHEADERc                 C   ó   |   t| jdd … ƒ¡ d S ©Né   ©rY   ÚintÚpathr-   r   r   r   Údo_SEND_ERROR   ó   z4BaseHTTPServerTestCase.request_handler.do_SEND_ERRORc                 C   rh   ri   rk   r-   r   r   r   Údo_HEAD„   ro   z.BaseHTTPServerTestCase.request_handler.do_HEADN)r   r   r   Úprotocol_versionÚdefault_request_versionrS   rV   rZ   r]   r_   r`   rg   rn   rp   r   r   r   r   r$   Y   s    r$   c                 C   s,   t  | ¡ tj | j| j¡| _| j ¡  d S r   )	r2   r:   r>   r?   r@   r)   r*   ÚconÚconnectr-   r   r   r   r:   ‡   s   
zBaseHTTPServerTestCase.setUpc                 C   ó,   | j  dd¡ | j  ¡ }|  |jtj¡ d S )Nr=   ú/)rs   rB   rC   ÚassertEqualÚstatusr   ÚNOT_IMPLEMENTED©r   Úresr   r   r   Útest_commandŒ   ó   
z#BaseHTTPServerTestCase.test_commandc                 C   ó>   d| j _| j  dd¡ | j  ¡  | j  ¡ }|  |jtj¡ d S )Nz	HTTP/1.1
ZXYZBOGUSrv   ©	rs   Ú_http_vsn_strÚ
putrequestÚ
endheadersrC   rw   rx   r   ry   rz   r   r   r   Útest_request_line_trimming‘   ó
   

z1BaseHTTPServerTestCase.test_request_line_trimmingc                 C   r~   )NZFUBARr=   rv   ©	rs   r€   r   r‚   rC   rw   rx   r   ZBAD_REQUESTrz   r   r   r   Útest_version_bogus˜   r„   z)BaseHTTPServerTestCase.test_version_bogusc                 C   r~   )Nz
HTTP/9.9.9r=   rv   r…   rz   r   r   r   Útest_version_digitsŸ   r„   z*BaseHTTPServerTestCase.test_version_digitsc                 C   r~   )Nr   r=   rv   r   rz   r   r   r   Útest_version_none_get¦   r„   z,BaseHTTPServerTestCase.test_version_none_getc                 C   r~   )Nr   ÚCUSTOMrv   r…   rz   r   r   r   Útest_version_none­   s
   

z(BaseHTTPServerTestCase.test_version_nonec                 C   sF   d| j _d| j _| j  dd¡ | j  ¡  | j  ¡ }|  |jtj	¡ d S )Néc   zHTTP/9.9r=   rv   )
rs   Z	_http_vsnr€   r   r‚   rC   rw   rx   r   ZHTTP_VERSION_NOT_SUPPORTEDrz   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   r…   rz   r   r   r   Útest_send_blank½   r„   z&BaseHTTPServerTestCase.test_send_blankc                 C   sD   | j  dd¡ | j  dd¡ | j  ¡  | j  ¡ }|  |jtj¡ d S )Nr=   rv   rL   rM   )	rs   r   Ú	putheaderr‚   rC   rw   rx   r   ry   rz   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 )NrH   r=   rv   rL   rU   )
rs   r€   r   rŽ   r‚   rC   rw   rx   r   ry   rz   r   r   r   Útest_header_keep_aliveË   s   

z-BaseHTTPServerTestCase.test_header_keep_alivec                 C   ru   )NÚTESTrv   )rs   rB   rC   rw   rx   r   rP   rz   r   r   r   Útest_handlerÓ   r}   z#BaseHTTPServerTestCase.test_handlerc                 C   sJ   | j  dd¡ | j  ¡ }|  | d¡d¡ | j  dd¡ |  | j j¡ d S )NZKEEPrv   rL   rU   r‘   )rs   rB   rC   rw   Ú	getheaderZ
addCleanuprM   rz   r   r   r   Útest_return_header_keep_aliveØ   s
   
z4BaseHTTPServerTestCase.test_return_header_keep_alivec                 C   ó*   | j  dd¡ | j  ¡ }|  |jd¡ d S )NZKEYERRORrv   rW   ©rs   rB   rC   rw   rx   rz   r   r   r   Útest_internal_key_errorß   ó   
z.BaseHTTPServerTestCase.test_internal_key_errorc                 C   r•   )Nr‰   rv   rW   r–   rz   r   r   r   Útest_return_custom_statusä   r˜   z0BaseHTTPServerTestCase.test_return_custom_statusc                 C   s>   | j  dd¡ | j  ¡ }|  |jd¡ |  t| d¡ƒ¡ d S )NZEXPLAINERRORrv   rW   úContent-Length)rs   rB   rC   rw   rx   Ú
assertTruerl   r“   rz   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LATINONEHEADERrv   zX-Special-Incomingu   Ã„rger mit Unicode©rF   ra   rb   rc   )rs   rB   rC   rw   r“   r   rd   rz   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NOTFOUNDrv   rš   )rs   rB   rC   rw   rx   r   r\   r   rl   r“   Úlen)r   r{   Ú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 ]A}| j dd |¡¡ | j 	¡ }|  
||j¡ |  
d | d¡¡ |  
d | d¡¡ ||vrI|  
d | d¡¡ | ¡ }|  
d|¡ qd S )NZ
SEND_ERRORú/{}rš   rJ   úTransfer-Encodingó    )r   ÚNOT_MODIFIEDÚRESET_CONTENTrP   Z
PROCESSINGÚSWITCHING_PROTOCOLSrs   rB   ÚformatrC   rw   rx   r“   r   ©r   Zallow_transfer_encoding_codesÚcoder{   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rE|  t| d¡ƒdk¡ |  d| d¡¡ n|  
d | d¡¡ |  
d | d¡¡ ||vrd|  
d | d¡¡ | ¡ }|  
d|¡ qd S )	NÚHEADr¢   rš   r   rK   rJ   r£   r¤   )r   r¥   r¦   ÚOKrP   r§   rs   rB   r¨   rC   rw   rx   r›   rl   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$   r:   r|   rƒ   r†   r‡   rˆ   rŠ   rŒ   r   r   r   r’   r”   r—   r™   rœ   rž   r¡   r«   r¯   r   r   r   r   rG   X   s,    .	rG   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_handlerrH   c                 C   s   |   tj¡ |  ¡  d S r   )rO   r   r­   rR   r-   r   r   r   Údo_GET,  s   z4RequestHandlerLoggingTestCase.request_handler.do_GETc                 C   s   |   tjd¡ d S )NzFile not foundr[   r-   r   r   r   Údo_ERROR0  ó   z6RequestHandlerLoggingTestCase.request_handler.do_ERRORN)r   r   r   rq   rr   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 s*w   Y  |  | ¡  d¡¡ d S )Nr=   rv   z"GET / HTTP/1.1" 200 -
)r>   r?   r@   r)   r*   rs   rt   r   Úcaptured_stderrrB   rC   r›   ÚgetvalueÚendswith)r   Úerrr   r   r   Útest_get3  s   

þÿz&RequestHandlerLoggingTestCase.test_getc                 C   s˜   t j | j| j¡| _| j ¡  t ¡ }| j 	dd¡ | j 
¡  W d   ƒ n1 s*w   Y  | ¡  d¡}|  |d  d¡¡ |  |d  d¡¡ d S )NÚERRORrv   Ú
r   z code 404, message File not foundrj   z"ERROR / HTTP/1.1" 404 -)r>   r?   r@   r)   r*   rs   rt   r   r´   rB   rC   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                   @   ó   e Zd ZdS )z(SimpleHTTPServerTestCase.request_handlerN©r   r   r   r   r   r   r   r$   L  ó    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 sMw   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!)Údirrv   ÚtestÚwbr   )ZmicrosecondT©Zusegmt) Úsuperr:   r4   ÚgetcwdÚcwdÚtempfileÚ
gettempdirÚchdirr    ÚmkdtempÚtempdirrm   ÚbasenameÚtempdir_nameÚbase_urlr0   Úopenrf   Ú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   r:   O  s*   



þÿÿzSimpleHTTPServerTestCase.setUpc                    sT   z#t  | j¡ zt | j¡ W n   Y W tƒ  ¡  d S W tƒ  ¡  d S tƒ  ¡  w r   )r4   rË   rÈ   ÚshutilÚrmtreerÍ   rÆ   r<   r-   rÞ   r   r   r<   d  s   üz!SimpleHTTPServerTestCase.tearDownNc                    s˜   ‡ ‡fdd„}d ‰ |ˆ_ ˆ ¡ }|  ˆ¡ |  ˆj|¡ |  ˆj¡ |r*|  ||¡ |  ˆjd¡ |  ˆj 	dd¡d¡ |  ˆ  d¡dd¡ ˆ  
¡  |S )	Nc                      s   	 ˆj ‰ d ˆ_ d S r   )Úfpr   ©ÚreaderÚresponser   r   Ú
close_conno  s   
zDSimpleHTTPServerTestCase.check_status_and_reason.<locals>.close_conné
   rL   rM   é   r¤   zConnection should be closed)Z_close_connr   r›   rw   rx   ÚassertIsNotNoneÚreasonÚversionÚmsgÚgetrM   )r   rå   rx   r    ræ   rE   r   rã   r   Úcheck_status_and_reasonn  s   
z0SimpleHTTPServerTestCase.check_status_and_reasonÚdarwinz2undecodable name cannot always be decoded on macOSÚwin32z+undecodable name cannot be decoded on win32z!need os_helper.TESTFN_UNDECODABLEc                 C   s  t  ¡ }t tj¡d }ttj | j	|¡dƒ}| 
tj¡ W d   ƒ n1 s(w   Y  |  | jd ¡}t jdkrKt | j	¡D ]
}|dkrJ|} n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Ä   rv   rï   rÃ   Úsurrogatepass)Úerrorsz	href="%s"Úsurrogateescapeú>%s<F©Úquote©r    )ÚsysÚgetfilesystemencodingr4   Úfsdecoder   ÚTESTFN_UNDECODABLErÑ   rm   r0   rÍ   rf   rB   rÐ   ÚplatformÚlistdirrî   r   r­   ÚurllibÚparserö   r®   rd   ÚhtmlÚescape)r   ÚencÚfilenameÚfrå   ÚnamerE   Z
quotednamer   r   r   Útest_undecodable_filename‡  s0   ÿ
þ

ÿ
ÿ

ÿ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=%bbz/\?x=\xef\xbf\xbd)rB   rÐ   r   ZassertRegexrd   ©r   rå   r   r   r   Útest_undecodable_parameter¤  s    z3SimpleHTTPServerTestCase.test_undecodable_parameterc           	      C   s4  	 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 )NZexisting_directoryz2/python.org/..%2f..%2f..%2f..%2f..%2f../%0a%0d/../z/existing_directoryrv   Ú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/)r4   Úmkdirrm   r0   rÍ   rÏ   rB   rî   r   ÚMOVED_PERMANENTLYr“   rw   Ú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¬  s4   





ÿ





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¡ t
 t
j | jdd¡¡ |   | jd ¡}|  |tj¡ d}tt
j | jd¡dƒ}| |¡ W d   ƒ n1 sÀw   Y  |   | jd ¡}|  |tj|¡ t
jdkrt
 ¡ dkrt
 | jd¡ z|   | jd ¡}|  |tj¡ W t
 | jd¡ d S t
 | jd¡ w d S d S )Nú/testr÷   ú/test/rv   rš   Ú0ú/?hi=2ú?hi=1r
  ú/?hi=1z/ThisDoesNotExistz/ThisDoesNotExist/Úspamz
index.htmlz/spam/s   Dummy index file
rÄ   Úposixr   ií  )rB   rÐ   rî   r   r­   r    r\   r  rw   r“   r4   Úmakedirsrm   r0   rÍ   rÑ   rÏ   rf   r  ÚgeteuidÚchmod)r   rå   r    r  r   r   r   r¸   Ý  sH   ÿ

ÿ"úz!SimpleHTTPServerTestCase.test_getc                 C   sT   | j | jd dd}|  |tj¡ |  | d¡tt| j	ƒƒ¡ |  | d¡d¡ d S )Nr  r¬   ©rD   zcontent-lengthzcontent-typezapplication/octet-stream)
rB   rÐ   rî   r   r­   rw   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 )NúIf-Modified-Sincer  r   rj   )ZhoursTrÅ   )rÙ   ÚmessageÚMessagerÜ   rB   rÐ   rî   r   r¥   rØ   rÕ   Ú	timedeltarÚ   Úformat_datetime)r   rF   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&  rB   rÐ   rî   r   r­   )r   ZdtZold_dtrF   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Ü   rB   rÐ   rî   r   r­   )r   rF   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 )Nrv   ZFOOr  ZcustomZGETs)rB   rî   r   ry   r  r   r   r   Útest_invalid_requests6  s   z.SimpleHTTPServerTestCase.test_invalid_requestsc                 C   sB   	 |   | jd ¡}| j|tj| jd |jd }|  || j¡ d S )Nr  r÷   zLast-modified)	rB   rÐ   rî   r   r­   r    rF   rw   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  rv   r  r  r
  r  )
rB   rÏ   rî   r   r­   r    r\   r  rw   r“   r  r   r   r   Útest_path_without_leading_slashH  s   ÿz8SimpleHTTPServerTestCase.test_path_without_leading_slashc              	   C   sº   d}t j | j|¡}z	t|dƒ ¡  W n ty!   t d| ¡‚w z|  	| j
d ¡}|  |tj¡}|j ¡ }W t  |¡ nt  |¡ w |  |¡ dtj|dd }|  | |¡|¡ d S )Nz<test&>.txtrÄ   z-Can not create file %s on current file systemrv   rô   Frõ   )r4   rm   r0   rÍ   rÑ   rM   ÚOSErrorÚunittestZSkipTestrB   rÐ   rî   r   r­   rF   Zget_content_charsetÚunlinkré   r   r  r®   rd   )r   r  Úfullpathrå   rE   r  Z	html_textr   r   r   Útest_html_escape_filenameX  s"   ÿÿ
z2SimpleHTTPServerTestCase.test_html_escape_filenamer   )r   r   r   r   r   r$   r:   r<   rî   r/  ÚskipIfrø   rü   Z
skipUnlessr   rû   r  r	  r  r¸   r!  r'  r(  r*  r+  r,  r-  r2  Ú__classcell__r   r   rÞ   r   r¾   K  s4    

ÿÿÿ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                   @   r¿   )z%CGIHTTPServerTestCase.request_handlerNrÀ   r   r   r   r   r$   ¢  rÁ   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 y¤   |  !¡  |  "d¡ Y nw tj 	| jd¡| _t#| jd	dd
}| $t%| j ¡ W d   ƒ n1 sÉw   Y  t &| jd¡ tj 	| j
d¡| _t#| jd	dd
}| $t%| j ¡ W d   ƒ n1 sùw   Y  t &| jd¡ tj 	| j
d¡| _t#| jd	dd
}| $t'| j ¡ W d   ƒ n	1 s*w   Y  t &| jd¡ tj 	| jd¡| _t#| jd	dd
}| $t%| j ¡ W d   ƒ n	1 s[w   Y  t &| jd¡ tj 	| j
d¡| _t#| jd	dd
}| $t(| jdf ¡ W d   ƒ n	1 sŽw   Y  t &| jd¡ tj 	| jd¡| _t#| jd	dd
}| $t%| j ¡ W d   ƒ n	1 s¿w   Y  t &| jd¡ tj 	| j
d¡| _)t#| j)d	dd
}| $t*| j ¡ W d   ƒ n	1 sðw   Y  t &| j)d¡ t +| j¡ d S )Nzcgi-binz	child-dirÚsubrÂ   Úpythonrc   z0Python executable path is not encodable to utf-8znocgi.pyÚw)Úencodingiÿ  zfile1.pyzfile2.pyzfile3.pyzfile4.pyZQUERY_STRINGzfile5.pyzfile6.py),r2   r:   r4   rÇ   rÈ   rÉ   rÌ   Ú
parent_dirrm   r0   Ú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	pythonexer   ZPythonSymlinkÚ	__enter__rø   Ú
executablerd   ÚUnicodeEncodeErrorr<   ZskipTestrÑ   rf   Ú	cgi_file1r  Ú	cgi_file2Ú	cgi_file4Ú
file6_pathÚ	cgi_file6rË   )r   râ   Zfile1Zfile2Zfile3Zfile4Zfile5Zfile6r   r   r   r:   §  s„   


þÿÿÿÿÿÿÿzCGIHTTPServerTestCase.setUpc              	   C   s  z|t  | j¡ | jr| j d d d ¡ | jrt  | j¡ | jr$t  | j¡ | jr-t  | j¡ | j	r6t  | j	¡ | j
r?t  | j
¡ | jrHt  | j¡ | jrQt  | j¡ t  | j¡ t  | j¡ t  | j¡ t  | j¡ t  | j¡ t  | j¡ W t | ¡ d S t | ¡ w r   )r4   rË   rÈ   rG  r;   rA  ÚremoverB  rC  rD  rE  rF  rN  Úrmdirr=  r<  r@  r?  r>  r;  r2   r<   r-   r   r   r   r<   ó  s2   zCGIHTTPServerTestCase.tearDownc                 C   sæ   i dd“dt “dt “dd“dd“dd“dd“d	d
“d
d
“dd“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 ])\}}t|tƒr^t|tƒr^|  |tj|¡ qGt |¡}| j	||d|||f d qGd S )Nr   r  z..z/.//..rv   z/\z//\z/.//úcgi-bin/file1.pyú/cgi-bin/file1.pyÚaz//az/az./az./C:/z/C:/z/a/bz/a/b/z/a/b/.z/a/b/dz/a/b/d/fz/a/b/fz/a/fz//f)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_pathrw   )r   Ztest_vectorsrm   ÚexpectedÚactualr   r   r   Útest_url_collapse_path  sv   ÿþýüûúùø	÷
öõôóòñðïäÿ
ÿÿúz,CGIHTTPServerTestCase.test_url_collapse_pathc                 C   s:   |   d¡}|  | ¡ | d¡|jfd| j dtjf¡ d S )NrS  úContent-typeó   Hello WorldrK   )rB   rw   r   r“   rx   Úlinesepr   r­   rz   r   r   r   Útest_headers_and_content9  s
   
þz.CGIHTTPServerTestCase.test_headers_and_contentc                 C   s   |   d¡}|  |jtj¡ d S )Nz)///////////nocgi.py/../cgi-bin/nothere.sh)rB   rw   rx   r   r\   rz   r   r   r   Útest_issue19435?  s   
z%CGIHTTPServerTestCase.test_issue19435c                 C   sF   t j ddddœ¡}ddi}|  dd||¡}|  | ¡ d	| j ¡ d S )
Nrj   r8  i@â )r  ZeggsZbaconr_  z!application/x-www-form-urlencodedz/cgi-bin/file2.pyZPOSTs   1, python, 123456)rþ   rÿ   Ú	urlencoderB   rw   r   ra  )r   ÚparamsrF   r{   r   r   r   Ú	test_postC  s   
ÿzCGIHTTPServerTestCase.test_postc                 C   s&   |   d¡}| ¡  |  |jtj¡ d S )Nz/cgi-bin/invalid)rB   r   rw   rx   r   r\   rz   r   r   r   Útest_invaliduriK  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:passrS  r=   r   r`  rK   r_  )
Úbase64Z	b64encoderB   rw   ra  r   r­   r   r“   rx   )r   rF   r{   r   r   r   Útest_authorizationP  s   ÿþz(CGIHTTPServerTestCase.test_authorizationc                 C   ó:   |   d¡}|  d| j dtjf| ¡ | d¡|jf¡ d S )NrR  r`  rK   r_  ©rB   rw   ra  r   r­   r   r“   rx   rz   r   r   r   Útest_no_leading_slashX  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_SOFTWARErS  r`  rK   r_  )
r4   r5   rB   rw   ra  r   r­   r   r“   rx   )r   Z	signaturer{   r   r   r   Útest_os_environ_is_not_altered_  s   

þz4CGIHTTPServerTestCase.test_os_environ_is_not_alteredc                 C   rj  )Nz/cgi-bin%2ffile1.pyr`  rK   r_  rk  rz   r   r   r   Ú#test_urlquote_decoding_in_cgi_checkh  ó
   
þz9CGIHTTPServerTestCase.test_urlquote_decoding_in_cgi_checkc                 C   rj  )Nz/cgi-bin/child-dir/file3.pyr`  rK   r_  rk  rz   r   r   r   Útest_nested_cgi_path_issue21323n  ro  z5CGIHTTPServerTestCase.test_nested_cgi_path_issue21323c                 C   rj  )Nz/cgi-bin/file4.py?a=b?c=ds   a=b?c=drK   r_  rk  rz   r   r   r   Ú&test_query_with_multiple_question_markt  ro  z<CGIHTTPServerTestCase.test_query_with_multiple_question_markc                 C   rj  )Nz0/cgi-bin/file4.py?k=aa%2F%2Fbb&//q//p//=//a//b//s   k=aa%2F%2Fbb&//q//p//=//a//b//rK   r_  rk  rz   r   r   r   Ú"test_query_with_continuous_slashesz  s   
ÿýz8CGIHTTPServerTestCase.test_query_with_continuous_slashesc              	   C   sd   z*t j d¡ |  d¡}|  d| j dtjf| ¡ | 	d¡|j
f¡ W t j d¡ d S t j d¡ w )Nz/sub/dir/cgi-binz/sub/dir/cgi-bin/file5.pyr`  rK   r_  )r   Zcgi_directoriesÚappendrB   rw   ra  r   r­   r   r“   rx   rP  rz   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 |ƒ}|  |¡) | jdd|d}|  tjj|j¡ d|›  d	¡}|  	|| 
¡ ¡ W d   ƒ n1 sGw   Y  qd S )
Nz?text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8ÚAccept)r   r   )))ru  rK   )ZACCEPTz
text/plainztext/html,text/plainz/cgi-bin/file6.pyr=   r   zHTTP_ACCEPT=r6  )r   ZsubTestrB   rw   r>   r   r­   rx   rd   r®   r   )r   Zbrowser_acceptZtestsrF   r\  r{   r   r   r   Útest_accept‹  s    ÿüü€þz!CGIHTTPServerTestCase.test_acceptN)r   r   r   r   r   r$   r4   ra  rd   r:   r<   r^  rb  rc  rf  rg  ri  rl  rm  rn  rp  rq  rr  rt  rv  r   r   r   r   r5  Ÿ  s&    L*	
r5  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©Ú	directoryFrH   )	r	   ZMockr
   ÚmakefileÚreturn_valuerÆ   r#   Ú
get_calledrq   )r   ry  rB   rÞ   r   r   r#   Ÿ  s
   

z!SocketlessRequestHandler.__init__c                 C   s6   d| _ |  tj¡ |  dd¡ |  ¡  | j d¡ d S )NTrJ   rK   ó    <html><body>Data</body></html>
)r|  rO   r   r­   rQ   rR   re   rf   r-   r   r   r   r±   §  s
   zSocketlessRequestHandler.do_GETc                 G   r   r   r   )r   r¨   r   r   r   r   r   ®  r   z$SocketlessRequestHandler.log_messager   )r   r   r   r#   r±   r   r4  r   r   rÞ   r   rw  ž  s    rw  c                   @   ó   e Zd Zdd„ ZdS )Ú!RejectingSocketlessRequestHandlerc                 C   s   |   tj¡ dS )NF)rY   r   ZEXPECTATION_FAILEDr-   r   r   r   Úhandle_expect_100²  s   z3RejectingSocketlessRequestHandler.handle_expect_100N)r   r   r   r€  r   r   r   r   r  ±  ó    r  c                   @   s0   e Zd Zdd„ Zdd„ Zdd„ Zedd„ ƒZd	S )
ÚAuditableBytesIOc                 C   s
   g | _ d S r   )Údatasr-   r   r   r   r#   ¹  s   
zAuditableBytesIO.__init__c                 C   s   | j  |¡ d S r   )rƒ  rs  )r   r    r   r   r   rf   ¼  r^   zAuditableBytesIO.writec                 C   s   d  | j¡S )Nr¤   )r0   rƒ  r-   r   r   r   ÚgetData¿  ó   zAuditableBytesIO.getDatac                 C   s
   t | jƒS r   )rŸ   rƒ  r-   r   r   r   Ú	numWritesÂ  s   
zAuditableBytesIO.numWritesN)r   r   r   r#   rf   r„  Úpropertyr†  r   r   r   r   r‚  ·  s    r‚  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.d/„ Zd0S )1ÚBaseHTTPRequestHandlerTestCases   HTTP/1.[0-9]+ 200 OKc                 C   s   t ƒ | _d S r   )rw  Úhandlerr-   r   r   r   r:   Ï  r…  z$BaseHTTPRequestHandlerTestCase.setUpc                 C   s:   t |ƒ}t ƒ }|| j_|| j_| j ¡  | d¡ | ¡ S ©Nr   )r
   r‰  Úrfilere   Ú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›   r‰  r|  r-   r   r   r   Úverify_get_calledÛ  r³   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>à  s   € zIBaseHTTPRequestHandlerTestCase.verify_expected_headers.<locals>.<genexpr>rj   )rw   Úsum)r   rF   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ƒ ¡(}|| j dƒ || j dƒ || j ddƒ || j ddƒ || j dƒ W d   ƒ n1 s;w   Y  | 	¡ }|  
d	|¡ |  
d
|¡ | ¡ }|  d|d ¡ |  d|d ¡ |  d|d ¡ |  d|d ¡ |  d|d ¡ d S )N)ú	127.0.0.1i9  Ústderrz/fooz/bar z	/spam %s.rT  u   ÂŸÂ beansz"GET /foo\b"ar HTTP/1.0"úú r   z/\x1bbar\x00\x1brj   z/spam a.é   u   /spam \x1b\x7f\x9fÂ beans.é   z"GET /foo\\b"ar\x07 HTTP/1.0"é   )r‰  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   óš   |   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   rj   éÿÿÿÿr}  úGET / HTTP/1.1r=   rv   rH   r   ©r‘  rœ  r˜  r’  rw   r‰  ÚrequestlineÚcommandrm   Úrequest_versionÚassertSequenceEqualrF   rV  ©r   Úresultr   r   r   Útest_http_1_1û  ó   
z,BaseHTTPRequestHandlerTestCase.test_http_1_1c                 C   r¨  )Ns   GET / HTTP/1.0

r   rj   rª  r}  úGET / HTTP/1.0r=   rv   úHTTP/1.0r   r¬  r±  r   r   r   Útest_http_1_0  r´  z,BaseHTTPRequestHandlerTestCase.test_http_1_0c                 C   s6   |   d¡}|  t|ƒd¡ |  |d d¡ |  ¡  d S )Ns   GET / HTTP/0.9

rj   r   r}  )r‘  rw   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 rj   ó   
)r‘  r›   r  r˜  Úindexr  r‰  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   rj   rª  r}  rµ  r=   rv   r¶  ©)ZExpectz100-continuer¬  ©r   r²  rF   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
rj   r¹  r¡  s   HTTP/1.1 200 OK
rª  r}  r«  r=   rv   rH   r¼  )r‘  rw   r˜  r’  r‰  r­  r®  rm   r¯  r°  rF   rV  r½  r   r   r   Útest_with_continue_1_10  s   
z5BaseHTTPRequestHandlerTestCase.test_with_continue_1_1c                 C   sN   t dƒ}tƒ }tƒ }||_||_d|_d|_d |_| d¡ |  	|j
d¡ d S )Nr©  rH   r   é¢  r¡  )r
   r‚  rw  r‹  re   r¯  r­  r®  rY   rw   r†  ©r   r  r  r‰  r   r   r   Ú#test_header_buffering_of_send_error?  s   
zBBaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_errorc                 C   sX   t dƒ}tƒ }tƒ }||_||_d|_| d¡ |  |jd¡ | 	¡  |  |jd¡ d S )Nr©  rH   rÁ  r   rj   )
r
   r‚  rw  r‹  re   r¯  Zsend_response_onlyrw   r†  rR   rÂ  r   r   r   Ú+test_header_buffering_of_send_response_onlyM  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©  rH   ZFooÚfooÚbarr   s   Foo: foo
bar: bar

rj   )r
   r‚  rw  r‹  re   r¯  rQ   rw   r†  rR   r„  rÂ  r   r   r   Ú$test_header_buffering_of_send_header[  s   zCBaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_headerc                 C   sŠ   dd„ }t dƒ}t ƒ }|| j_|| j_d| j_| j ¡  |  ||ƒd¡ ||ƒ d¡}|  |d d¡ |  |d	 d¡ |  |d
 d¡ d S )Nc                 S   s(   |   ¡ }|  d¡ |  ¡ }|  |¡ |S rŠ  )Útellr  r   )r  Úposr    r   r   r   Ú_readAndReseekm  s
   

z[BaseHTTPRequestHandlerTestCase.test_header_unbuffered_when_continue.<locals>._readAndReseekr¿  rH   r¤   r¹  r   s   HTTP/1.1 100 Continuerj   r¡  s   HTTP/1.1 200 OK)	r
   r‰  r‹  re   r¯  rŒ  ZassertNotEqualr»   rw   )r   rÊ  r  r  r²  r   r   r   Ú$test_header_unbuffered_when_continuek  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
rj   rª  c                 s   s    | ]}|d kV  qdS )s   Connection: close
Nr   )r“  Úrr   r   r   r–  Š  s   € zMBaseHTTPRequestHandlerTestCase.test_with_continue_rejected.<locals>.<genexpr>)r‰  r  r‘  rw   r˜  r  r|  r—  )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
)r‘  rw   r  r‰  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«  ©r‘  rw   r  r‰  r|  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õ   r6  )r‘  r0   r®   r   r  rd   )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   )Únextr‰  Zclose_connectionr   ©Zclose_valuesr   r   r   rŒ  ®  r^   zPBaseHTTPRequestHandlerTestCase.test_close_connection.<locals>.handle_one_request)T)FFT)r‰  rŒ  ÚiterÚhandler[  ÚStopIterationr×  )r   rŒ  r   rØ  r   Útest_close_connection«  s   

z4BaseHTTPRequestHandlerTestCase.test_close_connectionc              	   C   sd   t   ¡ }t  |¡\	}}}}}}}}	}
d| jj| || jj| ||||f }|  | jj|d|¡ d S )Nz#%s, %02d %3s %4d %02d:%02d:%02d GMT)rÛ   )ÚtimeÚgmtimer‰  ZweekdaynameZ	monthnamerw   Zdate_time_string)r   ZnowZyearZmonthZdayZhhZmmÚssZwdÚyÚzr\  r   r   r   Útest_date_time_stringº  s   

üz4BaseHTTPRequestHandlerTestCase.test_date_time_stringN)r   r   r   ÚreÚcompiler™  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   r   r   rˆ  Ç  s4    
	
rˆ  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Æ  rx  )r4   rm   r0   rÇ   Útranslated_1Útranslated_2Útranslated_3rw  Ú	handler_1Ú	handler_2ÚpathlibÚPurePathÚ	handler_3r-   r   r   r   r:   É  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_pathrw   ræ  rê  rç  rí  rè  ©r   rm   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   s2  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   ƒ d S 1 sw   Y  d S )Nrm   zc:c:c:foo/filenamez\c:../filenamezc:\c:..\foo/filenamezc:c:foo\c:c:bar/filename)r   Z	swap_attrr   r4   Úntpathré  rï  r×   Úseprw   ræ  rê  rç  rí  rè  rð  r   r   r   Útest_windows_colonö  sL   $Ùz3SimpleHTTPRequestHandlerTestCase.test_windows_colonN)r   r   r   r:   rñ  rò  rõ  r   r   r   r   rå  Ç  s    rå  c                   @   r~  )Ú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>   rI  Z
nobody_uidrÃ   Ú_r   zhttp.server)rÂ   r   r  Úgetattrrs  ZassertCountEqualÚ__all__)r   r\  Zdenylistr  Zmodule_objectr   r   r   Útest_all"  s   

€zMiscTestCase.test_allN)r   r   r   rú  r   r   r   r   rö  !  r  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   r   )N)r   r   r   r   r   r   r   Ú<lambda>6  s    z2ScriptTestCase.mock_server_class.<locals>.<lambda>)r(   )r'   )r{  )rH  )r	   Z	MagicMockr-   r   r   r   Úmock_server_class0  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=  ó   
þ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_localhostF  r  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   ó6   | j D ]}|  ¡ }tj||d |  |jtj¡ qd S rþ  )Ú
ipv6_addrsrý  r   rÃ   rw   r  r'   r  ©r   r÷  r   r  r   r   r   Útest_server_test_ipv6[  ó
   
ýz$ScriptTestCase.test_server_test_ipv6c                 C   r
  rþ  )Ú
ipv4_addrsrý  r   rÃ   rw   r  r'   r  r  r   r   r   Útest_server_test_ipv4b  r  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addModuleCleanupr4   rË   rÇ   r   r   r   r   ÚsetUpModulej  s   r  Ú__main__)AÚcollectionsr   Zhttp.serverr   r   r   r   r>   r   r   r4   r'   rø   rã  rh  ró  rë  rà   Zemail.messagerÙ   Zemail.utilsr   Zhttp.clientÚurllib.parserþ   rÉ   rÝ  rÕ   r!   r/  r	   Úior
   r   rÃ   r   Ztest.supportr   r   r   r"   r    ZTestCaser2   rG   r°   r¾   rK  rL  rM  rO  r3  Úhasattrr  r5  rw  r  r‚  rˆ  rå  rö  rû  r  r   Úmainr   r   r   r   Ú<module>   st    	 P$  %
ÿ ~  Z<
ÿ