o
     JAf                     @   s  	 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mZ dZdZG dd dejZG d	d
 d
ejeZG dd dejZG dd deZdd Zda dd Z!dd Z"G dd deZ#dd Z$eedddfddZ%e&dkrddl'Z'ddl(Z(e') Z*e*j+ddd d! e*j+d"d#d$d%d& e*j+d'd(e, d)d* e*j+d+d,de-d-d.d/ e*. Z/e/j0re#Z1neZ1G d0d1 d1eZ2e%e1e2e/j3e/j4d2 dS dS )3z0.6)
HTTPServerThreadingHTTPServerBaseHTTPRequestHandlerSimpleHTTPRequestHandlerCGIHTTPRequestHandler    N)
HTTPStatusa  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
        "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html;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                   @   s   e Zd ZdZdd ZdS )r      c                 C   s6   	 t j|  | jd d \}}t|| _|| _d S )N   )socketserver	TCPServerserver_bindZserver_addresssocketgetfqdnserver_nameserver_port)selfhostport r   "/usr/lib/python3.10/http/server.pyr      s
   
zHTTPServer.server_bindN)__name__
__module____qualname__Zallow_reuse_addressr   r   r   r   r   r      s    r   c                   @   s   e Zd ZdZdS )r   TN)r   r   r   Zdaemon_threadsr   r   r   r   r      s    r   c                   @   s   e Zd Z	 dej d  Zde Ze	Z
eZdZdd Zdd Zd	d
 Zdd Zd.ddZd/ddZd/ddZdd Zdd Zdd Zd0ddZdd Zdd  Zd!d" Zd/d#d$Zd%d& Zg d'Zg d(Zd)d* Z d+Z!e"j#j$Z%d,d- e&j'( D Z)dS )1r   zPython/r   z	BaseHTTP/HTTP/0.9c              
   C   s  	 d | _ | j | _}d| _t| jd}|d}|| _| }t	|dkr'dS t	|dkr|d }z*|
ds9t|d	d
d
 }|d}t	|dkrNtt|d t|d
 f}W n ttfyp   | tjd|  Y dS w |dkr}| jdkr}d| _|dkr| tjd|  dS || _dt	|  krdksn | tjd|  dS |d d \}}t	|dkrd| _|dkr| tjd|  dS ||| _ | _| j
drd	| jd	 | _ztjj| j| jd| _W n? tjjy
 } z| tjdt| W Y d }~dS d }~w tjjy) } z| tjdt| W Y d }~dS d }~ww | jdd}	|	 dkr<d| _n|	 dkrL| jdkrLd| _| jdd}
|
 dkrm| jdkrm| jdkrm|   smdS dS )NTz
iso-8859-1z
r   F   zHTTP//r   .r	   z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//)Z_classzLine too longzToo many headers
Connection close
keep-aliveZExpectz100-continue)!commanddefault_request_versionrequest_versionclose_connectionstrraw_requestlinerstriprequestlinesplitlen
startswith
ValueErrorint
IndexError
send_errorr   ZBAD_REQUESTprotocol_versionZHTTP_VERSION_NOT_SUPPORTEDpathlstriphttpclientZparse_headersrfileMessageClassheadersZLineTooLongZREQUEST_HEADER_FIELDS_TOO_LARGEZHTTPExceptiongetlowerhandle_expect_100)r   versionr*   wordsZbase_version_numberZversion_numberr#   r3   errZconntypeexpectr   r   r   parse_request  s   





z$BaseHTTPRequestHandler.parse_requestc                 C   s   	 |  tj |   dS NT)send_response_onlyr   ZCONTINUEend_headersr   r   r   r   r<   u  s   z(BaseHTTPRequestHandler.handle_expect_100c              
   C   s   	 zW| j d| _t| jdkr"d| _d| _d| _| tj	 W d S | js+d| _
W d S |  s2W d S d| j }t| |sI| tjd| j  W d S t| |}|  | j  W d S  tyt } z| d| d| _
W Y d }~d S d }~ww )Ni  i   r    TZdo_zUnsupported method (%r)zRequest timed out: %r)r7   readliner(   r,   r*   r%   r#   r1   r   ZREQUEST_URI_TOO_LONGr&   rA   hasattrNOT_IMPLEMENTEDgetattrwfileflushTimeoutError	log_error)r   Zmnamemethoder   r   r   handle_one_request  s<   


z)BaseHTTPRequestHandler.handle_one_requestc                 C   s,   	 d| _ |   | j s|   | j rd S d S rB   )r&   rP   rE   r   r   r   handle  s   zBaseHTTPRequestHandler.handleNc                 C   s  	 z	| j | \}}W n ty   d\}}Y nw |d u r|}|d u r$|}| d|| | || | dd d }|dkrq|tjtjtjfvrq| j	|t
j|ddt
j|ddd }|d	d
}| d| j | dtt| |   | jdkr|r| j| d S d S d S )N)???rR   zcode %d, message %sr   r!      Fquote)codemessageexplainzUTF-8replacezContent-TypeContent-LengthZHEAD)	responsesKeyErrorrM   send_responsesend_headerr   Z
NO_CONTENTZRESET_CONTENTNOT_MODIFIEDerror_message_formathtmlescapeencodeerror_content_typer'   r,   rD   r#   rJ   write)r   rV   rW   rX   ZshortmsgZlongmsgbodyZcontentr   r   r   r1     s>   z!BaseHTTPRequestHandler.send_errorc                 C   s<   	 |  | | || | d|   | d|   d S )NZServerZDate)log_requestrC   r^   version_stringdate_time_stringr   rV   rW   r   r   r   r]     s
   
z$BaseHTTPRequestHandler.send_responsec                 C   sj   	 | j dkr3|d u r|| jv r| j| d }nd}t| ds!g | _| jd| j||f dd d S d S )Nr   r   r    _headers_bufferz
%s %d %s
latin-1strict)r%   r[   rG   rk   appendr2   rc   rj   r   r   r   rC     s    



z)BaseHTTPRequestHandler.send_response_onlyc                 C   sx   	 | j dkrt| dsg | _| jd||f dd | dkr8| dkr-d| _d S | d	kr:d
| _d S d S d S )Nr   rk   z%s: %s
rl   rm   
connectionr!   Tr"   F)r%   rG   rk   rn   rc   r;   r&   )r   keywordvaluer   r   r   r^     s   



z"BaseHTTPRequestHandler.send_headerc                 C   s(   	 | j dkr| jd |   d S d S )Nr   s   
)r%   rk   rn   flush_headersrE   r   r   r   rD     s
   
z"BaseHTTPRequestHandler.end_headersc                 C   s,   t | dr| jd| j g | _d S d S )Nrk       )rG   rJ   re   joinrk   rE   r   r   r   rr     s   

z$BaseHTTPRequestHandler.flush_headers-c                 C   s0   	 t |tr	|j}| d| jt|t| d S )Nz
"%s" %s %s)
isinstancer   rq   log_messager*   r'   )r   rV   sizer   r   r   rg     s   
z"BaseHTTPRequestHandler.log_requestc                 G   s   	 | j |g|R   d S N)rw   r   formatargsr   r   r   rM   (  s   z BaseHTTPRequestHandler.log_errorc                 G   s(   	 t jd|  |  || f  d S )Nz%s - - [%s] %s
)sysstderrre   address_stringlog_date_time_stringrz   r   r   r   rw   6  s   
z"BaseHTTPRequestHandler.log_messagec                 C   s   	 | j d | j S )N )server_versionsys_versionrE   r   r   r   rh   L  s   z%BaseHTTPRequestHandler.version_stringc                 C   s"   	 |d u r	t   }tjj|ddS )NT)Zusegmt)timeemailutilsZ
formatdate)r   Z	timestampr   r   r   ri   P  s   z'BaseHTTPRequestHandler.date_time_stringc              	   C   sD   	 t   }t |\	}}}}}}}}	}
d|| j| ||||f }|S )Nz%02d/%3s/%04d %02d:%02d:%02d)r   	localtime	monthname)r   ZnowZyearZmonthZdayZhhZmmssxyzsr   r   r   r   V  s   z+BaseHTTPRequestHandler.log_date_time_string)ZMonZTueZWedZThuZFriZSatZSun)NZJanZFebZMarZAprZMayZJunZJulZAugZSepZOctZNovZDecc                 C   s   	 | j d S Nr   )client_addressrE   r   r   r   r   d  s   
z%BaseHTTPRequestHandler.address_stringHTTP/1.0c                 C   s   i | ]	}||j |jfqS r   )phrasedescription).0vr   r   r   
<dictcomp>s  s    z!BaseHTTPRequestHandler.<dictcomp>)NNry   )ru   ru   )*r   r   r   r}   r=   r+   r   __version__r   DEFAULT_ERROR_MESSAGEr`   DEFAULT_ERROR_CONTENT_TYPErd   r$   rA   r<   rP   rQ   r1   r]   rC   r^   rD   rr   rg   rM   rw   rh   ri   r   Zweekdaynamer   r   r2   r5   r6   ZHTTPMessager8   r   __members__valuesr[   r   r   r   r   r      s>    gj%

5


	
r   c                       sv   e Zd Z	 de Zddddd ZZdd fd	d

Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Z  ZS )r   zSimpleHTTP/zapplication/gzipapplication/octet-streamzapplication/x-bzip2zapplication/x-xz)z.gzz.Zz.bz2z.xzN	directoryc                   s2   |d u rt  }t || _t j|i | d S ry   )osgetcwdfspathr   super__init__)r   r   r|   kwargs	__class__r   r   r     s   z!SimpleHTTPRequestHandler.__init__c                 C   s:   	 |   }|rz| || j W |  d S |  w d S ry   )	send_headcopyfilerJ   r!   r   fr   r   r   do_GET  s   zSimpleHTTPRequestHandler.do_GETc                 C   s   	 |   }|r|  d S d S ry   )r   r!   r   r   r   r   do_HEAD  s
   z SimpleHTTPRequestHandler.do_HEADc                 C   sN  	 |  | j}d }tj|rhtj| j}|jdsM| t	j
 |d |d |d d |d |d f}tj|}| d| | dd	 |   d S d
D ]}tj||}tj|rb|} nqO| |S | |}|dr{| t	jd d S zt|d}W n ty   | t	jd Y d S w zt| }d| jv rd| jvrztj| jd }	W n ttttfy   Y n:w |	j d u r|	j!t"j#j$d}	|	j t"j#j$u rt"j"%|j&t"j#j$}
|
j!dd}
|
|	kr| t	j' |   |(  W d S | t	j) | d| | dt*|d  | d| +|j& |   |W S    |(   )Nr   r   r   r	   r      ZLocationrZ   0)z
index.htmlz	index.htmzFile not foundrbzIf-Modified-SincezIf-None-Match)tzinfo)ZmicrosecondContent-type   zLast-Modified),translate_pathr3   r   isdirurllibparseurlsplitendswithr]   r   ZMOVED_PERMANENTLY
urlunsplitr^   rD   rt   existslist_directory
guess_typer1   	NOT_FOUNDopenOSErrorfstatfilenor9   r   r   Zparsedate_to_datetime	TypeErrorr0   OverflowErrorr.   r   rY   datetimetimezoneZutcZfromtimestampst_mtimer_   r!   OKr'   ri   )r   r3   r   partsZ	new_partsZnew_urlindexZctypefsZimsZ
last_modifr   r   r   r     s   








z"SimpleHTTPRequestHandler.send_headc              	   C   s  	 zt |}W n ty   | tjd Y d S w |jdd d g }ztjj	| j
dd}W n ty>   tj	|}Y nw tj|dd}t }d	| }|d
 |d |d|  |d|  |d|  |d |D ]9}t j
||}| }	}
t j
|r|d }	|d }
t j
|r|d }	|dtjj|
ddtj|	ddf  qt|d d||d}t }|| |d | tj | dd|  | dtt| |   |S )NzNo permission to list directoryc                 S   s   |   S ry   )r;   )ar   r   r   <lambda>
  s    z9SimpleHTTPRequestHandler.list_directory.<locals>.<lambda>)keysurrogatepasserrorsFrT   zDirectory listing for %szZ<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">z<html>
<head>z@<meta http-equiv="Content-Type" content="text/html; charset=%s">z<title>%s</title>
</head>z<body>
<h1>%s</h1>z	<hr>
<ul>r   @z<li><a href="%s">%s</a></li>z</ul>
<hr>
</body>
</html>

surrogateescaper   r   ztext/html; charset=%srZ   ) r   listdirr   r1   r   r   sortr   r   unquoter3   UnicodeDecodeErrorra   rb   r}   getfilesystemencodingrn   rt   r   islinkrU   rc   ioBytesIOre   seekr]   r   r^   r'   r,   rD   )r   r3   listrZdisplaypathenctitlenamefullnameZdisplaynameZlinknameencodedr   r   r   r   r     sn   







z'SimpleHTTPRequestHandler.list_directoryc                 C   s   	 | ddd }| ddd }| d}z
tjj|dd}W n ty1   tj|}Y nw t|}| d}t	d |}| j
}|D ]}tj|sV|tjtjfv rWqFtj||}qF|re|d7 }|S )N?r   r   #r   r   r   )r+   r)   r   r   r   r   r   	posixpathnormpathfilterr   r   r3   dirnamecurdirpardirrt   )r   r3   Ztrailing_slashr>   Zwordr   r   r   r   5  s(   


z'SimpleHTTPRequestHandler.translate_pathc                 C   s   	 t || d S ry   )shutilcopyfileobj)r   sourceZ
outputfiler   r   r   r   S  s   z!SimpleHTTPRequestHandler.copyfilec                 C   sZ   	 t |\}}|| jv r| j| S | }|| jv r | j| S t|\}}|r+|S dS )Nr   )r   splitextextensions_mapr;   	mimetypesr   )r   r3   baseextZguess_r   r   r   r   c  s   



z#SimpleHTTPRequestHandler.guess_type)r   r   r   r   r   r   Z_encodings_map_defaultr   r   r   r   r   r   r   r   __classcell__r   r   r   r   r   y  s     
	X:r   c           	      C   s   	 |  d\} }}tj| } | d}g }|d d D ]}|dkr'|  q|r2|dkr2|| q|rM| }|rL|dkrF|  d}n	|dkrLd}nd}|rXd||f}dd| |f}d|}|S )Nr   r   r   z..r   r    )	partitionr   r   r   r+   poprn   rt   )	r3   r   query
path_partsZ
head_partspartZ	tail_partZ	splitpathcollapsed_pathr   r   r   _url_collapse_path  s4   



r   c                  C   sp   	 t rt S zdd l} W n
 ty   Y dS w z
| dd a W t S  ty7   dtdd |  D  a Y t S w )Nr   r   nobodyr	   r   c                 s   s    | ]}|d  V  qdS )r	   Nr   )r   r   r   r   r   	<genexpr>  s    znobody_uid.<locals>.<genexpr>)r   pwdImportErrorgetpwnamr\   maxZgetpwall)r   r   r   r   
nobody_uid  s   r  c                 C   s   	 t | t jS ry   )r   accessX_OK)r3   r   r   r   
executable  s   r  c                   @   sT   e Zd Z	 eedZdZdd Zdd Zdd Z	d	d
gZ
dd Zdd Zdd ZdS )r   forkr   c                 C   s(   	 |   r|   d S | tjd d S )NzCan only POST to CGI scripts)is_cgirun_cgir1   r   rH   rE   r   r   r   do_POST  s   zCGIHTTPRequestHandler.do_POSTc                 C   s   	 |   r	|  S t| S ry   )r  r  r   r   rE   r   r   r   r     s   
zCGIHTTPRequestHandler.send_headc                 C   s   	 t | j}|dd}|dkr.|d | | jvr.|d|d }|dkr.|d | | jvs|dkrH|d | ||d d  }}||f| _dS dS )Nr   r   r   TF)r   r3   findcgi_directoriescgi_info)r   r   Zdir_sepheadtailr   r   r   r    s   

zCGIHTTPRequestHandler.is_cgiz/cgi-binz/htbinc                 C   s
   	 t |S ry   )r  )r   r3   r   r   r   is_executable  s   z#CGIHTTPRequestHandler.is_executablec                 C   s   	 t j|\}}| dv S )N)z.pyz.pyw)r   r3   r   r;   )r   r3   r  r  r   r   r   	is_python  s   zCGIHTTPRequestHandler.is_pythonc           )   	   C   s  	 | j \}}|d | }|dt|d }|dkrH|d | }||d d  }| |}tj|rC||}}|dt|d }nn|dks|d\}}}	|d}|dkrg|d | ||d  }
}n|d}
}|d |
 }| |}tj|s| 	t
jd|  d S tj|s| 	t
jd|  d S | |}| js|s| |s| 	t
jd|  d S ttj}|  |d	< | jj|d
< d|d< | j|d< t| jj|d< | j|d< tj|}||d< | ||d< ||d< |	|d< | jd |d< | j d}|rW|! }t|dkrWdd l"}dd l#}|d |d< |d $ dkrWz|d %d}|&|'d}W n |j(t)fyD   Y nw |!d}t|dkrW|d |d< | j dd u rh| j* |d< n| jd |d< | j d}|r|||d< | j d }|r||d!< | j+d"d#}d$,||d%< | j d&}|r||d'< t-d | j+d(g }d),|}|r||d*< d+D ]	}|.|d q| /t
j0d, | 1  |	2d-d.}| jrx|
g}d/|vr|3| t4 }| j56  t7 }|dkr5t8|d\}}t99| j:gg g dd r#| j:;dsnt99| j:gg g dd st<|}|r3| =d0|  d S z.zt>| W n
 t?yG   Y nw t@| j:A d t@| j5A d tB||| W d S    | jC| jD| j tEd1 Y d S dd lF} |g}!| |rtGjH}"|"$ Id2r|"d d3 |"d4d   }"|"d5g|! }!d/|	vr|!3|	 | Jd6| K|! ztL|}#W n tMtNfy   d}#Y nw | jO|!| jP| jP| jP|d7}$| j$ d8kr|#dkr| j:;|#}%nd }%t99| j:jQgg g dd r| j:jQRdsnt99| j:jQgg g dd s|$S|%\}&}'| j5T|& |'r(| =d9|' |$jUV  |$jWV  |$jX}(|(r@| =d:|( d S | Jd; d S )<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)ZSERVER_SOFTWAREZSERVER_NAMEzCGI/1.1ZGATEWAY_INTERFACEZSERVER_PROTOCOLZSERVER_PORTZREQUEST_METHODZ	PATH_INFOZPATH_TRANSLATEDZSCRIPT_NAMEQUERY_STRINGZREMOTE_ADDRauthorizationr	   Z	AUTH_TYPEZbasicascii:ZREMOTE_USERzcontent-typeZCONTENT_TYPEzcontent-lengthCONTENT_LENGTHrefererHTTP_REFERERacceptr   ,ZHTTP_ACCEPTz
user-agentHTTP_USER_AGENTZcookiez, HTTP_COOKIE)r  ZREMOTE_HOSTr  r  r  r  zScript output follows+r   =zCGI script exit code    zw.exez-uzcommand: %s)stdinstdoutr~   envZpostz%szCGI script exit status %#xzCGI script exited OK)Yr  r
  r,   r   r   r3   r   r   r   r1   r   r   isfileZ	FORBIDDENr  	have_forkr  copydeepcopyenvironrh   Zserverr   r2   r'   r   r#   r   r   r   r   r9   r:   r+   base64binasciir;   rc   ZdecodebytesdecodeErrorUnicodeErrorZget_content_typeZget_allrt   r   
setdefaultr]   r   rr   rY   rn   r  rJ   rK   r  waitpidselectr7   readwaitstatus_to_exitcoderM   setuidr   dup2r   execveZhandle_errorrequest_exit
subprocessr}   r  r   rw   list2cmdliner/   r   r.   PopenPIPE_sockrecvcommunicatere   r~   r!   r"  
returncode))r   dirrestr3   iZnextdirZnextrestZ	scriptdirr   r   ZscriptZ
scriptnameZ
scriptfileZispyr#  Zuqrestr  r)  r*  lengthr  r  ZuacoZ
cookie_strkZdecoded_queryr|   r   pidstsexitcoder8  ZcmdlineZinterpnbytespdatar"  r~   statusr   r   r   r    sB  





















zCGIHTTPRequestHandler.run_cgiN)r   r   r   rG   r   r%  Zrbufsizer	  r   r  r  r  r  r  r   r   r   r   r     s    
	r   c                  G   s4   t j| t jt jd}tt|\}}}}}||fS )N)typeflags)r   getaddrinfoSOCK_STREAM
AI_PASSIVEnextiter)addressZinfosfamilyrM  proto	canonnameZsockaddrr   r   r   _get_best_family  s   rX  r   i@  c           	      C   s   	 t ||\|_}|| _||| R}|j d d \}}d|v r'd| dn|}td| d| d| d| d	 z|  W n tyR   td	 t	d
 Y n	w W d    d S W d    d S 1 sfw   Y  d S )Nr	   r  []zServing HTTP on z port z	 (http://z/) ...z&
Keyboard interrupt received, exiting.r   )
rX  Zaddress_familyr2   r   getsocknameprintZserve_foreverKeyboardInterruptr}   exit)	HandlerClassServerClassprotocolr   bindaddrZhttpdr   Zurl_hostr   r   r   test  s.   "rd  __main__z--cgi
store_truezrun as CGI server)actionhelpz--bindz-bZADDRESSz8specify alternate bind address (default: all interfaces))metavarrh  z--directoryz-dz8specify alternate directory (default: current directory))defaultrh  r   storer   z&specify alternate port (default: 8000))rg  rj  rM  nargsrh  c                       s$   e Zd Z fddZdd Z  ZS )DualStackServerc                    sH   t t | jtjtjd W d    n1 sw   Y  t  S r   )	
contextlibsuppress	Exceptionr   
setsockoptIPPROTO_IPV6IPV6_V6ONLYr   r   rE   r   r   r   r     s   

zDualStackServer.server_bindc                 C   s   | j ||| tjd d S )Nr   )ZRequestHandlerClassr|   r   )r   r6  r   r   r   r   finish_request  s   

zDualStackServer.finish_request)r   r   r   r   rt  r   r   r   r   r   rm    s    rm  )r_  r`  r   rb  )5r   __all__r&  r   Zemail.utilsr   ra   Zhttp.clientr5   r   r   r   r   r0  r   r   r
   r}   r   urllib.parser   r   r   r   r   r   ZThreadingMixInr   ZStreamRequestHandlerr   r   r   r   r  r  r   rX  rd  r   argparsern  ArgumentParserparseradd_argumentr   r/   
parse_argsr|   ZcgiZhandler_classrm  r   rb  r   r   r   r   <module>   s    R   j  0  



