
    z%i                     f   	 d Z g dZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZ dZdZ G d dej2                        Z G d	 d
ej6                  e      Z G d dej:                        Z G d de      Zd Z da!d Z"d Z# G d de      Z$d Z%eedddfdZ&e'dk(  rddl(Z(ddl)Z) e(jT                         Z+e+jY                  ddd       e+jY                  dddd !       e+jY                  d"d# ejZ                         d$%       e+jY                  d&d'd(dd)*       e+jY                  d+de.d,d-.       e+j_                         Z0e0jb                  re$Z2neZ2 G d/ d0e      Z3 e&e2e3e0jh                  e0jj                  e0jl                  1       yy)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                       e Zd ZdZd Zy)r      c                     	 t         j                  j                  |        | j                  d d \  }}t	        j
                  |      | _        || _        y )N   )socketserver	TCPServerserver_bindserver_addresssocketgetfqdnserver_nameserver_port)selfhostports      ?/home/uftp/.pyenv/versions/3.12.0/lib/python3.12/http/server.pyr   zHTTPServer.server_bind   sH    <**40((!,
d!>>$/    N)__name__
__module____qualname__allow_reuse_addressr    r   r   r   r      s     r   r   c                       e Zd ZdZy)r   TN)r   r   r   daemon_threadsr   r   r   r   r      s    Nr   r   c            
       L   e Zd Z	 dej                  j                         d   z   Zdez   Ze	Z
eZdZd Zd Zd Zd Zd!d
Zd"dZd"dZd Zd Zd Zd#dZd Zej7                   ej:                   ed       edd            D  ci c]	  }|d|d c}}       Zde e d      <   d Z!d Z"d"dZ#d Z$g dZ%g dZ&d Z'd Z(e)jT                  jV                  Z,e-j\                  j_                         D  ci c]  }||j`                  |jb                  f c}} Z2y	c c}} w c c}} w )$r   zPython/r   z	BaseHTTP/HTTP/0.9c                 0   	 d | _         | j                  x| _        }d| _        t	        | j
                  d      }|j                  d      }|| _        |j                         }t        |      dk(  ryt        |      dk\  r|d   }	 |j                  d      st        |j                  d	d
      d
   }|j                  d      }t        |      dk7  rt        t        d |D              rt        d      t        d |D              rt        d      t        |d         t        |d
         f}|dk\  r| j$                  dk\  rd| _        |dk\  r$| j                  t         j&                  d|z         y|| _        dt        |      cxk  rdk  s&n | j                  t         j"                  d|z         y|d d \  }}t        |      dk(  r0d| _        |dk7  r$| j                  t         j"                  d|z         y||c| _         | _        | j(                  j                  d      r#d	| j(                  j+                  d	      z   | _        	 t,        j.                  j1                  | j2                  | j4                        | _        | j6                  j?                  dd      }	|	jA                         dk(  rd| _        n)|	jA                         d k(  r| j$                  dk\  rd| _        | j6                  j?                  d!d      }
|
jA                         d"k(  r/| j$                  dk\  r | j                  dk\  r| jC                         syy# t        t        f$ r& | j                  t         j"                  d|z         Y yw xY w# t,        j.                  j8                  $ r4}| j                  t         j:                  dt	        |             Y d }~yd }~wt,        j.                  j<                  $ r4}| j                  t         j:                  dt	        |             Y d }~yd }~ww xY w)#NTz
iso-8859-1
r   F   zHTTP//r
   .r   c              3   >   K   | ]  }|j                            y wN)isdigit.0	components     r   	<genexpr>z7BaseHTTPRequestHandler.parse_request.<locals>.<genexpr>/  s     O99,,..Os   znon digit in http versionc              3   8   K   | ]  }t        |      d kD    yw)
   N)lenr,   s     r   r/   z7BaseHTTPRequestHandler.parse_request.<locals>.<genexpr>1  s     Kys9~*Ks   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splitr2   
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   versionrA   wordsbase_version_numberversion_numberr:   rL   errconntypeexpects              r   parse_requestz$BaseHTTPRequestHandler.parse_request  s   		 )-)E)EEw $$..=!((0&!!#u:?u:?BiG))'2$$&-mmC&;A&>#!4!:!:3!? ~&!+$$OOO$%@AAKNKK$%GHH!$^A%6!7^A=N9O!O 'D,A,AZ,O(-%'99/2EEG #*D CJ#!#OO&&)K79 bq	u:?$(D!%**4w>@ ")4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   B'L= :M5 =2M21M25P*O P!*PPc                 d    	 | j                  t        j                         | j                          yNT)send_response_onlyr   CONTINUEend_headersr   s    r   rY   z(BaseHTTPRequestHandler.handle_expect_100y  s,    	 	
 3 34r   c                 v   	 	 | j                   j                  d      | _        t        | j                        dkD  r5d| _        d| _        d| _        | j                  t        j                         y | j                  sd| _
        y | j                         sy d| j                  z   }t        | |      s.| j                  t        j                  d| j                  z         y t        | |      } |        | j                  j!                          y # t"        $ r#}| j%                  d|       d| _
        Y d }~y d }~ww xY w)Ni  i   r6   Tdo_zUnsupported method (%r)zRequest timed out: %r)rQ   readliner?   r2   rA   r<   r:   rH   r   REQUEST_URI_TOO_LONGr=   ra   hasattrNOT_IMPLEMENTEDgetattrwfileflushTimeoutError	log_error)r   mnamemethodes       r   handle_one_requestz)BaseHTTPRequestHandler.handle_one_request  s   		#'::#6#6u#=D 4''(50#% ')$!
 ? ?@''(,%%%'DLL(E4'..-<> T5)FHJJ 	NN2A6$(D!		s1   A,D 0D D AD -D 	D8D33D8c                     	 d| _         | j                          | j                   s| j                          | j                   sy y rc   )r=   rv   rg   s    r   handlezBaseHTTPRequestHandler.handle  s9    4 $!''##% ''r   Nc                    	 	 | j                   |   \  }}||}||}| j                  d||       | j                  ||       | j	                  dd       d }|dk\  r|t
        j                  t
        j                  t
        j                  fvr| j                  |t        j                  |d      t        j                  |d      dz  }|j                  d	d
      }| j	                  d| j                         | j	                  dt        t        |                   | j!                          | j"                  dk7  r|r| j$                  j'                  |       y y y # t        $ r	 d\  }}Y Vw xY w)N)???rz   zcode %d, message %sr5   r7      Fquote)codemessageexplainzUTF-8replacezContent-TypeContent-LengthHEAD)	responsesKeyErrorrr   send_responsesend_headerr   
NO_CONTENTRESET_CONTENTNOT_MODIFIEDerror_message_formathtmlescapeencodeerror_content_typer>   r2   rf   r:   ro   write)r   r~   r   r   shortmsglongmsgbodycontents           r   rH   z!BaseHTTPRequestHandler.send_error  sa   	"	- $t 4Hg ?G?G,dG<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                     	 | j                  |       | j                  ||       | j                  d| j                                | j                  d| j	                                y )NServerDate)log_requestrd   r   version_stringdate_time_stringr   r~   r   s      r   r   z$BaseHTTPRequestHandler.send_response  sY    	 	g.4#6#6#89!6!6!89r   c                    	 | j                   dk7  rt|#|| j                  v r| j                  |   d   }nd}t        | d      sg | _        | j                  j	                  d| j
                  ||fz  j                  dd             y y )Nr"   r   r6   _headers_bufferz
%s %d %s
latin-1strict)r<   r   rl   r   appendrJ   r   r   s      r   rd   z)BaseHTTPRequestHandler.send_response_only  s    ,:-4>>)"nnT215G G4!23')$  ''**D':*;<BF!8=-. .r   c                 @   	 | j                   dk7  rDt        | d      sg | _        | j                  j                  |d|dj	                  dd             |j                         dk(  r7|j                         dk(  rd	| _        y |j                         d
k(  rd| _        y y y )Nr"   r   z: r$   r   r   
connectionr7   Tr8   F)r<   rl   r   r   r   rX   r=   )r   keywordvalues      r   r   z"BaseHTTPRequestHandler.send_header  s    7:-4!23')$  ''!(%088HMO ==?l*{{}'(,%,.(-% / +r   c                 |    	 | j                   dk7  r,| j                  j                  d       | j                          y y )Nr"   s   
)r<   r   r   flush_headersrg   s    r   rf   z"BaseHTTPRequestHandler.end_headers  s8    ::-  ''0  .r   c                     t        | d      r<| j                  j                  dj                  | j                               g | _        y y )Nr   r   )rl   ro   r   joinr   rg   s    r   r   z$BaseHTTPRequestHandler.flush_headers  s;    4*+JJSXXd&:&:;<#%D  ,r   c                     	 t        |t              r|j                  }| j                  d| j                  t        |      t        |             y )Nz
"%s" %s %s)
isinstancer   r   log_messagerA   r>   )r   r~   sizes      r   r   z"BaseHTTPRequestHandler.log_request!  sB    	
 dJ'::D))3t9c$i	Ar   c                 ,    	  | j                   |g|  y r*   )r   )r   formatargss      r   rr   z BaseHTTPRequestHandler.log_error,  s    		 	'$'r             z\x02xz\\\c           	          	 ||z  }t         j                  j                  | j                         d| j	                         d|j                  | j                        d       y )Nz - - [z] 
)sysstderrr   address_stringlog_date_time_string	translate_control_char_table)r   r   r   r   s       r   r   z"BaseHTTPRequestHandler.log_message?  sW    	& 4-

--/335!++D,D,DEG 	Hr   c                 <    	 | j                   dz   | j                  z   S )N )server_versionsys_versionrg   s    r   r   z%BaseHTTPRequestHandler.version_stringY  s!    8""S(4+;+;;;r   c                 r    	 |t        j                          }t        j                  j                  |d      S )NT)usegmt)timeemailutils
formatdate)r   	timestamps     r   r   z'BaseHTTPRequestHandler.date_time_string]  s0    N		I{{%%i%==r   c           	          	 t        j                          }t        j                  |      \	  }}}}}}}}	}
d|| j                  |   ||||fz  }|S )Nz%02d/%3s/%04d %02d:%02d:%02d)r   	localtime	monthname)r   nowyearmonthdayhhmmssxyzss               r   r   z+BaseHTTPRequestHandler.log_date_time_stringc  s[    <iik04s0C-eS"b"aA*T^^E*D"b".> >r   )MonTueWedThuFriSatSun)NJanFebMarAprMayJunJulAugSepOctNovDecc                 "    	 | j                   d   S Nr   )client_addressrg   s    r   r   z%BaseHTTPRequestHandler.address_stringq  s    (""1%%r   HTTP/1.0)NNr*   )-r   )3r   r   r   r   rZ   rB   r   __version__r   DEFAULT_ERROR_MESSAGEr   DEFAULT_ERROR_CONTENT_TYPEr   r;   ra   rY   rv   rx   rH   r   rd   r   rf   r   r   rr   r>   	maketrans	itertoolschainranger   ordr   r   r   r   weekdaynamer   r   rJ   rN   rO   HTTPMessagerR   r   __members__valuesphrasedescriptionr   )r-   cvs   000r   r   r      sf   dN ckk//1!44K
 !;.N03 )l\$#J&3#j:..!&
	A( --'6yuT{E$tDT'UV!Q2aWVX%*D	"H4<> DK;I& " ;;**L
 ''..0 	
AHHamm$$II WHs   D
5 D r   c                   p     e Zd Z	 dez   ZdZdddddxZZdd	 fd

Zd Z	d Z
d Zd Zd Zd Zd Z xZS )r   zSimpleHTTP/)z
index.htmlz	index.htmzapplication/gzipapplication/octet-streamzapplication/x-bzip2zapplication/x-xz)z.gzz.Zz.bz2z.xzN	directoryc                    |t        j                         }t        j                  |      | _        t	        |   |i | y r*   )osgetcwdfspathr  super__init__)r   r  r   kwargs	__class__s       r   r  z!SimpleHTTPRequestHandler.__init__  s6    		I9-$)&)r   c                     	 | j                         }|r.	 | j                  || j                         |j                          y y # |j                          w xY wr*   )	send_headcopyfilero   r7   r   fs     r   do_GETzSimpleHTTPRequestHandler.do_GET  sF    "NNa,		  	s   A Ac                 L    	 | j                         }|r|j                          y y r*   )r  r7   r  s     r   do_HEADz SimpleHTTPRequestHandler.do_HEAD  s"    #NNGGI r   c                 0   	 | j                  | j                        }d }t        j                  j                  |      r5t        j
                  j                  | j                        }|j                  j                  d      s| j                  t        j                         |d   |d   |d   dz   |d   |d   f}t        j
                  j                  |      }| j                  d|       | j                  dd	       | j                          y | j                  D ]E  }t        j                  j                  ||      }t        j                  j!                  |      sC|} n | j#                  |      S | j%                  |      }|j                  d      r!| j'                  t        j(                  d
       y 	 t+        |d      }	 t        j.                  |j1                               }d| j2                  v r1d| j2                  vr"	 t4        j6                  j9                  | j2                  d         }	|	j:                  *|	j=                  t>        j@                  jB                        }	|	j:                  t>        j@                  jB                  u rt>        j>                  jE                  |jF                  t>        j@                  jB                        }
|
j=                  d      }
|
|	k  r@| j                  t        jH                         | j                          |jK                          y | j                  t        jT                         | j                  d|       | j                  dtW        |d                | j                  d| jY                  |jF                               | j                          |S # t,        $ r# | j'                  t        j(                  d
       Y y w xY w# tL        tN        tP        tR        f$ r Y w xY w#  |jK                           xY w)Nr'   r   r
   r   r%      Locationr   0zFile not foundrbzIf-Modified-SincezIf-None-Match)tzinfo)microsecondContent-type   zLast-Modified)-translate_pathrL   r  isdirurllibparseurlsplitendswithr   r   MOVED_PERMANENTLY
urlunsplitr   rf   index_pagesr   isfilelist_directory
guess_typerH   	NOT_FOUNDopenOSErrorfstatfilenorS   r   r   parsedate_to_datetimer  r   datetimetimezoneutcfromtimestampst_mtimer   r7   	TypeErrorrG   OverflowErrorrD   OKr>   r   )r   rL   r  parts	new_partsnew_urlindexctypefsims
last_modifs              r   r  z"SimpleHTTPRequestHandler.send_head  sL   		 ""499-77==LL))$))4E::&&s+"":#?#?@"1XuQxqC"1XuQx1	 ,,11)<  W5  !137  ")) 1T5177>>%( D	1 **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   8N4 AP ,O# 3C4P (BP 4)O O #O?<P >O??P Pc           
         	 	 t        j                  |      }|j                  d        g }	 t        j                  j                  | j                  d      }t        j                  |d      }t        j                         }d| }|j!                  d	       |j!                  d
       |j!                  d       |j!                  d| d       |j!                  d| d       |j!                  d| d       |j!                  d       |D ]  }t         j                  j#                  ||      }|x}	}
t         j                  j%                  |      r
|dz   }	|dz   }
t         j                  j'                  |      r|dz   }	|j!                  dt        j                  j)                  |
d      dt        j                  |	d      d        |j!                  d       dj#                  |      j+                  |d      }t-        j.                         }|j1                  |       |j3                  d       | j5                  t        j6                         | j9                  dd|z         | j9                  dt;        t=        |                   | j?                          |S # t        $ r# | j                  t        j
                  d       Y y w xY w# t        $ r- t        j                  j                  | j                        }Y w xY w)NzNo permission to list directoryc                 "    | j                         S r*   )rX   )as    r   <lambda>z9SimpleHTTPRequestHandler.list_directory.<locals>.<lambda>  s    	 r   )key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   surrogateescaper   r  ztext/html; charset=%sr   ) r  listdirr)  rH   r   r'  sortr  r  unquoterL   UnicodeDecodeErrorr   r   r   getfilesystemencodingr   r   r  islinkr}   r   ioBytesIOr   seekr   r4  r   r>   r2   rf   )r   rL   listrdisplaypathenctitlenamefullnamedisplaynamelinknameencodedr  s                r   r%  z'SimpleHTTPRequestHandler.list_directory	  s   		::d#D 			)	*	: ,,..tyy6E / 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|+<=[  	OO$$13 		 " 	: ,,..tyy9K	:s"   J" +K ")KK2LLc                    	 |j                  dd      d   }|j                  dd      d   }|j                         j                  d      }	 t        j                  j                  |d      }t        j                  |      }|j                  d      }t        d |      }| j                  }|D ]d  }t        j                  j                  |      s"|t        j                  t        j                  fv rEt        j                  j!                  ||      }f |r|dz  }|S # t        $ r" t        j                  j                  |      }Y w xY w)N?r
   r   #r'   rB  rC  )rB   r@   r   r  r  rI  rJ  	posixpathnormpathfilterr  r  rL   dirnamecurdirpardirr   )r   rL   trailing_slashr[   words        r   r  z'SimpleHTTPRequestHandler.translate_pathB  s   	 zz#a #zz#a #//4	.<<''_'ED !!$'

3tU#~~ 	,Dwwt$BII0F(F77<<d+D		,
 CKD " 	.<<''-D	.s   !D (EEc                 2    	 t        j                  ||       y r*   )shutilcopyfileobj)r   source
outputfiles      r   r  z!SimpleHTTPRequestHandler.copyfile`  s    	 	6:.r   c                    	 t        j                  |      \  }}|| j                  v r| j                  |   S |j                         }|| j                  v r| j                  |   S t	        j
                  |      \  }}|r|S y)Nr   )r]  splitextextensions_maprX   	mimetypesr&  )r   rL   baseextguess_s         r   r&  z#SimpleHTTPRequestHandler.guess_typep  s    	 &&t,	c$%%%&&s++iik$%%%&&s++''-qL)r   )r   r   r   r   r   r#  rl  _encodings_map_defaultr  r  r  r  r%  r  r  r&  __classcell__r	  s   @r   r   r     sd    	 #[0N-K!(%!	/ N+ )- *Vp7r</ *r   r   c                    	 | j                  d      \  } }}t        j                  j                  |       } | j	                  d      }g }|d d D ]2  }|dk(  r|j                          |s|dk7  s"|j                  |       4 |r2|j                         }|r"|dk(  r|j                          d}n
|dk(  rd}nd}|rdj                  ||f      }ddj                  |      z   |f}dj                  |      }|S )Nr[  r'   r&   z..r(   r6   )	partitionr  r  rI  rB   popr   r   )	rL   rq  query
path_parts
head_partspart	tail_part	splitpathcollapsed_paths	            r   _url_collapse_pathr    s    ^^C(ND!U<<%D CJJ3B &4<NNdckt%	&
 NN$	D  	c!		HHi/0	sxx
++Y7IXXi(Nr   c                      	 t         rt         S 	 dd l} 	 | j                  d      d   a t         S # t        $ r Y yw xY w# t        $ r+ dt        d | j                         D              z   a Y t         S w xY w)Nr   r&   nobodyr   r
   c              3   &   K   | ]	  }|d      yw)r   Nr   )r-   r   s     r   r/   znobody_uid.<locals>.<genexpr>  s     6!16s   )r  pwdImportErrorgetpwnamr   maxgetpwall)r  s    r   
nobody_uidr    sx    .7h'* M    7S6s||~666M7s   . = 	::,A10A1c                 L    	 t        j                  | t         j                        S r*   )r  accessX_OK)rL   s    r   
executabler    s    #99T277##r   c                   P    e Zd Z	  eed      ZdZd Zd Zd Z	ddgZ
d Zd	 Zd
 Zy)r   forkr   c                     	 | j                         r| j                          y | j                  t        j                  d       y )NzCan only POST to CGI scripts)is_cgirun_cgirH   r   rm   rg   s    r   do_POSTzCGIHTTPRequestHandler.do_POST  s3    	 ;;=LLNOO**.0r   c                 n    	 | j                         r| j                         S t        j                  |       S r*   )r  r  r   r  rg   s    r   r  zCGIHTTPRequestHandler.send_head  s+    ;;;=<<>!+55d;;r   c                    	 t        | j                        }|j                  dd      }|dkD  r=|d | | j                  vr,|j                  d|dz         }|dkD  r|d | | j                  vr,|dkD  r|d | ||dz   d  }}||f| _        yy)Nr'   r
   r   TF)r  rL   findcgi_directoriescgi_info)r   r~  dir_sepheadtails        r   r  zCGIHTTPRequestHandler.is_cgi  s    	 ,DII6 %%c1-k.'":d>R>R"R$))#wqy9G k.'":d>R>R"RQ;'1>'!)*3M$D $JDMr   z/cgi-binz/htbinc                     	 t        |      S r*   )r  )r   rL   s     r   is_executablez#CGIHTTPRequestHandler.is_executable  s    ?$r   c                 l    	 t         j                  j                  |      \  }}|j                         dv S )N)z.pyz.pyw)r  rL   rk  rX   )r   rL   r  r  s       r   	is_pythonzCGIHTTPRequestHandler.is_python  s.    <WW%%d+
dzz|..r   c                    	 | j                   \  }}|dz   |z   }|j                  dt        |      dz         }|dk\  rg|d | }||dz   d  }| j                  |      }t        j
                  j                  |      r#||}}|j                  dt        |      dz         }nn|dk\  rg|j                  d      \  }}}	|j                  d      }|dk\  r|d | ||d  }}
n|d}}
|dz   |
z   }| j                  |      }t        j
                  j                  |      s$| j                  t        j                  d|z         y t        j
                  j                  |      s$| j                  t        j                  d|z         y | j                  |      }| j                  s|s5| j!                  |      s$| j                  t        j                  d|z         y t#        j$                  t        j&                        }| j)                         |d	<   | j*                  j,                  |d
<   d|d<   | j.                  |d<   t1        | j*                  j2                        |d<   | j4                  |d<   t6        j8                  j;                  |      }||d<   | j                  |      |d<   ||d<   |	|d<   | j<                  d   |d<   | j>                  jA                  d      }|r|jC                         }t        |      dk(  rdd l"}dd l#}|d   |d<   |d   jI                         dk(  r]	 |d   jK                  d      }|jM                  |      jO                  d      }|jC                  d      }t        |      dk(  r	|d   |d<   	 | j>                  jA                  d      | j>                  jU                         |d<   n| j>                  d   |d<   | j>                  jA                  d      }|r||d<   | j>                  jA                  d       }|r||d!<   | j>                  jW                  d"d#      }d$jY                  |      |d%<   | j>                  jA                  d&      }|r||d'<   t[        d | j>                  jW                  d(g             }d)jY                  |      }|r||d*<   d+D ]  }|j]                  |d        | j_                  t        j`                  d,       | jc                          |	je                  d-d.      }| j                  r|
g}d/|vr|jg                  |       ti               }| jj                  jm                          t	        jn                         }|dk7  rt	        jp                  |d      \  }}ts        jr                  | jt                  gg g d      d   rC| jt                  jw                  d      sn'ts        jr                  | jt                  gg g d      d   rCt	        jx                  |      }|r| j{                  d0|        y 	 	 t	        j|                  |       t	        j                  | jt                  j                         d       t	        j                  | jj                  j                         d       t	        j                  |||       y dd lF} |g}!| j                  |      rAt        j                  }"|"jI                         j                  d2      r|"d d3 |"d4d  z   }"|"d5g|!z   }!d/|	vr|!jg                  |	       | j                  d6| j                  |!             	 t        |      }#| j                  |!| j                  | j                  | j                  |7      }$| j4                  jI                         d8k(  r!|#dkD  r| jt                  jw                  |#      }%nd }%ts        jr                  | jt                  j                  gg g d      d   rW| jt                  j                  j                  d      sn1ts        jr                  | jt                  j                  gg g d      d   rW|$j                  |%      \  }&}'| jj                  j                  |&       |'r| j{                  d9|'       |$j                  j                          |$j                  j                          |$j                  }(|(r| j{                  d:|(       y | j                  d;       y # |jP                  tR        f$ r Y mw xY w# t~        $ r Y w xY w#  | j*                  j                  | j                  | j<                         t	        j                  d1       Y y xY w# t        t        f$ r d}#Y 1w xY w)<Nr'   r
   r   r[  r6   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  r2   r  r  rL   r  rv  existsrH   r   r'  r$  	FORBIDDENr  	have_forkr  copydeepcopyenvironr   serverr   rJ   r>   r   r:   r  r  rI  r   rS   rW   rB   base64binasciirX   r   decodebytesdecodeErrorUnicodeErrorget_content_typeget_allr   r_  
setdefaultr   r4  r   r   r   r  ro   rp   r  waitpidselectrQ   readwaitstatus_to_exitcoderr   setuidr)  dup2r+  execvehandle_errorrequest_exit
subprocessr   r  r   r   list2cmdlinerF   r2  rD   PopenPIPE_sockrecvcommunicater   r   r7   r  
returncode))r   dirrestrL   inextdirnextrest	scriptdirrq  rx  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  zCGIHTTPRequestHandler.run_cgi  s?   #MM	TSy4IIc3s8A:&1f2AhGAaCDzH++G4Iww}}Y'#XTIIc3s8A:. 1f ,a IIcN68T!"XDFDF3Y'
((4
ww~~j)OO$$)J68 ww~~j)OO$$5
BD ~~j)>>%%j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!	" 	:==*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#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 ]]40NFFJJV$tV,HHNNHHNN\\F;VD  !78_ %NNL9 z  
((t7J7JK" z* sP   4c c' A3c7 e c$#c$'	c40c7 3c44c7 7Ae eeN)r   r   r   rl   r  r  rbufsizer  r  r  r  r  r  r  r   r   r   r   r     sG     F#I H0<4 "8,O /
x9r   r   c                      t        j                  | t         j                  t         j                  d}t	        t        |            \  }}}}}||fS )N)typeflags)r   getaddrinfoSOCK_STREAM
AI_PASSIVEnextiter)addressinfosfamilyr  proto	canonnamesockaddrs          r   _get_best_familyr    sM    	E
 04DK/@,FD%H8r   r   i@  c                    	 t        ||      \  |_        }|| _         |||       5 }|j                  j	                         d d \  }}d|v rd| dn|}t        d| d| d| d| d	       	 |j                          d d d        y # t        $ r# t        d	       t        j                  d
       Y 4w xY w# 1 sw Y   y xY w)Nr   r  []zServing HTTP on z port z	 (http://z/) ...z&
Keyboard interrupt received, exiting.r   )
r  address_familyrJ   r   getsocknameprintserve_foreverKeyboardInterruptr   exit)	HandlerClassServerClassprotocolr   bindaddrhttpdr   url_hosts	            r   testr     s    
 (8d'C$K$,L!	T<	( E\\--/3
d"%+QtfA;4tfF4& 1j$v/	
	!  ! 	;<HHQK	 s*   AB4,B)B1.B40B11B44B=__main__z--cgi
store_truezrun as CGI server)actionhelpz-bz--bindADDRESSz.bind to this address (default: all interfaces))metavarr$  z-dz--directoryz1serve this directory (default: current directory))defaultr$  z-pz
--protocolVERSIONz3conform to this HTTP version (default: %(default)s))r&  r'  r$  r   r[  z(bind to this port (default: %(default)s))r'  r  nargsr$  c                   $     e Zd Z fdZd Z xZS )DualStackServerc                     t        j                  t              5  | j                  j	                  t        j
                  t        j                  d       d d d        t        | !         S # 1 sw Y   xY wr   )	
contextlibsuppress	Exceptionr   
setsockoptIPPROTO_IPV6IPV6_V6ONLYr  r   )r   r	  s    r   r   zDualStackServer.server_bind  s`    $$Y/ @&&''););Q@@ 7&((@ @s   :A++A4c                 J    | j                  ||| t        j                         y )Nr   )RequestHandlerClassr   r  )r   r  r   s      r   finish_requestzDualStackServer.finish_request  s"    $$Wnd/3~~ % ?r   )r   r   r   r   r5  rs  rt  s   @r   r+  r+    s    	)	?r   r+  )r  r  r   r  r  )7r   __all__r  r-  email.utilsr   r   http.clientrN   rM  r   rm  r  r]  r  rf  r   r   r   r   urllib.parser  r   r   r   r   r   ThreadingMixInr   StreamRequestHandlerr   r   r  r  r  r  r   r  r   r   argparser-  ArgumentParserparseradd_argumentr  rF   
parse_argsr   cgihandler_classr+  r   r  r  r   r   r   <module>rC     s
  d 
      	   	      
      7 	 '' 	 ,55z q\>> qhA*5 A*L,` 
 $
C94 C9L -(4d. z$X$$&F
0  2
h	9  : mYRYY[<  = lI *6  7 3c6  7 Dxx-0?- ? 	"#YYYYQ r   