
    -hh`                     N   S r / SQ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rSr " S S\R2                  5      r " S	 S
\R6                  \5      r " S S\R:                  5      r " S S\5      rS r Sq!S r"S r# " S S\5      r$S r%\\SSS4S jr&\'S:X  a  SSK(r(SSK)r)\(RT                  " 5       r+\+RY                  SSSS9  \+RY                  SSSS S!9  \+RY                  S"S#\RZ                  " 5       S$S%9  \+RY                  S&S'S(SS)S*9  \+RY                  S+S\.S,S-S.9  \+R_                  5       r0\0Rb                  (       a  \$r2O\r2 " S/ S0\5      r3\&" \2\3\0Rh                  \0Rj                  \0Rl                  S19  gg)2z0.6)
HTTPServerThreadingHTTPServerBaseHTTPRequestHandlerSimpleHTTPRequestHandlerCGIHTTPRequestHandler    N)
HTTPStatusaD  <!DOCTYPE HTML>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>Error response</title>
    </head>
    <body>
        <h1>Error response</h1>
        <p>Error code: %(code)d</p>
        <p>Message: %(message)s.</p>
        <p>Error code explanation: %(code)s - %(explain)s.</p>
    </body>
</html>
ztext/html;charset=utf-8c                       \ rS rSrSrS rSrg)r         c                     [         R                  R                  U 5        U R                  S S u  p[        R
                  " U5      U l        X l        g )N   )socketserver	TCPServerserver_bindserver_addresssocketgetfqdnserver_nameserver_port)selfhostports      4/opt/python-3.13.8/usr/lib/python3.13/http/server.pyr   HTTPServer.server_bind   sA    **40((!,
!>>$/    )r   r   N)__name__
__module____qualname____firstlineno__allow_reuse_addressr   __static_attributes__ r   r   r   r      s     r   r   c                       \ rS rSrSrSrg)r      Tr"   N)r   r   r   r   daemon_threadsr!   r"   r   r   r   r      s    Nr   r   c            
       d   \ rS rSrS\R
                  R                  5       S   -   rS\-   r	\
r\rSrS rS rS rS	 rS#S jrS$S jrS$S jrS rS rS rS%S jrS r\R9                  \R<                  " \" S5      \" SS5      5       V Vs0 s H	  oSUS 3_M     snn 5      r S\ \!" S5      '   S r"S r#S$S jr$S r%/ SQr&/ SQr'S  r(S!r)\*RV                  RX                  r-\.R^                  Ra                  5        V Vs0 s H  nX"Rb                  URd                  4_M     snn r3S"r4g
s  snn f s  snn f )&r      zPython/r   z	BaseHTTP/HTTP/0.9c                 z   S U l         U R                  =U l        nSU l        [	        U R
                  S5      nUR                  S5      nX l        UR                  5       n[        U5      S:X  a  g[        U5      S:  Ga
  US   n UR                  S5      (       d  [        eUR                  S	S
5      S
   nUR                  S5      n[        U5      S:w  a  [        e[        S U 5       5      (       a  [        S5      e[        S U 5       5      (       a  [        S5      e[        US   5      [        US
   5      4nUS:  a  U R$                  S:  a  SU l        US:  a$  U R                  [         R&                  SU-  5        gXl        S[        U5      s=::  a  S::  d&  O  U R                  [         R"                  SU-  5        gUS S u  pg[        U5      S:X  a1  SU l        US:w  a$  U R                  [         R"                  SU-  5        gXgsU l         U l        U R(                  R                  S5      (       a#  S	U R(                  R+                  S	5      -   U l         [,        R.                  R1                  U R2                  U R4                  S9U l        U R6                  R?                  SS5      n	U	RA                  5       S:X  a  SU l        O+U	RA                  5       S :X  a  U R$                  S:  a  SU l        U R6                  R?                  S!S5      n
U
RA                  5       S":X  a6  U R$                  S:  a&  U R                  S:  a  U RC                  5       (       d  gg! [        [        4 a&    U R                  [         R"                  SU-  5         gf = f! [,        R.                  R8                   a4  nU R                  [         R:                  S[	        U5      5         S nAgS nAf[,        R.                  R<                   a4  nU R                  [         R:                  S[	        U5      5         S nAgS nAff = f)#NTz
iso-8859-1
r   F   zHTTP//r   .r   c              3   J   #    U  H  oR                  5       (       + v   M     g 7fN)isdigit.0	components     r   	<genexpr>7BaseHTTPRequestHandler.parse_request.<locals>.<genexpr>/  s     O9,,...s   !#znon digit in http versionc              3   >   #    U  H  n[        U5      S :  v   M     g7f)
   N)lenr2   s     r   r5   r6   1  s     KNys9~*Ns   z unreasonable length http versionzBad request version (%r))r   r   zHTTP/1.1)r   r   zInvalid HTTP version (%s)zBad request syntax (%r)GETzBad HTTP/0.9 request type (%r)z//)_classzLine too longzToo many headers
Connection close
keep-aliveExpectz100-continue)"commanddefault_request_versionrequest_versionclose_connectionstrraw_requestlinerstriprequestlinesplitr9   
startswith
ValueErroranyint
IndexError
send_errorr   BAD_REQUESTprotocol_versionHTTP_VERSION_NOT_SUPPORTEDpathlstriphttpclientparse_headersrfileMessageClassheadersLineTooLongREQUEST_HEADER_FIELDS_TOO_LARGEHTTPExceptiongetlowerhandle_expect_100)r   versionrH   wordsbase_version_numberversion_numberrA   rS   errconntypeexpects              r   parse_request$BaseHTTPRequestHandler.parse_request  s    )-)E)EEw $$..=!((0&!!#u:?u:?BiG))'22$$&-mmC&;A&>#!4!:!:3!? ~&!+$$OOOO$%@AAKNKKK$%GHH!$^A%6!7^A=N9O!O 'D,A,AZ,O(-%'99/2EEG #* CJ#!#OO&&)K79 bq	u:?$(D!%**4w>@ ")di 99%%dii..s33DI	;;44TZZ<@<M<M 5 ODL  <<##L"5>>w&$(D!nn,.##z1$)D!!!(B/LLNn,%%3$$
2))++G 
+ **.8: 	P {{&& 	OO::C {{(( 	OO::"C
 	s7   B7M 7N 3NNP:6*O%%!P:*P55P:c                 b    U R                  [        R                  5        U R                  5         gNT)send_response_onlyr   CONTINUEend_headersr   s    r   r`   (BaseHTTPRequestHandler.handle_expect_100y  s'     	
 3 34r   c                     U R                   R                  S5      U l        [        U R                  5      S:  a5  SU l        SU l        SU l        U R                  [        R                  5        g U R                  (       d  SU l
        g U R                  5       (       d  g SU R                  -   n[        X5      (       d.  U R                  [        R                  SU R                  -  5        g [        X5      nU" 5         U R                  R!                  5         g ! ["         a#  nU R%                  SU5        SU l
         S nAg S nAff = f)Ni  i   r=   Tdo_zUnsupported method (%r)zRequest timed out: %r)rX   readlinerF   r9   rH   rC   rA   rO   r   REQUEST_URI_TOO_LONGrD   rh   hasattrNOT_IMPLEMENTEDgetattrwfileflushTimeoutError	log_error)r   mnamemethodes       r   handle_one_request)BaseHTTPRequestHandler.handle_one_request  s   	#'::#6#6u#=D 4''(50#% ')$!
 ? ?@''(,%%%''DLL(E4''..-<> T)FHJJ 	NN2A6$(D!		s1   A-D 0D 	D AD ,,D 
E#EEc                     SU l         U R                  5         U R                   (       d$  U R                  5         U R                   (       d  M#  g g rk   )rD   r   ro   s    r   handleBaseHTTPRequestHandler.handle  s9     $!''##% '''r   Nc                     U R                   U   u  pEUc  UnUc  UnU R                  SX5        U R                  X5        U R	                  SS5        S nUS:  a  U[
        R                  [
        R                  [
        R                  4;  a  U R                  U[        R                  " USS9[        R                  " USS9S.-  nUR                  S	S
5      nU R	                  SU R                  5        U R	                  S[        [        U5      5      5        U R!                  5         U R"                  S:w  a$  U(       a  U R$                  R'                  U5        g g g ! [         a    Su  pE GN[f = f)N)???r   zcode %d, message %sr<   r>      Fquote)codemessageexplainzUTF-8replacezContent-TypeContent-LengthHEAD)	responsesKeyErrorr{   send_responsesend_headerr   
NO_CONTENTRESET_CONTENTNOT_MODIFIEDerror_message_formathtmlescapeencodeerror_content_typerE   r9   rn   rA   rx   write)r   r   r   r   shortmsglongmsgbodycontents           r   rO   !BaseHTTPRequestHandler.send_error  sV   $	- $t 4H ?G?G,d<4)w/
 CK..#11#002 2
 00;;we<;;we<4 G
 >>'95D^T-D-DE-s3t9~><<6!dJJT" '+!=  	- ,Hg	-s   E E/.E/c                     U R                  U5        U R                  X5        U R                  SU R                  5       5        U R                  SU R	                  5       5        g )NServerDate)log_requestrl   r   version_stringdate_time_stringr   r   r   s      r   r   $BaseHTTPRequestHandler.send_response  sR     	.4#6#6#89!6!6!89r   c                    U R                   S:w  az  Uc$  XR                  ;   a  U R                  U   S   nOSn[        U S5      (       d  / U l        U R                  R	                  SU R
                  X4-  R                  SS5      5        g g )Nr(   r   r=   _headers_bufferz
%s %d %s
latin-1strict)rC   r   ru   r   appendrQ   r   r   s      r   rl   )BaseHTTPRequestHandler.send_response_only  s    :->>)"nnT215G G4!233')$  ''**D:*;<BF!8=-. .r   c                 T   U R                   S:w  aK  [        U S5      (       d  / U l        U R                  R                  U< SU< S3R	                  SS5      5        UR                  5       S:X  a9  UR                  5       S:X  a  S	U l        g UR                  5       S
:X  a  SU l        g g g )Nr(   r   z: r*   r   r   
connectionr>   Tr?   F)rC   ru   r   r   r   r_   rD   )r   keywordvalues      r   r   "BaseHTTPRequestHandler.send_header  s    :-4!233')$  ''!(%088HMO ==?l*{{}'(,%,.(-% / +r   c                 |    U R                   S:w  a,  U R                  R                  S5        U R                  5         g g )Nr(   s   
)rC   r   r   flush_headersro   s    r   rn   "BaseHTTPRequestHandler.end_headers  s5    :-  ''0  .r   c                     [        U S5      (       a<  U R                  R                  SR                  U R                  5      5        / U l        g g )Nr   r   )ru   rx   r   joinr   ro   s    r   r   $BaseHTTPRequestHandler.flush_headers  s>    4*++JJSXXd&:&:;<#%D  ,r   c                     [        U[        5      (       a  UR                  nU R                  SU R                  [        U5      [        U5      5        g )Nz
"%s" %s %s)
isinstancer   r   log_messagerH   rE   )r   r   sizes      r   r   "BaseHTTPRequestHandler.log_request!  s@     dJ''::D))3t9c$i	Ar   c                 *    U R                   " U/UQ76   g r0   )r   )r   formatargss      r   r{    BaseHTTPRequestHandler.log_error,  s     	'$'r             z\x02xz\\\c           	          X-  n[         R                  R                  U R                  5       < SU R	                  5       < SUR                  U R                  5      < S35        g )Nz - - [z] 
)sysstderrr   address_stringlog_date_time_string	translate_control_char_table)r   r   r   r   s       r   r   "BaseHTTPRequestHandler.log_message?  sP    ( -

--/335!++D,D,DEG 	Hr   c                 :    U R                   S-   U R                  -   $ )N )server_versionsys_versionro   s    r   r   %BaseHTTPRequestHandler.version_stringY  s    ""S(4+;+;;;r   c                 n    Uc  [         R                   " 5       n[        R                  R                  USS9$ )NT)usegmt)timeemailutils
formatdate)r   	timestamps     r   r   'BaseHTTPRequestHandler.date_time_string]  s-    		I{{%%i%==r   c           	          [         R                   " 5       n[         R                  " U5      u	  p#pEpgpn
SX@R                  U   X%Xg4-  nU$ )Nz%02d/%3s/%04d %02d:%02d:%02d)r   	localtime	monthname)r   nowyearmonthdayhhmmssxyzss               r   r   +BaseHTTPRequestHandler.log_date_time_stringc  sJ    iik04s0C-SbaA*^^E*Db.> >r   )MonTueWedThuFriSatSun)NJanFebMarAprMayJunJulAugSepOctNovDecc                      U R                   S   $ Nr   )client_addressro   s    r   r   %BaseHTTPRequestHandler.address_stringq  s     ""1%%r   HTTP/1.0)r   rD   rA   rZ   rS   rF   rC   rH   )NNr0   )-r  )5r   r   r   r   r   ra   rI   r   __version__r   DEFAULT_ERROR_MESSAGEr   DEFAULT_ERROR_CONTENT_TYPEr   rB   rh   r`   r   r   rO   r   rl   r   rn   r   r   r{   rE   	maketrans	itertoolschainranger   ordr   r   r   r   weekdaynamer   r   rQ   rU   rV   HTTPMessagerY   r   __members__valuesphrasedescriptionr   r!   )r3   cvs   000r   r   r      se   R ckk//1!44K
 !;.N03 )l\$#J&3#j:..!&
	A( --'0uT{E$tDT'UV'U!2aW'UVX%*D	"H4<> DK;I& " ;;**L
 ''..00A 	
HHamm$$0II WHs   D&
="D,r   c                   z   ^  \ rS rSrS\-   rSrSSSSS.=rrS	S
.U 4S jjr	S r
S rS rS rS rS rS rS
rU =r$ )r   i  zSimpleHTTP/)z
index.htmlz	index.htmzapplication/gzipapplication/octet-streamzapplication/x-bzip2zapplication/x-xz)z.gzz.Zz.bz2z.xzN	directoryc                   > Uc  [         R                  " 5       n[         R                  " U5      U l        [        TU ]  " U0 UD6  g r0   )osgetcwdfspathr  super__init__)r   r  r   kwargs	__class__s       r   r  !SimpleHTTPRequestHandler.__init__  s6    		I9-$)&)r   c                     U R                  5       nU(       a-   U R                  XR                  5        UR                  5         g g ! UR                  5         f = fr0   )	send_headcopyfilerx   r>   r   fs     r   do_GETSimpleHTTPRequestHandler.do_GET  sA    NNa,		  	s   A Ac                 T    U R                  5       nU(       a  UR                  5         g g r0   )r$  r>   r&  s     r   do_HEAD SimpleHTTPRequestHandler.do_HEAD  s    NNGGI r   c                 ^   U R                  U R                  5      nS n[        R                  R                  U5      (       Ga@  [        R
                  R                  U R                  5      nUR                  R                  S5      (       d  U R                  [        R                  5        US   US   US   S-   US   US   4n[        R
                  R                  U5      nU R                  SU5        U R                  S	S
5        U R                  5         g U R                   HJ  n[        R                  R                  X5      n[        R                  R!                  U5      (       d  MH  Un  O   U R#                  U5      $ U R%                  U5      nUR                  S5      (       a!  U R'                  [        R(                  S5        g  [+        US5      n [        R.                  " UR1                  5       5      nSU R2                  ;   Ga/  SU R2                  ;  Ga   [4        R6                  R9                  U R2                  S   5      n	U	R:                  c'  U	R=                  [>        R@                  RB                  S9n	U	R:                  [>        R@                  RB                  L a  [>        R>                  RE                  URF                  [>        R@                  RB                  5      n
U
R=                  SS9n
X::  a@  U R                  [        RH                  5        U R                  5         URK                  5         g U R                  [        RT                  5        U R                  SU5        U R                  S	[W        US   5      5        U R                  SU RY                  URF                  5      5        U R                  5         U$ ! [,         a#    U R'                  [        R(                  S5         g f = f! [L        [N        [P        [R        4 a     Nf = f!   URK                  5         e = f)N)r-   z%2fz%2Fr   r   r   r-   r+      Locationr   0zFile not foundrbzIf-Modified-SincezIf-None-Match)tzinfo)microsecondContent-type   zLast-Modified)-translate_pathrS   r  isdirurllibparseurlsplitendswithr   r   MOVED_PERMANENTLY
urlunsplitr   rn   index_pagesr   isfilelist_directory
guess_typerO   	NOT_FOUNDopenOSErrorfstatfilenorZ   r   r   parsedate_to_datetimer2  r   datetimetimezoneutcfromtimestampst_mtimer   r>   	TypeErrorrN   OverflowErrorrK   OKrE   r   )r   rS   r'  parts	new_partsnew_urlindexctypefsims
last_modifs              r   r$  "SimpleHTTPRequestHandler.send_head  sK    ""499-77==LL))$))4E::&&':;;"":#?#?@"1XuQxqC"1XuQx1	 ,,11)<  W5  !137  "))T177>>%(( D	 * **400% ==OOJ002BC	T4 A
'	!((*%B#t||3't||;(++;;%89;C zz) "kk1B1B1F1FkGzzX%6%6%:%::%-%6%6%D%DKK):):)>)>&@
 &0%7%7A%7%F
%, ..z/F/FG ,,.GGI#'z}}-^U3-s2a5z:_%%bkk24HQ  	OOJ002BC	 ":}jI 8	GGIsK   O	 AP  ,O9 C0P =BP 	*O65O69PP PP P,c                 ^    [         R                  " U5      nUR                  S S9  / nU R                  nUR                  SS5      S   nUR                  SS5      S   n [        R                  R                  USS	9n[        R                  " US
S9n[        R                   " 5       nSU 3nUR#                  S5        UR#                  S5        UR#                  S5        UR#                  SU S35        UR#                  SU S35        UR#                  SU S35        UR#                  S5        U H  n[         R                  R%                  X5      nU=p[         R                  R'                  U5      (       a
  US-   n	US-   n
[         R                  R)                  U5      (       a  US-   n	UR#                  S[        R                  R+                  U
SS	9< S[        R                  " U	S
S9< S35        M     UR#                  S5        SR%                  U5      R-                  US5      n[.        R0                  " 5       nUR3                  U5        UR5                  S5        U R7                  [        R8                  5        U R;                  SSU-  5        U R;                  S [=        [?        U5      5      5        U RA                  5         U$ ! [         a#    U R                  [        R
                  S5         g f = f! [         a#    [        R                  R                  U5      n GNf = f)!NzNo permission to list directoryc                 "    U R                  5       $ r0   )r_   )as    r   <lambda>9SimpleHTTPRequestHandler.list_directory.<locals>.<lambda>  s
    	r   )key#r   r   ?surrogatepasserrorsFr   zDirectory listing for z<!DOCTYPE HTML>z<html lang="en">z<head>z<meta charset="z">z<title>z</title>
</head>z<body>
<h1>z</h1>z	<hr>
<ul>r-   @z<li><a href="z	</a></li>z</ul>
<hr>
</body>
</html>
r   surrogateescaper4  ztext/html; charset=%sr   )!r  listdirrD  rO   r   rB  sortrS   rI   r8  r9  unquoteUnicodeDecodeErrorr   r   r   getfilesystemencodingr   r   r7  islinkr   r   ioBytesIOr   seekr   rO  r   rE   r9   rn   )r   rS   listrdisplaypathenctitlenamefullnamedisplaynamelinknameencodedr'  s                r   r@  'SimpleHTTPRequestHandler.list_directory	  s   	::d#D 			)	*ii!''Q/2!''Q/2	< ,,..{6E / GK kk+U;'')(6	"#	#$		?3%r*+	75'!234	<we,-	Dww||D/H%))Kww}}X&&"Sj#:ww~~h''"SjHH||))(1@ * B{{;e<> ?  	
23))A,%%c+<=JJL		q	:==))@3)FG)3s7|+<=a  	OO$$13 		 " 	< ,,..{;K	<s#   K !K? *K<;K<?)L,+L,c                    UR                  SS5      S   nUR                  SS5      S   n [        R                  R                  USS9nUR                  S5      n[        R                  " U5      nUR                  S5      n[        S U5      nU R                  nU Hl  n[        R                  R                  U5      (       d$  U[        R                  [        R                  4;   a  MM  [        R                  R                  X5      nMn     U(       a  US-  nU$ ! [         a"    [        R                  R                  U5      n Nf = f)Nr_  r   r   r`  ra  rb  r-   )rI   r8  r9  rh  ri  r;  	posixpathnormpathfilterr  r  rS   dirnamecurdirpardirr   )r   rS   trailing_slashrb   words        r   r6  'SimpleHTTPRequestHandler.translate_pathE  s    zz#q!!$zz#q!!$	.<<''_'ED s+!!$'

3tU#~~Dwwt$$BII0F(F77<<+D	 
 CKD " 	.<<''-D	.s   D )EEc                 0    [         R                  " X5        g r0   )shutilcopyfileobj)r   source
outputfiles      r   r%  !SimpleHTTPRequestHandler.copyfilec  s     	6.r   c                    [         R                  " U5      u  p#X0R                  ;   a  U R                  U   $ UR                  5       nX0R                  ;   a  U R                  U   $ [        R
                  " U5      u  pEU(       a  U$ g)Nr  )r{  splitextextensions_mapr_   	mimetypesguess_file_type)r   rS   baseextguess_s         r   rA  #SimpleHTTPRequestHandler.guess_types  sx     &&t,	%%%&&s++iik%%%&&s++,,T2L)r   )r   r   r   r   r  r   r>  r  _encodings_map_defaultr  r(  r+  r$  r@  r6  r%  rA  r!   __classcell__r!  s   @r   r   r     si     #[0N-K!(%!	/ N+ )- * *Vp:x</ * *r   r   c                 "   U R                  S5      u  pn[        R                  R                  U 5      n U R	                  S5      n/ nUS S  H=  nUS:X  a  UR                  5         M  U(       d  M$  US:w  d  M,  UR                  U5        M?     U(       a9  UR                  5       nU(       a!  US:X  a  UR                  5         SnOUS:X  a  SnOSnU(       a  SR                  Xb45      nSSR                  U5      -   U4nSR                  U5      nU$ )Nr`  r-   r,   z..r.   r=   )	partitionr8  r9  rh  rI   popr   r   )	rS   r  query
path_parts
head_partspart	tail_part	splitpathcollapsed_paths	            r   _url_collapse_pathr    s     ^^C(NDU<<%D CJJ3B4<NNTdckt%	  
 NN$	D  	c!		HHi/0	sxx
++Y7IXXi(Nr   c                      [         (       a  [         $  SS Kn  U R                  S5      S   q [         $ ! [         a     gf = f! [         a+    S[        S U R                  5        5       5      -   q  [         $ f = f)Nr   r,   nobodyr   r   c              3   *   #    U  H	  oS    v   M     g7f)r   Nr"   )r3   r   s     r   r5   nobody_uid.<locals>.<genexpr>  s     6~!1~s   )r  pwdImportErrorgetpwnamr   maxgetpwall)r  s    r   
nobody_uidr    sy     v7h'* M    7S6s||~666M7s   2 A 
??-A76A7c                 L    [         R                  " U [         R                  5      $ r0   )r  accessX_OK)rS   s    r   
executabler    s    99T277##r   c                   j   ^  \ rS rSrU 4S jr\" \S5      rSrS r	S r
S rSS	/rS
 rS rS rSrU =r$ )r   i  c                 N   > SS K nUR                  SSS9  [        TU ]  " U0 UD6  g )Nr   z!http.server.CGIHTTPRequestHandler)r+      )remove)warnings_deprecatedr  r  )r   r   r   r  r!  s       r   r  CGIHTTPRequestHandler.__init__  s1    @$+ 	 	-$)&)r   forkr   c                     U R                  5       (       a  U R                  5         g U R                  [        R                  S5        g )NzCan only POST to CGI scripts)is_cgirun_cgirO   r   rv   ro   s    r   do_POSTCGIHTTPRequestHandler.do_POST  s0     ;;==LLNOO**.0r   c                 v    U R                  5       (       a  U R                  5       $ [        R                  U 5      $ r0   )r  r  r   r$  ro   s    r   r$  CGIHTTPRequestHandler.send_head  s*    ;;==<<>!+55d;;r   c                    [        U R                  5      nUR                  SS5      nUS:  aC  US U U R                  ;  a0  UR                  SUS-   5      nUS:  a  US U U R                  ;  a  M0  US:  a  US U XS-   S  pCX44U l        gg)Nr-   r   r   TF)r  rS   findcgi_directoriescgi_info)r   r  dir_sepheadtails        r   r  CGIHTTPRequestHandler.is_cgi  s     ,DII6 %%c1-k.'":d>R>R"R$))#wqy9G k.'":d>R>R"RQ;'1>!)*3M$ JDMr   z/cgi-binz/htbinc                     [        U5      $ r0   )r  )r   rS   s     r   is_executable#CGIHTTPRequestHandler.is_executable  s    $r   c                 j    [         R                  R                  U5      u  p#UR                  5       S;   $ )N)z.pyz.pyw)r  rS   r  r_   )r   rS   r  r  s       r   	is_pythonCGIHTTPRequestHandler.is_python"  s)    WW%%d+
zz|..r   c                    U R                   u  pUS-   U-   nUR                  S[        U5      S-   5      nUS:  ak  US U nX4S-   S  nU R                  U5      n[        R
                  R                  U5      (       a!  XVp!UR                  S[        U5      S-   5      nOOUS:  a  Mk  UR                  S5      u  p(n	UR                  S5      nUS:  a	  US U X$S  p*OUSp*US-   U
-   nU R                  U5      n[        R
                  R                  U5      (       d$  U R                  [        R                  SU-  5        g [        R
                  R                  U5      (       d$  U R                  [        R                  SU-  5        g U R                  U5      nU R                  (       d  U(       d:  U R!                  U5      (       d$  U R                  [        R                  SU-  5        g ["        R$                  " [        R&                  5      nU R)                  5       US	'   U R*                  R,                  US
'   SUS'   U R.                  US'   [1        U R*                  R2                  5      US'   U R4                  US'   [6        R8                  R;                  U5      nXS'   U R                  U5      US'   XS'   XS'   U R<                  S   US'   U R>                  RA                  S5      nU(       a  URC                  5       n[        U5      S:X  a  SS K"nSS K#nUS   US'   US   RI                  5       S:X  a]   US   RK                  S5      nURM                  U5      RO                  S5      nURC                  S5      n[        U5      S:X  a  US   US'   U R>                  RA                  S5      c  U R>                  RU                  5       US'   OU R>                  S   US'   U R>                  RA                  S5      nU(       a  UUS'   U R>                  RA                  S 5      nU(       a  UUS!'   U R>                  RW                  S"S#5      nS$RY                  U5      US%'   U R>                  RA                  S&5      nU(       a  UUS''   [[        S U R>                  RW                  S(/ 5      5      nS)RY                  U5      nU(       a  UUS*'   S+ H  nUR]                  US5        M     U R_                  [        R`                  S,5        U Rc                  5         U	Re                  S-S.5      nU R                  (       Ga  U
/nS/U;  a  URg                  U5        [i        5       nU Rj                  Rm                  5         [        Rn                  " 5       nUS:w  a  [        Rp                  " US5      u  nn[r        Rr                  " U Rt                  // / S5      S   (       aO  U Rt                  Rw                  S5      (       d  O.[r        Rr                  " U Rt                  // / S5      S   (       a  MO  [        Rx                  " U5      nU(       a  U R{                  S0U 35        g   [        R|                  " U5        [        R                  " U Rt                  R                  5       S5        [        R                  " U Rj                  R                  5       S5        [        R                  " UUU5        g SS KFn U/n!U R                  U5      (       aF  [        R                  n"U"RI                  5       R                  S25      (       a  U"S S3 U"S4S  -   n"U"S5/U!-   n!S/U	;  a  U!Rg                  U	5        U R                  S6U R                  U!5      5         [        U5      n#U R                  U!U R                  U R                  U R                  US79n$U R4                  RI                  5       S8:X  a"  U#S:  a  U Rt                  Rw                  U#5      n%OS n%[r        Rr                  " U Rt                  R                  // / S5      S   (       ac  U Rt                  R                  R                  S5      (       d  O8[r        Rr                  " U Rt                  R                  // / S5      S   (       a  Mc  U$R                  U%5      u  n&n'U Rj                  R                  U&5        U'(       a  U R{                  S9U'5        U$R                  R                  5         U$R                  R                  5         U$R                  n(U((       a  U R{                  S:U(5        g U R                  S;5        g ! URP                  [R        4 a     GNf = f! [~         a     GNf = f!   U R*                  R                  U R                  U R<                  5        [        R                  " S15         g = f! [        [        4 a    Sn# GNPf = f)<Nr-   r   r   r`  r=   zNo such CGI script (%r)z#CGI script is not a plain file (%r)z!CGI script is not executable (%r)SERVER_SOFTWARESERVER_NAMEzCGI/1.1GATEWAY_INTERFACESERVER_PROTOCOLSERVER_PORTREQUEST_METHOD	PATH_INFOPATH_TRANSLATEDSCRIPT_NAMEQUERY_STRINGREMOTE_ADDRauthorizationr   	AUTH_TYPEbasicascii:REMOTE_USERzcontent-typeCONTENT_TYPEzcontent-lengthCONTENT_LENGTHrefererHTTP_REFERERacceptr"   ,HTTP_ACCEPTz
user-agentHTTP_USER_AGENTcookiez, HTTP_COOKIE)r  REMOTE_HOSTr  r  r  r  zScript output follows+r   =zCGI script exit code r   zw.exez-uzcommand: %s)stdinstdoutr   envpostz%szCGI script exit status %#xzCGI script exited OK)Yr  r  r9   r6  r  rS   r7  r  existsrO   r   rB  r?  	FORBIDDENr  	have_forkr  copydeepcopyenvironr   serverr   rQ   rE   r   rA   r8  r9  rh  r  rZ   r^   rI   base64binasciir_   r   decodebytesdecodeErrorUnicodeErrorget_content_typeget_allr   r}  
setdefaultr   rO  r   r   r   r  rx   ry   r  waitpidselectrX   readwaitstatus_to_exitcoder{   setuidrD  dup2rF  execvehandle_errorrequest_exit
subprocessr   r  r;  r   list2cmdlinerM   rM  rK   PopenPIPE_sockrecvcommunicater   r   r>   r  
returncode))r   dirrestrS   inextdirnextrest	scriptdirr  r  script
scriptname
scriptfileispyr  uqrestr  r  r  lengthr  r  uaco
cookie_strkdecoded_queryr   r  pidstsexitcoder  cmdlineinterpnbytespdatar  r   statuss)                                            r   r  CGIHTTPRequestHandler.run_cgi'  sB   MM	Sy4IIc3s8A:&1f2AhGaCDzH++G4Iww}}Y''#TIIc3s8A:. 1f , IIcN68T"XDD3Y'
((4
ww~~j))OO$$)J68 ww~~j))OO$$5
BD ~~j)>>%%j11((7*DF  mmBJJ'!%!4!4!6![[44M#, !%!6!6 !8!89M $%%d+!K!%!4!4V!<'M#N!003M((9)//1M=!Q&'#0#3K  #))+w6	B(5a(8(?(?(H(.(:(:=(I(.w &
 )6(;(;C(@}-21>q1AC.<<N+3"&,,"?"?"AC"&,,~">C!!"23$*C !,,""9-")C%%h3 XXf-M\\l+%'C!"D$,,..x<=YYr]
!+CDANN1b!D 	:==*ABc3/>>>8D-'M*\FJJ'')Cax::c1-SmmTZZL"b!<Q?::??1-- mmTZZL"b!<Q?? 44S9NN%:8*#EF
IIf% 

))+Q/

))+Q/		*dC0 !lG~~j))<<>**733#CR[6"#;6F!4.72%u%]J,C,CG,LMV   '1(2(2'*	 ! #A ||!!#v-&1*zzv.--!1!1 2BA>qAzz'',,Q// --!1!1 2BA>qAA ]]40NFFJJV$tV,HHNNHHNN\\F;VD  !78_ %NNL9 z  
((t7J7JK" z* sP   84e e* /A6e; g e'&e'*
e84e; 7e88e; ;Aggg)r  )r   r   r   r   r  ru   r  r  rbufsizer  r$  r  r  r  r  r  r!   r  r  s   @r   r   r     sN    * F#I H0<4 "8,O /
x9 x9r   r   c                      [         R                  " U [         R                  [         R                  S.6n[	        [        U5      5      u  p#pEnX&4$ )N)typeflags)r   getaddrinfoSOCK_STREAM
AI_PASSIVEnextiter)addressinfosfamilyr1  proto	canonnamesockaddrs          r   _get_best_familyr>    sG    	E
 04DK/@,F%Hr   r  i@  c                    [        XC5      u  Ul        nX l        U" XP5       nUR                  R	                  5       S S u  psSU;   a  SU S3OUn[        SU SU SU SU S3	5         UR                  5         S S S 5        g ! [         a$    [        S	5        [        R                  " S
5         N6f = f! , (       d  f       g = f)Nr   r  []zServing HTTP on z port z	 (http://z/) ...z&
Keyboard interrupt received, exiting.r   )
r>  address_familyrQ   r   getsocknameprintserve_foreverKeyboardInterruptr   exit)	HandlerClassServerClassprotocolr   bindaddrhttpdr   url_hosts	            r   testrO    s     (8'C$K$,!	T	(E\\--/3
"%+QtfA;4tfF4& 1j$v/	
	! 
)	( ! 	;<HHQK	 
)	(s*   AB3)B+B0-B3/B00B33
C__main__z--cgi
store_truezrun as CGI server)actionhelpz-bz--bindADDRESSz.bind to this address (default: all interfaces))metavarrS  z-dz--directoryz1serve this directory (default: current directory))defaultrS  z-pz
--protocolVERSIONz3conform to this HTTP version (default: %(default)s))rU  rV  rS  r   r`  z(bind to this port (default: %(default)s))rV  r1  nargsrS  c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )DualStackServeri  c                    > [         R                  " [        5         U R                  R	                  [        R
                  [        R                  S5        S S S 5        [        TU ]!  5       $ ! , (       d  f       N= fr  )	
contextlibsuppress	Exceptionr   
setsockoptIPPROTO_IPV6IPV6_V6ONLYr  r   )r   r!  s    r   r   DualStackServer.server_bind   sU    $$Y/&&''););Q@ 0 7&(( 0/s   :A,,
A:c                 B    U R                  XU [        R                  S9  g )Nr  )RequestHandlerClassr   r  )r   r
  r  s      r   finish_requestDualStackServer.finish_request'  s     $$Wd/3~~ % ?r   r"   )r   r   r   r   r   re  r!   r  r  s   @r   rZ  rZ    s    	)	? 	?r   rZ  )rH  rI  r   rK  rJ  )7r  __all__r  rH  email.utilsr   r   http.clientrU   rl  r
  r  r  r{  r  r  r   r   r   r   urllib.parser8  r   r  r  r   r   ThreadingMixInr   StreamRequestHandlerr   r   r  r  r  r  r   r>  rO  r   argparser\  ArgumentParserparseradd_argumentr  rM   
parse_argsr   cgihandler_classrZ  r   rK  rJ  r"   r   r   <module>rt     s  f 
      	   	      
      7 	 '' 	 ,55z q\>> qhD*5 D*R,` 
 $
I94 I9X -(4d. z$$&F
0  2
h	9  : mRYY[<  = lI *6  7 3c6  7 Dxx-0?- ? 	"#YYYYQ r   