o
    °ó®gšË  ã                   @   sB  	 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" 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Z/dZ0dZ1e 2e3e
dƒoÊe
 4¡ d kd¡G dd„ de*ƒƒZ5G dd„ deƒZ6G d d!„ d!e6ƒZ7G d"d#„ d#ƒZ8G d$d%„ d%ej)ƒZ9G d&d'„ d'ej)ƒZ:G d(d)„ d)ej)ƒZ;G d*d+„ d+ej)ƒZ<d/d,d-„Z=e>d.kre=ƒ  dS dS )0é    )ÚOrderedDict)ÚBaseHTTPRequestHandlerÚ
HTTPServerÚSimpleHTTPRequestHandlerÚCGIHTTPRequestHandler)ÚserverÚ
HTTPStatusN)Úmock)ÚBytesIO)Ú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   úK/Users/admin/.pyenv/versions/3.10.0/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-   r0   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   )r6   r0   r3   r4   Ú__exit__r   Zthreading_cleanupr2   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   rA   R   s   
zBaseTestCase.request)r   r   r   r9   r;   rA   r   r   r   r   r1   C   s    r1   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   rH   )NrI   rJ   rK   ú
keep-aliverM   r,   r   r   r   Údo_KEEPc   rS   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   ©rX   r   Ú	NOT_FOUNDr,   r   r   r   Údo_NOTFOUNDl   ó   z2BaseHTTPServerTestCase.request_handler.do_NOTFOUNDc                 C   s   |   ddd¡ d S )NrV   zShort MessagezThis is a long 
 explanationrW   r,   r   r   r   Údo_EXPLAINERRORo   s   ÿz6BaseHTTPServerTestCase.request_handler.do_EXPLAINERRORc                 C   s.   |   d¡ |  dd¡ |  dd¡ |  ¡  d S )NrV   rI   rJ   rK   rL   )rN   rP   rQ   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 )NrV   ú	X-Specialõ   DÃ¤ngerous MindrK   rL   zx-special-incomingúutf-8)rN   rP   rQ   rE   ÚencodeÚwfileÚwrite)r   rD   r   r   r   Údo_LATINONEHEADERy   s   
z8BaseHTTPServerTestCase.request_handler.do_LATINONEHEADERc                 C   ó   |   t| jdd … ƒ¡ d S ©Né   ©rX   ÚintÚpathr,   r   r   r   Údo_SEND_ERROR   ó   z4BaseHTTPServerTestCase.request_handler.do_SEND_ERRORc                 C   rg   rh   rj   r,   r   r   r   Údo_HEAD„   rn   z.BaseHTTPServerTestCase.request_handler.do_HEADN)r   r   r   Úprotocol_versionÚdefault_request_versionrR   rU   rY   r\   r^   r_   rf   rm   ro   r   r   r   r   r#   Y   s    r#   c                 C   s,   t  | ¡ tj | j| j¡| _| j ¡  d S r   )	r1   r9   r=   r>   r?   r(   r)   ÚconÚconnectr,   r   r   r   r9   ‡   s   
zBaseHTTPServerTestCase.setUpc                 C   ó,   | j  dd¡ | j  ¡ }|  |jtj¡ d S )Nr<   ú/)rr   rA   rB   Ú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XYZBOGUSru   ©	rr   Ú_http_vsn_strÚ
putrequestÚ
endheadersrB   rv   rw   r   rx   ry   r   r   r   Útest_request_line_trimming‘   ó
   

z1BaseHTTPServerTestCase.test_request_line_trimmingc                 C   r}   )NZFUBARr<   ru   ©	rr   r   r€   r   rB   rv   rw   r   ZBAD_REQUESTry   r   r   r   Útest_version_bogus˜   rƒ   z)BaseHTTPServerTestCase.test_version_bogusc                 C   r}   )Nz
HTTP/9.9.9r<   ru   r„   ry   r   r   r   Útest_version_digitsŸ   rƒ   z*BaseHTTPServerTestCase.test_version_digitsc                 C   r}   )Nr   r<   ru   r~   ry   r   r   r   Útest_version_none_get¦   rƒ   z,BaseHTTPServerTestCase.test_version_none_getc                 C   r}   )Nr   ÚCUSTOMru   r„   ry   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<   ru   )
rr   Z	_http_vsnr   r€   r   rB   rv   rw   r   ZHTTP_VERSION_NOT_SUPPORTEDry   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„   ry   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<   ru   rK   rL   )	rr   r€   Ú	putheaderr   rB   rv   rw   r   rx   ry   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 )NrG   r<   ru   rK   rT   )
rr   r   r€   r   r   rB   rv   rw   r   rx   ry   r   r   r   Útest_header_keep_aliveË   s   

z-BaseHTTPServerTestCase.test_header_keep_alivec                 C   rt   )NÚTESTru   )rr   rA   rB   rv   rw   r   rO   ry   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KEEPru   rK   rT   r   )rr   rA   rB   rv   Ú	getheaderZ
addCleanuprL   ry   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KEYERRORru   rV   ©rr   rA   rB   rv   rw   ry   r   r   r   Útest_internal_key_errorß   ó   
z.BaseHTTPServerTestCase.test_internal_key_errorc                 C   r”   )Nrˆ   ru   rV   r•   ry   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EXPLAINERRORru   rV   úContent-Length)rr   rA   rB   rv   rw   Ú
assertTruerk   r’   ry   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LATINONEHEADERru   zX-Special-Incomingu   Ã„rger mit Unicode©rE   r`   ra   rb   )rr   rA   rB   rv   r’   r   rc   ry   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NOTFOUNDru   r™   )rr   rA   rB   rv   rw   r   r[   r   rk   r’   Úlen)r   rz   Ú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™   rI   úTransfer-Encodingó    )r   ÚNOT_MODIFIEDÚRESET_CONTENTrO   Z
PROCESSINGÚSWITCHING_PROTOCOLSrr   rA   ÚformatrB   rv   rw   r’   r   ©r   Zallow_transfer_encoding_codesÚcoderz   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   rJ   rI   r¢   r£   )r   r¤   r¥   ÚOKrO   r¦   rr   rA   r§   rB   rv   rw   rš   rk   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#   r9   r{   r‚   r…   r†   r‡   r‰   r‹   rŒ   rŽ   r   r‘   r“   r–   r˜   r›   r   r    rª   r®   r   r   r   r   rF   X   s,    .	rF   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_handlerrG   c                 C   s   |   tj¡ |  ¡  d S r   )rN   r   r¬   rQ   r,   r   r   r   Údo_GET,  s   z4RequestHandlerLoggingTestCase.request_handler.do_GETc                 C   s   |   tjd¡ d S )NzFile not foundrZ   r,   r   r   r   Údo_ERROR0  ó   z6RequestHandlerLoggingTestCase.request_handler.do_ERRORN)r   r   r   rp   rq   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<   ru   z"GET / HTTP/1.1" 200 -
)r=   r>   r?   r(   r)   rr   rs   r   Úcaptured_stderrrA   rB   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ÚERRORru   Ú
r   z code 404, message File not foundri   z"ERROR / HTTP/1.1" 404 -)r=   r>   r?   r(   r)   rr   rs   r   r³   rA   rB   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                   @   ó   e Zd ZdS )z(SimpleHTTPServerTestCase.request_handlerN©r   r   r   r   r   r   r   r#   L  ó    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 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!)Údirru   ÚtestÚwbr   )ZmicrosecondT©Zusegmt) r1   r9   r3   ÚgetcwdÚcwdÚtempfileÚ
gettempdirÚchdirrŸ   ÚmkdtempÚtempdirrl   ÚbasenameÚtempdir_nameÚbase_urlr/   Úopenre   Ú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   r9   O  s*   



þÿÿzSimpleHTTPServerTestCase.setUpc              	   C   sT   z#t  | j¡ zt | j¡ W n   Y W t | ¡ d S W t | ¡ d S t | ¡ w r   )r3   rÉ   rÆ   ÚshutilÚrmtreerË   r1   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é
   rK   rL   é   r£   zConnection should be closed)Z_close_connr   rš   rv   rw   ÚassertIsNotNoneÚreasonÚversionÚmsgÚgetrL   )r   rá   rw   rŸ   râ   rD   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|} qKq@|  |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Ã   ru   rë   rÂ   Úsurrogatepass)Úerrorsz	href="%s"Úsurrogateescapeú>%s<F©Úquote©rŸ   )ÚsysÚgetfilesystemencodingr3   Úfsdecoder   ÚTESTFN_UNDECODABLErÏ   rl   r/   rË   re   rA   rÎ   ÚplatformÚlistdirrê   r   r¬   ÚurllibÚparserò   r­   rc   ÚhtmlÚescape)r   ÚencÚfilenameÚfrá   ÚnamerD   Z
quotednamer   r   r   Útest_undecodable_filename‡  s0   ÿ
þ

ÿ
ÿ

ÿ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 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/ru   r™   Ú0ú/?hi=2ú?hi=1ÚLocationú/?hi=1z/ThisDoesNotExistz/ThisDoesNotExist/s   Dummy index file
z
index.htmlrÃ   Úposixr   ií  )rA   rÎ   rê   r   r¬   rŸ   r[   ÚMOVED_PERMANENTLYrv   r’   rÏ   r3   rl   r/   rÍ   re   r  ÚgeteuidÚchmodrË   )r   rá   rŸ   r   r   r   r   r·   ¤  sB   ÿ

ÿ"úz!SimpleHTTPServerTestCase.test_getc                 C   sT   | j | jd dd}|  |tj¡ |  | d¡tt| j	ƒƒ¡ |  | d¡d¡ d S )Nr  r«   ©rC   zcontent-lengthzcontent-typezapplication/octet-stream)
rA   rÎ   rê   r   r¬   rv   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œ   ri   )ZhoursTrÄ   )r×   ÚmessageÚMessagerÚ   rA   rÎ   rê   r   r¤   rÖ   rÓ   Ú	timedeltarØ   Úformat_datetime)r   rE   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  rA   rÎ   rê   r   r¬   )r   ZdtZold_dtrE   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Ú   rA   rÎ   rê   r   r¬   )r   rE   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 )Nru   ZFOOr  ZcustomZGETs)rA   rê   r   rx   r  r   r   r   Útest_invalid_requestsú  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)	rA   rÎ   rê   r   r¬   rŸ   rE   rv   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  ru   r  r  r  r	  )
rA   rÍ   rê   r   r¬   rŸ   r[   r  rv   r’   r  r   r   r   Útest_path_without_leading_slash  s   ÿz8SimpleHTTPServerTestCase.test_path_without_leading_slashc              	   C   sº   d}t j | j|¡}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 systemru   rð   Frñ   )r3   rl   r/   rË   rÏ   rL   ÚOSErrorÚunittestZSkipTestrA   rÎ   rê   r   r¬   rE   Zget_content_charsetÚunlinkrå   rü   rý   r­   rc   )r   rÿ   Úfullpathrá   rD   rþ   Z	html_textr   r   r   Útest_html_escape_filename  s"   ÿÿ
z2SimpleHTTPServerTestCase.test_html_escape_filenamer   )r   r   r   r   r   r#   r9   r;   rê   r  ÚskipIfrô   rø   Z
skipUnlessr   r÷   r  r·   r  r  r  r  r  r  r  r"  r   r   r   r   r½   K  s0    

ÿÿÿ'				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#   f  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Á   Úpythonrb   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),r1   r9   r3   rÅ   rÆ   rÇ   rÊ   Ú
parent_dirrl   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	pythonexer   ZPythonSymlinkÚ	__enter__rô   Ú
executablerc   ÚUnicodeEncodeErrorr;   ZskipTestrÏ   re   Ú	cgi_file1r  Ú	cgi_file2Ú	cgi_file4Ú
file6_pathÚ	cgi_file6rÉ   )r   rÞ   Zfile1Zfile2Zfile3Zfile4Zfile5Zfile6r   r   r   r9   k  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   )r3   rÉ   rÆ   r7  r:   r1  Úremover2  r3  r4  r5  r6  r>  Úrmdirr,  r+  r/  r.  r-  r*  r1   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   z//z..z/.//..ru   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: %r)rè   )
Ú
IndexErrorÚitemsÚ
isinstanceÚtypeÚ
issubclassÚ	ExceptionÚassertRaisesr   Z_url_collapse_pathrv   )r   Ztest_vectorsrl   Ú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 )NrC  úContent-typeó   Hello WorldrJ   )rA   rv   r   r’   rw   Úlinesepr   r¬   ry   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)rA   rv   rw   r   r[   ry   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 )
Nri   r'  i@â )ZspamZeggsZbaconrO  z!application/x-www-form-urlencodedz/cgi-bin/file2.pyZPOSTs   1, python, 123456)rú   rû   Ú	urlencoderA   rv   r   rQ  )r   ÚparamsrE   rz   r   r   r   Ú	test_post  s   
ÿzCGIHTTPServerTestCase.test_postc                 C   s&   |   d¡}| ¡  |  |jtj¡ d S )Nz/cgi-bin/invalid)rA   r   rv   rw   r   r[   ry   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:passrC  r<   rœ   rP  rJ   rO  )
Úbase64Z	b64encoderA   rv   rQ  r   r¬   r   r’   rw   )r   rE   rz   r   r   r   Útest_authorization  s   ÿþz(CGIHTTPServerTestCase.test_authorizationc                 C   ó:   |   d¡}|  d| j dtjf| ¡ | d¡|jf¡ d S )NrB  rP  rJ   rO  ©rA   rv   rQ  r   r¬   r   r’   rw   ry   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_SOFTWARErC  rP  rJ   rO  )
r3   r4   rA   rv   rQ  r   r¬   r   r’   rw   )r   Z	signaturerz   r   r   r   Útest_os_environ_is_not_altered#  s   

þz4CGIHTTPServerTestCase.test_os_environ_is_not_alteredc                 C   rZ  )Nz/cgi-bin%2ffile1.pyrP  rJ   rO  r[  ry   r   r   r   Ú#test_urlquote_decoding_in_cgi_check,  ó
   
þz9CGIHTTPServerTestCase.test_urlquote_decoding_in_cgi_checkc                 C   rZ  )Nz/cgi-bin/child-dir/file3.pyrP  rJ   rO  r[  ry   r   r   r   Útest_nested_cgi_path_issue213232  r_  z5CGIHTTPServerTestCase.test_nested_cgi_path_issue21323c                 C   rZ  )Nz/cgi-bin/file4.py?a=b?c=ds   a=b?c=drJ   rO  r[  ry   r   r   r   Ú&test_query_with_multiple_question_mark8  r_  z<CGIHTTPServerTestCase.test_query_with_multiple_question_markc                 C   rZ  )Nz0/cgi-bin/file4.py?k=aa%2F%2Fbb&//q//p//=//a//b//s   k=aa%2F%2Fbb&//q//p//=//a//b//rJ   rO  r[  ry   r   r   r   Ú"test_query_with_continuous_slashes>  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.pyrP  rJ   rO  )r   Zcgi_directoriesÚappendrA   rv   rQ  r   r¬   r   r’   rw   r@  ry   r   r   r   Ú test_cgi_path_in_sub_directoriesE  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   ƒ q1 sGw   Y  qd S )
Nz?text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8ÚAccept)r   r   )))re  rJ   )ZACCEPTz
text/plainztext/html,text/plainz/cgi-bin/file6.pyr<   rœ   zHTTP_ACCEPT=r%  )r   ZsubTestrA   rv   r=   r   r¬   rw   rc   r­   r   )r   Zbrowser_acceptZtestsrE   rL  rz   r   r   r   Útest_acceptO  s   ÿüüþz!CGIHTTPServerTestCase.test_acceptN)r   r   r   r   r   r#   r3   rQ  rc   r9   r;   rN  rR  rS  rV  rW  rY  r\  r]  r^  r`  ra  rb  rd  rf  r   r   r   r   r$  c  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©Ú	directoryFrG   )	r	   ZMockr
   ÚmakefileÚreturn_valueÚsuperr"   Ú
get_calledrp   )r   ri  rA   ©Ú	__class__r   r   r"   c  s
   

z!SocketlessRequestHandler.__init__c                 C   s6   d| _ |  tj¡ |  dd¡ |  ¡  | j d¡ d S )NTrI   rJ   ó    <html><body>Data</body></html>
)rm  rN   r   r¬   rP   rQ   rd   re   r,   r   r   r   r°   k  s
   zSocketlessRequestHandler.do_GETc                 G   r   r   r   )r   r§   r   r   r   r   r   r  r   z$SocketlessRequestHandler.log_messager   )r   r   r   r"   r°   r   Ú__classcell__r   r   rn  r   rg  b  s    rg  c                   @   ó   e Zd Zdd„ ZdS )Ú!RejectingSocketlessRequestHandlerc                 C   s   |   tj¡ dS )NF)rX   r   ZEXPECTATION_FAILEDr,   r   r   r   Úhandle_expect_100v  s   z3RejectingSocketlessRequestHandler.handle_expect_100N)r   r   r   rt  r   r   r   r   rs  u  ó    rs  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   )rw  rc  )r   rŸ   r   r   r   re   €  r]   zAuditableBytesIO.writec                 C   s   d  | j¡S )Nr£   )r/   rw  r,   r   r   r   ÚgetDataƒ  ó   zAuditableBytesIO.getDatac                 C   s
   t | jƒS r   )rž   rw  r,   r   r   r   Ú	numWrites†  s   
zAuditableBytesIO.numWritesN)r   r   r   r"   re   rx  Úpropertyrz  r   r   r   r   rv  {  s    rv  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   )rg  Úhandlerr,   r   r   r   r9   “  ry  z$BaseHTTPRequestHandlerTestCase.setUpc                 C   s:   t |ƒ}t ƒ }|| j_|| j_| j ¡  | d¡ | ¡ S ©Nr   )r
   r}  Úrfilerd   Ú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}  rm  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   )Ú
startswith)Ú.0Úh©Z	fieldNamer   r   Ú	<genexpr>¤  s   € zIBaseHTTPRequestHandlerTestCase.verify_expected_headers.<locals>.<genexpr>ri   )rv   Úsum)r   rE   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   óš   |   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   ri   éÿÿÿÿrp  úGET / HTTP/1.1r<   ru   rG   r   ©r…  r‘  r  r†  rv   r}  ÚrequestlineÚcommandrl   Úrequest_versionÚassertSequenceEqualrE   rF  ©r   Úresultr   r   r   Útest_http_1_1ª  ó   
z,BaseHTTPRequestHandlerTestCase.test_http_1_1c                 C   r’  )Ns   GET / HTTP/1.0

r   ri   r”  rp  úGET / HTTP/1.0r<   ru   ú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

ri   r   rp  )r…  rv   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 ri   ó   
)r…  rš   r‡  r  ÚindexÚassertFalser}  rm  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   ri   r”  rp  rŸ  r<   ru   r   ©)ZExpectz100-continuer–  ©r   rœ  rE   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
ri   r£  é   s   HTTP/1.1 200 OK
r”  rp  r•  r<   ru   rG   r§  )r…  rv   r  r†  r}  r—  r˜  rl   r™  rš  rE   rF  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“  rG   r   é¢  r«  )r
   rv  rg  r  rd   r™  r—  r˜  rX   rv   rz  ©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“  rG   r­  r   ri   )
r
   rv  rg  r  rd   r™  Zsend_response_onlyrv   rz  rQ   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“  rG   ZFooÚfooÚbarr   s   Foo: foo
bar: bar

ri   )r
   rv  rg  r  rd   r™  rP   rv   rz  rQ   rx  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   Ú_readAndReseek  s
   

z[BaseHTTPRequestHandlerTestCase.test_header_unbuffered_when_continue.<locals>._readAndReseekrª  rG   r£   r£  r   s   HTTP/1.1 100 Continueri   r«  s   HTTP/1.1 200 OK)	r
   r}  r  rd   r™  r€  ZassertNotEqualrº   rv   )r   r¶  rƒ  r„  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
ri   r”  c                 s   s    | ]}|d kV  qdS )s   Connection: close
Nr   )rˆ  Úrr   r   r   r‹  9  s   € zMBaseHTTPRequestHandlerTestCase.test_with_continue_rejected.<locals>.<genexpr>)r}  rs  r…  rv   r  r¥  rm  rŒ  )r   Zusual_handlerrœ  r   r   r   Útest_with_continue_rejected0  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…  rv   r¥  r}  rm  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…  rv   r¥  r}  rm  r—  r›  r   r   r   Útest_header_lengthD  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_headersL  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%  )r…  r/   r­   rü   rý   rc   )r   rœ  Útextr   r   r   Útest_html_escape_on_errorS  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ÚhandlerK  ÚStopIterationrÃ  )r   r€  r   rÄ  r   Útest_close_connectionZ  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	monthnamerv   Zdate_time_string)r   ZnowZyearZmonthZdayZhhZmmZssZwdÚyÚzrL  r   r   r   Útest_date_time_stringi  s   

üz4BaseHTTPRequestHandlerTestCase.test_date_time_stringN)r   r   r   ÚreÚcompilerŽ  r9   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|  ‹  s2    
	
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²  rh  )r3   rl   r/   rÅ   Útranslated_1Útranslated_2Útranslated_3rg  Ú	handler_1Ú	handler_2ÚpathlibÚPurePathÚ	handler_3r,   r   r   r   r9   x  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_pathrv   rÑ  rÕ  rÒ  rØ  rÓ  ©r   rl   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 )Nrl   zc:c:c:foo/filenamez\c:../filenamezc:\c:..\foo/filenamezc:c:foo\c:c:bar/filename)r   Z	swap_attrr   r3   ÚntpathrÔ  rÚ  rÕ   Úseprv   rÑ  rÕ  rÒ  rØ  rÓ  rÛ  r   r   r   Útest_windows_colon¥  sL   $Ùz3SimpleHTTPRequestHandlerTestCase.test_windows_colonN)r   r   r   r9   rÜ  rÝ  rà  r   r   r   r   rÐ  v  s    rÐ  c                   @   rr  )Ú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>   r9  Z
nobody_uidrÂ   Ú_r   zhttp.server)rÁ   r   r‡  Úgetattrrc  ZassertCountEqualÚ__all__)r   rL  Zdenylistr  Zmodule_objectr   r   r   Útest_allÑ  s   

€zMiscTestCase.test_allN)r   r   r   rå  r   r   r   r   rá  Ð  ru  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>å  s    z2ScriptTestCase.mock_server_class.<locals>.<lambda>)r'   )r&   )rk  )r8  )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ì  ó   
þ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õ  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.8z	127.0.0.1c                 C   ó6   | j D ]}|  ¡ }tj||d |  |jtj¡ qd S ré  )Ú
ipv6_addrsrè  r   rÂ   rv   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Â   rv   rí  r&   rï  r÷  r   r   r   Útest_server_test_ipv4  rù  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  ¡ }zt tttttt	t
t¡ W t  |¡ d S t  |¡ w r   )r3   rÅ   r   Zrun_unittestr¯   r|  rF   r½   r$  rÐ  rá  ræ  rÉ   )ÚverboserÆ   r   r   r   Ú	test_main  s   ørý  Ú__main__r   )?Úcollectionsr   Zhttp.serverr   r   r   r   r=   r   r   r3   r&   rô   rÎ  rX  rÞ  rÖ  rÜ   Zemail.messager×   Zemail.utilsrü   Zhttp.clientÚurllib.parserú   rÇ   rÉ  rÓ   r    r  r	   Úior
   rÂ   r   Ztest.supportr   r   r   r!   r   ZTestCaser1   rF   r¯   r½   r;  r<  r=  r?  r#  Úhasattrr  r$  rg  rs  rv  r|  rÐ  rá  ræ  rý  r   r   r   r   r   Ú<module>   sp    	 P$ h
ÿ ~ lZ
<

ÿ