509318396
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
ct„jª¬  ã               @   s”  d Z 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mZ dZd	ZG d
d„ dejƒ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�ej$ƒ Z%e%j&dddd� e%j&dddd d!d"� e%j&d#d$de'd%d&d'� e%j(ƒ Z)e)j*�rze!Z+neZ+e"e+e)j,e)j-d(� dS ))z0.6Ú
HTTPServerÚ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   s4   t jj| ƒ | jd d… \}}tj|ƒ| _|| _d S )Né   )ÚsocketserverÚ	TCPServerÚserver_bindÚserver_addressÚsocketZgetfqdnÚserver_nameÚserver_port)ÚselfÚhostÚport© r   ú#/usr/lib64/python3.6/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ej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dAdd„Zdd„ Zdd„ Zdd„ ZdBdd„Zdd„ Zdd „ Zd!d"„ ZdCd#d$„Zd%d&„ Zd'd(d)d*d+d,d-gZdd.d/d0d1d2d3d4d5d6d7d8d9gZd:d;„ Z d<Z!e"j#j$Z%d=d>„ e&j'j(ƒ D ƒZ)dS )Dr   zPython/r   z	BaseHTTP/zHTTP/0.9c             C   sÀ  d | _ | j | _}d| _t| jdƒ}|jdƒ}|| _|jƒ }t	|ƒdk�r|\}}}yZ|d d… dkrjt
‚|jddƒd }|jd	ƒ}t	|ƒd
kr”t
‚t|d ƒt|d ƒf}W n* t
tfk
rØ   | jtjd| ƒ dS X |dkrò| jdkròd| _|dk�rr| jtjd| ƒ dS n^t	|ƒd
k�rR|\}}d| _|dk�rr| jtjd| ƒ dS n |�s\dS | jtjd| ƒ dS |||  | _ | _| _| jjdƒ�r¨d| jjdƒ | _ytjj| j| jd�| _W nr tjjk
�rü } z| jtjdt|ƒƒ dS d }~X n: tjjk
�r4 } z| jtjdt|ƒƒ dS d }~X nX | jjddƒ}	|	jƒ dk�rZd| _n |	jƒ dk�rz| jdk�rzd| _| jjddƒ}
|
jƒ dk�r¼| jdk�r¼| jdk�r¼| j ƒ �s¼dS dS )NTz
iso-8859-1z
é   é   zHTTP/ú/r   Ú.r   r   zBad request version (%r)FzHTTP/1.1zInvalid HTTP version (%s)ZGETzBad HTTP/0.9 request type (%r)zBad request syntax (%r)z//)Z_classzLine too longzToo many headersÚ
ConnectionÚ Úclosez
keep-aliveZExpectz100-continue)r   r   )r   r   )!ÚcommandÚdefault_request_versionÚrequest_versionÚclose_connectionÚstrÚraw_requestlineÚrstripÚrequestlineÚsplitÚlenÚ
ValueErrorÚintÚ
IndexErrorÚ
send_errorr   ZBAD_REQUESTÚprotocol_versionZHTTP_VERSION_NOT_SUPPORTEDÚpathÚ
startswithÚlstripÚhttpÚclientZparse_headersÚrfileÚMessageClassÚheadersZLineTooLongZREQUEST_HEADER_FIELDS_TOO_LARGEZHTTPExceptionÚgetÚlowerÚhandle_expect_100)r   Úversionr&   Úwordsr   r.   Zbase_version_numberZversion_numberÚerrZconntypeZexpectr   r   r   Úparse_request  s”    












z$BaseHTTPRequestHandler.parse_requestc             C   s   | j tjƒ | jƒ  dS )NT)Úsend_response_onlyr   ZCONTINUEÚend_headers)r   r   r   r   r8   n  s    z(BaseHTTPRequestHandler.handle_expect_100c             C   sÞ   y¤| j jdƒ| _t| jƒdkr@d| _d| _d| _| jtj	ƒ d S | jsPd| _
d S | jƒ s\d S d| j }t| |ƒsˆ| jtjd| j ƒ d S t| |ƒ}|ƒ  | jjƒ  W n4 tjk
rØ } z| jd|ƒ d| _
d S d }~X nX d S )Ni  i   r   TZdo_zUnsupported method (%r)zRequest timed out: %r)r3   Ú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| _ | jƒ  x| j s | jƒ  qW d S )NT)r"   rH   )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|}| jd||ƒ | j||ƒ | j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œ }|jd	d
ƒ}| jd| jƒ | jdtt|ƒƒƒ | jƒ  | jdkoö|�r| jj|ƒ d S )Nú???zcode %d, message %sr   r   éÈ   F)Úquote)ÚcodeÚmessageÚexplainzUTF-8ÚreplacezContent-TypezContent-LengthZHEAD)rJ   rJ   )Ú	responsesÚKeyErrorrE   Úsend_responseÚsend_headerr   Z
NO_CONTENTZRESET_CONTENTZNOT_MODIFIEDÚerror_message_formatÚhtmlÚescapeÚencodeÚerror_content_typer#   r(   r>   r   rC   Úwrite)r   rM   rN   rO   ZshortmsgZlongmsgZbodyZcontentr   r   r   r,   ­  s4    
z!BaseHTTPRequestHandler.send_errorc             C   s:   | j |ƒ | j||ƒ | jd| jƒ ƒ | jd| jƒ ƒ d S )NZServerZDate)Úlog_requestr=   rT   Úversion_stringÚdate_time_string)r   rM   rN   r   r   r   rS   â  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jd| j||f jddƒƒ d S )NzHTTP/0.9r   r   Ú_headers_bufferz
%s %d %s
zlatin-1Ústrict)r!   rQ   r@   r^   Úappendr-   rX   )r   rM   rN   r   r   r   r=   ï  s    


z)BaseHTTPRequestHandler.send_response_onlyc             C   sl   | j dkr6t| dƒsg | _| jjd||f jddƒƒ |jƒ dkrh|jƒ dkrVd| _n|jƒ d	krhd
| _d S )NzHTTP/0.9r^   z%s: %s
zlatin-1r_   Z
connectionr   Tz
keep-aliveF)r!   r@   r^   r`   rX   r7   r"   )r   ÚkeywordÚvaluer   r   r   rT   ý  s    

z"BaseHTTPRequestHandler.send_headerc             C   s"   | j dkr| jjdƒ | jƒ  d S )NzHTTP/0.9s   
)r!   r^   r`   Úflush_headers)r   r   r   r   r>     s    
z"BaseHTTPRequestHandler.end_headersc             C   s(   t | dƒr$| jjdj| jƒƒ g | _d S )Nr^   ó    )r@   rC   rZ   Újoinr^   )r   r   r   r   rc     s    
z$BaseHTTPRequestHandler.flush_headersú-c             C   s.   t |tƒr|j}| jd| jt|ƒt|ƒƒ d S )Nz
"%s" %s %s)Ú
isinstancer   rb   Úlog_messager&   r#   )r   rM   Úsizer   r   r   r[     s    
z"BaseHTTPRequestHandler.log_requestc             G   s   | j |f|žŽ  d S )N)rh   )r   ÚformatÚargsr   r   r   rE   !  s    z BaseHTTPRequestHandler.log_errorc             G   s&   t jjd| jƒ | jƒ || f ƒ d S )Nz%s - - [%s] %s
)ÚsysÚstderrrZ   Úaddress_stringÚlog_date_time_string)r   rj   rk   r   r   r   rh   /  s    z"BaseHTTPRequestHandler.log_messagec             C   s   | j d | j S )Nú )Úserver_versionÚsys_version)r   r   r   r   r\   E  s    z%BaseHTTPRequestHandler.version_stringc             C   s    |d krt j ƒ }tjj|dd�S )NT)Zusegmt)ÚtimeÚemailZutilsZ
formatdate)r   Z	timestampr   r   r   r]   I  s    z'BaseHTTPRequestHandler.date_time_stringc          	   C   sB   t j ƒ }t j|ƒ\	}}}}}}}}	}
d|| j| ||||f }|S )Nz%02d/%3s/%04d %02d:%02d:%02d)rs   Z	localtimeÚ	monthname)r   ZnowZyearZmonthZdayZhhZmmZssÚxÚyÚzÚsr   r   r   ro   O  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   rn   ]  s    z%BaseHTTPRequestHandler.address_stringzHTTP/1.0c             C   s   i | ]}|j |jf|“qS r   )ÚphraseZdescription)Ú.0Úvr   r   r   ú
<dictcomp>l  s   z!BaseHTTPRequestHandler.<dictcomp>)NN)N)N)rf   rf   )N)*r   r   r   rl   r9   r'   rr   Ú__version__rq   ÚDEFAULT_ERROR_MESSAGErU   ÚDEFAULT_ERROR_CONTENT_TYPErY   r    r<   r8   rH   rI   r,   rS   r=   rT   r>   rc   r[   rE   rh   r\   r]   ro   Zweekdaynameru   rn   r-   r1   r2   ZHTTPMessager4   r   Ú__members__ÚvaluesrQ   r   r   r   r   r   Ž   s<   ig%
5



	c               @   sx   e Zd Zde Zdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Z	dd„ Z
dd„ ZejsVejƒ  ejjƒ Zejdddddœƒ dS )r   zSimpleHTTP/c          
   C   s.   | j ƒ }|r*z| j|| jƒ W d |jƒ  X d S )N)Ú	send_headÚcopyfilerC   r   )r   Úfr   r   r   Údo_GET�  s
    zSimpleHTTPRequestHandler.do_GETc             C   s   | j ƒ }|r|jƒ  d S )N)r„   r   )r   r†   r   r   r   Údo_HEADŠ  s    z SimpleHTTPRequestHandler.do_HEADc       	      C   sx  | j | jƒ}d }tjj|ƒrÄtjj| jƒ}|jjdƒsŒ| jt	j
ƒ |d |d |d d |d |d f}tjj|ƒ}| jd|ƒ | jƒ  d S x6dD ]$}tjj||ƒ}tjj|ƒr’|}P q’W | j|ƒS | j|ƒ}yt|d
ƒ}W n$ tk
�r    | jt	jdƒ d S X yZ| jt	jƒ | jd|ƒ tj|jƒ ƒ}| jdt|d ƒƒ | jd| j|jƒƒ | jƒ  |S    |jƒ  ‚ Y nX d S )Nr   r   r   r   r   é   ZLocationú
index.htmlú	index.htmÚrbzFile not foundzContent-typezContent-Lengthé   zLast-Modified)rŠ   r‹   )Útranslate_pathr.   ÚosÚisdirÚurllibÚparseZurlsplitÚendswithrS   r   ZMOVED_PERMANENTLYZ
urlunsplitrT   r>   re   ÚexistsÚlist_directoryÚ
guess_typeÚopenÚOSErrorr,   Ú	NOT_FOUNDÚOKÚfstatÚfilenor#   r]   Úst_mtimer   )	r   r.   r†   ÚpartsZ	new_partsZnew_urlÚindexZctypeZfsr   r   r   r„   �  sF    


z"SimpleHTTPRequestHandler.send_headc             C   sØ  yt j|ƒ}W n" tk
r0   | j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jƒ }d	| }|jd
ƒ |jdƒ |jd| ƒ |jd| ƒ |jd| ƒ |jdƒ x~|D ]v}t j
j||ƒ}| }	}
t j
j|ƒ�r"|d }	|d }
t j
j|ƒ�r8|d }	|jdtjj|
dd�tj|	dd�f ƒ qêW |jdƒ dj|ƒj|dƒ}tjƒ }|j|ƒ |jdƒ | jtjƒ | jdd| ƒ | jdtt|ƒƒƒ | jƒ  |S )NzNo permission to list directoryc             S   s   | j ƒ S )N)r7   )Úar   r   r   Ú<lambda>Ð  s    z9SimpleHTTPRequestHandler.list_directory.<locals>.<lambda>)ÚkeyÚsurrogatepass)ÚerrorsF)rL   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’   Úunquoter.   ÚUnicodeDecodeErrorrV   rW   rl   Úgetfilesystemencodingr`   re   r�   ÚislinkrL   rX   ÚioÚBytesIOrZ   ÚseekrS   rš   rT   r#   r(   r>   )r   r.   ÚlistÚrZdisplaypathÚencÚtitleÚnameÚfullnameZdisplaynameZlinknameZencodedr†   r   r   r   r•   Á  s\    







z'SimpleHTTPRequestHandler.list_directoryc             C   sÔ   |j ddƒd }|j ddƒd }|jƒ jdƒ}ytjj|dd�}W n  tk
rb   tjj|ƒ}Y nX tj|ƒ}|j dƒ}t	d |ƒ}t
jƒ }x8|D ]0}t
jj|ƒs�|t
jt
jfkr²q�t
jj||ƒ}q�W |rÐ|d7 }|S )Nú?r   r   ú#r   r£   )r¤   )r'   r%   r“   r‘   r’   rª   r«   Ú	posixpathÚnormpathÚfilterr�   Úgetcwdr.   ÚdirnameÚcurdirÚpardirre   )r   r.   Ztrailing_slashr:   Zwordr   r   r   rŽ   û  s$    	



z'SimpleHTTPRequestHandler.translate_pathc             C   s   t j||ƒ d S )N)ÚshutilZcopyfileobj)r   ÚsourceZ
outputfiler   r   r   r…     s    z!SimpleHTTPRequestHandler.copyfilec             C   sL   t j|ƒ\}}|| jkr"| j| S |jƒ }|| jkr>| j| S | jd S d S )Nr   )r¹   ÚsplitextÚextensions_mapr7   )r   r.   ÚbaseZextr   r   r   r–   )  s    



z#SimpleHTTPRequestHandler.guess_typezapplication/octet-streamz
text/plain)r   z.pyz.cz.hN)r   r   r   r   rq   r‡   rˆ   r„   r•   rŽ   r…   r–   Ú	mimetypesZinitedZinitZ	types_mapÚcopyrÃ   Úupdater   r   r   r   r   r  s    	1:
c       	      C   sÒ   | j dƒ\} }}tjj| ƒ} | jdƒ}g }x<|d d… D ],}|dkrN|jƒ  q8|r8|dkr8|j|ƒ q8W |rœ|jƒ }|r |dkrŽ|jƒ  d}q |dkr d}nd}|r²dj||fƒ}ddj|ƒ |f}dj|ƒ}|S )Nr·   r   r   z..r   r   éÿÿÿÿ)Ú	partitionr‘   r’   rª   r'   Úpopr`   re   )	r.   Ú_ÚqueryÚ
path_partsZ
head_partsÚpartZ	tail_partZ	splitpathÚcollapsed_pathr   r   r   Ú_url_collapse_pathN  s.    


rÐ   c              C   sp   t rt S ydd l} W n tk
r(   dS X y| jdƒd a W n. tk
rj   dtdd„ | jƒ D ƒƒ a Y nX t S )Nr   r   Únobodyr   c             s   s   | ]}|d  V  qdS )r   Nr   )r|   rv   r   r   r   ú	<genexpr>Œ  s    znobody_uid.<locals>.<genexpr>rÈ   )rÑ   ÚpwdÚImportErrorÚgetpwnamrR   ÚmaxZgetpwall)rÓ   r   r   r   Ú
nobody_uid€  s     r×   c             C   s   t j| t jƒS )N)r�   ÚaccessÚX_OK)r.   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$   | j ƒ r| jƒ  n| jtjdƒ d S )NzCan only POST to CGI scripts)Úis_cgiÚrun_cgir,   r   rA   )r   r   r   r   Údo_POST¦  s
    
zCGIHTTPRequestHandler.do_POSTc             C   s   | j ƒ r| jƒ S tj| ƒS d S )N)rÜ   rÝ   r   r„   )r   r   r   r   r„   ´  s    zCGIHTTPRequestHandler.send_headc             C   sP   t | jƒ}|jddƒ}|d |… ||d d …  }}|| jkrL||f| _dS dS )Nr   r   TF)rÐ   r.   Ú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   r.   r   r   r   Úis_executableÕ  s    z#CGIHTTPRequestHandler.is_executablec             C   s   t jj|ƒ\}}|jƒ dkS )Nú.pyú.pyw)rå   ræ   )r�   r.   rÂ   r7   )r   r.   râ   rã   r   r   r   Ú	is_pythonÙ  s    zCGIHTTPRequestHandler.is_pythonc       )      C   s¸  | j \}}|d | }|jdt|ƒd ƒ}x`|dkrŠ|d |… }||d d … }| j|ƒ}tjj|ƒr†|| }}|jdt|ƒd ƒ}q,P q,W |jdƒ\}}}	|jdƒ}|dkrÊ|d |… ||d …  }
}n
|d }
}|d |
 }| j|ƒ}tjj|ƒ�s| j	t
jd| ƒ d S tjj|ƒ�s2| j	t
jd| ƒ d S | j|ƒ}| j�sL| �rn| j|ƒ�sn| j	t
jd| ƒ d S tjtjƒ}| jƒ |d	< | jj|d
< d|d< | j|d< t| jjƒ|d< | j|d< tjj|ƒ}||d< | j|ƒ|d< ||d< |	�rö|	|d< | jd |d< | jj dƒ}|�r¾|j!ƒ }t|ƒdk�r¾dd l"}dd l#}|d |d< |d j$ƒ dk�r¾y"|d j%dƒ}|j&|ƒj'dƒ}W n |j(t)fk
�r˜   Y n&X |j!dƒ}t|ƒdk�r¾|d |d< | jj dƒd k�rà| jj*ƒ |d< n| jd |d< | jj dƒ}|�r||d< | jj d ƒ}|�r"||d!< g }xN| jj+d"ƒD ]>}|d d… d#k�rZ|j,|j-ƒ ƒ n||d$d … j!d%ƒ }�q4W d%j.|ƒ|d&< | jj d'ƒ}|�rž||d(< t/d | jj0d)g ƒƒ}d*j.|ƒ}|�rÊ||d+< xd<D ]}|j1|dƒ �qÐW | j2t
j3d-ƒ | j4ƒ  |	j5d.d/ƒ}| j�r.|
g}d0|k�r*|j,|ƒ t6ƒ }| j7j8ƒ  tj9ƒ }|dk�r¤tj:|dƒ\}}x0t;j;| j<gg g dƒd �rŒ| j<j=dƒ�s^P �q^W |�r | j>d1|ƒ d S y\ytj?|ƒ W n t@k
�rÊ   Y nX tjA| j<jBƒ dƒ tjA| j7jBƒ dƒ tjC|||ƒ W n(   | jjD| jE| jƒ tjFd2ƒ Y nX �n†dd lG} |g}!| j|ƒ�r‚tHjI}"|"j$ƒ jJd3ƒ�rv|"d d=… |"d>d …  }"|"d6g|! }!d0|	k�r–|!j,|	ƒ | jKd7| jL|!ƒƒ ytM|ƒ}#W n tNtOfk
�rÒ   d}#Y nX | jP|!| jQ| jQ| jQ|d8�}$| jj$ƒ d9k�r|#dk�r| j<j=|#ƒ}%nd }%x4t;j;| j<jRgg g dƒd �rN| j<jRjSdƒ�sP �qW |$jT|%ƒ\}&}'| j7jU|&ƒ |'�r|| j>d:|'ƒ |$jVjWƒ  |$jXjWƒ  |$jY}(|(�rª| j>d1|(ƒ n
| jKd;ƒ 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ÚREMOTE_HOSTzScript output followsú+rp   ú=zCGI script exit status %#xé   zw.exer   r‰   z-uzcommand: %s)ÚstdinÚstdoutrm   ÚenvZpostz%szCGI script exited OK)rè   rô   rì   rò   ró   rî   éûÿÿÿéüÿÿÿ)Zrá   rß   r(   rŽ   r�   r.   r�   rÉ   r”   r,   r   r™   ÚisfileZ	FORBIDDENrç   Ú	have_forkrä   rÆ   ÚdeepcopyÚenvironr\   Zserverr   r-   r#   r   r   r‘   r’   rª   rz   r5   r6   r'   Úbase64Úbinasciir7   rX   ZdecodebytesÚdecodeÚErrorÚUnicodeErrorZget_content_typeZgetallmatchingheadersr`   Ústripre   r»   Zget_allÚ
setdefaultrS   rš   rc   rP   r×   rC   rD   rÛ   ÚwaitpidÚselectr3   ÚreadrE   Úsetuidr˜   Údup2rœ   ÚexecveZhandle_errorZrequestÚ_exitÚ
subprocessrl   rÚ   r“   rh   Zlist2cmdliner*   Ú	TypeErrorr)   ÚPopenÚPIPEZ_sockZrecvZcommunicaterZ   rm   r   rù   Ú
returncode))r   ÚdirÚrestr.   ÚiZnextdirZnextrestZ	scriptdirrË   rÌ   ZscriptZ
scriptnameZ
scriptfileZispyrú   Zuqrestré   r  r  Zlengthrí   rï   ÚlineZuaÚcoZ
cookie_strÚkZdecoded_queryrk   rÑ   ÚpidÚstsr  ZcmdlineZinterpÚnbytesÚpÚdatarù   rm   Zstatusr   r   r   rÝ   Þ  s4   

























zCGIHTTPRequestHandler.run_cgiN)r   r   r   r@   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jƒ }d}t|j|d |d d�ƒ y|jƒ  W n& tk
rt   tdƒ tj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.)	r-   r   ZgetsocknameÚprintrj   Zserve_foreverÚKeyboardInterruptrl   Úexit)	ÚHandlerClassZServerClassZprotocolr   Úbindr   ZhttpdZsaZserve_messager   r   r   Útestž  s    
r$  Ú__main__z--cgiÚ
store_truezRun as CGI Server)ÚactionÚhelpz--bindz-bZADDRESSz8Specify alternate bind address [default: all interfaces])ÚdefaultÚmetavarr(  r   Zstorer·   z&Specify alternate port [default: 8000])r'  r)  ÚtypeÚnargsr(  )r"  r   r#  ).r   Ú__all__Zemail.utilsrt   rV   Zhttp.clientr1   r®   rÅ   r�   r¹   r	  rÀ   r   r	   rl   rs   Zurllib.parser‘   rÆ   Úargparser   r€   r�   r
   r   ZStreamRequestHandlerr   r   rÐ   rÑ   r×   rÚ   r   r$  r   ÚArgumentParserÚparserÚadd_argumentr*   Ú
parse_argsrk   ZcgiZhandler_classr   r#  r   r   r   r   Ú<module>S   sh      g ]0  
