
    daf                        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 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%jR                  d        G d d      Z* G d dejV                        Z, G d dejZ                        Z. G d de.      Z/ G d de.      Z0 G d de.      Z1dZ2dZ3dZ4dZ5 ejl                   e7ed      xr  ejp                         dk(  d       G d d e.             Z9 G d! d"e      Z: G d# d$e:      Z; G d% d&      Z< G d' d(ejZ                        Z= G d) d*ejZ                        Z> G d+ d,ejZ                        Z? G d- d.ejZ                        Z@d/ ZAeBd0k(  r ej                          yy)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y)NoLogRequestHandlerc                      y N )selfargss     0/root/Python-3.12.4/Lib/test/test_httpservers.pylog_messagezNoLogRequestHandler.log_message(   s        Nc                      yN r   )r   ns     r   readzNoLogRequestHandler.read,   s    r   r   )__name__
__module____qualname__r   r   r   r   r   r   r   '   s    r   r   c                       e Zd Zd Zd Zd Zy)TestServerThreadc                 ^    t         j                  j                  |        || _        || _        y r   )	threadingThread__init__request_handlertest_object)r   r*   r)   s      r   r(   zTestServerThread.__init__1   s&    !!$'.&r   c                    t        d| j                        | _        | j                  j                  j	                         \  | j
                  _        | j
                  _        | j
                  j                  j                          d | _        	 | j                  j                  d       | j                  j                          y # | j                  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.run6   s     !143G3GH7;{{7I7I7U7U7W4t//4''++-	'KK%%d+KK$$&DKK$$&s   C Cc                 X    | j                   j                          | j                          y r   )r   shutdownjoinr5   s    r   stopzTestServerThread.stop@   s    		r   N)r    r!   r"   r(   r6   r:   r   r   r   r$   r$   0   s    '
'r   r$   c                   &    e Zd Zd Zd Zddi fdZy)BaseTestCasec                 @   t        j                         | _        t        j                         t
        _        t        j                         | _	        t        | | j                        | _        | j                  j                          | j                  j                          y r   )r   threading_setup_threadsr   EnvironmentVarGuardosenvironr&   Eventr1   r$   r)   threadstartwaitr5   s    r   setUpzBaseTestCase.setUpF   sg    (88:224
'oo/&tT-A-AB  "r   c                     | j                   j                          d | _         t        j                  j	                          t        j                  | j                    y r   )rD   r:   rA   rB   __exit__r   threading_cleanupr?   r5   s    r   tearDownzBaseTestCase.tearDownN   s;    


**DMM:r   GETNc                     t         j                  j                  | j                  | j                        | _        | j
                  j                  ||||       | j
                  j                         S r   )httpclientHTTPConnectionr/   r0   
connectionrequestgetresponse)r   urimethodbodyheaderss        r   rR   zBaseTestCase.requestT   sM    ++44TYY		JT7;**,,r   )r    r!   r"   rG   rK   rR   r   r   r   r<   r<   E   s    #; #(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y)BaseHTTPServerTestCasec                   J    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y)&BaseHTTPServerTestCase.request_handlerHTTP/1.1c                     | j                  t        j                         | j                  dd       | j                  dd       | j	                          y )NContent-Type	text/html
Connectionclosesend_responser	   
NO_CONTENTsend_headerend_headersr5   s    r   do_TESTz.BaseHTTPServerTestCase.request_handler.do_TEST_   sB    z445^[9\73r   c                     | j                  t        j                         | j                  dd       | j                  dd       | j	                          y )Nr^   r_   r`   
keep-aliverb   r5   s    r   do_KEEPz.BaseHTTPServerTestCase.request_handler.do_KEEPe   sB    z445^[9\<8r   c                 &    | j                  d       y )N  
send_errorr5   s    r   do_KEYERRORz2BaseHTTPServerTestCase.request_handler.do_KEYERRORk   s    OOC r   c                 B    | j                  t        j                         y r   rn   r	   	NOT_FOUNDr5   s    r   do_NOTFOUNDz2BaseHTTPServerTestCase.request_handler.do_NOTFOUNDn   s    OOJ001r   c                 *    | j                  ddd       y )Nrl   zShort MessagezThis is a long 
 explanationrm   r5   s    r   do_EXPLAINERRORz6BaseHTTPServerTestCase.request_handler.do_EXPLAINERRORq   s    OOC;=r   c                     | j                  d       | j                  dd       | j                  dd       | j                          y )Nrl   r^   r_   r`   ra   )rc   re   rf   r5   s    r   	do_CUSTOMz0BaseHTTPServerTestCase.request_handler.do_CUSTOMu   s<    s#^[9\73r   c                     | j                  d       | j                  dd       | j                  dd       | j                          | j                  d   j	                  d      }| j
                  j                  |       y )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_LATINONEHEADER{   si    s#[*;<\73<< 45<<WEDJJT"r   c                 R    | j                  t        | j                  dd               y N   rn   intpathr5   s    r   do_SEND_ERRORz4BaseHTTPServerTestCase.request_handler.do_SEND_ERROR       OOC		!"./r   c                 R    | j                  t        | j                  dd               y 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[   [   s;    %",			!	2	=		#	0	0r   r)   c                     t         j                  |        t        j                  j	                  | j
                  | j                        | _        | j                  j                          y r   )	r<   rG   rN   rO   rP   r/   r0   conconnectr5   s    r   rG   zBaseHTTPServerTestCase.setUp   s@    4 ;;--diiCr   c                     | j                   j                  dd       | j                   j                         }| j                  |j                  t
        j                         y )NrL   /)r   rR   rS   assertEqualstatusr	   NOT_IMPLEMENTEDr   ress     r   test_commandz#BaseHTTPServerTestCase.test_command   sB    $hh""$Z%?%?@r   c                    d| j                   _        | j                   j                  dd       | j                   j                          | j                   j	                         }| j                  |j                  t        j                         y )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   s^    !-J,hh""$Z%?%?@r   c                    d| j                   _        | j                   j                  dd       | j                   j                          | j                   j	                         }| j                  |j                  t        j                         y )NFUBARrL   r   	r   r   r   r   rS   r   r   r	   BAD_REQUESTr   s     r   test_version_bogusz)BaseHTTPServerTestCase.test_version_bogus   s^    !(E3'hh""$Z%;%;<r   c                    d| j                   _        | j                   j                  dd       | j                   j                          | j                   j	                         }| j                  |j                  t        j                         y )Nz
HTTP/9.9.9rL   r   r   r   s     r   test_version_digitsz*BaseHTTPServerTestCase.test_version_digits   s^    !-E3'hh""$Z%;%;<r   c                    d| j                   _        | j                   j                  dd       | j                   j                          | j                   j	                         }| j                  |j                  t        j                         y )NzHTTP/-9_9_9.+9_9_9rL   r   r   r   s     r   "test_version_signs_and_underscoresz9BaseHTTPServerTestCase.test_version_signs_and_underscores   s^    !5E3'hh""$Z%;%;<r   c                    d| j                   _        | j                   j                  dd       | j                   j                          | j                   j	                         }| j                  |j                  t        j                         y )NzHTTP/909876543210.0rL   r   r   r   s     r   "test_major_version_number_too_longz9BaseHTTPServerTestCase.test_major_version_number_too_long   ^    !6E3'hh""$Z%;%;<r   c                    d| j                   _        | j                   j                  dd       | j                   j                          | j                   j	                         }| j                  |j                  t        j                         y )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                   j                  dd       | j                   j                          | j                   j	                         }| j                  |j                  t        j                         y )Nr   rL   r   r   r   s     r   test_version_none_getz,BaseHTTPServerTestCase.test_version_none_get   s^    !#E3'hh""$Z%?%?@r   c                    d| j                   _        | j                   j                  dd       | j                   j                          | j                   j	                         }| j                  |j                  t        j                         y )Nr   CUSTOMr   r   r   s     r   test_version_nonez(BaseHTTPServerTestCase.test_version_none   s^    !#Hc*hh""$Z%;%;<r   c                 <   d| j                   _        d| j                   _        | j                   j                  dd       | j                   j	                          | j                   j                         }| j                  |j                  t        j                         y )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   sj    !+E3'hh""$Z%J%JKr   c                    d| j                   _        | j                   j                  dd       | j                   j                          | j                   j	                         }| j                  |j                  t        j                         y r   r   r   s     r   test_send_blankz&BaseHTTPServerTestCase.test_send_blank   s^    !#B#hh""$Z%;%;<r   c                 0   | j                   j                  dd       | j                   j                  dd       | j                   j                          | j                   j	                         }| j                  |j                  t        j                         y )NrL   r   r`   ra   )	r   r   	putheaderr   rS   r   r   r	   r   r   s     r   test_header_closez(BaseHTTPServerTestCase.test_header_close   sf    E3'<1hh""$Z%?%?@r   c                 R   d| j                   _        | j                   j                  dd       | j                   j                  dd       | j                   j	                          | j                   j                         }| j                  |j                  t        j                         y )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   sr    !+E3'<6hh""$Z%?%?@r   c                     | j                   j                  dd       | j                   j                         }| j                  |j                  t
        j                         y )NTESTr   )r   rR   rS   r   r   r	   rd   r   s     r   test_handlerz#BaseHTTPServerTestCase.test_handler   sB    %hh""$Z%:%:;r   c                 4   | j                   j                  dd       | j                   j                         }| j                  |j	                  d      d       | j                   j                  dd       | j                  | j                   j                         y )NKEEPr   r`   ri   r   )r   rR   rS   r   	getheader
addCleanupra   r   s     r   test_return_header_keep_alivez4BaseHTTPServerTestCase.test_return_header_keep_alive   si    %hh""$|4lC%'r   c                     | j                   j                  dd       | j                   j                         }| j                  |j                  d       y )NKEYERRORr   rl   r   rR   rS   r   r   r   s     r   test_internal_key_errorz.BaseHTTPServerTestCase.test_internal_key_error   s<    S)hh""$S)r   c                     | j                   j                  dd       | j                   j                         }| j                  |j                  d       y )Nr   r   rl   r   r   s     r   test_return_custom_statusz0BaseHTTPServerTestCase.test_return_custom_status   s<    3'hh""$S)r   c                     | j                   j                  dd       | j                   j                         }| j                  |j                  d       | j                  t        |j                  d                   y )NEXPLAINERRORr   rl   Content-Length)r   rR   rS   r   r   
assertTruer   r   r   s     r   test_return_explain_errorz0BaseHTTPServerTestCase.test_return_explain_error   sW    -hh""$S)CMM*:;<=r   c                    | j                   j                  ddddi       | j                   j                         }| j                  |j	                  d      d       | j                  |j                         dj                  d             y )	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  sw    )3 (<9
 	 hh""${35FG%9%@%@%IJr   c                 J   | j                   j                  dd       | j                   j                         }| j                  |j                  t
        j                         |j                         }| j                  t        |j                  d            t        |             y )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  sp    S)hh""$Z%9%9:xxzS]]+;<=s4yIr   c                    t         j                  t         j                  f}t         j                  t         j                  t         j                  t         j                  t         j
                  fD ]  }| j                  j                  ddj                  |             | j                  j                         }| j                  ||j                         | j                  d |j                  d             | j                  d |j                  d             ||vr!| j                  d |j                  d             |j                         }| j                  d|        y )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  s   )3)@)@)3)A)A)C%**J,C,C**J,D,D335 	(D HH\5<<+=>((&&(CT3::.T3==1A#BCT3==#@A88  s}}5H'IJ88:DS$'	(r   c                    t         j                  t         j                  f}t         j                  t         j                  t         j                  t         j                  t         j
                  fD ]N  }| j                  j                  ddj                  |             | j                  j                         }| j                  ||j                         |t         j                  k(  rN| j                  t        |j                  d            dkD         | j                  d|j                  d             nB| j                  d |j                  d             | j                  d |j                  d             ||vr!| j                  d |j                  d             |j!                         }| j                  d|       Q y )	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(  sP   )3)@)@)3)A)A)C%]]J$9$9,,j.F.F335 	(D HHVU\\$%78((&&(CT3::.z}}$CMM2B$C Dq HIk3==+HI  s}}5E'FG  s}}^'DE88  s}}5H'I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   Z   s    ,0-/E ,0\
A
A=====A=L=AA<
(*
*
>KJ("(r   rY   c                   .    e Zd Z G d de      Zd Zd Zy)RequestHandlerLoggingTestCasec                        e Zd ZdZdZd Zd Zy)-RequestHandlerLoggingTestCase.request_handlerr\   c                 b    | j                  t        j                         | j                          y r   )rc   r	   r   rf   r5   s    r   do_GETz4RequestHandlerLoggingTestCase.request_handler.do_GETC  s     z}}-r   c                 D    | j                  t        j                  d       y )NzFile not foundrq   r5   s    r   do_ERRORz6RequestHandlerLoggingTestCase.request_handler.do_ERRORG  s    OOJ002BCr   N)r    r!   r"   r   r   r   r   r   r   r   r)   r   ?  s    %",		Dr   r)   c                    t         j                  j                  | j                  | j                        | _        | j
                  j                          t        j                         5 }| j
                  j                  dd       | j
                  j                          d d d        | j                  j                         j                  d             y # 1 sw Y   8xY w)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_getJ  s    ;;--diiC$$& 	##HHUC(HH  "	# 	LLN##$>?	A		# 	#s   (7CCc                 2   t         j                  j                  | j                  | j                        | _        | j
                  j                          t        j                         5 }| j
                  j                  dd       | j
                  j                          d d d        j                         j                  d      }| j                  |d   j                  d             | j                  |d   j                  d             y # 1 sw Y   oxY w)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_errU  s    ;;--diiC$$& 	##HHWc*HH  "	# $$T*a))*LMNa))*DEF	# 	#s   (7DDN)r    r!   r"   r   r)   r   r   r   r   r   r   r   >  s    	D0 	D	A
Gr   r   c                   \    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y)(SimpleHTTPServerTestCase.request_handlerN)r    r!   r"   r   r   r   r)   r  c  s    r   r)   c                    t         |           t        j                         | _        t        j                         }t        j                  |       d| _        t        j                  |      | _
        t        j                  j                  | j                        | _        d| j                  z   | _        t        j                  j                  | j                  d      }t!        |d      5 }|j#                  | j                         |j%                          d d d        t        j&                  |      j(                  }t*        j*                  j-                  |t*        j.                  j0                        }|j3                  d      | _        t6        j8                  j;                  |j=                         d	      | _        y # 1 sw Y   xY w)
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.setUpf  sH   99;))+
5	''K8GG,,T\\:d///77<<f5(D! 	TJJtyy!JJL	 !**&&44U!!#
#-#5#5!#5#D !&!7!7  "4 "8 "1	 	s   ,,GGc                     	 t        j                  | j                         	 t        j                  | j
                         t        |           y #  Y xY w# t        |           w xY wr   )rA   r  r  shutilrmtreer  r
  rK   r   r)  s    r   rK   z!SimpleHTTPServerTestCase.tearDown{  sP    	HHTXXdll+ GGs   A A AA A(c                    fd}d |_         j                         }| j                         | j                  j                  |       | j                  j                         |r| j                  ||       | j                  j                  d       | j                  j                  j                  dd      d       | j                  j                  d      dd       j                          |S )Nc                  ,    j                    d_         y)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HKr   
   r`   ra      r   zConnection should be closed)_close_connr   r   r   r   assertIsNotNonereasonversionmsggetra   )r   r2  r   r   r3  rV   r1  s    `    @r   check_status_and_reasonz0SimpleHTTPServerTestCase.check_status_and_reason  s    	 )}}!&1X__-T4( 	))2.)),@'JR#/L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                  | j                  |      d      5 }|j                  t        j
                         d d d        | j                  | j                  dz         }t         j                  dk(  r-t        j                  | j                        D ]  }|dk7  s	|} n | j                  |t         j"                        }t$        j&                  j)                  |d      }| j+                  d|z  j-                  |d	      |       | j+                  d
t/        j0                  |d      z  j-                  |d	      |       | j                  | j                  dz   |z         }| j                  |t         j"                  t        j
                         y # 1 sw Y   ZxY w)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parserE  r   r|   htmlescape)r   encfilenamefr2  namerV   
quotednames           r   test_undecodable_filenamez2SimpleHTTPServerTestCase.test_undecodable_filename  s    '');;y;;<vE"'',,t||X6= 	2GGI001	2<< 34<<8# 

4<<0 6>#H ++HjmmD\\'''I
{Z/vc#45t	=vHE BBvc#45t	=<< 3j @A$$Xz}}*3*F*F 	% 	H#	2 	2s   / G''G1c                 p   | j                  | j                  dz         j                         }| j                  |d| j                   dj	                  d             | j                  | j                  dz         j                         }| j                  |d| j                   dj	                  d             y )Nz/?x=123zlisting for z/\?x=123latin1z/?x=%bbz/\?x=\xef\xbf\xbd)rR   r  r   assertRegexr|   r   r2  s     r   test_undecodable_parameterz3SimpleHTTPServerTestCase.test_undecodable_parameter  s    <<	 9:??Al4==/#J#Q#QRZ#[\<<	 9:??Al4==/AR#S#Z#Z[c#der   c                    t        j                  t         j                  j                  | j                  d             d| j
                   d}| d}| j                  |      }| j                  |t        j                         |j                  d      }| j                  ||d       d| }| j                  |      }| j                  |t        j                         |j                  d      }| j                  |j                  d      |       | j                  ||d	       d| }| j                  |      }| j                  |t        j                         | j                  |j                  d      |       d
| }| d}| j                  |      }| j                  |t        j                         |j                  d      }| j                  |j                  d
      |       y)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_locationr2  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    	dll,@ABB4CTCTBUUhi"e1I <<$$$Xz/K/KL%%j1#4:NO Y
<<
+$$Xz/K/KL%%j1,,T2A#4@ 	 	A
 3%j<<,$$Xz/K/KL++J79JK ->cU*C'-L,MQ*O'<< ?@$$Xz/K/KL%%j1 	++,?@hOr   c                 .   | j                  | j                  dz         }| j                  |t        j                  | j
                         | j                  | j                  dz         }| j                  |t        j                         | j                  | j                  dz         }| j                  |t        j                         | j                  | j                        }| j                  |t        j                         | j                  |j                  d      d       | j                  | j                  dz         }| j                  |t        j                         | j                  | j                  dz         }| j                  |t        j                         | j                  |j                  d	      | j                  d
z          | j                  d      }| j                  |t        j                         | j                  d      }| j                  |t        j                         t        j                  t        j                  j                  | j                  dd             | j                  | j                  dz         }| j                  |t        j                         d}t        t        j                  j                  | j                   d      d      5 }|j#                  |       d d d        | j                  | j                  dz         }| j                  |t        j                  |       t        j$                  dk(  rt        j&                         dk7  rt        j(                  | j                  d       	 | j                  | j                  dz         }| j                  |t        j                         t        j(                  | j                  d       y y y # 1 sw Y   xY w# t        j(                  | j                  d       w xY w)N/testrF  /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   rb  r   r   rA   makedirsr   r9   r  r  r  r~   rT  geteuidchmod)r   r2  r   rS  s       r   r   z!SimpleHTTPServerTestCase.test_get  s   << 78$$Xz}}499$M<< 89$$Xz/C/CD<< 34$$Xz}}=<<.$$Xz/K/KL++,<=sC<< 89$$Xz}}=<< 78$$Xz/K/KL++J71	3<< 34$$Xz/C/CD<< >?$$Xz/C/CD
BGGLLv|DE<< 89$$Xz}}=&"'',,t00,?F 	!GGDM	<< 34$$Xz}}dC 77g"**,!"3HHT\\1%.<<(;<,,Xz7K7KLu- #4	 	 u-s   !O&>O2 &O/2"Pc                 @   | j                  | j                  dz   d      }| j                  |t        j                         | j                  |j                  d      t        t        | j                                     | j                  |j                  d      d       y )Nrn  r   rU   zcontent-lengthzcontent-typezapplication/octet-stream)
rR   r  r<  r	   r   r   r   strr   r   rZ  s     r   	test_headz"SimpleHTTPServerTestCase.test_head  s    <<MMG#F   4$$Xz}}=++,<=S^,	.++N;3	5r   c                 (   t         j                  j                         }| j                  |d<   | j	                  | j
                  dz   |      }| j                  |t        j                         | j                  t        j                  d      z   }t         j                  j                         }t         j                  j                  |d      |d<   | j	                  | j
                  dz   |      }| j                  |t        j                         y)	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-Sincern  r   r   )hoursTr  N)r  messageMessager#  rR   r  r<  r	   r   r  r  	timedeltar   format_datetime)r   rW   r2  new_dts       r   test_browser_cachez+SimpleHTTPServerTestCase.test_browser_cache'  s    
 --'')'+'='=#$<< 7<I$$Xz/F/FG ))H,>,>Q,GG--'')',{{'B'B6 (C (#$<< 7<I$$Xz/F/FGr   c                 R   | j                   }|t        j                  d      z
  }t        j                  j                         }t        j                  j                  |d      |d<   | j                  | j                  dz   |      }| j                  |t        j                         y )Nim  )daysTr  r~  rn  r   )r  r  r  r  r  r  r   r  rR   r  r<  r	   r   )r   dtold_dtrW   r2  s        r   test_browser_cache_file_changedz8SimpleHTTPServerTestCase.test_browser_cache_file_changed9  s    %%h((c22--'')',{{'B'B6 (C (#$<< 7<I$$Xz}}=r   c                     t         j                  j                         }| j                  |d<   d|d<   | j	                  | j
                  dz   |      }| j                  |t        j                         y )Nr~  *zIf-None-Matchrn  r   )	r  r  r  r#  rR   r  r<  r	   r   )r   rW   r2  s      r   ,test_browser_cache_with_If_None_Match_headerzESimpleHTTPServerTestCase.test_browser_cache_with_If_None_Match_headerD  s`     --'')'+'='=#$#& << 7<I$$Xz}}=r   c                 6   | j                  dd      }| j                  |t        j                         | j                  dd      }| j                  |t        j                         | j                  dd      }| j                  |t        j                         y )Nr   FOOrz  customGETs)rR   r<  r	   r   rZ  s     r   test_invalid_requestsz.SimpleHTTPServerTestCase.test_invalid_requestsM  sz    <<E<2$$Xz/I/IJ<<H<5$$Xz/I/IJ<<F<3$$Xz/I/IJr   c                     | j                  | j                  dz         }| j                  |t        j                  | j
                         |j                  d   }| j                  || j                         y)zChecks that the datetime returned in Last-Modified response header
        is the actual datetime of last modification, rounded to the second
        rn  rF  zLast-modifiedN)	rR   r  r<  r	   r   r   rW   r   r#  )r   r2  r#  s      r   test_last_modifiedz+SimpleHTTPServerTestCase.test_last_modifiedV  s`     << 78$$Xz}}499$M$,,_=*D,B,BCr   c                 Z   | j                  | j                  dz         }| j                  |t        j                  | j
                         | j                  | j                  dz         }| j                  |t        j                         | j                  | j                  dz         }| j                  |t        j                         | j                  | j                        }| j                  |t        j                         | j                  | j                  dz         }| j                  |t        j                         | j                  | j                  dz         }| j                  |t        j                         | j                  |j                  d      | j                  dz          y )	Nrn  rF  ro  r   rq  rr  r^  rs  )
rR   r  r<  r	   r   r   rr   rb  r   r   rZ  s     r   test_path_without_leading_slashz8SimpleHTTPServerTestCase.test_path_without_leading_slash_  sC   << 1 1G ;<$$Xz}}499$M<< 1 1H <=$$Xz/C/CD<< 1 1C 78$$Xz}}=<< 1 12$$Xz/K/KL<< 1 1H <=$$Xz}}=<< 1 1G ;<$$Xz/K/KL++J7**X5	7r   c                    d}t         j                  j                  | j                  |      }	 t	        |d      j                          	 | j                  | j                  dz         }| j                  |t        j                        }|j                  j                         }t        j                   |       | j#                  |       dt%        j&                  |d      z  }| j)                  |j+                  |      |       y # t        $ r t        j                  d|z        w xY w# t        j                   |       w xY w)Nz<test&>.txtr  z-Can not create file %s on current file systemr   rC  FrD  )rA   r   r9   r  r  ra   OSErrorunittestSkipTestrR   r  r<  r	   r   rW   get_content_charsetunlinkr7  rO  rP  r   r|   )r   rR  fullpathr2  rV   rQ  	html_texts          r   test_html_escape_filenamez2SimpleHTTPServerTestCase.test_html_escape_filenameo  s    77<<h7	94 &&(
	 ||DMMC$78H//*--HD""668CIIhS!T[[??	i&&s+T2  	9## %-/7%8 9 9	9 IIhs   D 	AD( "D%(D?r   )r    r!   r"   r   r   r)   rG   rK   r<  r  skipIfrG  rK  
skipUnlessr   rJ  rV  r[  rl  r   r|  r  r  r  r  r  r  r  __classcell__r)  s   @r   r   r   b  s    -/G 1*2 X__S\\X-IKX__S\\W,BDX55<>H>DKH.f/Pb(.T5H$	>>KD7 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>")
rw  z7This test can't be run reliably as root (issue #13308).c                       e Zd Z G d dee      Zej                  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y)CGIHTTPServerTestCasec                        e Zd Z fdZ xZS )%CGIHTTPServerTestCase.request_handlerc                     t        j                  dt              5  t        |          cd d d        S # 1 sw Y   y xY w)Nignore)actioncategory)warningscatch_warningsDeprecationWarningr
  run_cgir-  s    r   r  z-CGIHTTPServerTestCase.request_handler.run_cgi  s5     ((CUV )w() ) )s   5>)r    r!   r"   r  r  r  s   @r   r)   r    s    	) 	)r   r)   asciic                    t         j                  |        t        j                         | _        t        j                         | _        t        j                  j                  | j                  d      | _
        t        j                  j                  | j                  d      | _        t        j                  j                  | j                  d      | _        t        j                  j                  | j                  d      | _        t        j                  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/        j0                         rbt        j                  j                  | j                  d      | _        t5        j6                  | j2                        j9                         | _        nt:        j<                  | _        	 | j2                  j?                  d       t        j                  j                  | j                  d      | _        tG        | j                   d	d
      5 }|jI                  tJ        | j2                  z         d d d        t        jL                  | j                   d       t        j                  j                  | j                  d      | _        tG        | j"                  d	d
      5 }|jI                  tJ        | j2                  z         d d d        t        jL                  | j"                  d       t        j                  j                  | j                  d      | _        tG        | j$                  d	d
      5 }|jI                  tN        | j2                  z         d d d        t        jL                  | j$                  d       t        j                  j                  | j                  d      | _        tG        | j&                  d	d
      5 }|jI                  tJ        | j2                  z         d d d        t        jL                  | j&                  d       t        j                  j                  | j                  d      | _        tG        | j(                  d	d
      5 }|jI                  tP        | j2                  dfz         d d d        t        jL                  | j(                  d       t        j                  j                  | j                  d      | _        tG        | j*                  d	d
      5 }|jI                  tJ        | j2                  z         d d d        t        jL                  | j*                  d       t        j                  j                  | j                  d      | _)        tG        | jR                  d	d
      5 }|jI                  tT        | j2                  z         d d d        t        jL                  | jR                  d       t        jV                  | j                         y # t@        $ r% | jC                          | jE                  d       Y Mw xY w# 1 sw Y   xY w# 1 sw Y   dxY w# 1 sw Y   xY w# 1 sw Y   ZxY w# 1 sw Y   xY w# 1 sw Y   NxY w# 1 sw Y   xY w)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_dirra  
nocgi_path
file1_path
file2_path
file3_path
file4_path
file5_path_pythonexe_symlinkr   can_symlink	pythonexer   PythonSymlink	__enter__rG  
executabler|   UnicodeEncodeErrorrK   skipTestr  r~   	cgi_file1rx  	cgi_file2	cgi_file4
file6_path	cgi_file6r  )r   r0  file1file2file3file4file5file6s           r   rG   zCGIHTTPServerTestCase.setUp  s   4 99;"**,ww||DOOY?WW\\$,,Ddoou=dnne<"$'',,t~~y"I

##$
 
 
(() #'  "WW\\$//8DDN&-&;&;DNN&K&U&U&WD# ^^DN	N NN!!'*
 '',,t
C$//39 	1RHHY/0	1
%('',,t||Z@$//39 	4UKK	DNN23	4
%('',,t||Z@$//39 	4UKK	DNN23	4
%('',,t'9'9:F$//39 	4UKK	DNN23	4
%('',,t||Z@$//39 	FUKK	T^^^$DDE	F
%('',,t'>'>
K$//39 	4UKK	DNN23	4
%('',,t||Z@$//39 	4UKK	DNN23	4
%(
!O " 	NMMOMMLM	N
	1 	1
	4 	4
	4 	4
	4 	4
	F 	F
	4 	4
	4 	4sf   [ -#[7?#\#\##\5%\+	#\8#]*[43[47\\\\(+\58]]c                 <   	 t        j                  | j                         | j                  r| j                  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(                  t         j*                  j-                  | j.                  d             t        j                  | j.                         t0        j3                  |        y # t0        j3                  |        w xY w)Nzgmon.out)rA   r  r  r  rI   r  remover  r  r  r  r  r  rmdirr  r  r  r  r  r   r  r   r9   r  r<   rK   r5   s    r   rK   zCGIHTTPServerTestCase.tearDown  s}   	(HHTXX&&''00tTB		$//*		$//*		$//*		$//*		$//*		$//*		$//*HHT''(HHT\\"HHT,,-HHT^^$HHT^^$ RWW\\$//:FGHHT__%!!$'L!!$'s   I,J J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}|j                         D ]y  \  }}t        |t              r2t	        |t
              r"| j                  |t        j                  |       Ht        j                  |      }| j                  ||d|d|d|       { y )Nr   r`  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: r_  )

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

 $
 6
 D
  3
  !4
 
 %
 5
 5
 V
 F
  W!
" g#
$ !#",%-,4.8(.+0.8.2049
< +002 	;ND((D)j9.M!!("(";";TC  2248  6"&&: ! ;	;r   c                     | j                  d      }| j                  |j                         |j                  d      |j                  fd| j
                  z   dt        j                  f       y )Nr  Content-type   Hello Worldr_   )rR   r   r   r   r   linesepr	   r   r   s     r   test_headers_and_contentz.CGIHTTPServerTestCase.test_headers_and_content\  sT    ll./XXZ~6

Cdll*KG	Ir   c                 z    | j                  d      }| j                  |j                  t        j                         y )Nz)///////////nocgi.py/../cgi-bin/nothere.sh)rR   r   r   r	   rr   r   s     r   test_issue19435z%CGIHTTPServerTestCase.test_issue19435b  s+    llFGZ%9%9:r   c                     t         j                  j                  dddd      }ddi}| j                  dd||      }| j	                  |j                         d	| j                  z          y )
Nr   r  i@ )rt  eggsbaconr  z!application/x-www-form-urlencodedz/cgi-bin/file2.pyPOSTs   1, python, 123456)rM  rN  	urlencoderR   r   r   r  )r   paramsrW   r   s       r   	test_postzCGIHTTPServerTestCase.test_postf  s`    ''(f=?!$GHll.H%9DLL%HIr   c                     | j                  d      }|j                          | j                  |j                  t        j
                         y )Nz/cgi-bin/invalid)rR   r   r   r   r	   rr   r   s     r   test_invaliduriz%CGIHTTPServerTestCase.test_invalidurin  s4    ll-.
Z%9%9:r   c                    ddt        j                  d      z   i}| j                  dd|      }| j                  d| j                  z   dt
        j                  f|j                         |j                  d	      |j                  f       y )
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_authorizations  sz    #i##$45'6 7ll.wlGdll*KGXXZ~6

C	Er   c                     | j                  d      }| j                  d| j                  z   dt        j                  f|j                         |j                  d      |j                  f       y )Nr  r  r_   r  rR   r   r  r	   r   r   r   r   r   s     r   test_no_leading_slashz+CGIHTTPServerTestCase.test_no_leading_slash{  sT    ll-.dll*KGXXZ~6

C	Er   c                 J   d}|t         j                  d<   | j                  d      }| j                  d| j                  z   dt
        j                  f|j                         |j                  d      |j                  f       | j                  t         j                  d   |       y )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_altered  s    %	(1

$%ll./dll*KGXXZ~6

C	E 	$56	Br   c                     | j                  d      }| j                  d| j                  z   dt        j                  f|j                         |j                  d      |j                  f       y )Nz/cgi-bin%2ffile1.pyr  r_   r  r  r   s     r   #test_urlquote_decoding_in_cgi_checkz9CGIHTTPServerTestCase.test_urlquote_decoding_in_cgi_check  sT    ll01dll*KGXXZ~6

C	Er   c                     | j                  d      }| j                  d| j                  z   dt        j                  f|j                         |j                  d      |j                  f       y )Nz/cgi-bin/child-dir/file3.pyr  r_   r  r  r   s     r   test_nested_cgi_path_issue21323z5CGIHTTPServerTestCase.test_nested_cgi_path_issue21323  sT    ll89dll*KGXXZ~6

C	Er   c                     | j                  d      }| j                  d| j                  z   dt        j                  f|j                         |j                  d      |j                  f       y )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  sT    ll67$,,&Z]]CXXZ~6

C	Er   c                     | j                  d      }| j                  d| j                  z   dt        j                  f|j                         |j                  d      |j                  f       y )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  sW    llMN.=*--)XXZ~6

C	Er   c                    	 t         j                  j                  d       | j                  d      }| j	                  d| j
                  z   dt        j                  f|j                         |j                  d      |j                  f       t         j                  j                  d       y # t         j                  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1889KL,,:;C$,,.Z]]KS]]>:CJJGI "11889KL!11889KLs   B
B, ,!Cc                    d}d|ff|fddf}|D ]  \  }}t        |      }| j                  |      5  | j                  dd|      }| j                  t        j
                  j                  |j                         d| j                  d	      }| j                  ||j                                d d d         y # 1 sw Y   xY w)
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GX!'*Gg& 4ll#6wlO  !3!3SZZ@)(4;;GDh
3	4 4	44 4s   A=B99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    s    )-/D ) jj(GJ"X(>(;TI;J;
EECEEEEM4r   r  c                   ,     e Zd Zd fd	Zd Zd Z xZS )SocketlessRequestHandlerc                     t        j                         }t               |j                  _        t
        |   |d d |       d| _        d| _        y )N	directoryFr\   )	r
   Mockr   makefilereturn_valuer
  r(   
get_calledr   )r   r  rR   r)  s      r   r(   z!SocketlessRequestHandler.__init__  sC    ))+(/	%$	B *r   c                     d| _         | j                  t        j                         | j	                  dd       | j                          | j                  j                  d       y )NTr^   r_       <html><body>Data</body></html>
)r  rc   r	   r   re   rf   r}   r~   r5   s    r   r   zSocketlessRequestHandler.do_GET  sJ    :==)5

>?r   c                      y 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y)!RejectingSocketlessRequestHandlerc                 B    | j                  t        j                         y)NF)rn   r	   EXPECTATION_FAILEDr5   s    r   handle_expect_100z3RejectingSocketlessRequestHandler.handle_expect_100  s    
556r   N)r    r!   r"   r'  r   r   r   r$  r$    s    r   r$  c                   .    e Zd Zd Zd Zd Zed        Zy)AuditableBytesIOc                     g | _         y r   )datasr5   s    r   r(   zAuditableBytesIO.__init__  s	    
r   c                 :    | j                   j                  |       y r   )r+  r  )r   r   s     r   r~   zAuditableBytesIO.write  s    

$r   c                 8    dj                  | 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.  propertyr0  r   r   r   r)  r)    s%     $  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y)BaseHTTPRequestHandlerTestCasezrTest the functionality of the BaseHTTPServer.

       Test the support for the Expect 100-continue header.
       s   HTTP/1.[0-9]+ 200 OKc                 "    t               | _        y r   )r  handlerr5   s    r   rG   z$BaseHTTPRequestHandlerTestCase.setUp  s    /1r   c                     t        |      }t               }|| j                  _        || j                  _        | j                  j	                          |j                  d       |j                         S Nr   )r   r5  rfiler}   handle_one_requestseek	readlines)r   r  inputoutputs       r   send_typical_requestz3BaseHTTPRequestHandlerTestCase.send_typical_request  sU     "#'')A!!r   c                 N    | j                  | j                  j                         y r   )r   r5  r  r5   s    r   verify_get_calledz0BaseHTTPRequestHandlerTestCase.verify_get_called  s    //0r   c                 \    dD ]&  | j                  t        fd|D              d       ( y )N)s   Server: s   Date: s   Content-Type: c              3   @   K   | ]  }|j                          y wr   )rd  ).0h	fieldNames     r   	<genexpr>zIBaseHTTPRequestHandlerTestCase.verify_expected_headers.<locals>.<genexpr>  s      JQi!8 Js   r   )r   sum)r   rW   rE  s     @r   verify_expected_headersz6BaseHTTPRequestHandlerTestCase.verify_expected_headers  s/    B 	OIS J' JJAN	Or   c                 \    | j                   j                  |      }| j                  |       y r   )HTTPResponseMatchsearchr7  )r   r2  matchs      r   verify_http_server_responsez:BaseHTTPRequestHandlerTestCase.verify_http_server_response  s&    &&--h7U#r   c                    d| j                   _        t        j                  }t        j
                  j                  t        dt                     5 } || j                   d        || j                   d        || j                   dd        || j                   dd        || j                   d       d d d        j                         }| j                  d	|       | j                  d
|       |j                         }| j                  d|d          | j                  d|d          | j                  d|d          | j                  d|d          | j                  d|d          y # 1 sw Y   xY w)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"   )r5  client_addressr   r   r
   patchobjectrG  r   r   assertNotIn
splitlinesr   )r   r   fake_stderrrP  r   s        r   test_unprintable_not_loggedz:BaseHTTPRequestHandlerTestCase.test_unprintable_not_logged	  s6    ':#,88ZZsHhj9 	G[f-&89k37k3JK&EF	G %%'((!!#feAh')584j%(+7qB6aA	G 	Gs   A"E''E0c                 X   | j                  d      }| j                  |d          | j                  |dd        | j                          | j	                  |d   d       | j	                  | j
                  j                  d       | j	                  | j
                  j                  d       | j	                  | j
                  j                  d       | j	                  | j
                  j                  d	       | j                  | j
                  j                  j                         d
       y )N   GET / HTTP/1.1

r   r   r!  GET / HTTP/1.1rL   r   r\   r   r>  rM  rH  r@  r   r5  requestlinecommandr   request_versionassertSequenceEqualrW   r  r   results     r   test_http_1_1z,BaseHTTPRequestHandlerTestCase.test_http_1_1      **+DE((3$$VAb\2 %JK113CD--u5**C055zB  !5!5!;!;!=rBr   c                 X   | j                  d      }| j                  |d          | j                  |dd        | j                          | j	                  |d   d       | j	                  | j
                  j                  d       | j	                  | j
                  j                  d       | j	                  | j
                  j                  d       | j	                  | j
                  j                  d	       | j                  | j
                  j                  j                         d
       y )Ns   GET / HTTP/1.0

r   r   r_  r!  GET / HTTP/1.0rL   r   HTTP/1.0r   ra  rf  s     r   test_http_1_0z,BaseHTTPRequestHandlerTestCase.test_http_1_0*  ri  r   c                     | j                  d      }| j                  t        |      d       | j                  |d   d       | j                          y )Ns   GET / HTTP/0.9

r   r   r!  )r>  r   r   r@  rf  s     r   test_http_0_9z,BaseHTTPRequestHandlerTestCase.test_http_0_96  sH    **+DEVa($IJ r   c                     | j                  d      }| j                  |d   j                  d             | j                  |d|j	                  d              | j                  | j                  j                         y )Ns)   GET /spaced out HTTP/1.1
Host: dummy

r   s   HTTP/1.1 400 r      
)r>  r   rd  rH  indexrc  r5  r  rf  s     r   test_extra_spacez/BaseHTTPRequestHandlerTestCase.test_extra_space<  sk    **

 	q	,,-=>?$$VAfll7.C%DE001r   c                 \   | j                  d      }| j                  |d          | j                  |dd        | j                          | j	                  |d   d       | j	                  | j
                  j                  d       | j	                  | j
                  j                  d       | j	                  | j
                  j                  d       | j	                  | j
                  j                  d	       d
}| j                  | j
                  j                  j                         |       y )Ns(   GET / HTTP/1.0
Expect: 100-continue

r   r   r_  r!  rk  rL   r   rl  )Expectz100-continuera  r   rg  rW   s      r   test_with_continue_1_0z5BaseHTTPRequestHandlerTestCase.test_with_continue_1_0F  s    **+\]((3$$VAb\2 %JK113CD--u5**C055zB/  !5!5!;!;!=wGr   c                    | j                  d      }| j                  |d   d       | j                  |d   d       | j                  |d   d       | j                  |dd        | j                          | j                  |d   d	       | j                  | j                  j
                  d
       | j                  | j                  j                  d       | j                  | j                  j                  d       | j                  | j                  j                  d       d}| j                  | j                  j                  j                         |       y )N(   GET / HTTP/1.1
Expect: 100-continue

r   s   HTTP/1.1 100 Continue
r   rq  rS  s   HTTP/1.1 200 OK
r_  r!  r`  rL   r   r\   ru  )r>  r   rH  r@  r5  rb  rc  r   rd  re  rW   r  rw  s      r   test_with_continue_1_1z5BaseHTTPRequestHandlerTestCase.test_with_continue_1_1S  s   **+\]$@AG,$:;$$VAb\2 %JK113CD--u5**C055zB/  !5!5!;!;!=wGr   c                     t        d      }t               }t               }||_        ||_        d|_        d|_        d |_        |j                  d       | j                  |j                  d       y )Nr^  r\   r     rS  )r   r)  r  r8  r}   rd  rb  rc  rn   r   r0  r   r<  r=  r5  s       r   #test_header_buffering_of_send_errorzBBaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_errorb  sf    12!#*,", 3))1-r   c                    t        d      }t               }t               }||_        ||_        d|_        |j                  d       | j                  |j                  d       |j                          | j                  |j                  d       y )Nr^  r\   r}  r   r   )
r   r)  r  r8  r}   rd  send_response_onlyr   r0  rf   r~  s       r   +test_header_buffering_of_send_response_onlyzJBaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_response_onlyp  sy    12!#*,",""3'))1-))1-r   c                    t        d      }t               }t               }||_        ||_        d|_        |j                  dd       |j                  dd       | j                  |j                  d       |j                          | j                  |j                         d       | j                  |j                  d       y )	Nr^  r\   Foofoobarr   s   Foo: foo
bar: bar

r   )r   r)  r  r8  r}   rd  re   r   r0  rf   r.  r~  s       r   $test_header_buffering_of_send_headerzCBaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_header~  s    12!#*,",E5)E5)))1-)+JK))1-r   c                    d }t        d      }t               }|| j                  _        || j                  _        d| j                  _        | j                  j                          | j                   ||      d        ||      j                  d      }| j                  |d   d       | j                  |d   d       | j                  |d	   d
       y )Nc                     | j                         }| j                  d       | j                         }| j                  |       |S r7  )tellr:  r   )rS  posr   s      r   _readAndReseekz[BaseHTTPRequestHandlerTestCase.test_header_unbuffered_when_continue.<locals>._readAndReseek  s3    &&(CFF1I668DFF3KKr   rz  r\   r   rq  r   s   HTTP/1.1 100 Continuer   rS  s   HTTP/1.1 200 OK)	r   r5  r8  r}   rd  r9  assertNotEqualr   r   )r   r  r<  r=  rg  s        r   $test_header_unbuffered_when_continuezCBaseHTTPRequestHandlerTestCase.test_header_unbuffered_when_continue  s    	 IJ"#'1$'')N62C8'--g6$<=C($67r   c                 P   | j                   }t               | _         | j                  d      }| j                  |d   d       | j	                  |dd        | j                  | j                   j                         | j                  t        d |dd D              d       || _         y )Nrz  r   s!   HTTP/1.1 417 Expectation Failed
r   r_  c              3   &   K   | ]	  }|d k(    yw)s   Connection: close
Nr   )rC  rs     r   rF  zMBaseHTTPRequestHandlerTestCase.test_with_continue_rejected.<locals>.<genexpr>  s     QqQ"::Qs   )r5  r$  r>  r   rH  rc  r  rG  )r   usual_handlerrg  s      r   test_with_continue_rejectedz:BaseHTTPRequestHandlerTestCase.test_with_continue_rejected  s    8:**+\]$JK$$VAb\2 	001QF1RLQQSTU$r   c                     | j                  dddz  z         }| j                  |d   d       | j                  | j                  j                         | j                  | j                  j                  t               y )Ns   GET    x  r   s#   HTTP/1.1 414 Request-URI Too Long
)r>  r   rc  r5  r  assertIsInstancerb  r{  rf  s     r   test_request_lengthz2BaseHTTPRequestHandlerTestCase.test_request_length  sd     **7TE\+AB$LM001dll66<r   c                     | j                  dddz  z   dz         }| j                  |d   d       | j                  | j                  j                         | j                  | j                  j
                  d       y )Ns   GET / HTTP/1.1
X-Foo: bar   rr  s   

r   s   HTTP/1.1 431 Line too long
r`  r>  r   rc  r5  r  rb  rf  s     r   test_header_lengthz1BaseHTTPRequestHandlerTestCase.test_header_length  sl    **+dUl:[HJ$EF001113CDr   c                     | j                  d      }| j                  |d   d       | j                  | j                  j                         | j                  | j                  j
                  d       y )Ns  GET / HTTP/1.1
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar

r   s   HTTP/1.1 431 Too many headers
r`  r  rf  s     r   test_too_many_headersz4BaseHTTPRequestHandlerTestCase.test_too_many_headers  s^    **EG$HI001113CDr   c                     | j                  d      }dj                  |      }d}| j                  t        j                  |d      j                  d      |       y )Ns*   <script>alert("hello")</script> / HTTP/1.1r   z<script>alert("hello")</script>FrD  r  )r>  r9   r   rO  rP  r|   )r   rg  texts      r   test_html_escape_on_errorz8BaseHTTPRequestHandlerTestCase.test_html_escape_on_error  sL    **9;&!0dkk$e4;;GDfMr   c                 6     fd}| j                   _        t        d       j                   j                           j	                  t
        t               t        d       j                   j                           j	                  t
        t               y )Nc                  :    t               j                  _        y r   )nextr5  close_connection)close_valuesr   s   r   r9  zPBaseHTTPRequestHandlerTestCase.test_close_connection.<locals>.handle_one_request  s    ,0,>DLL)r   )T)FFT)r5  r9  iterhandler  StopIterationr  )r   r9  r  s   ` @r   test_close_connectionz4BaseHTTPRequestHandlerTestCase.test_close_connection  sl    	?*<'G}-|<01-|<r   c           	      6   t        j                          }t        j                  |      \	  }}}}}}}}	}
d| j                  j                  |   || j                  j                  |   ||||fz  }| j                  | j                  j                  |      |       y )Nz#%s, %02d %3s %4d %02d:%02d:%02d GMT)r"  )timegmtimer5  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    iik15S1A.eS"b"b!Q8LL$$R(LL""5)"b"	<
 
 	666ExPr   N)r    r!   r"   __doc__recompilerJ  rG   r>  r@  rH  rM  r\  rh  rm  ro  rs  rx  r{  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r3  r3    s    
 #

#:;2"1O$B*
C
C!2HH... 8,
%=EEN=
Qr   r3  c                   (    e Zd ZdZd Zd Zd Zd Zy) SimpleHTTPRequestHandlerTestCasez Test url parsing c                    t         j                  j                  t        j                         d      | _        t         j                  j                  dd      | _        t         j                  j                  dd      | _        t               | _        t        d      | _	        t        t        j                  d            | _        y )NrR  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  sz    GGLLjAGGLL
;GGLL
;131EB1G<L<LU<STr   c                    | j                   j                  d      }| j                  || j                         | j                  j                  d      }| j                  || j
                         | j                  j                  d      }| j                  || j                         | j                   j                  d      }| j                  || j                         | j                  j                  d      }| j                  || j
                         | j                  j                  d      }| j                  || j                         | j                   j                  d      }| j                  || j                         | j                  j                  d      }| j                  || j
                         | j                  j                  d      }| j                  || j                         y )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t001~~,,[9t001~~,,[9t001~~,,-@At001~~,,-@At001~~,,-@At001~~,,-JKt001~~,,-JKt001~~,,-JKt001r   c                    | j                   j                  d      }| j                  || j                         | j                  j                  d      }| j                  || j
                         | j                  j                  d      }| j                  || j                         | j                   j                  d      }| j                  || j                         | j                  j                  d      }| j                  || j
                         | j                  j                  d      }| j                  || j                         y )Nz
//filenamez//filename?foo=barr  r  s     r   test_start_with_double_slashz=SimpleHTTPRequestHandlerTestCase.test_start_with_double_slash
  s   ~~,,\:t001~~,,\:t001~~,,\:t001~~,,-ABt001~~,,-ABt001~~,,-ABt001r   c                 	   t        j                  t        j                  dt              5  | j
                  j                  d      }|j                  t        j                  t        j                        }| j                  || j                         | j                  j                  d      }|j                  t        j                  t        j                        }| j                  || j                         | j                  j                  d      }|j                  t        j                  t        j                        }| j                  || j                         | j
                  j                  d      }|j                  t        j                  t        j                        }| j                  || j                         | j                  j                  d      }|j                  t        j                  t        j                        }| j                  || j                         | j                  j                  d      }|j                  t        j                  t        j                        }| j                  || j                         | j
                  j                  d      }|j                  t        j                  t        j                        }| j                  || j                         | j                  j                  d      }|j                  t        j                  t        j                        }| j                  || j                         | j                  j                  d      }|j                  t        j                  t        j                        }| j                  || j                         | j
                  j                  d      }|j                  t        j                  t        j                        }| j                  || j                         | j                  j                  d      }|j                  t        j                  t        j                        }| j                  || j                         | j                  j                  d      }|j                  t        j                  t        j                        }| j                  || j                         d d d        y # 1 sw Y   y xY w)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  sR   vyy&&9 '	6>>001EFD<<

BFF3DT4#4#45>>001EFD<<

BFF3DT4#4#45>>001EFD<<

BFF3DT4#4#45>>001BCD<<

BFF3DT4#4#45>>001BCD<<

BFF3DT4#4#45>>001BCD<<

BFF3DT4#4#45>>001IJD<<

BFF3DT4#4#45>>001IJD<<

BFF3DT4#4#45>>001IJD<<

BFF3DT4#4#45>>001LMD<<

BFF3DT4#4#45>>001LMD<<

BFF3DT4#4#45>>001LMD<<

BFF3DT4#4#45O'	6 '	6 '	6s   R=S00S9N)r    r!   r"   r  rG   r  r  r  r   r   r   r  r    s    U2,2(6r   r  c                       e Zd Zd Zy)MiscTestCasec                    g }h d}t        t              D ]J  }|j                  d      s||v rt        t        |      }t        |dd       dk(  s:|j	                  |       L | j                  t        j                  |       y )N>   r  r  
nobody_uid_r!   zhttp.server)r  r   rd  getattrr  assertCountEqual__all__)r   r  denylistrT  module_objects        r   test_allzMiscTestCase.test_allE  st    7K 	&Ds#tx'7#FD1M}lD9]J%	& 	fnnh7r   N)r    r!   r"   r  r   r   r   r  r  D  s    	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y	)
ScriptTestCasec                     t        j                  t        j                  t        j                  t        j                  t        j                  d                               S )Nc                       y)N)r   r   r   r   r   r   <lambda>z2ScriptTestCase.mock_server_class.<locals>.<lambda>Y  s    r   )r.   )r-   )r  )r  )r
   	MagicMockr5   s    r   mock_server_classz ScriptTestCase.mock_server_classS  sF    ~~..!%#~~(7 "

 
	
r   zbuiltins.printc                     | j                         }t        j                  |d        | j                  |j                  t
        j                  t
        j                  f       y 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_unspec`  sC    ,,.$7&&__fnn-	
r   c                     | j                         }t        j                  |d       | j                  |j                  t
        j                  t
        j                  f       y )Nr,   r  r  r  s      r   test_server_test_localhostz)ScriptTestCase.test_server_test_localhosti  sC    ,,.+>&&__fnn-	
r   )z::z'2001:0db8:85a3:0000:0000:8a2e:0370:7334z::1)z0.0.0.0z8.8.8.8rO  c                     | j                   D ]S  }| j                         }t        j                  ||       | j	                  |j
                  t        j                         U y r  )
ipv6_addrsr  r   r  r   r  r-   r  r   r  r  r  s       r   test_server_test_ipv6z$ScriptTestCase.test_server_test_ipv6~  sM    OO 	JD002KKKKd;[77I	Jr   c                     | j                   D ]S  }| j                         }t        j                  ||       | j	                  |j
                  t        j                         U y r  )
ipv4_addrsr  r   r  r   r  r-   r  r  s       r   test_server_test_ipv4z$ScriptTestCase.test_server_test_ipv4  sM    OO 	ID002KKKKd;[77H	Ir   N)r    r!   r"   r  r
   rW  r  r  r  r  r  r  r   r   r   r  r  Q  s    
 TZZ !
 "
 TZZ !
 "
JJ TZZ !J "J TZZ !I "Ir   r  c                  p    t        j                  t        j                  t        j                                y r   )r  addModuleCleanuprA   r  r  r   r   r   setUpModuler    s    bhh		4r   __main__)Dr  collectionsr   http.serverr   r   r   r   rN   r   r	   rA   r-   rG  r  r  r  r  r+  email.messager  email.utilsrO  http.clienturllib.parserM  r  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  hasattrrw  r  r  r$  r)  r3  r  r  r  r  r    mainr   r   r   <module>r     s  
 $5 5 # 	  
 	                    " )   t , y'' *-8$$ -*a(\ a(H!GL !GH`3| `3F			"		& Y'=JBJJLA,=ACA4L A4CA4H7 &(@   }QX%6%6 }Q@W6x'8'8 W6t
88$$ 
89IX&& 9Ix5 zHMMO r   