<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
B
    YI~d·  ã               @   sæ  d Z dddddgZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZ dd	l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&e edddfdd„Z'e(dkrâddl)Z)e) *¡ Z+e+j,dddd  e+j,d!d"dd#d$d% e+j,d&d'e -¡ d(d) e+j,d*d+de.d,d-d. e+ /¡ Z0e0j1rÂe&Z2nee!e0j3d/Z2e'e2e0j4e0j5d0 dS )1z0.6Ú
HTTPServerÚThreadingHTTPServerÚBaseHTTPRequestHandlerÚSimpleHTTPRequestHandlerÚCGIHTTPRequestHandleré    N)Úpartial)Ú
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   s4   t j | ¡ | jd d… \}}t |¡| _|| _d S )Né   )ÚsocketserverÚ	TCPServerÚserver_bindÚserver_addressÚsocketZgetfqdnÚserver_nameÚserver_port)ÚselfÚhostÚport© r   ú0/opt/alt/python37/lib64/python3.7/http/server.pyr   ˆ   s    zHTTPServer.server_bindN)Ú__name__Ú
__module__Ú__qualname__Zallow_reuse_addressr   r   r   r   r   r   „   s   c               @   s   e Zd ZdZdS )r   TN)r   r   r   Zdaemon_threadsr   r   r   r   r      s   c               @   sF  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dEdd„ZdFdd„ZdGdd„Zdd„ Zdd„ Zdd„ ZdHdd„Zdd„ Ze dd „ e ed!ƒed"d#ƒ¡D ƒ¡Zd$ee d%ƒ< d&d'„ Z!d(d)„ Z"dId*d+„Z#d,d-„ Z$d.d/d0d1d2d3d4gZ%dd5d6d7d8d9d:d;d<d=d>d?d@gZ&dAdB„ Z'dCZ(e)j*j+Z,dDd „ e-j. /¡ D ƒZ0dS )Jr   zPython/r   z	BaseHTTP/zHTTP/0.9c          
   C   sâ  d | _ | j | _}d| _t| jdƒ}| d¡}|| _| ¡ }t	|ƒdkrLdS t	|ƒdkr |d }yT| 
d¡srt‚| d	d
¡d
 }| d¡}t	|ƒdkrœt‚t|d ƒt|d
 ƒf}W n* ttfk
rà   |  tjd| ¡ dS X |dkrú| jdkrúd| _|dkr|  tjd| ¡ dS || _dt	|ƒ  kr<dksTn |  tjd| ¡ dS |d d… \}}t	|ƒdkr˜d| _|dkr˜|  tjd| ¡ dS || | _ | _| j 
d¡rÆd	| j d	¡ | _ytjj| j| jd| _W nv tjjk
r } z|  tjdt|ƒ¡ dS d }~X Y n< tjjk
rV } z|  tjdt|ƒ¡ dS d }~X Y nX | j dd¡}	|	 ¡ dkr|d| _n |	 ¡ dkrœ| jdkrœd| _| j dd¡}
|
 ¡ dkrÞ| jdkrÞ| jdkrÞ|   ¡ sÞd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)ZGETzBad HTTP/0.9 request type (%r)z//)Z_classzLine too longzToo many headersÚ
ConnectionÚ Úclosez
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!   r1   Ú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:   w  s    z(BaseHTTPRequestHandler.handle_expect_100c          
   C   sà   y¤| j  d¡| _t| jƒdkr@d| _d| _d| _|  tj	¡ d S | jsPd| _
d S |  ¡ s\d S d| j }t| |ƒsˆ|  tjd| j ¡ d S t| |ƒ}|ƒ  | j ¡  W n6 tjk
rÚ } z|  d|¡ d| _
d S d }~X Y nX d S )Ni  i   r   TZdo_zUnsupported method (%r)zRequest timed out: %r)r5   Úreadliner&   r*   r(   r#   r!   r/   r   ZREQUEST_URI_TOO_LONGr$   r?   ÚhasattrÚNOT_IMPLEMENTEDÚgetattrÚwfileÚflushr   ZtimeoutÚ	log_error)r   ZmnameÚmethodÚer   r   r   Úhandle_one_request‰  s4    


z)BaseHTTPRequestHandler.handle_one_requestc             C   s&   d| _ |  ¡  x| j s |  ¡  qW d S )NT)r$   rK   )r   r   r   r   Úhandle®  s    zBaseHTTPRequestHandler.handleNc             C   s  y| j | \}}W n tk
r.   d\}}Y nX |d kr<|}|d krH|}|  d||¡ |  ||¡ |  dd¡ d }|dkrâ|tjtjtjfkrâ| 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 )N)z???z???zcode %d, message %sr   r    éÈ   F)Úquote)ÚcodeÚmessageÚexplainzUTF-8ÚreplacezContent-TypezContent-LengthZHEAD)Ú	responsesÚKeyErrorrH   Úsend_responseÚsend_headerr   Z
NO_CONTENTZRESET_CONTENTÚNOT_MODIFIEDÚerror_message_formatÚhtmlÚescapeÚencodeÚerror_content_typer%   r*   rA   r!   rF   Úwrite)r   rO   rP   rQ   ZshortmsgZlongmsgZbodyZcontentr   r   r   r/   ¶  s4    
z!BaseHTTPRequestHandler.send_errorc             C   s:   |   |¡ |  ||¡ |  d|  ¡ ¡ |  d|  ¡ ¡ d S )NZServerZDate)Úlog_requestr@   rV   Úversion_stringÚdate_time_string)r   rO   rP   r   r   r   rU   ë  s    
z$BaseHTTPRequestHandler.send_responsec             C   sd   | j dkr`|d kr0|| jkr,| j| d }nd}t| dƒs@g | _| j d| j||f  dd¡¡ d S )NzHTTP/0.9r   r   Ú_headers_bufferz
%s %d %s
zlatin-1Ústrict)r#   rS   rC   ra   Úappendr0   r[   )r   rO   rP   r   r   r   r@   ø  s    


z)BaseHTTPRequestHandler.send_response_onlyc             C   sl   | j dkr6t| dƒsg | _| j d||f  dd¡¡ | ¡ dkrh| ¡ dkrVd| _n| ¡ d	krhd
| _d S )NzHTTP/0.9ra   z%s: %s
zlatin-1rb   Z
connectionr    Tz
keep-aliveF)r#   rC   ra   rc   r[   r9   r$   )r   ÚkeywordÚvaluer   r   r   rV     s    

z"BaseHTTPRequestHandler.send_headerc             C   s"   | j dkr| j d¡ |  ¡  d S )NzHTTP/0.9s   
)r#   ra   rc   Úflush_headers)r   r   r   r   rA     s    
z"BaseHTTPRequestHandler.end_headersc             C   s(   t | dƒr$| j d | j¡¡ g | _d S )Nra   ó    )rC   rF   r]   Újoinra   )r   r   r   r   rf     s    
z$BaseHTTPRequestHandler.flush_headersú-c             C   s.   t |tƒr|j}|  d| jt|ƒt|ƒ¡ d S )Nz
"%s" %s %s)Ú
isinstancer   re   Úlog_messager(   r%   )r   rO   Úsizer   r   r   r^     s    
z"BaseHTTPRequestHandler.log_requestc             G   s   | j |f|žŽ  d S )N)rk   )r   ÚformatÚargsr   r   r   rH   *  s    z BaseHTTPRequestHandler.log_errorc             C   s   i | ]}d |d›|“qS )z\xZ02xr   )Ú.0Úcr   r   r   ú
<dictcomp>:  s    z!BaseHTTPRequestHandler.<dictcomp>é    é   é    z\\ú\c             G   s2   || }t j d|  ¡ |  ¡ | | j¡f ¡ d S )Nz%s - - [%s] %s
)ÚsysÚstderrr]   Úaddress_stringÚlog_date_time_stringÚ	translateÚ_control_char_table)r   rm   rn   rP   r   r   r   rk   =  s
    z"BaseHTTPRequestHandler.log_messagec             C   s   | j d | j S )Nú )Úserver_versionÚsys_version)r   r   r   r   r_   W  s    z%BaseHTTPRequestHandler.version_stringc             C   s    |d krt   ¡ }tjj|ddS )NT)Zusegmt)ÚtimeÚemailÚutilsZ
formatdate)r   Z	timestampr   r   r   r`   [  s    z'BaseHTTPRequestHandler.date_time_stringc          	   C   sB   t   ¡ }t  |¡\	}}}}}}}}	}
d|| j| ||||f }|S )Nz%02d/%3s/%04d %02d:%02d:%02d)r   Z	localtimeÚ	monthname)r   ZnowZyearZmonthZdayZhhZmmÚssÚxÚyÚzÚsr   r   r   ry   a  s
    z+BaseHTTPRequestHandler.log_date_time_stringZMonZTueZWedZThuZFriZSatZSunZJanZFebZMarZAprZMayZJunZJulZAugZSepZOctZNovZDecc             C   s
   | j d S )Nr   )Úclient_address)r   r   r   r   rx   o  s    z%BaseHTTPRequestHandler.address_stringzHTTP/1.0c             C   s   i | ]}|j |jf|“qS r   )ÚphraseÚdescription)ro   Úvr   r   r   rq   ~  s   )NN)N)N)ri   ri   )N)1r   r   r   rv   r;   r)   r~   Ú__version__r}   ÚDEFAULT_ERROR_MESSAGErX   ÚDEFAULT_ERROR_CONTENT_TYPEr\   r"   r?   r:   rK   rL   r/   rU   r@   rV   rA   rf   r^   rH   r%   Ú	maketransÚ	itertoolsÚchainÚranger{   Úordrk   r_   r`   ry   Zweekdaynamer‚   rx   r0   r3   r4   ZHTTPMessager6   r   Ú__members__ÚvaluesrS   r   r   r   r   r   ”   sB   ij%
5


"
	c                   sŽ   e Zd Zde 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ejshe ¡  ej ¡ Ze dddddœ¡ ‡  ZS )r   zSimpleHTTP/N)Ú	directoryc               s(   |d krt  ¡ }|| _tƒ j||Ž d S )N)ÚosÚgetcwdr–   ÚsuperÚ__init__)r   r–   rn   Úkwargs)Ú	__class__r   r   rš   “  s    z!SimpleHTTPRequestHandler.__init__c             C   s.   |   ¡ }|r*z|  || j¡ W d | ¡  X d S )N)Ú	send_headÚcopyfilerF   r    )r   Úfr   r   r   Údo_GET™  s
    zSimpleHTTPRequestHandler.do_GETc             C   s   |   ¡ }|r| ¡  d S )N)r   r    )r   rŸ   r   r   r   Údo_HEAD¢  s    z SimpleHTTPRequestHandler.do_HEADc             C   s>  |   | j¡}d }tj |¡rÄtj | j¡}|j d¡sŒ|  t	j
¡ |d |d |d d |d |d f}tj |¡}|  d|¡ |  ¡  d S x6dD ]$}tj ||¡}tj |¡r’|}P q’W |  |¡S |  |¡}yt|d	ƒ}W n$ tk
r    |  t	jd
¡ d S X yt | ¡ ¡}d| jkrØd| jkrØytj | jd ¡}	W n ttttfk
r`   Y nxX |	j d kr~|	j!t"j#j$d}	|	j t"j#j$krØt"j" %|j&t"j#j$¡}
|
j!dd}
|
|	krØ|  t	j'¡ |  ¡  | (¡  d S |  t	j)¡ |  d|¡ |  dt*|d ƒ¡ |  d|  +|j&¡¡ |  ¡  |S    | (¡  ‚ Y nX d S )Nr   r   r	   r
   r   é   ZLocation)z
index.htmlz	index.htmÚrbzFile not foundzIf-Modified-SincezIf-None-Match)Útzinfo)ZmicrosecondzContent-typezContent-Lengthé   zLast-Modified),Útranslate_pathr1   r—   ÚisdirÚurllibÚparseZurlsplitÚendswithrU   r   ZMOVED_PERMANENTLYZ
urlunsplitrV   rA   rh   ÚexistsÚlist_directoryÚ
guess_typeÚopenÚOSErrorr/   Ú	NOT_FOUNDÚfstatÚfilenor7   r€   r   Zparsedate_to_datetimeÚ	TypeErrorr.   ÚOverflowErrorr,   r¤   rR   ÚdatetimeZtimezoneZutcZfromtimestampÚst_mtimerW   r    ÚOKr%   r`   )r   r1   rŸ   ÚpartsZ	new_partsZnew_urlÚindexZctypeZfsZimsZ
last_modifr   r   r   r   ¨  sl    



z"SimpleHTTPRequestHandler.send_headc          	   C   sÚ  yt  |¡}W n" tk
r0   |  tjd¡ d S X |jdd„ d g }ytjj	| j
dd}W n" tk
r~   tj 	| j
¡}Y nX tj|dd}t ¡ }d	| }| d
¡ | d¡ | d| ¡ | d| ¡ | d| ¡ | d¡ x~|D ]v}t j
 ||¡}| }	}
t j
 |¡r$|d }	|d }
t j
 |¡r:|d }	| dtjj|
ddtj|	ddf ¡ qìW | d¡ d |¡ |d¡}t ¡ }| |¡ | d¡ |  tj¡ |  dd| ¡ |  dtt|ƒƒ¡ |  ¡  |S )NzNo permission to list directoryc             S   s   |   ¡ S )N)r9   )Úar   r   r   Ú<lambda>  rg   z9SimpleHTTPRequestHandler.list_directory.<locals>.<lambda>)ÚkeyÚsurrogatepass)ÚerrorsF)rN   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   zContent-typeztext/html; charset=%szContent-Length) r—   Úlistdirr¯   r/   r   r°   Úsortr¨   r©   Úunquoter1   ÚUnicodeDecodeErrorrY   rZ   rv   Úgetfilesystemencodingrc   rh   r§   ÚislinkrN   r[   ÚioÚBytesIOr]   ÚseekrU   r·   rV   r%   r*   rA   )r   r1   ÚlistÚrZdisplaypathÚencÚtitleÚnameÚfullnameZdisplaynameZlinknameZencodedrŸ   r   r   r   r¬   ÷  s\    







z'SimpleHTTPRequestHandler.list_directoryc             C   sÒ   |  dd¡d }|  dd¡d }| ¡  d¡}ytjj|dd}W n  tk
rb   tj |¡}Y nX t |¡}|  d¡}t	d |ƒ}| j
}x8|D ]0}tj |¡sŽ|tjtjfkr°qŽtj ||¡}qŽW |rÎ|d7 }|S )Nú?r	   r   ú#r   r½   )r¾   )r)   r'   rª   r¨   r©   rÄ   rÅ   Ú	posixpathÚnormpathÚfilterr–   r—   r1   ÚdirnameÚcurdirÚpardirrh   )r   r1   Ztrailing_slashr<   Zwordr   r   r   r¦   1  s$    	



z'SimpleHTTPRequestHandler.translate_pathc             C   s   t  ||¡ d S )N)ÚshutilZcopyfileobj)r   ÚsourceZ
outputfiler   r   r   rž   O  s    z!SimpleHTTPRequestHandler.copyfilec             C   sL   t  |¡\}}|| jkr"| j| S | ¡ }|| jkr>| j| S | jd S d S )Nr   )rÓ   ÚsplitextÚextensions_mapr9   )r   r1   ÚbaseZextr   r   r   r­   _  s    



z#SimpleHTTPRequestHandler.guess_typezapplication/octet-streamz
text/plain)r   z.pyz.cz.h)r   r   r   rŒ   r}   rš   r    r¡   r   r¬   r¦   rž   r­   Ú	mimetypesZinitedZinitZ	types_mapÚcopyrÜ   ÚupdateÚ__classcell__r   r   )rœ   r   r   „  s"   	O:
c       	      C   sÒ   |   d¡\} }}tj | ¡} |  d¡}g }x<|d d… D ],}|dkrN| ¡  q8|r8|dkr8| |¡ q8W |rœ| ¡ }|r |dkrŽ| ¡  d}q |dkr d}nd}|r²d ||f¡}dd |¡ |f}d |¡}|S )NrÑ   r   r   z..r   r   )Ú	partitionr¨   r©   rÄ   r)   Úpoprc   rh   )	r1   Ú_ÚqueryÚ
path_partsZ
head_partsÚpartZ	tail_partZ	splitpathÚcollapsed_pathr   r   r   Ú_url_collapse_path„  s.    


ré   c              C   sp   t rt S ydd l} W n tk
r(   dS X y|  d¡d a W n. tk
rj   dtdd„ |  ¡ D ƒƒ a Y nX t S )Nr   r   Únobodyr
   r	   c             s   s   | ]}|d  V  qdS )r
   Nr   )ro   r„   r   r   r   ú	<genexpr>Â  s    znobody_uid.<locals>.<genexpr>)rê   ÚpwdÚImportErrorÚgetpwnamrT   ÚmaxZgetpwall)rì   r   r   r   Ú
nobody_uid¶  s     rð   c             C   s   t  | t j¡S )N)r—   ÚaccessÚX_OK)r1   r   r   r   Ú
executableÆ  s    ró   c               @   sR   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|  ¡  n|  tjd¡ d S )NzCan only POST to CGI scripts)Úis_cgiÚrun_cgir/   r   rD   )r   r   r   r   Údo_POSTÜ  s
    
zCGIHTTPRequestHandler.do_POSTc             C   s   |   ¡ r|  ¡ S t | ¡S d S )N)rõ   rö   r   r   )r   r   r   r   r   ê  s    zCGIHTTPRequestHandler.send_headc             C   sP   t | jƒ}| dd¡}|d |… ||d d …  }}|| jkrL||f| _dS dS )Nr   r	   TF)ré   r1   Ú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 )N)ró   )r   r1   r   r   r   Úis_executable  s    z#CGIHTTPRequestHandler.is_executablec             C   s   t j |¡\}}| ¡ dkS )N)z.pyz.pyw)r—   r1   rÛ   r9   )r   r1   rû   rü   r   r   r   Ú	is_python  s    zCGIHTTPRequestHandler.is_pythonc       )   	   C   s¶  | j \}}|d | }| dt|ƒd ¡}x`|dkrŠ|d |… }||d d … }|  |¡}tj |¡r†|| }}| dt|ƒd ¡}q,P q,W | d¡\}}}	| d¡}|dkrÊ|d |… ||d …  }
}n
|d }
}|d |
 }|  |¡}tj |¡s|  	t
jd| ¡ d S tj |¡s2|  	t
jd| ¡ d S |  |¡}| jsJ|sl|  |¡sl|  	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< |	rô|	|d< | jd |d< | j  d¡}|r¼| !¡ }t|ƒdkr¼dd l"}dd l#}|d |d< |d  $¡ dkr¼y"|d  %d¡}| &|¡ 'd¡}W n |j(t)fk
r–   Y n&X | !d¡}t|ƒdkr¼|d |d< | j  d¡d krÞ| j *¡ |d< n| jd |d< | j  d¡}|r||d< | j  d ¡}|r ||d!< g }xN| j +d"¡D ]>}|d d… d#krX| ,| -¡ ¡ n||d$d …  !d%¡ }q2W d% .|¡|d&< | j  d'¡}|rœ||d(< t/d | j 0d)g ¡ƒ}d* .|¡}|rÈ||d+< xd,D ]}| 1|d¡ qÎW |  2t
j3d-¡ |  4¡  |	 5d.d/¡}| jr,|
g}d0|kr(| ,|¡ t6ƒ }| j7 8¡  t 9¡ }|dkr¢t :|d¡\}}x0t; ;| j<gg g d¡d rŠ| j< =d¡s\P q\W |rž|  >d1|¡ d S y\yt ?|¡ W n t@k
rÈ   Y nX t A| j< B¡ d¡ t A| j7 B¡ d¡ t C|||¡ W n(   | j D| jE| j¡ t Fd2¡ Y nX n†dd lG} |g}!|  |¡r€tHjI}"|" $¡  Jd3¡rt|"d d4… |"d5d …  }"|"d6g|! }!d0|	kr”|! ,|	¡ |  Kd7|  L|!¡¡ ytM|ƒ}#W n tNtOfk
rÐ   d}#Y nX | jP|!| jQ| jQ| jQ|d8}$| j $¡ d9kr|#dkr| j< =|#¡}%nd }%x4t; ;| j<jRgg g d¡d rL| j<jR Sd¡sP qW |$ T|%¡\}&}'| j7 U|&¡ |'rz|  >d:|'¡ |$jV W¡  |$jX W¡  |$jY}(|(r¨|  >d1|(¡ n
|  Kd;¡ 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Úacceptz	
 é   ú,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 status %#xrs   zw.exeéûÿÿÿéüÿÿÿz-uzcommand: %s)ÚstdinÚstdoutrw   ÚenvZpostz%szCGI script exited OK)Zrú   rø   r*   r¦   r—   r1   r§   râ   r«   r/   r   r°   ÚisfileZ	FORBIDDENrþ   Ú	have_forkrý   rß   ZdeepcopyÚenvironr_   Zserverr   r0   r%   r   r!   r¨   r©   rÄ   rˆ   r7   r8   r)   Úbase64Úbinasciir9   r[   ZdecodebytesÚdecodeÚErrorÚUnicodeErrorZget_content_typeZgetallmatchingheadersrc   Ústriprh   rÕ   Zget_allÚ
setdefaultrU   r·   rf   rR   rð   rF   rG   rô   ÚwaitpidÚselectr5   ÚreadrH   Úsetuidr¯   Údup2r²   ÚexecveZhandle_errorZrequestÚ_exitÚ
subprocessrv   ró   rª   rk   Zlist2cmdliner-   r³   r,   ÚPopenÚPIPEZ_sockZrecvZcommunicater]   rw   r    r  Ú
returncode))r   ÚdirÚrestr1   ÚiZnextdirZnextrestZ	scriptdirrä   rå   ZscriptZ
scriptnameZ
scriptfileZispyr  Zuqrestr   r  r  Úlengthr  r  ÚlineZuaÚcoZ
cookie_strÚkZdecoded_queryrn   rê   ÚpidÚstsr#  ZcmdlineZinterpÚnbytesÚpÚdatar  rw   Ústatusr   r   r   rö     s2   


























zCGIHTTPRequestHandler.run_cgiN)r   r   r   rC   r—   r  Zrbufsizer÷   r   rõ   rù   rý   rþ   rö   r   r   r   r   r   Ë  s   
zHTTP/1.0i@  r   c       	   	   C   s„   ||f}|| _ ||| ƒb}|j ¡ }d}t|j|d |d dƒ y| ¡  W n& tk
rt   tdƒ t d¡ Y nX W d Q R X d S )Nz>Serving HTTP on {host} port {port} (http://{host}:{port}/) ...r   r	   )r   r   z&
Keyboard interrupt received, exiting.)	r0   r   ZgetsocknameÚprintrm   Zserve_foreverÚKeyboardInterruptrv   Úexit)	ÚHandlerClassZServerClassZprotocolr   Úbindr   ZhttpdZsaZserve_messager   r   r   ÚtestÔ  s    
r9  Ú__main__z--cgiÚ
store_truezRun as CGI Server)ÚactionÚhelpz--bindz-bZADDRESSz8Specify alternate bind address [default: all interfaces])ÚdefaultÚmetavarr=  z--directoryz-dz9Specify alternative directory [default:current directory])r>  r=  r   ÚstorerÑ   z&Specify alternate port [default: 8000])r<  r>  ÚtypeÚnargsr=  )r–   )r7  r   r8  )6rŒ   Ú__all__rß   rµ   Zemail.utilsr€   rY   Zhttp.clientr3   rÈ   r   rÞ   r—   rÓ   r  rÙ   r   r   rv   r   Zurllib.parser¨   Ú	functoolsr   r   r   rŽ   r   r   ZThreadingMixInr   ZStreamRequestHandlerr   r   ré   rê   rð   ró   r   r9  r   ÚargparseÚArgumentParserÚparserÚadd_argumentr˜   r-   Ú
parse_argsrn   ZcgiZhandler_classr–   r   r8  r   r   r   r   Ú<module>S   sz      s  0  

