
    <e                        d Z ddlmZ ddlmZmZmZmZ ddlm	Z	m
Z
 ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZ ddl m!Z!m"Z" ddlZddl#m$Z$ dd	l%m&Z& dd
l%m'Z'  e$j(        d            G d d          Z) G d dej*                  Z+ G d dej,                  Z- G d de-          Z. G d de-          Z/ G d de-          Z0dZ1dZ2dZ3dZ4 ej5         e6ed          o ej7                    dk    d           G d d e-                      Z8 G d! d"e          Z9 G d# d$e9          Z: G d% d&          Z; G d' d(ej,                  Z< G d) d*ej,                  Z= G d+ d,ej,                  Z> G d- d.ej,                  Z?d/ Z@eAd0k    r ejB                     dS dS )1zUnittests for the various HTTPServer modules.

Written by Cody A.W. Somerville <cody-somerville@ubuntu.com>,
Josip Dzolonga, and Michael Otteneder for the 2007/08 GHOP contest.
    )OrderedDict)BaseHTTPRequestHandler
HTTPServerSimpleHTTPRequestHandlerCGIHTTPRequestHandler)server
HTTPStatusN)mock)BytesIOStringIO)support)	os_helper)threading_helperT)modulec                       e Zd Zd ZddZdS )NoLogRequestHandlerc                     d S N )selfargss     ,/usr/lib/python3.11/test/test_httpservers.pylog_messagezNoLogRequestHandler.log_message'   s        Nc                     dS N r   )r   ns     r   readzNoLogRequestHandler.read+   s    rr   r   )__name__
__module____qualname__r   r   r   r   r   r   r   &   s7               r   r   c                        e Zd Zd Zd Zd ZdS )TestServerThreadc                 `    t           j                            |            || _        || _        d S r   )	threadingThread__init__request_handlertest_object)r   r*   r)   s      r   r(   zTestServerThread.__init__0   s/    !!$'''.&r   c                    t          d| j                  | _        | j        j                                        \  | j        _        | j        _        | j        j        	                                 d | _        	 | j        
                    d           | j                                         d S # | j                                         w xY w)N)	localhostr   g?)r   r)   r   socketgetsocknamer*   HOSTPORTserver_startedsetserve_foreverserver_closer   s    r   runzTestServerThread.run5   s     !143GHH7;{7I7U7U7W7W4t/4'++---	'K%%d+++K$$&&&&&DK$$&&&&s   6B+ +Cc                 `    | j                                          |                                  d S r   )r   shutdownjoinr5   s    r   stopzTestServerThread.stop?   s'    		r   N)r    r!   r"   r(   r6   r:   r   r   r   r$   r$   /   sA        ' ' '
' ' '    r   r$   c                   (    e Zd Zd Zd Zddi fdZdS )BaseTestCasec                 8   t          j                    | _        t          j                    t
          _        t          j                    | _	        t          | | j                  | _        | j                                         | j	                                         d S r   )r   threading_setup_threadsr   EnvironmentVarGuardosenvironr&   Eventr1   r$   r)   threadstartwaitr5   s    r   setUpzBaseTestCase.setUpE   su    (8::244
'o//&tT-ABB  """""r   c                     | j                                          d | _         t          j                                         t          j        | j          d S r   )rD   r:   rA   rB   __exit__r   threading_cleanupr?   r5   s    r   tearDownzBaseTestCase.tearDownM   sG    

*DM::::r   GETNc                     t           j                            | j        | j                  | _        | j                            ||||           | j                                        S r   )httpclientHTTPConnectionr/   r0   
connectionrequestgetresponse)r   urimethodbodyheaderss        r   rR   zBaseTestCase.requestS   sO    +44TY	JJT7;;;**,,,r   )r    r!   r"   rG   rK   rR   r   r   r   r<   r<   D   sO        # # #; ; ; #(dB - - - - - -r   r<   c                       e Zd Z G d dee          Zd Zd Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )BaseHTTPServerTestCasec                   L    e Zd ZdZdZd Zd Zd Zd Zd Z	d Z
d Zd	 Zd
 ZdS )&BaseHTTPServerTestCase.request_handlerHTTP/1.1c                     |                      t          j                   |                     dd           |                     dd           |                                  d S )NContent-Type	text/html
Connectionclosesend_responser	   
NO_CONTENTsend_headerend_headersr5   s    r   do_TESTz.BaseHTTPServerTestCase.request_handler.do_TEST^   s]    z4555^[999\7333r   c                     |                      t          j                   |                     dd           |                     dd           |                                  d S )Nr^   r_   r`   
keep-aliverb   r5   s    r   do_KEEPz.BaseHTTPServerTestCase.request_handler.do_KEEPd   s]    z4555^[999\<888r   c                 0    |                      d           d S )N  
send_errorr5   s    r   do_KEYERRORz2BaseHTTPServerTestCase.request_handler.do_KEYERRORj   s    OOC     r   c                 D    |                      t          j                   d S r   rn   r	   	NOT_FOUNDr5   s    r   do_NOTFOUNDz2BaseHTTPServerTestCase.request_handler.do_NOTFOUNDm   s    OOJ011111r   c                 4    |                      ddd           d S )Nrl   zShort MessagezThis is a long 
 explanationrm   r5   s    r   do_EXPLAINERRORz6BaseHTTPServerTestCase.request_handler.do_EXPLAINERRORp   s)    OOC;= = = = =r   c                     |                      d           |                     dd           |                     dd           |                                  d S )Nrl   r^   r_   r`   ra   )rc   re   rf   r5   s    r   	do_CUSTOMz0BaseHTTPServerTestCase.request_handler.do_CUSTOMt   sZ    s###^[999\7333r   c                 $   |                      d           |                     dd           |                     dd           |                                  | j        d                             d          }| j                            |           d S )Nrl   	X-Special   Dängerous Mindr`   ra   zx-special-incomingutf-8)rc   re   rf   rW   encodewfilewrite)r   rV   s     r   do_LATINONEHEADERz8BaseHTTPServerTestCase.request_handler.do_LATINONEHEADERz   s    s###[*;<<<\7333< 45<<WEEDJT"""""r   c                 d    |                      t          | j        dd                               d S N   rn   intpathr5   s    r   do_SEND_ERRORz4BaseHTTPServerTestCase.request_handler.do_SEND_ERROR   ,    OOC	!""../////r   c                 d    |                      t          | j        dd                               d S r   r   r5   s    r   do_HEADz.BaseHTTPServerTestCase.request_handler.do_HEAD   r   r   N)r    r!   r"   protocol_versiondefault_request_versionrg   rj   ro   rs   ru   rw   r   r   r   r   r   r   r)   r[   Z   s        %",	 	 		 	 		! 	! 	!	2 	2 	2	= 	= 	=	 	 		# 	# 	#	0 	0 	0	0 	0 	0 	0 	0r   r)   c                     t                               |            t          j                            | j        | j                  | _        | j                                         d S r   )	r<   rG   rN   rO   rP   r/   r0   conconnectr5   s    r   rG   zBaseHTTPServerTestCase.setUp   sM    4   ;--diCCr   c                     | j                             dd           | j                                         }|                     |j        t
          j                   d S )NrL   /)r   rR   rS   assertEqualstatusr	   NOT_IMPLEMENTEDr   ress     r   test_commandz#BaseHTTPServerTestCase.test_command   sN    $$$h""$$Z%?@@@@@r   c                    d| j         _        | j                             dd           | j                                          | j                                         }|                     |j        t          j                   d S )Nz	HTTP/1.1
XYZBOGUSr   	r   _http_vsn_str
putrequest
endheadersrS   r   r   r	   r   r   s     r   test_request_line_trimmingz1BaseHTTPServerTestCase.test_request_line_trimming   sl    !-J,,,h""$$Z%?@@@@@r   c                    d| j         _        | j                             dd           | j                                          | j                                         }|                     |j        t          j                   d S )NFUBARrL   r   	r   r   r   r   rS   r   r   r	   BAD_REQUESTr   s     r   test_version_bogusz)BaseHTTPServerTestCase.test_version_bogus   sl    !(E3'''h""$$Z%;<<<<<r   c                    d| j         _        | j                             dd           | j                                          | j                                         }|                     |j        t          j                   d S )Nz
HTTP/9.9.9rL   r   r   r   s     r   test_version_digitsz*BaseHTTPServerTestCase.test_version_digits   sl    !-E3'''h""$$Z%;<<<<<r   c                    d| j         _        | j                             dd           | j                                          | j                                         }|                     |j        t          j                   d S )NzHTTP/-9_9_9.+9_9_9rL   r   r   r   s     r   "test_version_signs_and_underscoresz9BaseHTTPServerTestCase.test_version_signs_and_underscores   sl    !5E3'''h""$$Z%;<<<<<r   c                    d| j         _        | j                             dd           | j                                          | j                                         }|                     |j        t          j                   d S )NzHTTP/909876543210.0rL   r   r   r   s     r   "test_major_version_number_too_longz9BaseHTTPServerTestCase.test_major_version_number_too_long   l    !6E3'''h""$$Z%;<<<<<r   c                    d| j         _        | j                             dd           | j                                          | j                                         }|                     |j        t          j                   d S )NzHTTP/1.909876543210rL   r   r   r   s     r   "test_minor_version_number_too_longz9BaseHTTPServerTestCase.test_minor_version_number_too_long   r   r   c                    d| j         _        | j                             dd           | j                                          | j                                         }|                     |j        t          j                   d S )Nr   rL   r   r   r   s     r   test_version_none_getz,BaseHTTPServerTestCase.test_version_none_get   sl    !#E3'''h""$$Z%?@@@@@r   c                    d| j         _        | j                             dd           | j                                          | j                                         }|                     |j        t          j                   d S )Nr   CUSTOMr   r   r   s     r   test_version_nonez(BaseHTTPServerTestCase.test_version_none   sl    !#Hc***h""$$Z%;<<<<<r   c                    d| j         _        d| j         _        | j                             dd           | j                                          | j                                         }|                     |j        t          j	                   d S )Nc   zHTTP/9.9rL   r   )
r   	_http_vsnr   r   r   rS   r   r   r	   HTTP_VERSION_NOT_SUPPORTEDr   s     r   test_version_invalidz+BaseHTTPServerTestCase.test_version_invalid   sv    !+E3'''h""$$Z%JKKKKKr   c                    d| j         _        | j                             dd           | j                                          | j                                         }|                     |j        t          j                   d S r   r   r   s     r   test_send_blankz&BaseHTTPServerTestCase.test_send_blank   sl    !#B###h""$$Z%;<<<<<r   c                     | j                             dd           | j                             dd           | j                                          | j                                         }|                     |j        t          j                   d S )NrL   r   r`   ra   )	r   r   	putheaderr   rS   r   r   r	   r   r   s     r   test_header_closez(BaseHTTPServerTestCase.test_header_close   sz    E3'''<111h""$$Z%?@@@@@r   c                 8   d| j         _        | j                             dd           | j                             dd           | j                                          | j                                         }|                     |j        t          j	                   d S )Nr\   rL   r   r`   ri   )
r   r   r   r   r   rS   r   r   r	   r   r   s     r   test_header_keep_alivez-BaseHTTPServerTestCase.test_header_keep_alive   s    !+E3'''<666h""$$Z%?@@@@@r   c                     | j                             dd           | j                                         }|                     |j        t
          j                   d S )NTESTr   )r   rR   rS   r   r   r	   rd   r   s     r   test_handlerz#BaseHTTPServerTestCase.test_handler   sN    %%%h""$$Z%:;;;;;r   c                 4   | j                             dd           | j                                         }|                     |                    d          d           | j                             dd           |                     | j         j                   d S )NKEEPr   r`   ri   r   )r   rR   rS   r   	getheader
addCleanupra   r   s     r   test_return_header_keep_alivez4BaseHTTPServerTestCase.test_return_header_keep_alive   s    %%%h""$$|44lCCC%%%'''''r   c                     | j                             dd           | j                                         }|                     |j        d           d S )NKEYERRORr   rl   r   rR   rS   r   r   r   s     r   test_internal_key_errorz.BaseHTTPServerTestCase.test_internal_key_error   sK    S)))h""$$S)))))r   c                     | j                             dd           | j                                         }|                     |j        d           d S )Nr   r   rl   r   r   s     r   test_return_custom_statusz0BaseHTTPServerTestCase.test_return_custom_status   sK    3'''h""$$S)))))r   c                    | j                             dd           | j                                         }|                     |j        d           |                     t          |                    d                               d S )NEXPLAINERRORr   rl   Content-Length)r   rR   rS   r   r   
assertTruer   r   r   s     r   test_return_explain_errorz0BaseHTTPServerTestCase.test_return_explain_error   sr    ---h""$$S)))CMM*:;;<<=====r   c                 >   | j                             ddddi           | j                                         }|                     |                    d          d           |                     |                                d                    d                     d S )	NLATINONEHEADERr   zX-Special-Incomingu   Ärger mit UnicoderW   ry   rz   r{   )r   rR   rS   r   r   r   r|   r   s     r   test_latin1_headerz)BaseHTTPServerTestCase.test_latin1_header  s    )3 (<9
 	 	 	 h""$${335FGGG%9%@%@%I%IJJJJJr   c                 f   | j                             dd           | j                                         }|                     |j        t
          j                   |                                }|                     t          |	                    d                    t          |                     d S )NNOTFOUNDr   r   )r   rR   rS   r   r   r	   rr   r   r   r   len)r   r   datas      r   test_error_content_lengthz0BaseHTTPServerTestCase.test_error_content_length  s    S)))h""$$Z%9:::xxzzS]]+;<<==s4yyIIIIIr   c                    t           j        t           j        f}t           j        t           j        t           j        t           j        t           j        fD ]}| j                            dd                    |                     | j        	                                }| 
                    ||j                   | 
                    d |                    d                     | 
                    d |                    d                     ||vr)| 
                    d |                    d                     |                                }| 
                    d|           d S )N
SEND_ERROR/{}r   r^   Transfer-Encodingr   )r	   NOT_MODIFIEDRESET_CONTENTrd   
PROCESSINGSWITCHING_PROTOCOLSr   rR   formatrS   r   r   r   r   r   allow_transfer_encoding_codescoder   r   s        r   test_send_errorz&BaseHTTPServerTestCase.test_send_error  s9   )3)@)3)A)C%*J,C*J,D35 	( 	(D H\5<<+=+=>>>(&&((CT3:...T3==1A#B#BCCCT3==#@#@AAA888  s}}5H'I'IJJJ88::DS$''''	( 	(r   c                    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    rc|                     t          |                    d                    dk               |                     d|                    d                     nR| 
                    d |                    d                     | 
                    d |                    d                     ||vr)| 
                    d |                    d                     |                                }| 
                    d|           d S )	NHEADr   r   r   r_   r^   r   r   )r	   r   r   OKrd   r   r   rR   r   rS   r   r   r   r   r   assertInr   r   s        r   test_head_via_send_errorz/BaseHTTPServerTestCase.test_head_via_send_error'  s   )3)@)3)A)C%]J$9,j.F35 	( 	(D HVU\\$%7%7888(&&((CT3:...z}$$CMM2B$C$C D Dq HIIIk3==+H+HIIII  s}}5E'F'FGGG  s}}^'D'DEEE888  s}}5H'I'IJJJ88::DS$''''!	( 	(r   N)r    r!   r"   r   r   r)   rG   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   rY   rY   Y   s       ,0 ,0 ,0 ,0 ,0-/E ,0 ,0 ,0\  
A A A
A A A= = == = == = == = == = =A A A= = =L L L= = =A A AA A A< < <
( ( (* * *
* * *
> > >K K KJ J J( ( ("( ( ( ( (r   rY   c                   6    e Zd Z G d de          Zd Zd ZdS )RequestHandlerLoggingTestCasec                   "    e Zd ZdZdZd Zd ZdS )-RequestHandlerLoggingTestCase.request_handlerr\   c                 l    |                      t          j                   |                                  d S r   )rc   r	   r   rf   r5   s    r   do_GETz4RequestHandlerLoggingTestCase.request_handler.do_GETB  s0    z}---r   c                 F    |                      t          j        d           d S )NzFile not foundrq   r5   s    r   do_ERRORz6RequestHandlerLoggingTestCase.request_handler.do_ERRORF  s     OOJ02BCCCCCr   N)r    r!   r"   r   r   r   r   r   r   r   r)   r   >  sC        %",	 	 		D 	D 	D 	D 	Dr   r)   c                    t           j                            | j        | j                  | _        | j                                         t          j                    5 }| j        	                    dd           | j        
                                 d d d            n# 1 swxY w Y   |                     |                                                    d                     d S )NrL   r   z"GET / HTTP/1.1" 200 -
)rN   rO   rP   r/   r0   r   r   r   captured_stderrrR   rS   r   getvalueendswith)r   errs     r   test_getz&RequestHandlerLoggingTestCase.test_getI  s   ;--diCC$&& 	##HUC(((H  """	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	LLNN##$>??	A 	A 	A 	A 	A   5BB!$B!c                 Z   t           j                            | j        | j                  | _        | j                                         t          j                    5 }| j        	                    dd           | j        
                                 d d d            n# 1 swxY w Y   |                                                    d          }|                     |d                             d                     |                     |d                             d                     d S )NERRORr   
r   z code 404, message File not foundr   z"ERROR / HTTP/1.1" 404 -)rN   rO   rP   r/   r0   r   r   r   r   rR   rS   r   splitr   r   )r   r   liness      r   test_errz&RequestHandlerLoggingTestCase.test_errT  s-   ;--diCC$&& 	##HWc***H  """	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# $$T**a))*LMMNNNa))*DEEFFFFFr   N)r    r!   r"   r   r)   r   r   r   r   r   r   r   =  sm        	D 	D 	D 	D 	D0 	D 	D 	D	A 	A 	A
G 
G 
G 
G 
Gr   r   c                   N    e Zd Z G d dee          Z fdZ fdZddZ e	j
        ej        dk    d           e	j
        ej        d	k    d
           e	j        ej        d          d                                     Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z xZS )SimpleHTTPServerTestCasec                       e Zd ZdS )(SimpleHTTPServerTestCase.request_handlerNr    r!   r"   r   r   r   r)   r  b          r   r)   c                    t                                                       t          j                    | _        t          j                    }t          j        |           d| _        t          j	        |          | _
        t          j                            | j
                  | _        d| j        z   | _        t          j                            | j
        d          }t!          |d          5 }|                    | j                   |                                 d d d            n# 1 swxY w Y   t          j        |          j        }t*          j                            |t*          j        j                  }|                    d          | _        t6          j                            |                                d	          | _        d S )
Ns   We are the knights who say Ni!)dirr   testwbr   )microsecondTusegmt) superrG   rA   getcwdcwdtempfile
gettempdirchdirr   mkdtemptempdirr   basenametempdir_namebase_urlr9   openr~   flushstatst_mtimedatetimefromtimestamptimezoneutcreplacelast_modif_datetimeemailutils
formatdate	timestamplast_modif_header)r   basetempdirtempnametempmtime
last_modif	__class__s         r   rG   zSimpleHTTPServerTestCase.setUpe  s   9;;)++
5	'K888G,,T\::d//7<<f55(D!! 	TJJty!!!JJLLL	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 !!*&44U!# #
#-#5#5!#5#D#D !&!7!7  ""4 "8 "1 "1s   //D**D.1D.c                 
   	 t          j        | j                   	 t          j        | j                   n#  Y nxY wt                                                       d S # t                                                       w xY wr   )rA   r  r  shutilrmtreer  r  rK   )r   r,  s    r   rK   z!SimpleHTTPServerTestCase.tearDownz  sz    	HTXdl++++GGEGGs   A  7 A  ;A   "BNc                 $   fd}d |_                                         }|                                |                     j        |           |                     j                   |r|                     ||           |                     j        d           |                     j        	                    dd          d           |                                         d          dd           
                                 |S )Nc                  $    j          d_         dS )zWDon't close reader yet so we can check if there was leftover
            buffered inputN)fp)readerresponses   r   
close_connzDSimpleHTTPServerTestCase.check_status_and_reason.<locals>.close_conn  s     [FHKKKr   
   r`   ra      r   zConnection should be closed)_close_connr   r   r   r   assertIsNotNonereasonversionmsggetra   )r   r4  r   r   r5  rV   r3  s    `    @r   check_status_and_reasonz0SimpleHTTPServerTestCase.check_status_and_reason  s   	 	 	 	 	 	 )}}!!!&111X_--- 	)T4((( 	)2...)),@@'JJJR#/LMMMr   darwinz2undecodable name cannot always be decoded on macOSwin32z+undecodable name cannot be decoded on win32z!need os_helper.TESTFN_UNDECODABLEc                    t          j                    }t          j        t          j                  dz   }t          t          j                            | j	        |          d          5 }|
                    t          j                   d d d            n# 1 swxY w Y   |                     | j        dz             }t           j        dk    r&t          j        | j	                  D ]}|dk    r|} n|                     |t           j                  }t$          j                            |d          }|                     d|z                      |d	          |           |                     d
t/          j        |d          z                      |d	          |           |                     | j        dz   |z             }|                     |t           j        t          j                   d S )Nz.txtr	  r   r?  r  surrogatepass)errorsz	href="%s"surrogateescape>%s<Fquoter   )sysgetfilesystemencodingrA   fsdecoder   TESTFN_UNDECODABLEr  r   r9   r  r~   rR   r  platformlistdirr>  r	   r   urllibparserG  r   r|   htmlescape)r   encfilenamefr4  namerV   
quotednames           r   test_undecodable_filenamez2SimpleHTTPServerTestCase.test_undecodable_filename  s    '));y;<<vE"',,t|X66== 	2GGI0111	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2<< 344<8## 
4<00  6>>#HE " ++HjmDD\'''II
{Z/vc#455t	= 	= 	=vHE B B BBvc#455t	= 	= 	=<< 3j @AA$$Xz}*3*F 	% 	H 	H 	H 	H 	Hs   ( BBBc                    |                      | j        dz                                             }|                     |d| j         d                    d                     |                      | j        dz                                             }|                     |d| j         d                    d                     d S )Nz/?x=123zlisting for z/\?x=123latin1z/?x=%bbu   /\?x=ï¿½)rR   r  r   assertRegexr|   r   r4  s     r   test_undecodable_parameterz3SimpleHTTPServerTestCase.test_undecodable_parameter  s    <<	 9::??AA#I$-#I#I#I#P#PQY#Z#Z[[[<<	 9::??AA#R$-#R#R#R#Y#YZb#c#cdddddr   c                 <   t          j        t           j                            | j        d                     d| j         d}| d}|                     |          }|                     |t          j	                   |
                    d          }|                     ||d           d| }|                     |          }|                     |t          j	                   |
                    d          }|                     |                    d          |           |                     ||d	           d| }|                     |          }|                     |t          j	                   |                     |
                    d          |           d
| }| d}|                     |          }|                     |t          j	                   |
                    d          }|                     |                    d
          |           dS )aI  Ensure //evil.co/..%2f../../X does not put //evil.co/ in Location.

        //netloc/ in a Location header is a redirect to a new host.
        https://github.com/python/cpython/issues/87389

        This checks that a path resolving to a directory on our server cannot
        resolve into a redirect to another server.
        existing_directoryz2/python.org/..%2f..%2f..%2f..%2f..%2f../%0a%0d/../z/existing_directoryr   Locationznon-attack failed!r<  //zcExpected Location header to start with a single / and end with a / as this is a directory redirect.zhttps://pypi.org/N)rA   mkdirr   r9   r  r  rR   r>  r	   MOVED_PERMANENTLYr   r   assertFalse
startswithr   )	r   urlexpected_locationr4  location
attack_urlattack3_urlattack_scheme_netloc_2slash_urlexpected_scheme_netloc_locations	            r   3test_get_dir_redirect_location_domain_injection_bugzLSimpleHTTPServerTestCase.test_get_dir_redirect_location_domain_injection_bug  s%    	dl,@AABBBi4CTiii"III <<$$$$Xz/KLLL%%j11#4:NOOO YY
<<
++$$Xz/KLLL%%j11,,T22AAA#4@ 	 	A 	A 	A
 !3jj<<,,$$Xz/KLLL++J779JKKK +Dc*C*C'-L*O*O*O'<< ?@@$$Xz/KLLL%%j11 	++,?@@hOOOOOr   c                    |                      | j        dz             }|                     |t          j        | j                   |                      | j        dz             }|                     |t          j                   |                      | j        dz             }|                     |t          j                   |                      | j                  }|                     |t          j                   |                     |	                    d          d           |                      | j        dz             }|                     |t          j                   |                      | j        dz             }|                     |t          j                   |                     |	                    d	          | j        d
z              |                      d          }|                     |t          j                   |                      d          }|                     |t          j                   t          j        t          j                            | j        dd                     |                      | j        dz             }|                     |t          j                   d}t          t          j                            | j        d          d          5 }|                    |           d d d            n# 1 swxY w Y   |                      | j        dz             }|                     |t          j        |           t          j        dk    rt          j                    dk    rt          j        | j        d           	 |                      | j        dz             }|                     |t          j                   t          j        | j        d           d S # t          j        | j        d           w xY wd S d S )N/testrH  /test/r   r   0/?hi=2?hi=1r`  /?hi=1z/ThisDoesNotExistz/ThisDoesNotExist/spamz
index.htmlz/spam/s   Dummy index file
r	  posixr   i  )rR   r  r>  r	   r   r   rr   rd  r   r   rA   makedirsr   r9   r  r  r  r~   rV  geteuidchmod)r   r4  r   rU  s       r   r   z!SimpleHTTPServerTestCase.test_get  s   << 788$$Xz}49$MMM<< 899$$Xz/CDDD<< 344$$Xz}===<<..$$Xz/KLLL++,<==sCCC<< 899$$Xz}===<< 788$$Xz/KLLL++J771	3 	3 	3<< 344$$Xz/CDDD<< >??$$Xz/CDDD
BGLLv|DDEEE<< 899$$Xz}===&"',,t0,??FF 	!GGDMMM	 	 	 	 	 	 	 	 	 	 	 	 	 	 	<< 344$$Xz}dCCC 7g"*,,!"3"3HT\1%%%.<<(;<<,,Xz7KLLLu-----u---- "3"3s   !LL
L=O' 'Pc                 f   |                      | j        dz   d          }|                     |t          j                   |                     |                    d          t          t          | j	                                       |                     |                    d          d           d S )Nrp  r   rU   zcontent-lengthzcontent-typezapplication/octet-stream)
rR   r  r>  r	   r   r   r   strr   r   r\  s     r   	test_headz"SimpleHTTPServerTestCase.test_head  s    <<MG#F   4 4$$Xz}===++,<==S^^,,	. 	. 	.++N;;3	5 	5 	5 	5 	5r   c                    t           j                                        }| j        |d<   |                     | j        dz   |          }|                     |t          j                   | j	        t          j        d          z   }t           j                                        }t           j                            |d          |d<   |                     | j        dz   |          }|                     |t          j                   dS )	zCheck that when a request to /test is sent with the request header
        If-Modified-Since set to date of last modification, the server returns
        status code 304, not 200
        If-Modified-Sincerp  r   r   )hoursTr  N)r"  messageMessager&  rR   r  r>  r	   r   r!  r  	timedeltar#  format_datetime)r   rW   r4  new_dts       r   test_browser_cachez+SimpleHTTPServerTestCase.test_browser_cache&  s    
 -''))'+'=#$<< 7<II$$Xz/FGGG )H,>Q,G,G,GG-''))',{'B'B6 (C ( (#$<< 7<II$$Xz/FGGGGGr   c                 F   | j         }|t          j        d          z
  }t          j                                        }t          j                            |d          |d<   |                     | j	        dz   |          }| 
                    |t          j                   d S )Nim  )daysTr  r  rp  r   )r!  r  r  r"  r  r  r#  r  rR   r  r>  r	   r   )r   dtold_dtrW   r4  s        r   test_browser_cache_file_changedz8SimpleHTTPServerTestCase.test_browser_cache_file_changed8  s    %h(c2222-''))',{'B'B6 (C ( (#$<< 7<II$$Xz}=====r   c                     t           j                                        }| j        |d<   d|d<   |                     | j        dz   |          }|                     |t          j                   d S )Nr  *zIf-None-Matchrp  r   )	r"  r  r  r&  rR   r  r>  r	   r   )r   rW   r4  s      r   ,test_browser_cache_with_If_None_Match_headerzESimpleHTTPServerTestCase.test_browser_cache_with_If_None_Match_headerC  si     -''))'+'=#$#& << 7<II$$Xz}=====r   c                 P   |                      dd          }|                     |t          j                   |                      dd          }|                     |t          j                   |                      dd          }|                     |t          j                   d S )Nr   FOOr|  customGETs)rR   r>  r	   r   r\  s     r   test_invalid_requestsz.SimpleHTTPServerTestCase.test_invalid_requestsL  s    <<E<22$$Xz/IJJJ<<H<55$$Xz/IJJJ<<F<33$$Xz/IJJJJJr   c                     |                      | j        dz             }|                     |t          j        | j                   |j        d         }|                     || j                   dS )zChecks that the datetime returned in Last-Modified response header
        is the actual datetime of last modification, rounded to the second
        rp  rH  zLast-modifiedN)	rR   r  r>  r	   r   r   rW   r   r&  )r   r4  r&  s      r   test_last_modifiedz+SimpleHTTPServerTestCase.test_last_modifiedU  si     << 788$$Xz}49$MMM$,_=*D,BCCCCCr   c                 L   |                      | j        dz             }|                     |t          j        | j                   |                      | j        dz             }|                     |t          j                   |                      | j        dz             }|                     |t          j                   |                      | j                  }|                     |t          j                   |                      | j        dz             }|                     |t          j                   |                      | j        dz             }|                     |t          j                   |                     |	                    d          | j        dz              d S )	Nrp  rH  rq  r   rs  rt  r`  ru  )
rR   r  r>  r	   r   r   rr   rd  r   r   r\  s     r   test_path_without_leading_slashz8SimpleHTTPServerTestCase.test_path_without_leading_slash^  sj   << 1G ;<<$$Xz}49$MMM<< 1H <==$$Xz/CDDD<< 1C 788$$Xz}===<< 122$$Xz/KLLL<< 1H <==$$Xz}===<< 1G ;<<$$Xz/KLLL++J77*X5	7 	7 	7 	7 	7r   c                    d}t           j                            | j        |          }	 t	          |d                                           n%# t          $ r t          j        d|z            w xY w	 | 	                    | j
        dz             }|                     |t          j                  }|j                                        }t          j        |           n# t          j        |           w xY w|                     |           dt%          j        |d          z  }|                     |                    |          |           d S )Nz<test&>.txtr	  z-Can not create file %s on current file systemr   rE  FrF  )rA   r   r9   r  r  ra   OSErrorunittestSkipTestrR   r  r>  r	   r   rW   get_content_charsetunlinkr9  rQ  rR  r   r|   )r   rT  fullpathr4  rV   rS  	html_texts          r   test_html_escape_filenamez2SimpleHTTPServerTestCase.test_html_escape_filenamen  sE    7<<h77	94  &&(((( 	9 	9 	9# %-/7%8 9 9 9	9	 ||DMC$788H//*-HHD"6688CIhBIhS!!!T[????	i&&s++T22222s   "A "A.2AC C3r   )r    r!   r"   r   r   r)   rG   rK   r>  r  skipIfrI  rM  
skipUnlessr   rL  rX  r]  rn  r   r~  r  r  r  r  r  r  r  __classcell__r,  s   @r   r  r  a  s           -/G   1 1 1 1 1*       2 X_S\X-IK KX_S\W,BD DX5<> >H H> >D DK KH.e e e/P /P /Pb(. (. (.T5 5 5H H H$	> 	> 	>> > >K K KD D D7 7 7 3 3 3 3 3 3 3r   r  zD#!%s

print("Content-type: text/html")
print()
print("Hello World")
a  #!%s
import os
import sys
import urllib.parse

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

content_length = int(os.environ["CONTENT_LENGTH"])
query_string = sys.stdin.buffer.read(content_length)
params = {key.decode("utf-8"): val.decode("utf-8")
            for key, val in urllib.parse.parse_qsl(query_string)}

print("%%s, %%s, %%s" %% (params["spam"], params["eggs"], params["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>")
ry  z7This test can't be run reliably as root (issue #13308).c                       e Zd Z G d dee          Zej                            d          Zd Z	d Z
d Zd Zd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )CGIHTTPServerTestCasec                       e Zd ZdS )%CGIHTTPServerTestCase.request_handlerNr  r   r   r   r)   r    r  r   r)   asciic                    t                               |            t          j                    | _        t          j                    | _        t          j        	                    | j        d          | _
        t          j        	                    | j
        d          | _        t          j        	                    | j        d          | _        t          j        	                    | j        d          | _        t          j        	                    | j        d          | _        t          j        | j
                   t          j        | j                   t          j        | j                   t          j        | j                   t          j        | j                   d | _        d | _        d | _        d | _        d | _        d | _        d | _        t/          j                    r[t          j        	                    | j        d          | _        t5          j        | j                                                  | _        nt:          j        | _        	 | j                            d           n9# t@          $ r, | !                                 | "                    d           Y nw xY wt          j        	                    | j        d          | _        tG          | j        d	d
          5 }|$                    tJ          | j        z             d d d            n# 1 swxY w Y   t          j&        | j        d           t          j        	                    | j
        d          | _        tG          | j        d	d
          5 }|$                    tJ          | j        z             d d d            n# 1 swxY w Y   t          j&        | j        d           t          j        	                    | j
        d          | _        tG          | j        d	d
          5 }|$                    tN          | j        z             d d d            n# 1 swxY w Y   t          j&        | j        d           t          j        	                    | j        d          | _        tG          | j        d	d
          5 }|$                    tJ          | j        z             d d d            n# 1 swxY w Y   t          j&        | j        d           t          j        	                    | j
        d          | _        tG          | j        d	d
          5 }|$                    tP          | j        dfz             d d d            n# 1 swxY w Y   t          j&        | j        d           t          j        	                    | j        d          | _        tG          | j        d	d
          5 }|$                    tJ          | j        z             d d d            n# 1 swxY w Y   t          j&        | j        d           t          j        	                    | j
        d          | _)        tG          | j)        d	d
          5 }|$                    tT          | j        z             d d d            n# 1 swxY w Y   t          j&        | j)        d           t          j+        | j                   d S )Nzcgi-binz	child-dirsubr  pythonr{   z0Python executable path is not encodable to utf-8znocgi.pyw)encodingi  zfile1.pyzfile2.pyzfile3.pyzfile4.pyQUERY_STRINGzfile5.pyzfile6.py),r<   rG   rA   r  r  r  r  
parent_dirr   r9   cgi_dircgi_child_dir	sub_dir_1	sub_dir_2cgi_dir_in_sub_dirrc  
nocgi_path
file1_path
file2_path
file3_path
file4_path
file5_path_pythonexe_symlinkr   can_symlink	pythonexer   PythonSymlink	__enter__rI  
executabler|   UnicodeEncodeErrorrK   skipTestr  r~   	cgi_file1rz  	cgi_file2	cgi_file4
file6_path	cgi_file6r  )r   r2  file1file2file3file4file5file6s           r   rG   zCGIHTTPServerTestCase.setUp  s   4   9;;"*,,w||DOY??W\\$,DDdou==dne<<"$',,t~y"I"I

#$$$
   
   
())) #' "" 	,W\\$/8DDDN&-&;DN&K&K&U&U&W&WD## ^DN	N N!!'****! 	N 	N 	NMMOOOMMLMMMMM	N ',,t
CC$/3999 	1RHHY/000	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1
%(((',,t|Z@@$/3999 	4UKK	DN2333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4
%(((',,t|Z@@$/3999 	4UKK	DN2333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4
%(((',,t'9:FF$/3999 	4UKK	DN2333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4
%(((',,t|Z@@$/3999 	FUKK	T^^$DDEEE	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F
%(((',,t'>
KK$/3999 	4UKK	DN2333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4
%(((',,t|Z@@$/3999 	4UKK	DN2333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4
%(((
!!!!!s   I& &3JJ #LLL5#N$$N(+N(
#P99P= P=#SSS4%U%%U),U)#W::W>W> #ZZZc                    	 t          j        | j                   | j        r| j                            d d d            | j        rt          j        | j                   | j        rt          j        | j                   | j        rt          j        | j                   | j	        rt          j        | j	                   | j
        rt          j        | j
                   | j        rt          j        | j                   | j        rt          j        | j                   t          j        | j                   t          j        | j                   t          j        | j                   t          j        | j                   t          j        | j                   t          j        | j                   t(                              |            d S # t(                              |            w xY wr   )rA   r  r  r  rI   r  remover  r  r  r  r  r  rmdirr  r  r  r  r  r  r<   rK   r5   s    r   rK   zCGIHTTPServerTestCase.tearDown  s   	(HTX& C'00tTBBB +	$/*** +	$/*** +	$/*** +	$/*** +	$/*** +	$/*** +	$/***HT'(((HT\"""HT,---HT^$$$HT^$$$HT_%%%!!$'''''L!!$''''s   F2G G,c                    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                    r7t	          |t
                    r"|                     |t          j        |           Qt          j        |          }| 	                    ||d|d|d|           d S )Nr   rb  z..z/.//..r   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 = z	
Got:    z	
Wanted: ra  )

IndexErroritems
isinstancetype
issubclass	ExceptionassertRaisesr   _url_collapse_pathr   )r   test_vectorsr   expectedactuals        r   test_url_collapse_pathz,CGIHTTPServerTestCase.test_url_collapse_path*  s   

*
 j
 	

 $
 6
 D
  3
  !4
 
 %
 5
 5
 V
 F
  W!
" g#
$ !#",%-,4.8(.+0.8.2049
 
 
< +0022 	; 	;ND((D)) ;j9.M.M ;!!("(";TC C C C  2488  66"&$$&: ! ; ; ; ;	; 	;r   c                     |                      d          }|                     |                                |                    d          |j        fd| j        z   dt          j        f           d S )Nr  Content-type   Hello Worldr_   )rR   r   r   r   r   linesepr	   r   r   s     r   test_headers_and_contentz.CGIHTTPServerTestCase.test_headers_and_contentT  sn    ll.//XXZZ~66
Cdl*KG	I 	I 	I 	I 	Ir   c                 z    |                      d          }|                     |j        t          j                   d S )Nz)///////////nocgi.py/../cgi-bin/nothere.sh)rR   r   r   r	   rr   r   s     r   test_issue19435z%CGIHTTPServerTestCase.test_issue19435Z  s5    llFGGZ%9:::::r   c                     t           j                            dddd          }ddi}|                     dd||          }|                     |                                d	| j        z              d S )
Nr   r  i@ )rv  eggsbaconr  z!application/x-www-form-urlencodedz/cgi-bin/file2.pyPOSTs   1, python, 123456)rO  rP  	urlencoderR   r   r   r  )r   paramsrW   r   s       r   	test_postzCGIHTTPServerTestCase.test_post^  su    ''(f==? ?!$GHll.HH%9DL%HIIIIIr   c                     |                      d          }|                                 |                     |j        t          j                   d S )Nz/cgi-bin/invalid)rR   r   r   r   r	   rr   r   s     r   test_invaliduriz%CGIHTTPServerTestCase.test_invalidurif  sB    ll-..


Z%9:::::r   c                    ddt          j        d          z   i}|                     dd|          }|                     d| j        z   dt
          j        f|                                |                    d	          |j	        f           d S )
Ns   Authorizations   Basic s   username:passr  rL   r   r  r_   r  )
base64	b64encoderR   r   r  r	   r   r   r   r   )r   rW   r   s      r   test_authorizationz(CGIHTTPServerTestCase.test_authorizationk  s    #i#$455'6 7ll.wlGGdl*KGXXZZ~66
C	E 	E 	E 	E 	Er   c                     |                      d          }|                     d| j        z   dt          j        f|                                |                    d          |j        f           d S )Nr  r  r_   r  rR   r   r  r	   r   r   r   r   r   s     r   test_no_leading_slashz+CGIHTTPServerTestCase.test_no_leading_slashs  sn    ll-..dl*KGXXZZ~66
C	E 	E 	E 	E 	Er   c                 N   d}|t           j        d<   |                     d          }|                     d| j        z   dt
          j        f|                                |                    d          |j	        f           |                     t           j        d         |           d S )NzTest CGI ServerSERVER_SOFTWAREr  r  r_   r  )
rA   rB   rR   r   r  r	   r   r   r   r   )r   	signaturer   s      r   test_os_environ_is_not_alteredz4CGIHTTPServerTestCase.test_os_environ_is_not_alteredz  s    %	(1
$%ll.//dl*KGXXZZ~66
C	E 	E 	E 	$56	BBBBBr   c                     |                      d          }|                     d| j        z   dt          j        f|                                |                    d          |j        f           d S )Nz/cgi-bin%2ffile1.pyr  r_   r  r  r   s     r   #test_urlquote_decoding_in_cgi_checkz9CGIHTTPServerTestCase.test_urlquote_decoding_in_cgi_check  sn    ll011dl*KGXXZZ~66
C	E 	E 	E 	E 	Er   c                     |                      d          }|                     d| j        z   dt          j        f|                                |                    d          |j        f           d S )Nz/cgi-bin/child-dir/file3.pyr  r_   r  r  r   s     r   test_nested_cgi_path_issue21323z5CGIHTTPServerTestCase.test_nested_cgi_path_issue21323  sn    ll899dl*KGXXZZ~66
C	E 	E 	E 	E 	Er   c                     |                      d          }|                     d| j        z   dt          j        f|                                |                    d          |j        f           d S )Nz/cgi-bin/file4.py?a=b?c=ds   a=b?c=dr_   r  r  r   s     r   &test_query_with_multiple_question_markz<CGIHTTPServerTestCase.test_query_with_multiple_question_mark  sn    ll677$,&Z]CXXZZ~66
C	E 	E 	E 	E 	Er   c                     |                      d          }|                     d| j        z   dt          j        f|                                |                    d          |j        f           d S )Nz0/cgi-bin/file4.py?k=aa%2F%2Fbb&//q//p//=//a//b//s   k=aa%2F%2Fbb&//q//p//=//a//b//r_   r  r  r   s     r   "test_query_with_continuous_slashesz8CGIHTTPServerTestCase.test_query_with_continuous_slashes  sq    llMNN.=*-)XXZZ~66
C	E 	E 	E 	E 	Er   c                    	 t           j                            d           |                     d          }|                     d| j        z   dt          j        f|                                |	                    d          |j
        f           t           j                            d           d S # t           j                            d           w xY w)Nz/sub/dir/cgi-binz/sub/dir/cgi-bin/file5.pyr  r_   r  )r   cgi_directoriesappendrR   r   r  r	   r   r   r   r   r  r   s     r    test_cgi_path_in_sub_directoriesz6CGIHTTPServerTestCase.test_cgi_path_in_sub_directories  s    	M!1889KLLL,,:;;C$,.Z]KS]]>::CJGI I I "1889KLLLLL!1889KLLLLs   BB/ /!Cc                    d}d|ff|fddf}|D ]\  }}t          |          }|                     |          5  |                     dd|          }|                     t          j        j        |j                   d|                     d	          }| 	                    ||
                                           d d d            n# 1 swxY w Y   d S )
Nz?text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept)r   r   )))r  r_   )ACCEPTz
text/plainztext/html,text/plainz/cgi-bin/file6.pyrL   r   zHTTP_ACCEPT=r  )r   subTestrR   r   rN   r	   r   r   r|   r   r   )r   browser_accepttestsrW   r  r   s         r   test_acceptz!CGIHTTPServerTestCase.test_accept  s,   U 	 (*N;'	
 "' 	4 	4GX!'**Gg&& 4 4ll#6wlOO  !3SZ@@@4(44;;GDDh

333	4 4 4 4 4 4 4 4 4 4 4 4 4 4 4	4 	4s   BCC	C	N)r    r!   r"   r   r   r)   rA   r  r|   rG   rK   r  r  r  r  r  r  r  r  r  r  r  r  r	  r  r   r   r   r  r    sl           -/D    j((GJ" J" J"X( ( (8(; (; (;TI I I; ; ;J J J; ; ;
E E EE E EC C CE E EE E EE E EE E EM M M4 4 4 4 4r   r  c                   ,     e Zd Zd fd	Zd Zd Z xZS )SocketlessRequestHandlerNc                     t          j                    }t                      |j        _        t                                          |d d |           d| _        d| _        d S )N	directoryFr\   )	r
   Mockr   makefilereturn_valuer  r(   
get_calledr   )r   r  rR   r,  s      r   r(   z!SocketlessRequestHandler.__init__  sS    )++(/		%$	BBB *r   c                     d| _         |                     t          j                   |                     dd           |                                  | j                            d           d S )NTr^   r_       <html><body>Data</body></html>
)r  rc   r	   r   re   rf   r}   r~   r5   s    r   r   zSocketlessRequestHandler.do_GET  sd    :=)))555
>?????r   c                     d S r   r   )r   r   r   s      r   r   z$SocketlessRequestHandler.log_message  s    r   r   )r    r!   r"   r(   r   r   r  r  s   @r   r  r    s^        + + + + + +@ @ @      r   r  c                       e Zd Zd ZdS )!RejectingSocketlessRequestHandlerc                 D    |                      t          j                   dS )NF)rn   r	   EXPECTATION_FAILEDr5   s    r   handle_expect_100z3RejectingSocketlessRequestHandler.handle_expect_100  s    
5666ur   N)r    r!   r"   r!  r   r   r   r  r    s#            r   r  c                   6    e Zd Zd Zd Zd Zed             ZdS )AuditableBytesIOc                     g | _         d S r   )datasr5   s    r   r(   zAuditableBytesIO.__init__  s    


r   c                 :    | j                             |           d S r   )r%  r  )r   r   s     r   r~   zAuditableBytesIO.write  s    
$r   c                 6    d                     | j                  S )Nr   )r9   r%  r5   s    r   getDatazAuditableBytesIO.getData  s    xx
###r   c                 *    t          | j                  S r   )r   r%  r5   s    r   	numWriteszAuditableBytesIO.numWrites  s    4:r   N)r    r!   r"   r(   r~   r(  propertyr*  r   r   r   r#  r#    s\               $ $ $   X  r   r#  c                       e Zd ZdZ ej        d          Zd Zd Zd Z	d Z
d Zd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )BaseHTTPRequestHandlerTestCasezrTest the functionality of the BaseHTTPServer.

       Test the support for the Expect 100-continue header.
       s   HTTP/1.[0-9]+ 200 OKc                 ,    t                      | _        d S r   )r  handlerr5   s    r   rG   z$BaseHTTPRequestHandlerTestCase.setUp  s    /11r   c                     t          |          }t                      }|| j        _        || j        _        | j                                         |                    d           |                                S Nr   )r   r/  rfiler}   handle_one_requestseek	readlines)r   r  inputoutputs       r   send_typical_requestz3BaseHTTPRequestHandlerTestCase.send_typical_request  sa      "#'')))A!!!r   c                 D    |                      | j        j                   d S r   )r   r/  r  r5   s    r   verify_get_calledz0BaseHTTPRequestHandlerTestCase.verify_get_called  s    /00000r   c                 p    dD ]1|                      t          fd|D                       d           2d S )N)s   Server: s   Date: s   Content-Type: c              3   B   K   | ]}|                               V  d S r   )rf  ).0h	fieldNames     r   	<genexpr>zIBaseHTTPRequestHandlerTestCase.verify_expected_headers.<locals>.<genexpr>  s/       J JQi!8!8 J J J J J Jr   r   )r   sum)r   rW   r?  s     @r   verify_expected_headersz6BaseHTTPRequestHandlerTestCase.verify_expected_headers  sV    B 	O 	OIS J J J J' J J JJJANNNN	O 	Or   c                 d    | j                             |          }|                     |           d S r   )HTTPResponseMatchsearchr9  )r   r4  matchs      r   verify_http_server_responsez:BaseHTTPRequestHandlerTestCase.verify_http_server_response  s2    &--h77U#####r   c                 8   d| j         _        t          j        }t          j                            t          dt                                5 } || j         d            || j         d            || j         dd            || j         dd            || j         d           d d d            n# 1 swxY 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.r  u    beansz"GET /foo\b"ar HTTP/1.0" r   z/\x1bbar\x00\x1br   z/spam a.   u   /spam \x1b\x7f\x9f beans.   z"GET /foo\\b"ar\x07 HTTP/1.0"   )r/  client_addressr   r   r
   patchobjectrI  r   r   assertNotIn
splitlinesr   )r   r   fake_stderrrJ  r   s        r   test_unprintable_not_loggedz:BaseHTTPRequestHandlerTestCase.test_unprintable_not_logged  s    ':#,8ZsHhjj99 	G[Kf---K&8999Kk3777Kk3JKKKK&EFFF	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G %%''((((((!!##feAh''')58444j%(+++7qBBB6aAAAAAs   AB//B36B3c                 d   |                      d          }|                     |d                    |                     |dd                    |                                  |                     |d         d           |                     | j        j        d           |                     | j        j        d           |                     | j        j        d           |                     | j        j	        d	           | 
                    | j        j                                        d
           d S )N   GET / HTTP/1.1

r   r   r  GET / HTTP/1.1rL   r   r\   r   r8  rG  rB  r:  r   r/  requestlinecommandr   request_versionassertSequenceEqualrW   r  r   results     r   test_http_1_1z,BaseHTTPRequestHandlerTestCase.test_http_1_1     **+DEE((333$$VAbD\222   %JKKK13CDDD-u555*C0005zBBB  !5!;!;!=!=rBBBBBr   c                 d   |                      d          }|                     |d                    |                     |dd                    |                                  |                     |d         d           |                     | j        j        d           |                     | j        j        d           |                     | j        j        d           |                     | j        j	        d	           | 
                    | j        j                                        d
           d S )Ns   GET / HTTP/1.0

r   r   rY  r  GET / HTTP/1.0rL   r   HTTP/1.0r   r[  r`  s     r   test_http_1_0z,BaseHTTPRequestHandlerTestCase.test_http_1_0"  rc  r   c                     |                      d          }|                     t          |          d           |                     |d         d           |                                  d S )Ns   GET / HTTP/0.9

r   r   r  )r8  r   r   r:  r`  s     r   test_http_0_9z,BaseHTTPRequestHandlerTestCase.test_http_0_9.  se    **+DEEVa((($IJJJ     r   c                 *   |                      d          }|                     |d                             d                     |                     |d|                    d                              |                     | j        j                   d S )Ns)   GET /spaced out HTTP/1.1
Host: dummy

r   s   HTTP/1.1 400 r      
)r8  r   rf  rB  indexre  r/  r  r`  s     r   test_extra_spacez/BaseHTTPRequestHandlerTestCase.test_extra_space4  s    **
 

 	q	,,-=>>???$$VAfll7.C.C,C%DEEE011111r   c                 h   |                      d          }|                     |d                    |                     |dd                    |                                  |                     |d         d           |                     | j        j        d           |                     | j        j        d           |                     | j        j        d           |                     | j        j	        d	           d
}| 
                    | j        j                                        |           d S )Ns(   GET / HTTP/1.0
Expect: 100-continue

r   r   rY  r  re  rL   r   rf  )Expectz100-continuer[  r   ra  rW   s      r   test_with_continue_1_0z5BaseHTTPRequestHandlerTestCase.test_with_continue_1_0>  s   **+\]]((333$$VAbD\222   %JKKK13CDDD-u555*C0005zBBB/  !5!;!;!=!=wGGGGGr   c                    |                      d          }|                     |d         d           |                     |d         d           |                     |d         d           |                     |dd                    |                                  |                     |d         d	           |                     | j        j        d
           |                     | j        j        d           |                     | j        j        d           |                     | j        j        d           d}| 	                    | j        j
                                        |           d S )N(   GET / HTTP/1.1
Expect: 100-continue

r   s   HTTP/1.1 100 Continue
r   rk  rM  s   HTTP/1.1 200 OK
rY  r  rZ  rL   r   r\   ro  )r8  r   rB  r:  r/  r\  r]  r   r^  r_  rW   r  rq  s      r   test_with_continue_1_1z5BaseHTTPRequestHandlerTestCase.test_with_continue_1_1K  sN   **+\]]$@AAAG,,,$:;;;$$VAbD\222   %JKKK13CDDD-u555*C0005zBBB/  !5!;!;!=!=wGGGGGr   c                    t          d          }t                      }t                      }||_        ||_        d|_        d|_        d |_        |                    d           | 	                    |j
        d           d S )NrX  r\   r     rM  )r   r#  r  r2  r}   r^  r\  r]  rn   r   r*  r   r6  r7  r/  s       r   #test_header_buffering_of_send_errorzBBaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_errorZ  s~    122!##*,,", 3)1-----r   c                 D   t          d          }t                      }t                      }||_        ||_        d|_        |                    d           |                     |j        d           |	                                 |                     |j        d           d S )NrX  r\   rw  r   r   )
r   r#  r  r2  r}   r^  send_response_onlyr   r*  rf   rx  s       r   +test_header_buffering_of_send_response_onlyzJBaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_response_onlyh  s    122!##*,,",""3''')1---)1-----r   c                    t          d          }t                      }t                      }||_        ||_        d|_        |                    dd           |                    dd           |                     |j        d           |	                                 |                     |
                                d           |                     |j        d           d S )	NrX  r\   Foofoobarr   s   Foo: foo
bar: bar

r   )r   r#  r  r2  r}   r^  re   r   r*  rf   r(  rx  s       r   $test_header_buffering_of_send_headerzCBaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_headerv  s    122!##*,,",E5)))E5))))1---))+JKKK)1-----r   c                    d }t          d          }t                      }|| j        _        || j        _        d| j        _        | j                                         |                      ||          d            ||                              d          }|                     |d         d           |                     |d         d           |                     |d	         d
           d S )Nc                     |                                  }|                     d           |                                 }|                     |           |S r1  )tellr4  r   )rU  posr   s      r   _readAndReseekz[BaseHTTPRequestHandlerTestCase.test_header_unbuffered_when_continue.<locals>._readAndReseek  s?    &&((CFF1III6688DFF3KKKKr   rt  r\   r   rk  r   s   HTTP/1.1 100 Continuer   rM  s   HTTP/1.1 200 OK)	r   r/  r2  r}   r^  r3  assertNotEqualr   r   )r   r  r6  r7  ra  s        r   $test_header_unbuffered_when_continuezCBaseHTTPRequestHandlerTestCase.test_header_unbuffered_when_continue  s    	 	 	 IJJ"#'1$'')))NN622C888''--g66$<===C((($677777r   c                    | j         }t                      | _         |                     d          }|                     |d         d           |                     |dd                    |                     | j         j                   |                     t          d |dd         D                       d           || _         d S )Nrt  r   s!   HTTP/1.1 417 Expectation Failed
r   rY  c              3   "   K   | ]
}|d k    V  dS )s   Connection: close
Nr   )r=  rs     r   r@  zMBaseHTTPRequestHandlerTestCase.test_with_continue_rejected.<locals>.<genexpr>  s(      QQqQ"::QQQQQQr   )r/  r  r8  r   rB  re  r  rA  )r   usual_handlerra  s      r   test_with_continue_rejectedz:BaseHTTPRequestHandlerTestCase.test_with_continue_rejected  s    8::**+\]]$JKKK$$VAbD\222 	0111QQF1R4LQQQQQSTUUU$r   c                     |                      dddz  z             }|                     |d         d           |                     | j        j                   |                     | j        j        t                     d S )Ns   GET    x  r   s#   HTTP/1.1 414 Request-URI Too Long
)r8  r   re  r/  r  assertIsInstancer\  r}  r`  s     r   test_request_lengthz2BaseHTTPRequestHandlerTestCase.test_request_length  su     **7TE\+ABB$LMMM0111dl6<<<<<r   c                     |                      dddz  z   dz             }|                     |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
rZ  r8  r   re  r/  r  r\  r`  s     r   test_header_lengthz1BaseHTTPRequestHandlerTestCase.test_header_length  s    **+dUl:[HJ J$EFFF011113CDDDDDr   c                     |                      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
rZ  r  r`  s     r   test_too_many_headersz4BaseHTTPRequestHandlerTestCase.test_too_many_headers  sr    **EG G$HIII011113CDDDDDr   c                     |                      d          }d                    |          }d}|                     t          j        |d                              d          |           d S )Ns*   <script>alert("hello")</script> / HTTP/1.1r   z<script>alert("hello")</script>FrF  r  )r8  r9   r   rQ  rR  r|   )r   ra  texts      r   test_html_escape_on_errorz8BaseHTTPRequestHandlerTestCase.test_html_escape_on_error  sg    **9; ;&!!0dk$e444;;GDDfMMMMMr   c                 R     fd}| j         _        t          d           j                                                               t
          t                     t          d           j                                                               t
          t                     d S )Nc                  :    t                     j        _        d S r   )nextr/  close_connection)close_valuesr   s   r   r3  zPBaseHTTPRequestHandlerTestCase.test_close_connection.<locals>.handle_one_request  s    ,0,>,>DL)))r   )T)FFT)r/  r3  iterhandler  StopIterationr  )r   r3  r  s   ` @r   test_close_connectionz4BaseHTTPRequestHandlerTestCase.test_close_connection  s    	? 	? 	? 	? 	? 	?*<'G}}-|<<<011-|<<<<<r   c           	         t          j                     }t          j        |          \	  }}}}}}}}	}
d| j        j        |         || j        j        |         ||||fz  }|                     | j                            |          |           d S )Nz#%s, %02d %3s %4d %02d:%02d:%02d GMT)r%  )timegmtimer/  weekdayname	monthnamer   date_time_string)r   nowyearmonthdayhhmmsswdyzr  s               r   test_date_time_stringz4BaseHTTPRequestHandlerTestCase.test_date_time_string  s    ikk15S1A1A.eS"b"b!Q8L$R(L"5)"b"	<
 
 	666EExPPPPPr   N)r    r!   r"   __doc__recompilerD  rG   r8  r:  rB  rG  rV  rb  rg  ri  rm  rr  ru  ry  r|  r  r  r  r  r  r  r  r  r  r   r   r   r-  r-    s        
 #
#:;;2 2 2" " "1 1 1O O O$ $ $B B B*
C 
C 
C
C 
C 
C! ! !2 2 2H H HH H H. . .. . .. . . 8 8 8,
% 
% 
%= = =E E EE E EN N N= = =
Q 
Q 
Q 
Q 
Qr   r-  c                   *    e Zd ZdZd Zd Zd Zd ZdS ) SimpleHTTPRequestHandlerTestCasez Test url parsing c                    t           j                            t          j                    d          | _        t           j                            dd          | _        t           j                            dd          | _        t                      | _        t          d          | _	        t          t          j        d                    | _        d S )NrT  r  r  r  )rA   r   r9   r  translated_1translated_2translated_3r  	handler_1	handler_2pathlibPurePath	handler_3r5   s    r   rG   z&SimpleHTTPRequestHandlerTestCase.setUp  s    GLLjAAGLL
;;GLL
;;1331EBBB1G<LU<S<STTTr   c                    | 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_pathr   r  r  r  r  r  r   r   s     r   test_query_argumentsz5SimpleHTTPRequestHandlerTestCase.test_query_arguments  s   ~,,[99t0111~,,[99t0111~,,[99t0111~,,-@AAt0111~,,-@AAt0111~,,-@AAt0111~,,-JKKt0111~,,-JKKt0111~,,-JKKt011111r   c                    | 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  s     r   test_start_with_double_slashz=SimpleHTTPRequestHandlerTestCase.test_start_with_double_slash  s   ~,,\::t0111~,,\::t0111~,,\::t0111~,,-ABBt0111~,,-ABBt0111~,,-ABBt011111r   c                 j	   t          j        t          j        dt                    5  | 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                   d d d            d S # 1 swxY w Y   d S )Nr   zc:c:c:foo/filenamez\c:../filenamezc:\c:..\foo/filenamezc:c:foo\c:c:bar/filename)r   	swap_attrr   rA   ntpathr  r  r   sepr   r  r  r  r  r  r  s     r   test_windows_colonz3SimpleHTTPRequestHandlerTestCase.test_windows_colon  s   vy&&99 '	6 '	6>001EFFD<<
BF33DT4#4555>001EFFD<<
BF33DT4#4555>001EFFD<<
BF33DT4#4555>001BCCD<<
BF33DT4#4555>001BCCD<<
BF33DT4#4555>001BCCD<<
BF33DT4#4555>001IJJD<<
BF33DT4#4555>001IJJD<<
BF33DT4#4555>001IJJD<<
BF33DT4#4555>001LMMD<<
BF33DT4#4555>001LMMD<<
BF33DT4#4555>001LMMD<<
BF33DT4#4555O'	6 '	6 '	6 '	6 '	6 '	6 '	6 '	6 '	6 '	6 '	6 '	6 '	6 '	6 '	6 '	6 '	6 '	6s   Q5R((R,/R,N)r    r!   r"   r  rG   r  r  r  r   r   r   r  r    sY        U U U2 2 2,2 2 2(6 (6 (6 (6 (6r   r  c                       e Zd Zd ZdS )MiscTestCasec                 2   g }h d}t          t                    D ][}|                    d          s||v rt          t          |          }t          |dd           dk    r|                    |           \|                     t          j        |           d S )N>   r  r  
nobody_uid_r!   zhttp.server)r  r   rf  getattrr  assertCountEqual__all__)r   r  denylistrV  module_objects        r   test_allzMiscTestCase.test_all=  s    777KK 	& 	&Ds## tx'7'7#FD11M}lD99]JJ%%%fnh77777r   N)r    r!   r"   r  r   r   r   r  r  <  s#        	8 	8 	8 	8 	8r   r  c                       e Zd Zd Z ej        d          d             Z ej        d          d             ZdZdZ	 ej        d          d             Z
 ej        d          d             Zd	S )
ScriptTestCasec                     t          j        t          j        t          j        t          j        t          j        d                                                   S )Nc                      dS )N)r   r   r   r   r   r   <lambda>z2ScriptTestCase.mock_server_class.<locals>.<lambda>Q  s     r   )r.   )r-   )r  )r  )r
   	MagicMockr5   s    r   mock_server_classz ScriptTestCase.mock_server_classK  sp    ~.!%#~(7     " " "    

 

 

 
	
r   zbuiltins.printc                     |                                  }t          j        |d            |                     |j        t
          j        t
          j        f           d S NServerClassbindr  r   r  r   address_familyr-   AF_INET6AF_INETr   r  mock_servers      r   test_server_test_unspecz&ScriptTestCase.test_server_test_unspecX  sZ    ,,..$7777&_fn-	
 	
 	
 	
 	
r   c                     |                                  }t          j        |d           |                     |j        t
          j        t
          j        f           d S )Nr,   r  r  r  s      r   test_server_test_localhostz)ScriptTestCase.test_server_test_localhosta  sZ    ,,..+>>>>&_fn-	
 	
 	
 	
 	
r   )z::z'2001:0db8:85a3:0000:0000:8a2e:0370:7334z::1)z0.0.0.0z8.8.8.8rI  c                     | j         D ]Q}|                                 }t          j        ||           |                     |j        t          j                   Rd S r  )
ipv6_addrsr  r   r  r   r  r-   r  r   r  r  r  s       r   test_server_test_ipv6z$ScriptTestCase.test_server_test_ipv6v  se    O 	J 	JD0022KKKd;;;;[7IIII	J 	Jr   c                     | j         D ]Q}|                                 }t          j        ||           |                     |j        t          j                   Rd S r  )
ipv4_addrsr  r   r  r   r  r-   r  r  s       r   test_server_test_ipv4z$ScriptTestCase.test_server_test_ipv4}  se    O 	I 	ID0022KKKd;;;;[7HHHH	I 	Ir   N)r    r!   r"   r  r
   rQ  r  r  r  r  r  r  r   r   r   r  r  I  s        
 
 
 TZ !!
 
 "!
 TZ !!
 
 "!
JJ TZ !!J J "!J TZ !!I I "!I I Ir   r  c                  f    t          j        t          j        t          j                               d S r   )r  addModuleCleanuprA   r  r  r   r   r   setUpModuler    s#    bh	44444r   __main__)Cr  collectionsr   http.serverr   r   r   r   rN   r   r	   rA   r-   rI  r  r  r  r  r.  email.messager"  email.utilsrQ  http.clienturllib.parserO  r  r  r  r&   r  r
   ior   r   r  r   test.supportr   r   requires_working_socketr   r'   r$   TestCaser<   rY   r   r  r  r  r  r  r  hasattrry  r  r  r  r#  r-  r  r  r  r  r    mainr   r   r   <module>r     s   
 $ # # # # #5 5 5 5 5 5 5 5 5 5 5 5 # # # # # # # # 				  



 				                                                              " " " " " " ) ) ) ) ) )  t , , , ,           y'   *- - - - -8$ - - -*a( a( a( a( a(\ a( a( a(H!G !G !G !G !GL !G !G !GH`3 `3 `3 `3 `3| `3 `3 `3F			"		& Y''=JBJLLA,=AC Cz4 z4 z4 z4 z4L z4 z4C Cz4z    7   &    (@           }Q }Q }Q }Q }QX%6 }Q }Q }Q@W6 W6 W6 W6 W6x'8 W6 W6 W6t
8 
8 
8 
8 
88$ 
8 
8 
89I 9I 9I 9I 9IX& 9I 9I 9Ix5 5 5 zHMOOOOO r   