
    0hh                        S r SSKJr  SSKJrJrJrJr  SSKJ	r	J
r
  SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKJr  SSK J!r!J"r"  SSKrSSK#J$r$  SS	K%J&r&J'r'J(r(J)r)  SS
K*J+r+  \$RX                  " SS9   " S S5      r- " S S\R\                  5      r/ " S S\R`                  \+5      r1 " S S\15      r2 " S S\15      r3 " S S\15      r4Sr5Sr6Sr7Sr8\Rr                  " \:" \S5      =(       a    \Rv                  " 5       S:H  S5      \(" 5        " S S \15      5       5       r< " S! S"\5      r= " S# S$\=5      r> " S% S&5      r? " S' S(\R`                  \+5      r@ " S) S*\R`                  5      rA " S+ S,\R`                  5      rB " S- S.\R`                  5      rCS/ rD\ES0:X  a  \R                  " 5         gg)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)is_apple	os_helperrequires_subprocessthreading_helper)ExtraAssertionsT)modulec                   $    \ rS rSrS rSS jrSrg)NoLogRequestHandler(   c                     g N )selfargss     >/opt/python-3.13.8/usr/lib/python3.13/test/test_httpservers.pylog_messageNoLogRequestHandler.log_message)   s        Nc                     gN r   )r   ns     r   readNoLogRequestHandler.read-   s    r   r   r   )__name__
__module____qualname____firstlineno__r   r$   __static_attributes__r   r   r   r   r   (   s    r   r   c                   &    \ rS rSrS rS rS rSrg)TestServerThread1   c                 Z    [         R                  R                  U 5        X l        Xl        g r   )	threadingThread__init__request_handlertest_object)r   r3   r2   s      r   r1   TestServerThread.__init__2   s"    !!$'.&r   c                    [        SU R                  5      U l        U R                  R                  R	                  5       u  U R
                  l        U R
                  l        U R
                  R                  R                  5         S U l         U R                  R                  S5        U R                  R                  5         g ! U R                  R                  5         f = f)N)	localhostr   g?)r   r2   r   socketgetsocknamer3   HOSTPORTserver_startedsetserve_foreverserver_closer   s    r   runTestServerThread.run7   s     !143G3GH7;{{7I7I7U7U7W4t//4''++-	'KK%%d+KK$$&DKK$$&s   C Cc                 X    U R                   R                  5         U R                  5         g r   )r   shutdownjoinr?   s    r   stopTestServerThread.stopA   s    		r   )r2   r   r3   N)r&   r'   r(   r)   r1   r@   rE   r*   r   r   r   r,   r,   1   s    '
'r   r,   c                   0    \ rS rSrS rS rSS0 4S jrSrg)BaseTestCaseF   c                 D   [         R                  " 5       U l        [        R                  " 5       [
        l        [        R                  " 5       U l	        [        X R                  5      U l        U R                  R                  5         U R                  R                  5         g r   )r   threading_setup_threadsr   EnvironmentVarGuardosenvironr/   Eventr;   r,   r2   threadstartwaitr?   s    r   setUpBaseTestCase.setUpG   se    (88:224
'oo/&t-A-AB  "r   c                     U R                   R                  5         S U l         [        R                  R	                  5         [
        R                  " U R                  6   g r   )rQ   rE   rN   rO   __exit__r   threading_cleanuprL   r?   s    r   tearDownBaseTestCase.tearDownO   s;    


**DMM:r   GETNc                     [         R                  R                  U R                  U R                  5      U l        U R
                  R                  X!X45        U R
                  R                  5       $ r   )httpclientHTTPConnectionr9   r:   
connectionrequestgetresponse)r   urimethodbodyheaderss        r   ra   BaseTestCase.requestU   sI    ++44TYY		JT;**,,r   )rL   r`   r;   rQ   )r&   r'   r(   r)   rT   rY   ra   r*   r   r   r   rH   rH   F   s    #; #(dB -r   rH   c                       \ rS rSr " S S\\5      rS rS rS r	S r
S rS	 rS
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rSrg)BaseHTTPServerTestCase[   c                   R    \ rS rSrSrSrS rS rS rS r	S r
S rS	 rS
 rS rSrg)&BaseHTTPServerTestCase.request_handler\   HTTP/1.1c                     U R                  [        R                  5        U R                  SS5        U R                  SS5        U R	                  5         g )NContent-Type	text/html
Connectionclosesend_responser	   
NO_CONTENTsend_headerend_headersr?   s    r   do_TEST.BaseHTTPServerTestCase.request_handler.do_TEST`   sB    z445^[9\73r   c                     U R                  [        R                  5        U R                  SS5        U R                  SS5        U R	                  5         g )Nrp   rq   rr   
keep-alivert   r?   s    r   do_KEEP.BaseHTTPServerTestCase.request_handler.do_KEEPf   sB    z445^[9\<8r   c                 &    U R                  S5        g )N  
send_errorr?   s    r   do_KEYERROR2BaseHTTPServerTestCase.request_handler.do_KEYERRORl   s    OOC r   c                 B    U R                  [        R                  5        g r   r   r	   	NOT_FOUNDr?   s    r   do_NOTFOUND2BaseHTTPServerTestCase.request_handler.do_NOTFOUNDo   s    OOJ001r   c                 *    U R                  SSS5        g )Nr   zShort MessagezThis is a long 
 explanationr   r?   s    r   do_EXPLAINERROR6BaseHTTPServerTestCase.request_handler.do_EXPLAINERRORr   s    OOC;=r   c                     U R                  S5        U R                  SS5        U R                  SS5        U R                  5         g )Nr   rp   rq   rr   rs   )ru   rw   rx   r?   s    r   	do_CUSTOM0BaseHTTPServerTestCase.request_handler.do_CUSTOMv   s<    s#^[9\73r   c                     U R                  S5        U R                  SS5        U R                  SS5        U R                  5         U R                  S   R	                  S5      nU R
                  R                  U5        g )Nr   	X-Special   Dängerous Mindrr   rs   zx-special-incomingutf-8)ru   rw   rx   rf   encodewfilewrite)r   re   s     r   do_LATINONEHEADER8BaseHTTPServerTestCase.request_handler.do_LATINONEHEADER|   si    s#[*;<\73<< 45<<WEDJJT"r   c                 R    U R                  [        U R                  SS  5      5        g N   r   intpathr?   s    r   do_SEND_ERROR4BaseHTTPServerTestCase.request_handler.do_SEND_ERROR       OOC		!"./r   c                 R    U R                  [        U R                  SS  5      5        g r   r   r?   s    r   do_HEAD.BaseHTTPServerTestCase.request_handler.do_HEAD   r   r   r   N)r&   r'   r(   r)   protocol_versiondefault_request_versionry   r}   r   r   r   r   r   r   r   r*   r   r   r   r2   rl   \   s;    %",			!	2	=		#	0	0r   r2   c                     [         R                  U 5        [        R                  R	                  U R
                  U R                  5      U l        U R                  R                  5         g r   )	rH   rT   r]   r^   r_   r9   r:   conconnectr?   s    r   rT   BaseHTTPServerTestCase.setUp   s@    4 ;;--diiCr   c                     U R                   R                  SS5        U R                   R                  5       nU R                  UR                  [
        R                  5        g )Nr[   /)r   ra   rb   assertEqualstatusr	   NOT_IMPLEMENTEDr   ress     r   test_command#BaseHTTPServerTestCase.test_command   sB    $hh""$Z%?%?@r   c                    SU R                   l        U R                   R                  SS5        U R                   R                  5         U R                   R	                  5       nU R                  UR                  [        R                  5        g )Nz	HTTP/1.1
XYZBOGUSr   	r   _http_vsn_str
putrequest
endheadersrb   r   r   r	   r   r   s     r   test_request_line_trimming1BaseHTTPServerTestCase.test_request_line_trimming   s^    !-J,hh""$Z%?%?@r   c                    SU R                   l        U R                   R                  SS5        U R                   R                  5         U R                   R	                  5       nU R                  UR                  [        R                  5        g )NFUBARr[   r   	r   r   r   r   rb   r   r   r	   BAD_REQUESTr   s     r   test_version_bogus)BaseHTTPServerTestCase.test_version_bogus   s^    !(E3'hh""$Z%;%;<r   c                    SU R                   l        U R                   R                  SS5        U R                   R                  5         U R                   R	                  5       nU R                  UR                  [        R                  5        g )Nz
HTTP/9.9.9r[   r   r   r   s     r   test_version_digits*BaseHTTPServerTestCase.test_version_digits   s^    !-E3'hh""$Z%;%;<r   c                    SU R                   l        U R                   R                  SS5        U R                   R                  5         U R                   R	                  5       nU R                  UR                  [        R                  5        g )NzHTTP/-9_9_9.+9_9_9r[   r   r   r   s     r   "test_version_signs_and_underscores9BaseHTTPServerTestCase.test_version_signs_and_underscores   s^    !5E3'hh""$Z%;%;<r   c                    SU R                   l        U R                   R                  SS5        U R                   R                  5         U R                   R	                  5       nU R                  UR                  [        R                  5        g )NzHTTP/909876543210.0r[   r   r   r   s     r   "test_major_version_number_too_long9BaseHTTPServerTestCase.test_major_version_number_too_long   ^    !6E3'hh""$Z%;%;<r   c                    SU R                   l        U R                   R                  SS5        U R                   R                  5         U R                   R	                  5       nU R                  UR                  [        R                  5        g )NzHTTP/1.909876543210r[   r   r   r   s     r   "test_minor_version_number_too_long9BaseHTTPServerTestCase.test_minor_version_number_too_long   r   r   c                    SU R                   l        U R                   R                  SS5        U R                   R                  5         U R                   R	                  5       nU R                  UR                  [        R                  5        g )Nr"   r[   r   r   r   s     r   test_version_none_get,BaseHTTPServerTestCase.test_version_none_get   s^    !#E3'hh""$Z%?%?@r   c                    SU R                   l        U R                   R                  SS5        U R                   R                  5         U R                   R	                  5       nU R                  UR                  [        R                  5        g )Nr"   CUSTOMr   r   r   s     r   test_version_none(BaseHTTPServerTestCase.test_version_none   s^    !#Hc*hh""$Z%;%;<r   c                 <   SU R                   l        SU R                   l        U R                   R                  SS5        U R                   R	                  5         U R                   R                  5       nU R                  UR                  [        R                  5        g )Nc   zHTTP/9.9r[   r   )
r   	_http_vsnr   r   r   rb   r   r   r	   HTTP_VERSION_NOT_SUPPORTEDr   s     r   test_version_invalid+BaseHTTPServerTestCase.test_version_invalid   sj    !+E3'hh""$Z%J%JKr   c                    SU R                   l        U R                   R                  SS5        U R                   R                  5         U R                   R	                  5       nU R                  UR                  [        R                  5        g r!   r   r   s     r   test_send_blank&BaseHTTPServerTestCase.test_send_blank   s^    !#B#hh""$Z%;%;<r   c                 0   U R                   R                  SS5        U R                   R                  SS5        U R                   R                  5         U R                   R	                  5       nU R                  UR                  [        R                  5        g )Nr[   r   rr   rs   )	r   r   	putheaderr   rb   r   r   r	   r   r   s     r   test_header_close(BaseHTTPServerTestCase.test_header_close   sf    E3'<1hh""$Z%?%?@r   c                 R   SU R                   l        U R                   R                  SS5        U R                   R                  SS5        U R                   R	                  5         U R                   R                  5       nU R                  UR                  [        R                  5        g )Nrn   r[   r   rr   r|   )
r   r   r   r   r   rb   r   r   r	   r   r   s     r   test_header_keep_alive-BaseHTTPServerTestCase.test_header_keep_alive   sr    !+E3'<6hh""$Z%?%?@r   c                     U R                   R                  SS5        U R                   R                  5       nU R                  UR                  [
        R                  5        g )NTESTr   )r   ra   rb   r   r   r	   rv   r   s     r   test_handler#BaseHTTPServerTestCase.test_handler   sB    %hh""$Z%:%:;r   c                 4   U R                   R                  SS5        U R                   R                  5       nU R                  UR	                  S5      S5        U R                   R                  SS5        U R                  U R                   R                  5        g )NKEEPr   rr   r|   r   )r   ra   rb   r   	getheader
addCleanuprs   r   s     r   test_return_header_keep_alive4BaseHTTPServerTestCase.test_return_header_keep_alive   si    %hh""$|4lC%'r   c                     U R                   R                  SS5        U R                   R                  5       nU R                  UR                  S5        g )NKEYERRORr   r   r   ra   rb   r   r   r   s     r   test_internal_key_error.BaseHTTPServerTestCase.test_internal_key_error   s<    S)hh""$S)r   c                     U R                   R                  SS5        U R                   R                  5       nU R                  UR                  S5        g )Nr   r   r   r   r   s     r   test_return_custom_status0BaseHTTPServerTestCase.test_return_custom_status   s<    3'hh""$S)r   c                     U R                   R                  SS5        U R                   R                  5       nU R                  UR                  S5        U R                  [        UR                  S5      5      5        g )NEXPLAINERRORr   r   Content-Length)r   ra   rb   r   r   
assertTruer   r   r   s     r   test_return_explain_error0BaseHTTPServerTestCase.test_return_explain_error  sW    -hh""$S)CMM*:;<=r   c                    U R                   R                  SSSS0S9  U R                   R                  5       nU R                  UR	                  S5      S5        U R                  UR                  5       SR                  S5      5        g )	NLATINONEHEADERr   zX-Special-Incomingu   Ärger mit Unicoderf   r   r   r   )r   ra   rb   r   r   r$   r   r   s     r   test_latin1_header)BaseHTTPServerTestCase.test_latin1_header  sw    )3 (<9
 	 hh""${35FG%9%@%@%IJr   c                 J   U R                   R                  SS5        U R                   R                  5       nU R                  UR                  [
        R                  5        UR                  5       nU R                  [        UR                  S5      5      [        U5      5        g )NNOTFOUNDr   r   )r   ra   rb   r   r   r	   r   r$   r   r   len)r   r   datas      r   test_error_content_length0BaseHTTPServerTestCase.test_error_content_length  sp    S)hh""$Z%9%9:xxzS]]+;<=s4yIr   c                    [         R                  [         R                  4n[         R                  [         R                  [         R                  [         R                  [         R
                  4 H  nU R                  R                  SSR                  U5      5        U R                  R                  5       nU R                  X#R                  5        U R                  S UR                  S5      5        U R                  S UR                  S5      5        X!;  a!  U R                  S UR                  S5      5        UR                  5       nU R                  SU5        M     g )N
SEND_ERROR/{}r   rp   Transfer-Encodingr   )r	   NOT_MODIFIEDRESET_CONTENTrv   
PROCESSINGSWITCHING_PROTOCOLSr   ra   formatrb   r   r   r   r$   r   allow_transfer_encoding_codescoder   r  s        r   test_send_error&BaseHTTPServerTestCase.test_send_error  s   )3)@)@)3)A)A)C%**J,C,C**J,D,D335D HH\5<<+=>((&&(CT::.T3==1A#BCT3==#@A8  s}}5H'IJ88:DS$'5r   c                    [         R                  [         R                  4n[         R                  [         R                  [         R                  [         R                  [         R
                  4 GHP  nU R                  R                  SSR                  U5      5        U R                  R                  5       nU R                  X#R                  5        U[         R                  :X  aN  U R                  [        UR                  S5      5      S:  5        U R                  SUR                  S5      5        OBU R                  S UR                  S5      5        U R                  S UR                  S5      5        X!;  a!  U R                  S UR                  S5      5        UR!                  5       nU R                  SU5        GMS     g )	NHEADr  r   r   rq   rp   r  r   )r	   r  r  OKrv   r  r   ra   r  rb   r   r   r   r   r   assertInr$   r  s        r   test_head_via_send_error/BaseHTTPServerTestCase.test_head_via_send_error)  sF   )3)@)@)3)A)A)C%]]J$9$9,,j.F.F335D HHVU\\$%78((&&(CT::.z}}$CMM2B$C Dq HIk3==+HI  s}}5E'FG  s}}^'DE8  s}}5H'IJ88:DS$'!5r   r   N)r&   r'   r(   r)   r   r   r2   rT   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r*   r   r   r   ri   ri   [   s    ,0-/E ,0\
A
A=====A=L=AA<
(*
*
>KJ("(r   ri   c                   6    \ rS rSr " S S\5      rS rS rSrg)RequestHandlerLoggingTestCasei?  c                   (    \ rS rSrSrSrS rS rSrg)-RequestHandlerLoggingTestCase.request_handleri@  rn   c                 b    U R                  [        R                  5        U R                  5         g r   )ru   r	   r  rx   r?   s    r   do_GET4RequestHandlerLoggingTestCase.request_handler.do_GETD  s     z}}-r   c                 D    U R                  [        R                  S5        g )NzFile not foundr   r?   s    r   do_ERROR6RequestHandlerLoggingTestCase.request_handler.do_ERRORH  s    OOJ002BCr   r   N)	r&   r'   r(   r)   r   r   r#  r&  r*   r   r   r   r2   r!  @  s    %",		Dr   r2   c                    [         R                  R                  U R                  U R                  5      U l        U R
                  R                  5         [        R                  " 5        nU R
                  R                  SS5        U R
                  R                  5         S S S 5        U R                  WR                  5       S5        g ! , (       d  f       N/= f)Nr[   r   z"GET / HTTP/1.1" 200 -
)r]   r^   r_   r9   r:   r   r   r   captured_stderrra   rb   assertEndsWithgetvalue)r   errs     r   test_get&RequestHandlerLoggingTestCase.test_getK  s    ;;--diiC$$&#HHUC(HH  " ' 	CLLN,FG	 '&s   )7C		
Cc                    [         R                  R                  U R                  U R                  5      U l        U R
                  R                  5         [        R                  " 5        nU R
                  R                  SS5        U R
                  R                  5         S S S 5        WR                  5       R                  S5      nU R                  US   S5        U R                  US   S5        g ! , (       d  f       NX= f)NERRORr   
r   z code 404, message File not foundr   z"ERROR / HTTP/1.1" 404 -)r]   r^   r_   r9   r:   r   r   r   r)  ra   rb   r+  splitr*  )r   r,  liness      r   test_err&RequestHandlerLoggingTestCase.test_errU  s    ;;--diiC$$&#HHWc*HH  " ' $$T*E!H&HIE!H&@A '&s   )7C22
D r  N)	r&   r'   r(   r)   r   r2   r-  r4  r*   r   r   r   r  r  ?  s    	D0 	DH
Br   r  c                   <  ^  \ rS rSr " S S\\5      rU 4S jrU 4S jrS#S jr	S#S jr
S r\R                  " \R                  S	5      S
 5       r\R                  " \R                  S	5      S 5       r\R$                  " \S5      \R$                  " \R*                  S:H  S5      \R                  " \R,                  S5      S 5       5       5       r\R$                  " \S5      \R$                  " \R*                  S:H  S5      \R                  " \R,                  S5      S 5       5       5       rS r\R                  " \R4                  S5      S 5       r\R                  " \R4                  S5      S 5       rS rS rS rS r S r!S r"S r#S r$S r%S r&S  r'S! r(S"r)U =r*$ )$SimpleHTTPServerTestCaseib  c                       \ rS rSrSrg)(SimpleHTTPServerTestCase.request_handleric  r   N)r&   r'   r(   r)   r*   r   r   r   r2   r9  c  s    r   r2   c                   > [         TU ]  5         [        R                  " 5       U l        [
        R                  " 5       n[        R                  " U5        SU l        [
        R                  " US9U l
        [        R                  R                  U R                  5      U l        SU R                  -   U l        [        R                  R                  U R                  S5      n[!        US5       nUR#                  U R                  5        UR%                  5         S S S 5        [        R&                  " U5      R(                  n[*        R*                  R-                  U[*        R.                  R0                  5      nUR3                  SS9U l        [6        R8                  R;                  UR=                  5       SS	9U l        g ! , (       d  f       N= f)
Ns   We are the knights who say Ni!)dirr   testwbr   )microsecondTusegmt) superrT   rN   getcwdcwdtempfile
gettempdirchdirr  mkdtemptempdirr   basenametempdir_namebase_urlrD   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   rT   SimpleHTTPServerTestCase.setUpf  sA   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   -,F??
Gc                    >  [         R                  " U R                  5         [        R                  " U R
                  5        [        TU ]  5         g !    N= f! [        TU ]  5         f = fr   )rN   rF  rC  shutilrmtreerH  rA  rY   )r   r`  s    r   rY   !SimpleHTTPServerTestCase.tearDown{  sP    	HHTXXdll+ GGs    A  A AA A*c                   ^^ UU4S jnS mUTl         TR                  5       nU R                  T5        U R                  TR                  U5        U R                  TR                  5        U(       a  U R                  X55        U R                  TR                  S5        U R                  TR                  R                  SS5      S5        U R                  TR                  S5      SS5        TR                  5         U$ )Nc                  ,   > TR                   m STl         g)zKDon't close reader yet so we can check if there was leftover
buffered inputN)fp)readerresponses   r   
close_connDSimpleHTTPServerTestCase.check_status_and_reason.<locals>.close_conn  s     [[FHKr   
   rr   rs      r   zConnection should be closed)_close_connr$   r   r   r   assertIsNotNonereasonversionmsggetrs   )r   rj  r   r  rk  re   ri  s    `    @r   check_status_and_reason0SimpleHTTPServerTestCase.check_status_and_reason  s    	 )}}!&1X__-T( 	))2.)),@'JR#/LMr   c                    [         R                  R                  U R                  U5      n [         R                  " [         R                  R                  U R                  U5      5        Uc  [        R                  R                  USS9nU R                  U R                  S-   U-   S-   5      nU R                  U[        R                  5      n[         R"                  " U R                   SU S3SS9n[$        R&                  " 5       nSU S	3R)                  US
5      nU R+                  US-   U5        U R+                  US-   U5        g ! [
        [        4 a    U R                  SU< S35         GN	f = f)NzCan not create directory  on current file systemsurrogatepasserrorsr   Fquotelisting for z</surrogateescape   title>   h1>)rN   r   rD   rH  mkdirOSErrorUnicodeEncodeErrorskipTesturllibparser}  ra   rK  ru  r	   r  htmlescapesysgetfilesystemencodingr   r  )	r   dirname
quotednamefullpathrj  re   displaypathencprefixs	            r   check_list_dir_dirname/SimpleHTTPServerTestCase.check_list_dir_dirname  s;   77<<g6	5HHRWW\\$,,89
 ++GO+LJ<< 3j @3 FG++HjmmDkkT]]O1WIQ"?uM'')}B/66s<MNfy($/fvot, +, 	5MM5g[ A3 4 5	5s   >E
 
&E43E4c                    [         R                  R                  U R                  U5      n[	        U5      R                  5       [        R                  =(       d    S-   n [        US5       nUR                  U5        S S S 5        U R                  U R                  S-   5      nU R                  U[        R                   5      n["        R$                  R'                  USS9nUR(                  R+                  5       nU R-                  U5        U R/                  SU S	3R                  S
5      U5        [0        R2                  " USS9n	U R/                  SU	 S3R                  US5      U5        U R                  U R                  S-   U-   5      nU R                  U[        R                   US9  g ! , (       d  f       GN7= f! [         a    U R                  SU< S35         GN]f = f)N   r=  zCan not create file rx  r   ry  rz  zhref=""asciiFr|  ><r  r  )rN   r   rD   rH  r  r   r   TESTFN_UNDECODABLErL  r   r  r  ra   rK  ru  r	   r  r  r  r}  rf   get_content_charsetrp  r  r  r  )
r   filenamer  contentfrj  re   r  r  displaynames
             r   check_list_dir_filename0SimpleHTTPServerTestCase.check_list_dir_filename  s   77<<h7/((*i.J.J.UgV	5h%  & << 34++HjmmD\\'''I
224S!
|1-55g>Ekk(%8+a(//5FGN<< 3j @A$$Xz}}7$K! &% 	5MM0 =3 4 5	5s0   F? +F-=F? -
F<7F? <F? ? G#"G#zneed os_helper.TESTFN_NONASCIIc                 L    [         R                  S-   nU R                  U5        g N.dir)r   TESTFN_NONASCIIr  r   r  s     r   test_list_dir_nonascii_dirname7SimpleHTTPServerTestCase.test_list_dir_nonascii_dirname  s"     ++f4##G,r   c                 L    [         R                  S-   nU R                  U5        g N.txt)r   r  r  r   r  s     r   test_list_dir_nonascii_filename8SimpleHTTPServerTestCase.test_list_dir_nonascii_filename  s"     ,,v5$$X.r   z<undecodable name cannot always be decoded on Apple platformswin32z+undecodable name cannot be decoded on win32z!need os_helper.TESTFN_UNDECODABLEc                 t    [         R                  " [        R                  5      S-   nU R	                  U5        g r  )rN   fsdecoder   r  r  r  s     r   !test_list_dir_undecodable_dirname:SimpleHTTPServerTestCase.test_list_dir_undecodable_dirname  s+     ++i::;fD##G,r   c                 t    [         R                  " [        R                  5      S-   nU R	                  U5        g r  )rN   r  r   r  r  r  s     r   "test_list_dir_undecodable_filename;SimpleHTTPServerTestCase.test_list_dir_undecodable_filename  s+     ;;y;;<vE$$X.r   c                 (    SnU R                  USS9  g )Nu   �.dirz%ff.dirr  )r  r  s     r   "test_list_dir_undecodable_dirname2;SimpleHTTPServerTestCase.test_list_dir_undecodable_dirname2  s    ##G	#Br   z!need os_helper.TESTFN_UNENCODABLEc                 L    [         R                  S-   nU R                  U5        g r  )r   TESTFN_UNENCODABLEr  r  s     r   !test_list_dir_unencodable_dirname:SimpleHTTPServerTestCase.test_list_dir_unencodable_dirname  s"     ..7##G,r   c                 L    [         R                  S-   nU R                  U5        g r  )r   r  r  r  s     r   "test_list_dir_unencodable_filename;SimpleHTTPServerTestCase.test_list_dir_unencodable_filename  s"     //&8$$X.r   c           
          S HL  nU R                  US9   US-   nU R                  U[        R                  R	                  USS9S9  S S S 5        MN     g ! , (       d  f       M`  = f)N	zq?zf#z&amp;z&ampz<i>z"dq"z'sq'z%A4z	%E2%82%ACnamer  z&<>'")safer  )subTestr  r  r  r}  )r   r  r  s      r   test_list_dir_escape_dirname5SimpleHTTPServerTestCase.test_list_dir_escape_dirname  sa    )D4(-++G#)<<#5#5gH#5#M , O )()((s   2A
A#	c                    S Ho  nU R                  US9   US-   nU R                  U5        [        R                  " [        R
                  R                  U R                  U5      5        S S S 5        Mq     g ! , (       d  f       M  = f)Nr  r  r  )r  r  r   unlinkrN   r   rD   rH  )r   r  r  s      r   test_list_dir_escape_filename6SimpleHTTPServerTestCase.test_list_dir_escape_filename  sc    )D4(&=,,X6  dllH!EF )()((s   AA77
B	c                    SU R                    S3R                  S5      nU R                  U R                   S-   5      R                  5       nU R	                  US-   U5        U R	                  US-   U5        U R                  U R                   S-   5      R                  5       nU R	                  US-   U5        U R	                  US-   U5        g )Nr~  z/</latin1z/#123r  r  z/?x=123)rK  r   ra   r$   r  )r   r  rj  s      r   %test_list_dir_with_query_and_fragment>SimpleHTTPServerTestCase.test_list_dir_with_query_and_fragment  s    c299(C<< 78==?fy((3fvox0<<	 9:??Afy((3fvox0r   c                    [         R                  " [         R                  R                  U R                  S5      5        SU R
                   S3nU S3nU R                  U5      nU R                  U[        R                  5        UR                  S5      nU R                  XBSS9  SU 3nU R                  U5      nU R                  U[        R                  5        UR                  S5      nU R                  US5        U R                  XBS	S9  SU 3nU R                  U5      nU R                  U[        R                  5        U R                  UR                  S5      U5        S
U 3nU S3nU R                  U5      nU R                  U[        R                  5        UR                  S5      nU R                  US
5        g)a!  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!rs  //zcExpected Location header to start with a single / and end with a / as this is a directory redirect.zhttps://pypi.org/N)rN   r  r   rD   rH  rJ  ra   ru  r	   MOVED_PERMANENTLYr   r   assertNotStartsWithassertStartsWith)	r   urlexpected_locationrj  location
attack_urlattack3_urlattack_scheme_netloc_2slash_urlexpected_scheme_netloc_locations	            r   3test_get_dir_redirect_location_domain_injection_bugLSimpleHTTPServerTestCase.test_get_dir_redirect_location_domain_injection_bug  s    	dll,@ABB4CTCTBUUhi"e1I <<$$$Xz/K/KL%%j1:NO Y
<<
+$$Xz/K/KL%%j1  40@ 	 	A
 3%j<<,$$Xz/K/KL++J79JK ->cU*C'-L,MQ*O'<< ?@$$Xz/K/KL%%j1 	h(;<r   c                 
   U R                  U R                  S-   5      nU R                  U[        R                  U R
                  S9  U R                  U R                  S-   5      nU R                  U[        R                  5        U R                  U R                  S-   5      nU R                  U[        R                  5        U R                  U R                  S-   5      nU R                  U[        R                  5        U R                  U R                  S-   5      nU R                  U[        R                  5        U R                  U R                  S-   5      nU R                  U[        R                  5        U R                  U R                  S-   5      nU R                  U[        R                  5        U R                  U R                  5      nU R                  U[        R                  5        U R                  UR                  S	5      U R                  S-   5        U R                  UR                  S
5      S5        U R                  U R                  S-   5      nU R                  U[        R                  5        U R                  U R                  S-   5      nU R                  U[        R                  5        U R                  UR                  S	5      U R                  S-   5        U R                  S5      nU R                  U[        R                  5        U R                  S5      nU R                  U[        R                  5        [        R                  " [        R                  R                  U R                  SS5      5        U R                  U R                  S-   5      nU R                  U[        R                  5        Sn[        [        R                  R                  U R                   S5      S5       nUR#                  U5        S S S 5        U R                  U R                  S-   5      nU R                  U[        R                  U5        [        R$                  S:X  a  [        R&                  " 5       S:w  a  [        R(                  " U R                  S5         U R                  U R                  S-   5      nU R                  U[        R                  5        [        R(                  " U R                  S5        g g g ! , (       d  f       N= f! [        R(                  " U R                  S5        f = f)N/testr  /test/z/test%2fz/test%2Fr   z%2fz%2Fr  r   0/?hi=2?hi=1/?hi=1z/ThisDoesNotExistz/ThisDoesNotExist/spamz
index.htmlz/spam/s   Dummy index file
r=  posixr   i  )ra   rK  ru  r	   r  r  r   r  r   r   rN   makedirsr   rD   rH  rL  rJ  r   r  geteuidchmod)r   rj  r  r  s       r   r-  !SimpleHTTPServerTestCase.test_getB  s   << 78$$Xz}}499$M<< 89$$Xz/C/CD<<
 :;$$Xz/C/CD<<
 :;$$Xz/C/CD<< 34$$Xz}}=<< 56$$Xz}}=<< 56$$Xz}}=<<.$$Xz/K/KL++J79LM++,<=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 G<< 34$$Xz}}dC 77g"**,!"3HHT\\1%.<<(;<,,Xz7K7KLu- #4 GF u-s   T->T  
T #Uc                 :   U R                  U R                  S-   SS9nU R                  U[        R                  5        U R                  UR                  S5      [        [        U R                  5      5      5        U R                  UR                  S5      S5        g )Nr  r  rd   zcontent-lengthzcontent-typezapplication/octet-stream)
ra   rK  ru  r	   r  r   r   strr  r  r   rj  s     r   	test_head"SimpleHTTPServerTestCase.test_headu  s    <<MMG#F   4$$Xz}}=++,<=S^,	.++N;3	5r   c                    [         R                  R                  5       nU R                  US'   U R	                  U R
                  S-   US9nU R                  U[        R                  5        U R                  [        R                  " SS9-   n[         R                  R                  5       n[         R                  R                  USS9US'   U R	                  U R
                  S-   US9nU R                  U[        R                  5        g)	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-Sincer  r   r   )hoursTr?  N)rV  messageMessagerZ  ra   rK  ru  r	   r  rU  rP  	timedeltarW  format_datetime)r   rf   rj  new_dts       r   test_browser_cache+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                 B   U R                   nU[        R                  " SS9-
  n[        R                  R                  5       n[        R                  R                  USS9US'   U R                  U R                  S-   US9nU R                  U[        R                  5        g )Nim  )daysTr?  r  r  r   )rU  rP  r  rV  r  r  rW  r  ra   rK  ru  r	   r  )r   dtold_dtrf   rj  s        r   test_browser_cache_file_changed8SimpleHTTPServerTestCase.test_browser_cache_file_changed  s    %%h((c22--'')',{{'B'B6 (C (#$<< 7<I$$Xz}}=r   c                     [         R                  R                  5       nU R                  US'   SUS'   U R	                  U R
                  S-   US9nU R                  U[        R                  5        g )Nr  *zIf-None-Matchr  r   )	rV  r  r  rZ  ra   rK  ru  r	   r  )r   rf   rj  s      r   ,test_browser_cache_with_If_None_Match_headerESimpleHTTPServerTestCase.test_browser_cache_with_If_None_Match_header  s`     --'')'+'='=#$#& << 7<I$$Xz}}=r   c                 $   U R                  SSS9nU R                  U[        R                  5        U R                  SSS9nU R                  U[        R                  5        U R                  SSS9nU R                  U[        R                  5        g )Nr   FOOr  customGETs)ra   ru  r	   r   r  s     r   test_invalid_requests.SimpleHTTPServerTestCase.test_invalid_requests  sz    <<E<2$$Xz/I/IJ<<H<5$$Xz/I/IJ<<F<3$$Xz/I/IJr   c                     U R                  U R                  S-   5      nU R                  U[        R                  U R
                  S9  UR                  S   nU R                  X R                  5        g)zChecks that the datetime returned in Last-Modified response header
is the actual datetime of last modification, rounded to the second
r  r  zLast-modifiedN)	ra   rK  ru  r	   r  r  rf   r   rZ  )r   rj  rZ  s      r   test_last_modified+SimpleHTTPServerTestCase.test_last_modified  s^     << 78$$Xz}}499$M$,,_=*,B,BCr   c                    U R                  U R                  S-   5      nU R                  U[        R                  U R
                  S9  U R                  U R                  S-   5      nU R                  U[        R                  5        U R                  U R                  S-   5      nU R                  U[        R                  5        U R                  U R                  5      nU R                  U[        R                  5        U R                  UR                  S5      U R                  S-   5        U R                  U R                  S-   5      nU R                  U[        R                  5        U R                  U R                  S-   5      nU R                  U[        R                  5        U R                  UR                  S5      U R                  S-   5        g )	Nr  r  r  r   r  r  r  r  )
ra   rJ  ru  r	   r  r  r   r  r   r   r  s     r   test_path_without_leading_slash8SimpleHTTPServerTestCase.test_path_without_leading_slash  sl   << 1 1G ;<$$Xz}}499$M<< 1 1H <=$$Xz/C/CD<< 1 1C 78$$Xz}}=<< 1 12$$Xz/K/KL++J7**S0	2<< 1 1H <=$$Xz}}=<< 1 1G ;<$$Xz/K/KL++J7**X5	7r   )rK  rC  r  rU  rZ  rH  rJ  r   )+r&   r'   r(   r)   r   r   r2   rT   rY   ru  r  r  unittest
skipUnlessr   r  r  r  skipIfr   r  platformr  r  r  r  r  r  r  r  r  r  r  r-  r  r  r  r	  r  r  r  r*   __classcell__r`  s   @r   r7  r7  b  s   -/G 1*2-$L, 229;-;- 229;/;/ __XSU__S\\W,BD55<>->DU- __XSU__S\\W,BD55<>/>DU/C 55<>->- 55<>/>/OG1/=b1.f5H$	>>KD7 7r   r7  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>")
r  z7This test can't be run reliably as root (issue #13308).c                       \ rS rSr " S S\\5      r\R                  R                  S5      rS r
S rS rS rS	 rS
 rS rS rS rS rS rS rS rS rS rS rSrg)CGIHTTPServerTestCasei  c                   ,   ^  \ rS rSrSrU 4S jrSrU =r$ )%CGIHTTPServerTestCase.request_handleri  Nc                    > U R                   R                  [        S5         [        TU ]  " U0 UD6  S S S 5        g ! , (       d  f       g = f)Nz#http\.server\.CGIHTTPRequestHandler)_test_case_selfassertWarnsRegexDeprecationWarningrA  r1   )r   r   kwargsr`  s      r   r1   .CGIHTTPServerTestCase.request_handler.__init__  sA    %%66&:<
  $1&1< < <s	   <
A
r   )r&   r'   r(   r)   r"  r1   r*   r  r  s   @r   r2   r     s    	2 	2r   r2   r  c                    X R                   l        [        R                  U 5        [        R
                  " 5       U l        [        R                  " 5       U l	        [        R                  R                  U R                  S5      U l        [        R                  R                  U R                  S5      U l        [        R                  R                  U R                  S5      U l        [        R                  R                  U R                  S5      U l        [        R                  R                  U R                  S5      U l        [        R"                  " U R                  5        [        R"                  " U R                  5        [        R"                  " U R                  5        [        R"                  " U R                  5        [        R"                  " U R                   5        S U l        S U l        S U l        S U l        S U l        S U l        S U l        [2        R4                  " 5       (       ac  [        R                  R                  U R                  S5      U l        [8        R:                  " U R6                  5      R=                  5       U l        O[>        R@                  U l         U R6                  RC                  S5        [        R                  R                  U R                  S5      U l        [K        U R$                  S	SS
9 nURM                  [N        U R6                  -  5        S S S 5        [        RP                  " U R$                  S5        [        R                  R                  U R                  S5      U l        [K        U R&                  S	SS
9 nURM                  [N        U R6                  -  5        S S S 5        [        RP                  " U R&                  S5        [        R                  R                  U R                  S5      U l        [K        U R(                  S	SS
9 nURM                  [R        U R6                  -  5        S S S 5        [        RP                  " U R(                  S5        [        R                  R                  U R                  S5      U l        [K        U R*                  S	SS
9 nURM                  [N        U R6                  -  5        S S S 5        [        RP                  " U R*                  S5        [        R                  R                  U R                  S5      U l        [K        U R,                  S	SS
9 nURM                  [T        U R6                  S4-  5        S S S 5        [        RP                  " U R,                  S5        [        R                  R                  U R                   S5      U l        [K        U R.                  S	SS
9 nURM                  [N        U R6                  -  5        S S S 5        [        RP                  " U R.                  S5        [        R                  R                  U R                  S5      U l+        [K        U RV                  S	SS
9 nURM                  [X        U R6                  -  5        S S S 5        [        RP                  " U RV                  S5        [        RZ                  " U R                  5        g ! [D         a%    U RG                  5         U RI                  S5         GNAf = f! , (       d  f       GN= f! , (       d  f       GNg= f! , (       d  f       GN= f! , (       d  f       GNk= f! , (       d  f       GN= f! , (       d  f       GNm= f! , (       d  f       N= f)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).r2   r"  rH   rT   rN   rB  rC  rD  rG  
parent_dirr   rD   cgi_dircgi_child_dir	sub_dir_1	sub_dir_2cgi_dir_in_sub_dirr  
nocgi_path
file1_path
file2_path
file3_path
file4_path
file5_path_pythonexe_symlinkr   can_symlink	pythonexer   PythonSymlink	__enter__r  
executabler   r  rY   r  rL  r   	cgi_file1r  	cgi_file2	cgi_file4
file6_path	cgi_file6rF  )r   rh  file1file2file3file4file5file6s           r   rT   CGIHTTPServerTestCase.setUp  s   /3,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9RHHY/0 :
%('',,t||Z@$//39UKK	DNN23 :
%('',,t||Z@$//39UKK	DNN23 :
%('',,t'9'9:F$//39UKK	DNN23 :
%('',,t||Z@$//39UKK	T^^^$DDE :
%('',,t'>'>
K$//39UKK	DNN23 :
%('',,t||Z@$//39UKK	DNN23 :
%(
!O " 	NMMOMMLM	N
 :9
 :9
 :9
 :9
 :9
 :9
 :9sf   )[ #\	#\(#\-8#\?%]#]#*#]5+\\	
\
\*-
\<?
]
] #
]25
^c                    S U R                   l         [        R                  " U R                  5        U R
                  (       a  U R
                  R                  S S S 5        U R                  (       a   [        R                  " U R                  5        U R                  (       a   [        R                  " U R                  5        U R                  (       a   [        R                  " U R                  5        U R                  (       a   [        R                  " U R                  5        U R                  (       a   [        R                  " U R                  5        U R                  (       a   [        R                  " U R                  5        U R                  (       a   [        R                  " U R                  5        [        R                  " U R                   5        [        R                  " U R"                  5        [        R                  " U R$                  5        [        R                  " U R&                  5        [        R                  " U R(                  5        [*        R,                  " [        R.                  R1                  U R2                  S5      5        [        R                  " U R2                  5        [4        R7                  U 5        g ! [4        R7                  U 5        f = f)Nzgmon.out)r2   r"  rN   rF  rC  r9  rW   r3  remover4  r5  r6  r7  r8  rB  rmdirr/  r.  r2  r1  r0  r   r  r   rD   r-  rH   rY   r?   s    r   rY   CGIHTTPServerTestCase.tearDown]  s   /3,	(HHTXX&&''00tTB		$//*		$//*		$//*		$//*		$//*		$//*		$//*HHT''(HHT\\"HHT,,-HHT^^$HHT^^$ RWW\\$//:FGHHT__%!!$'L!!$'s   J#K K#c                    0 SS_S[         _S[         _SS_SS_SS_SS_S	S
_S
S
_SS_SS_SS_SS_SS_SS_SS_SS_SSSSS[         SS[         SSS.EnUR                  5        H  u  p#[        U[        5      (       a8  [	        U[
        5      (       a#  U R                  U[        R                  U5        MR  [        R                  " U5      nU R                  X4SU< SU< SU< 3S9  M     g )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_path,CGIHTTPServerTestCase.test_url_collapse_path}  s|   

*
 j
 	

 $
 6
 D
  3
  !4
 
 %
 5
 5
 V
 F
  W!
" g#
$ !#",%-,4.8(.+0.8.2049
< +002ND(D))j9.M.M!!("(";";TC  2248  6"&&: ! ; 3r   c                     U R                  S5      nU R                  UR                  5       UR                  S5      UR                  4SU R
                  -   S[        R                  45        g )NrQ  Content-type   Hello Worldrq   )ra   r   r$   r   r   linesepr	   r  r   s     r   test_headers_and_content.CGIHTTPServerTestCase.test_headers_and_content  sT    ll./XXZ~6

Cdll*KG	Ir   c                 z    U R                  S5      nU R                  UR                  [        R                  5        g )Nz)///////////nocgi.py/../cgi-bin/nothere.sh)ra   r   r   r	   r   r   s     r   test_issue19435%CGIHTTPServerTestCase.test_issue19435  s+    llFGZ%9%9:r   c                     [         R                  R                  SSSS.5      nSS0nU R                  SSX5      nU R	                  UR                  5       S	U R                  -   5        g )
Nr   r)  i@ )r  eggsbaconra  z!application/x-www-form-urlencodedz/cgi-bin/file2.pyPOSTs   1, python, 123456)r  r  	urlencodera   r   r$   rc  )r   paramsrf   r   s       r   	test_postCGIHTTPServerTestCase.test_post  s^    ''(f=?!$GHll.H%9DLL%HIr   c                     U R                  S5      nUR                  5         U R                  UR                  [        R
                  5        g )Nz/cgi-bin/invalid)ra   r$   r   r   r	   r   r   s     r   test_invaliduri%CGIHTTPServerTestCase.test_invaliduri  s4    ll-.
Z%9%9:r   c                    SS[         R                  " S5      -   0nU R                  SSUS9nU R                  SU R                  -   S[
        R                  4UR                  5       UR                  S	5      UR                  45        g )
Ns   Authorizations   Basic s   username:passrQ  r[   r   rb  rq   ra  )
base64	b64encodera   r   rc  r	   r  r$   r   r   )r   rf   r   s      r   test_authorization(CGIHTTPServerTestCase.test_authorization  sz    #i##$45'6 7ll.wlGdll*KGXXZ~6

C	Er   c                     U R                  S5      nU R                  SU R                  -   S[        R                  4UR                  5       UR                  S5      UR                  45        g )NrP  rb  rq   ra  ra   r   rc  r	   r  r$   r   r   r   s     r   test_no_leading_slash+CGIHTTPServerTestCase.test_no_leading_slash  sT    ll-.dll*KGXXZ~6

C	Er   c                 J   SnU[         R                  S'   U R                  S5      nU R                  SU R                  -   S[
        R                  4UR                  5       UR                  S5      UR                  45        U R                  [         R                  S   U5        g )NzTest CGI ServerSERVER_SOFTWARErQ  rb  rq   ra  )
rN   rO   ra   r   rc  r	   r  r$   r   r   )r   	signaturer   s      r   test_os_environ_is_not_altered4CGIHTTPServerTestCase.test_os_environ_is_not_altered  s    %	(1

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

C	E 	$56	Br   c                     U R                  S5      nU R                  SU R                  -   S[        R                  4UR                  5       UR                  S5      UR                  45        g )Nz/cgi-bin%2ffile1.pyrb  rq   ra  rz  r   s     r   #test_urlquote_decoding_in_cgi_check9CGIHTTPServerTestCase.test_urlquote_decoding_in_cgi_check  sT    ll01dll*KGXXZ~6

C	Er   c                     U R                  S5      nU R                  SU R                  -   S[        R                  4UR                  5       UR                  S5      UR                  45        g )Nz/cgi-bin/child-dir/file3.pyrb  rq   ra  rz  r   s     r   test_nested_cgi_path_issue213235CGIHTTPServerTestCase.test_nested_cgi_path_issue21323  sT    ll89dll*KGXXZ~6

C	Er   c                     U R                  S5      nU R                  SU R                  -   S[        R                  4UR                  5       UR                  S5      UR                  45        g )Nz/cgi-bin/file4.py?a=b?c=ds   a=b?c=drq   ra  rz  r   s     r   &test_query_with_multiple_question_mark<CGIHTTPServerTestCase.test_query_with_multiple_question_mark  sT    ll67$,,&Z]]CXXZ~6

C	Er   c                     U R                  S5      nU R                  SU R                  -   S[        R                  4UR                  5       UR                  S5      UR                  45        g )Nz0/cgi-bin/file4.py?k=aa%2F%2Fbb&//q//p//=//a//b//s   k=aa%2F%2Fbb&//q//p//=//a//b//rq   ra  rz  r   s     r   "test_query_with_continuous_slashes8CGIHTTPServerTestCase.test_query_with_continuous_slashes  sW    llMN.=*--)XXZ~6

C	Er   c                     [         R                  R                  S5        U R                  S5      nU R	                  SU R
                  -   S[        R                  4UR                  5       UR                  S5      UR                  45        [         R                  R                  S5        g ! [         R                  R                  S5        f = f)Nz/sub/dir/cgi-binz/sub/dir/cgi-bin/file5.pyrb  rq   ra  )r   cgi_directoriesappendra   r   rc  r	   r  r$   r   r   rL  r   s     r    test_cgi_path_in_sub_directories6CGIHTTPServerTestCase.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                    SnSU44U4SS4nU H  u  p4[        U5      nU R                  U5         U R                  SSUS9nU R                  [        R
                  R                  UR                  5        SU 3R                  S	5      nU R                  XER                  5       5        S S S 5        M     g ! , (       d  f       M  = f)
Nz?text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept)r   r"   )))r  rq   )ACCEPTz
text/plainztext/html,text/plainz/cgi-bin/file6.pyr[   r   zHTTP_ACCEPT=r  )r   r  ra   r   r]   r	   r  r   r   r  r$   )r   browser_accepttestsrf   r\  r   s         r   test_accept!CGIHTTPServerTestCase.test_accept  s    U 	 (*N;'	
 "'G!'*Gg&ll#6wlO  !3!3SZZ@)(4;;GDh
3	 '& "'&&s   A9B66
C	)r9  r/  r.  r2  rC  r4  r5  r6  r7  r8  rB  r3  r-  r;  r0  r1  N)r&   r'   r(   r)   r   r   r2   rN   rc  r   rT   rY   r^  rd  rg  ro  rr  rw  r{  r  r  r  r  r  r  r  r*   r   r   r   r  r    s    	2-/D 	2 jj(GK"Z(@(;TI;J;
EECEEEEM4r   r  c                   8   ^  \ rS rSrSU 4S jjrS rS rSrU =r$ )SocketlessRequestHandleri  c                    > [         R                  " 5       n[        5       UR                  l        [
        TU ]  US S US9  SU l        SU l        g )N	directoryFrn   )	r
   Mockr   makefilereturn_valuerA  r1   
get_calledr   )r   r  ra   r`  s      r   r1   !SocketlessRequestHandler.__init__  sC    ))+(/	%$	B *r   c                     SU l         U R                  [        R                  5        U R	                  SS5        U R                  5         U R                  R                  S5        g )NTrp   rq       <html><body>Data</body></html>
)r  ru   r	   r  rw   rx   r   r   r?   s    r   r#  SocketlessRequestHandler.do_GET  sJ    :==)5

>?r   c                     g r   r   )r   r  r   s      r   r   $SocketlessRequestHandler.log_message  s    r   )r  r   r   )	r&   r'   r(   r)   r1   r#  r   r*   r  r  s   @r   r  r    s    +@ r   r  c                       \ rS rSrS rSrg)!RejectingSocketlessRequestHandleri  c                 B    U R                  [        R                  5        g)NF)r   r	   EXPECTATION_FAILEDr?   s    r   handle_expect_1003RejectingSocketlessRequestHandler.handle_expect_100   s    
556r   r   N)r&   r'   r(   r)   r  r*   r   r   r   r  r    s    r   r  c                   6    \ rS rSrS rS rS r\S 5       rSr	g)AuditableBytesIOi%  c                     / U l         g r   datasr?   s    r   r1   AuditableBytesIO.__init__'  s	    
r   c                 :    U R                   R                  U5        g r   )r  r  )r   r  s     r   r   AuditableBytesIO.write*  s    

$r   c                 8    SR                  U R                  5      $ )Nr   )rD   r  r?   s    r   getDataAuditableBytesIO.getData-  s    xx

##r   c                 ,    [        U R                  5      $ r   )r  r  r?   s    r   	numWritesAuditableBytesIO.numWrites0  s    4::r   r  N)
r&   r'   r(   r)   r1   r   r  propertyr  r*   r   r   r   r  r  %  s%     $  r   r  c                       \ rS rSrSr\R                  " S5      rS rS r	S r
S rS rS	 rS
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rSrg)BaseHTTPRequestHandlerTestCasei5  zdTest the functionality of the BaseHTTPServer.

Test the support for the Expect 100-continue header.
s   HTTP/1.[0-9]+ 200 OKc                 "    [        5       U l        g r   )r  handlerr?   s    r   rT   $BaseHTTPRequestHandlerTestCase.setUp=  s    /1r   c                     [        U5      n[        5       nX R                  l        X0R                  l        U R                  R	                  5         UR                  S5        UR                  5       $ Nr   )r   r  rfiler   handle_one_requestseek	readlines)r   r  inputoutputs       r   send_typical_request3BaseHTTPRequestHandlerTestCase.send_typical_request@  sQ     "#'')A!!r   c                 N    U R                  U R                  R                  5        g r   )r   r  r  r?   s    r   verify_get_called0BaseHTTPRequestHandlerTestCase.verify_get_calledI  s    //0r   c                 b   ^ S H(  mU R                  [        U4S jU 5       5      S5        M*     g )N)s   Server: s   Date: s   Content-Type: c              3   D   >#    U  H  oR                  T5      v   M     g 7fr   )
startswith).0h	fieldNames     r   	<genexpr>IBaseHTTPRequestHandlerTestCase.verify_expected_headers.<locals>.<genexpr>N  s      J'Qi!8!8's    r   )r   sum)r   rf   r  s     @r   verify_expected_headers6BaseHTTPRequestHandlerTestCase.verify_expected_headersL  s)    BIS J' JJAN Cr   c                 \    U R                   R                  U5      nU R                  U5        g r   )HTTPResponseMatchsearchrp  )r   rj  matchs      r   verify_http_server_response:BaseHTTPRequestHandlerTestCase.verify_http_server_responseP  s&    &&--h7U#r   c                    SU R                   l        [        R                  n[        R
                  R                  [        S[        5       5       nU" U R                   S5        U" U R                   S5        U" U R                   SS5        U" U R                   SS5        U" U R                   S5        S S S 5        WR                  5       nU R                  S	U5        U R                  S
U5        UR                  5       nU R                  SUS   5        U R                  SUS   5        U R                  SUS   5        U R                  SUS   5        U R                  SUS   5        g ! , (       d  f       N= f)N)	127.0.0.1i9  stderrz/fooz/bar z	/spam %s.rR  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objectr  r   r+  assertNotIn
splitlinesr  )r   r   fake_stderrr  r3  s        r   test_unprintable_not_logged:BaseHTTPRequestHandlerTestCase.test_unprintable_not_loggedT  s+    ':#,88ZZsHhj9[f-&89k37k3JK&EF : %%'((!!#feAh')584j%(+7qB6aA :9s   A"E''
E5c                 X   U R                  S5      nU R                  US   5        U R                  USS 5        U R                  5         U R	                  US   S5        U R	                  U R
                  R                  S5        U R	                  U R
                  R                  S5        U R	                  U R
                  R                  S5        U R	                  U R
                  R                  S	5        U R                  U R
                  R                  R                  5       S
5        g )N   GET / HTTP/1.1

r   r   r  GET / HTTP/1.1r[   r   rn   r   r  r  r  r  r   r  requestlinecommandr   request_versionassertSequenceEqualrf   rT  r   results     r   test_http_1_1,BaseHTTPRequestHandlerTestCase.test_http_1_1i      **+DE((3$$VAb\2 %JK113CD--u5**C055zB  !5!5!;!;!=rBr   c                 X   U R                  S5      nU R                  US   5        U R                  USS 5        U R                  5         U R	                  US   S5        U R	                  U R
                  R                  S5        U R	                  U R
                  R                  S5        U R	                  U R
                  R                  S5        U R	                  U R
                  R                  S	5        U R                  U R
                  R                  R                  5       S
5        g )Ns   GET / HTTP/1.0

r   r   r  r  GET / HTTP/1.0r[   r   HTTP/1.0r   r  r  s     r   test_http_1_0,BaseHTTPRequestHandlerTestCase.test_http_1_0u  r  r   c                     U R                  S5      nU R                  [        U5      S5        U R                  US   S5        U R                  5         g )Ns   GET / HTTP/0.9

r   r   r  )r  r   r  r  r  s     r   test_http_0_9,BaseHTTPRequestHandlerTestCase.test_http_0_9  sH    **+DEVa($IJ r   c                     U R                  S5      nU R                  US   S5        U R                  USUR                  S5       5        U R	                  U R
                  R                  5        g )Ns)   GET /spaced out HTTP/1.1
Host: dummy

r   s   HTTP/1.1 400 r      
)r  r  r  indexassertFalser  r  r  s     r   test_extra_space/BaseHTTPRequestHandlerTestCase.test_extra_space  sd    **

 	fQi)9:$$VAfll7.C%DE001r   c                 \   U R                  S5      nU R                  US   5        U R                  USS 5        U R                  5         U R	                  US   S5        U R	                  U R
                  R                  S5        U R	                  U R
                  R                  S5        U R	                  U R
                  R                  S5        U R	                  U R
                  R                  S	5        S
nU R                  U R
                  R                  R                  5       U5        g )Ns(   GET / HTTP/1.0
Expect: 100-continue

r   r   r  r  r   r[   r   r  )Expectz100-continuer  r   r  rf   s      r   test_with_continue_1_05BaseHTTPRequestHandlerTestCase.test_with_continue_1_0  s    **+\]((3$$VAb\2 %JK113CD--u5**C055zB/  !5!5!;!;!=wGr   c                    U R                  S5      nU R                  US   S5        U R                  US   S5        U R                  US   S5        U R                  USS 5        U R                  5         U R                  US   S	5        U R                  U R                  R
                  S
5        U R                  U R                  R                  S5        U R                  U R                  R                  S5        U R                  U R                  R                  S5        SnU R                  U R                  R                  R                  5       U5        g )N(   GET / HTTP/1.1
Expect: 100-continue

r   s   HTTP/1.1 100 Continue
r   r  r  s   HTTP/1.1 200 OK
r  r  r  r[   r   rn   r  )r  r   r  r  r  r  r  r   r  r  rf   rT  r  s      r   test_with_continue_1_15BaseHTTPRequestHandlerTestCase.test_with_continue_1_1  s   **+\]$@AG,$:;$$VAb\2 %JK113CD--u5**C055zB/  !5!5!;!;!=wGr   c                     [        S5      n[        5       n[        5       nXl        X#l        SUl        SUl        S Ul        UR                  S5        U R                  UR                  S5        g )Nr  rn   r"     r  )r   r  r  r  r   r  r  r  r   r   r  r   r  r  r  s       r   #test_header_buffering_of_send_errorBBaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_error  sb    12!#*,", 3))1-r   c                    [        S5      n[        5       n[        5       nXl        X#l        SUl        UR                  S5        U R                  UR                  S5        UR                  5         U R                  UR                  S5        g )Nr  rn   r  r   r   )
r   r  r  r  r   r  send_response_onlyr   r  rx   r  s       r   +test_header_buffering_of_send_response_onlyJBaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_response_only  su    12!#*,",""3'))1-))1-r   c                    [        S5      n[        5       n[        5       nXl        X#l        SUl        UR                  SS5        UR                  SS5        U R                  UR                  S5        UR                  5         U R                  UR                  5       S5        U R                  UR                  S5        g )	Nr  rn   Foofoobarr   s   Foo: foo
bar: bar

r   )r   r  r  r  r   r  rw   r   r  rx   r  r  s       r   $test_header_buffering_of_send_headerCBaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_header  s    12!#*,",E5)E5)))1-)+JK))1-r   c                    S n[        S5      n[        5       nX R                  l        X0R                  l        SU R                  l        U R                  R                  5         U R                  U" U5      S5        U" U5      R                  S5      nU R                  US   S5        U R                  US   S5        U R                  US	   S
5        g )Nc                     U R                  5       nU R                  S5        U R                  5       nU R                  U5        U$ r  )tellr  r$   )r  posr  s      r   _readAndReseek[BaseHTTPRequestHandlerTestCase.test_header_unbuffered_when_continue.<locals>._readAndReseek  s3    &&(CFF1I668DFF3KKr   r  rn   r   r  r   s   HTTP/1.1 100 Continuer   r  s   HTTP/1.1 200 OK)	r   r  r  r   r  r  assertNotEqualr2  r   )r   r*  r  r  r  s        r   $test_header_unbuffered_when_continueCBaseHTTPRequestHandlerTestCase.test_header_unbuffered_when_continue  s    	 IJ"#'1$'')N62C8'--g6$<=C($67r   c                 N   U R                   n[        5       U l         U R                  S5      nU R                  US   S5        U R	                  USS 5        U R                  U R                   R                  5        U R                  [        S USS  5       5      S5        Xl         g )Nr  r   s!   HTTP/1.1 417 Expectation Failed
r   r  c              3   *   #    U  H	  oS :H  v   M     g7f)s   Connection: close
Nr   )r  rs     r   r  MBaseHTTPRequestHandlerTestCase.test_with_continue_rejected.<locals>.<genexpr>  s     QLq"::Ls   )r  r  r  r   r  r
  r  r  )r   usual_handlerr  s      r   test_with_continue_rejected:BaseHTTPRequestHandlerTestCase.test_with_continue_rejected  s    8:**+\]$JK$$VAb\2 	001QF1RLQQSTU$r   c                     U R                  SSS-  -   5      nU R                  US   S5        U R                  U R                  R                  5        U R                  U R                  R                  [        5        g )Ns   GET    x  r   s   HTTP/1.1 414 URI Too Long
)r  r   r
  r  r  assertIsInstancer  r  r  s     r   test_request_length2BaseHTTPRequestHandlerTestCase.test_request_length  sd     **7TE\+AB$DE001dll66<r   c                     U R                  SSS-  -   S-   5      nU R                  US   S5        U R                  U R                  R                  5        U R                  U R                  R
                  S5        g )Ns   GET / HTTP/1.1
X-Foo: bar   rr8  s   

r   s   HTTP/1.1 431 Line too long
r  r  r   r
  r  r  r  r  s     r   test_header_length1BaseHTTPRequestHandlerTestCase.test_header_length  sl    **+dUl:[HJ$EF001113CDr   c                     U R                  S5      nU R                  US   S5        U R                  U R                  R                  5        U R                  U R                  R
                  S5        g )Ns  GET / HTTP/1.1
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar
X-Foo: bar

r   s   HTTP/1.1 431 Too many headers
r  r>  r  s     r   test_too_many_headers4BaseHTTPRequestHandlerTestCase.test_too_many_headers  s^    **EG$HI001113CDr   c                     U R                  S5      nSR                  U5      nSnU R                  [        R                  " USS9R                  S5      U5        g )Ns*   <script>alert("hello")</script> / HTTP/1.1r   z<script>alert("hello")</script>Fr|  r  )r  rD   r  r  r  r   )r   r  texts      r   test_html_escape_on_error8BaseHTTPRequestHandlerTestCase.test_html_escape_on_error  sL    **9;&!0dkk$e4;;GDfMr   c                 8  ^ ^ UU 4S jnUT R                   l        [        S5      mT R                   R                  5         T R	                  [
        [        T5        [        S5      mT R                   R                  5         T R	                  [
        [        T5        g )Nc                  :   > [        T 5      TR                  l        g r   )nextr  close_connection)close_valuesr   s   r   r  PBaseHTTPRequestHandlerTestCase.test_close_connection.<locals>.handle_one_request  s    ,0,>DLL)r   )T)FFT)r  r  iterhandlerY  StopIterationrJ  )r   r  rL  s   ` @r   test_close_connection4BaseHTTPRequestHandlerTestCase.test_close_connection  sl    	?*<'G}-|<01-|<r   c           	      (   [         R                   " 5       n[         R                  " U5      u	  p#pEpgpn
SU R                  R                  U   UU R                  R                  U   X%Xg4-  nU R                  U R                  R                  US9U5        g )Nz#%s, %02d %3s %4d %02d:%02d:%02d GMT)rY  )timegmtimer  weekdayname	monthnamer   date_time_string)r   nowyearmonthdayhhmmsswdyzr\  s               r   test_date_time_string4BaseHTTPRequestHandlerTestCase.test_date_time_string(  s    iik15S1A.SbbQ8LL$$R(LL""5)b	<
 
 	666ExPr   )r  N) r&   r'   r(   r)   __doc__recompiler  rT   r  r  r  r  r  r  r  r  r  r  r  r  r  r$  r-  r4  r:  r?  rB  rF  rQ  rc  r*   r   r   r   r  r  5  s    
 

#:;2"1O$B*
C
C!2HH... 8,
%=EEN=
Qr   r  c                   0    \ rS rSrSrS rS rS rS rSr	g)	 SimpleHTTPRequestHandlerTestCasei5  zTest url parsing c                    [         R                  R                  [         R                  " 5       S5      U l        [         R                  R                  SS5      U l        [         R                  R                  SS5      U l        [        5       U l        [        SS9U l	        [        [        R                  " S5      S9U l        g )Nr  r"  r#  r  )rN   r   rD   rB  translated_1translated_2translated_3r  	handler_1	handler_2pathlibPurePath	handler_3r?   s    r   rT   &SimpleHTTPRequestHandlerTestCase.setUp7  sz    GGLLjAGGLL
;GGLL
;131EB1G<L<LU<STr   c                    U R                   R                  S5      nU R                  XR                  5        U R                  R                  S5      nU R                  XR
                  5        U R                  R                  S5      nU R                  XR                  5        U R                   R                  S5      nU R                  XR                  5        U R                  R                  S5      nU R                  XR
                  5        U R                  R                  S5      nU R                  XR                  5        U R                   R                  S5      nU R                  XR                  5        U R                  R                  S5      nU R                  XR
                  5        U R                  R                  S5      nU R                  XR                  5        g )Nz	/filenamez/filename?foo=barz/filename?a=b&spam=eggs#zotrn  translate_pathr   rk  ro  rl  rr  rm  r   r   s     r   test_query_arguments5SimpleHTTPRequestHandlerTestCase.test_query_arguments?  sp   ~~,,[9001~~,,[9001~~,,[9001~~,,-@A001~~,,-@A001~~,,-@A001~~,,-JK001~~,,-JK001~~,,-JK001r   c                    U R                   R                  S5      nU R                  XR                  5        U R                  R                  S5      nU R                  XR
                  5        U R                  R                  S5      nU R                  XR                  5        U R                   R                  S5      nU R                  XR                  5        U R                  R                  S5      nU R                  XR
                  5        U R                  R                  S5      nU R                  XR                  5        g )Nz
//filenamez//filename?foo=barru  rw  s     r   test_start_with_double_slash=SimpleHTTPRequestHandlerTestCase.test_start_with_double_slashU  s    ~~,,\:001~~,,\:001~~,,\:001~~,,-AB001~~,,-AB001~~,,-AB001r   c                 	   [         R                  " [        R                  S[        5         U R
                  R                  S5      nUR                  [        R                  [        R                  5      nU R                  XR                  5        U R                  R                  S5      nUR                  [        R                  [        R                  5      nU R                  XR                  5        U R                  R                  S5      nUR                  [        R                  [        R                  5      nU R                  XR                  5        U R
                  R                  S5      nUR                  [        R                  [        R                  5      nU R                  XR                  5        U R                  R                  S5      nUR                  [        R                  [        R                  5      nU R                  XR                  5        U R                  R                  S5      nUR                  [        R                  [        R                  5      nU R                  XR                  5        U R
                  R                  S5      nUR                  [        R                  [        R                  5      nU R                  XR                  5        U R                  R                  S5      nUR                  [        R                  [        R                  5      nU R                  XR                  5        U R                  R                  S5      nUR                  [        R                  [        R                  5      nU R                  XR                  5        U R
                  R                  S5      nUR                  [        R                  [        R                  5      nU R                  XR                  5        U R                  R                  S5      nUR                  [        R                  [        R                  5      nU R                  XR                  5        U R                  R                  S5      nUR                  [        R                  [        R                  5      nU R                  XR                  5        S S S 5        g ! , (       d  f       g = f)Nr   zc:c:c:foo/filenamez\c:../filenamezc:\c:..\foo/filenamezc:c:foo\c:c:bar/filename)r   	swap_attrr   rN   ntpathrn  rv  rT  sepr   rk  ro  rl  rr  rm  rw  s     r   test_windows_colon3SimpleHTTPRequestHandlerTestCase.test_windows_colond  s1   vyy&&9>>001EFD<<

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

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

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

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

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

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

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

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

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

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

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

BFF3DT#4#45O :99s   R1S%%
S3)rn  ro  rr  rk  rl  rm  N)
r&   r'   r(   r)   re  rT   rx  r{  r  r*   r   r   r   ri  ri  5  s    U2,2(6r   ri  c                       \ rS rSrS rSrg)MiscTestCasei  c                    / n1 Skn[        [        5       HT  nUR                  S5      (       d  X2;   a  M   [        [        U5      n[        USS 5      S:X  d  MC  UR	                  U5        MV     U R                  [        R                  U5        g )N>   r<  r>  
nobody_uid_r'   zhttp.server)r;  r   r  getattrr  assertCountEqual__all__)r   r\  denylistr  module_objects        r   test_allMiscTestCase.test_all  sp    7KDs##t'7#FD1M}lD9]J%   	fnnh7r   r   N)r&   r'   r(   r)   r  r*   r   r   r   r  r    s    	8r   r  c                       \ rS rSrS r\R                  " S5      S 5       r\R                  " S5      S 5       rSr	Sr
\R                  " S5      S 5       r\R                  " S5      S	 5       rS
rg)ScriptTestCasei  c                     [         R                  " [         R                  " [         R                  " [         R                  " [         R                  " S S9S9S9S9S9$ )Nc                      g)N)r"   r   r   r   r   r   <lambda>2ScriptTestCase.mock_server_class.<locals>.<lambda>  s    r   )r8   )r7   )r  )r=  )r
   	MagicMockr?   s    r   mock_server_class ScriptTestCase.mock_server_class  sF    ~~..!%#~~(7 "

 
	
r   zbuiltins.printc                     U R                  5       n[        R                  " US S9  U R                  UR                  [
        R                  [
        R                  45        g NServerClassbindr  r   r<  r  address_familyr7   AF_INET6AF_INETr   r  mock_servers      r   test_server_test_unspec&ScriptTestCase.test_server_test_unspec  sC    ,,.$7&&__fnn-	
r   c                     U R                  5       n[        R                  " USS9  U R                  UR                  [
        R                  [
        R                  45        g )Nr6   r  r  r  s      r   test_server_test_localhost)ScriptTestCase.test_server_test_localhost  sC    ,,.+>&&__fnn-	
r   )z::z'2001:0db8:85a3:0000:0000:8a2e:0370:7334z::1)z0.0.0.0z8.8.8.8r  c                     U R                    HQ  nU R                  5       n[        R                  " X2S9  U R	                  UR
                  [        R                  5        MS     g r  )
ipv6_addrsr  r   r<  r   r  r7   r  r   r  r  r  s       r   test_server_test_ipv6$ScriptTestCase.test_server_test_ipv6  sD    OOD002KKKK;[77I $r   c                     U R                    HQ  nU R                  5       n[        R                  " X2S9  U R	                  UR
                  [        R                  5        MS     g r  )
ipv4_addrsr  r   r<  r   r  r7   r  r  s       r   test_server_test_ipv4$ScriptTestCase.test_server_test_ipv4  sD    OOD002KKKK;[77H $r   r   N)r&   r'   r(   r)   r  r
   r  r  r  r  r  r  r  r*   r   r   r   r  r    s    
 
ZZ !
 "
 
ZZ !
 "
JJ 
ZZ !J "J 
ZZ !I "Ir   r  c                  t    [         R                  " [        R                  [        R                  " 5       5        g r   )r  addModuleCleanuprN   rF  rB  r   r   r   setUpModuler    s    bhh		4r   __main__)Gre  collectionsr   http.serverr   r   r   r   r]   r   r	   rN   r7   r  rf  ru  r  rp  rc  email.messagerV  email.utilsr  http.clienturllib.parser  rD  rT  rP  r/   r  r
   ior   r   r<  r   test.supportr   r   r   r   test.support.testcaser   requires_working_socketr   r0   r,   TestCaserH   ri   r  r7  r?  r@  rA  rC  r  hasattrr  r  r  r  r  r  ri  r  r  r  r&   mainr   r   r   <module>r     s  
 $5 5 # 	  
 	                    2   t , y'' *-8$$o -*a(\ a(H BL  BFd7| d7N		"		& 
Y'=BJJLA,=ACG4L G4 CG4T7 &(@   }QX%6%6 }Q@W6x'8'8 W6t
88$$ 
89IX&& 9Ix5 zMMO r   