£Á°èZ¨Ä…–K§‚«“ô4“ÒÙ´dîfUÙÃÅ WKbyÊ¦•êŽ…È®FÒ¿ÊÎóCozá¬S@6{Í:›œêZÌ:Š•_%:¢¾¾~;‘Ã~èŠ©ÊÇí`ÔÑ©úë™µ'5I¿fš×WO%ø9¾«¾DK|€ùÍD”Ýs]nHÕ¶ê×Ó¼ãžªéUWŸÈË%DÒÕ¬ï‘]/Åcx  ‰ï2ß]ä6G[]S£ÔÏ¯rs{úëóµmÒï#UQxo·õÞCe]"±/aÙ&Eã4ú9Jé_ÞåëdãöKë)AÞ                  ¯¹ægƒÛowÐø^d™ý½ßB7áyMä9ÜÖUã
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
<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rd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re&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rtt|d t|d
 f}W n* ttfk
r   | tjd|  dS X |dkr| jdkrd| _|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rd| _|dkr| tjd|  dS || | _ | _| j
drd	| 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rd| _| jdd}
|
 dkr| jdkr| jdkr|   sd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|rt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 qW | |S | |}yt|d	}W n$ tk
r    | t	jd
 d S X yt| }d| jkrd| jkry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rt"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  qW |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rqtj||}qW |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rd}nd}|rd||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rdd l"}dd l#}|d |d< |d $ dkry"|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 qW | 2t
j3d- | 4  |	5d.d/}| jr,|
g}d0|kr(|,| t6 }| j78  t9 }|dkrt:|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| j7B d tC||| W n(   | jD| jE| j tFd2 Y nX ndd lG} |g}!| |rtHjI}"|"$ 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<jRSdsP qW |$T|%\}&}'| j7U|& |'rz| >d:|' |$jVW  |$jXW  |$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.exez-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  

