3 Õì2a«ã@s”dZddddgZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlZddlZddlmZdZd ZGd d„dejƒZGd d„dejƒZGd d„deƒZd d„Zdadd„Zdd„Z Gdd„deƒZ!eedddfdd„Z"e#dk�r�ej$ƒZ%e%j&dddd�e%j&dddd d!d"�e%j&d#d$de'd%d&d'�e%j(ƒZ)e)j*�rze!Z+neZ+e"e+e)j,e)j-d(�dS))z0.6Ú HTTPServerÚBaseHTTPRequestHandlerÚSimpleHTTPRequestHandlerÚCGIHTTPRequestHandleréN)Ú HTTPStatusa¹ Error response

Error response

Error code: %(code)d

Message: %(message)s.

Error code explanation: %(code)s - %(explain)s.

ztext/html;charset=utf-8c@seZdZdZdd„ZdS)récCs4tjj|ƒ|jdd…\}}tj|ƒ|_||_dS)Né)Ú socketserverÚ TCPServerÚ server_bindÚserver_addressÚsocketZgetfqdnÚ server_nameÚ server_port)ÚselfÚhostÚport©rú+/opt/alt/python36/lib64/python3.6/server.pyr †s  zHTTPServer.server_bindN)Ú__name__Ú __module__Ú __qualname__Zallow_reuse_addressr rrrrr‚sc @seZdZdejjƒdZdeZe Z e Z dZ dd„Zdd„Zd d „Zd d „Zd?dd„Zd@dd„ZdAdd„Zdd„Zdd„Zdd„ZdBdd„Zdd„Zdd „Zd!d"„ZdCd#d$„Zd%d&„Zd'd(d)d*d+d,d-gZd d.d/d0d1d2d3d4d5d6d7d8d9g Zd:d;„Z d„e&j'j(ƒDƒZ)d S)DrzPython/rz BaseHTTP/zHTTP/0.9c Cs d|_|j|_}d|_t|jdƒ}|jdƒ}||_|jƒ}t |ƒdk�r|\}}}yZ|dd…dkrjt ‚|jddƒd}|jd ƒ}t |ƒd kr”t ‚t |d ƒt |dƒf}Wn*t t fk rØ|j tjd |ƒd SX|dkrò|jdkròd |_|dk�rr|j tjd|ƒd Sn^t |ƒd k�rR|\}}d|_|dk�rr|j tjd|ƒd Sn |�s\d S|j tjd|ƒd S||||_|_|_ytjj|j|jd�|_Wnrtjjk �rÜ}z|j tjdt|ƒƒd Sd}~Xn:tjjk �r}z|j tjdt|ƒƒd Sd}~XnX|jjddƒ} | jƒdk�r:d|_n | jƒdk�rZ|jdk�rZd |_|jjddƒ} | jƒdk�rœ|jdk�rœ|jdk�rœ|jƒ�sœd SdS)NTz iso-8859-1z éézHTTP/ú/rÚ.rrzBad request version (%r)FzHTTP/1.1zInvalid HTTP version (%s)ZGETzBad HTTP/0.9 request type (%r)zBad request syntax (%r))Z_classz Line too longzToo many headersÚ ConnectionÚÚclosez keep-aliveZExpectz 100-continue)rr)rr)ÚcommandÚdefault_request_versionÚrequest_versionÚclose_connectionÚstrÚraw_requestlineÚrstripÚ requestlineÚsplitÚlenÚ ValueErrorÚintÚ IndexErrorÚ send_errorrZ BAD_REQUESTÚprotocol_versionZHTTP_VERSION_NOT_SUPPORTEDÚpathÚhttpÚclientZ parse_headersÚrfileÚ MessageClassÚheadersZ LineTooLongZREQUEST_HEADER_FIELDS_TOO_LARGEZ HTTPExceptionÚgetÚlowerÚhandle_expect_100) rÚversionr&Úwordsrr.Zbase_version_numberZversion_numberÚerrZconntypeÚexpectrrrÚ parse_requests�                    z$BaseHTTPRequestHandler.parse_requestcCs|jtjƒ|jƒdS)NT)Úsend_response_onlyrZCONTINUEÚ end_headers)rrrrr6gs z(BaseHTTPRequestHandler.handle_expect_100cCsÞy¤|jjdƒ|_t|jƒdkr@d|_d|_d|_|jtj ƒdS|jsPd|_ dS|j ƒs\dSd|j}t ||ƒsˆ|jtj d|jƒdSt||ƒ}|ƒ|jjƒWn4tjk rØ}z|jd|ƒd|_ dSd}~XnXdS)NiirTZdo_zUnsupported method (%r)zRequest timed out: %r)r1Úreadliner$r(r&r!rr,rZREQUEST_URI_TOO_LONGr"r;ÚhasattrÚNOT_IMPLEMENTEDÚgetattrÚwfileÚflushr ZtimeoutÚ log_error)rZmnameÚmethodÚerrrÚhandle_one_requestys4      z)BaseHTTPRequestHandler.handle_one_requestcCs&d|_|jƒx|js |jƒqWdS)NT)r"rG)rrrrÚhandležszBaseHTTPRequestHandler.handleNcCs y|j|\}}Wntk r.d\}}YnX|dkr<|}|dkrH|}|jd||ƒ|j||ƒ|jddƒd}|dkrâ|tjtjtjfkrâ|j |t j |dd�t j |dd�dœ}|j d d ƒ}|jd |j ƒ|jd tt|ƒƒƒ|jƒ|jd koö|�r|jj|ƒdS)Nú???zcode %d, message %srréÈF)Úquote)ÚcodeÚmessageÚexplainzUTF-8Úreplacez Content-TypezContent-LengthZHEAD)rIrI)Ú responsesÚKeyErrorrDÚ send_responseÚ send_headerrZ NO_CONTENTZ RESET_CONTENTZ NOT_MODIFIEDÚerror_message_formatÚhtmlÚescapeÚencodeÚerror_content_typer#r(r=rrBÚwrite)rrLrMrNZshortmsgZlongmsgZbodyZcontentrrrr,¦s4     z!BaseHTTPRequestHandler.send_errorcCs:|j|ƒ|j||ƒ|jd|jƒƒ|jd|jƒƒdS)NZServerZDate)Ú log_requestr<rSÚversion_stringÚdate_time_string)rrLrMrrrrRÛs  z$BaseHTTPRequestHandler.send_responsecCsd|jdkr`|dkr0||jkr,|j|d}nd}t|dƒs@g|_|jjd|j||fjddƒƒdS)NzHTTP/0.9rrÚ_headers_bufferz %s %d %s zlatin-1Ústrict)r!rPr?r]Úappendr-rW)rrLrMrrrr<ès   z)BaseHTTPRequestHandler.send_response_onlycCsl|jdkr6t|dƒsg|_|jjd||fjddƒƒ|jƒdkrh|jƒdkrVd|_n|jƒd krhd |_dS) NzHTTP/0.9r]z%s: %s zlatin-1r^Z connectionrTz keep-aliveF)r!r?r]r_rWr5r")rÚkeywordÚvaluerrrrSös     z"BaseHTTPRequestHandler.send_headercCs"|jdkr|jjdƒ|jƒdS)NzHTTP/0.9s )r!r]r_Ú flush_headers)rrrrr=s  z"BaseHTTPRequestHandler.end_headerscCs(t|dƒr$|jjdj|jƒƒg|_dS)Nr]ó)r?rBrYÚjoinr])rrrrrb s z$BaseHTTPRequestHandler.flush_headersú-cCs.t|tƒr|j}|jd|jt|ƒt|ƒƒdS)Nz "%s" %s %s)Ú isinstancerraÚ log_messager&r#)rrLÚsizerrrrZs z"BaseHTTPRequestHandler.log_requestcGs|j|f|žŽdS)N)rg)rÚformatÚargsrrrrDs z BaseHTTPRequestHandler.log_errorcGs&tjjd|jƒ|jƒ||fƒdS)Nz%s - - [%s] %s )ÚsysÚstderrrYÚaddress_stringÚlog_date_time_string)rrirjrrrrg(sz"BaseHTTPRequestHandler.log_messagecCs|jd|jS)Nú )Úserver_versionÚ sys_version)rrrrr[>sz%BaseHTTPRequestHandler.version_stringcCs |dkrtjƒ}tjj|dd�S)NT)Zusegmt)ÚtimeÚemailZutilsZ formatdate)rZ timestamprrrr\Bsz'BaseHTTPRequestHandler.date_time_stringc CsBtjƒ}tj|ƒ\ }}}}}}}} } d||j|||||f} | S)Nz%02d/%3s/%04d %02d:%02d:%02d)rrZ localtimeÚ monthname) rZnowZyearZmonthZdayZhhZmmÚssÚxÚyÚzÚsrrrrnHs z+BaseHTTPRequestHandler.log_date_time_stringZMonZTueZWedZThuZFriZSatZSunZJanZFebZMarZAprZMayZJunZJulZAugZSepZOctZNovZDeccCs |jdS)Nr)Úclient_address)rrrrrmVsz%BaseHTTPRequestHandler.address_stringzHTTP/1.0cCsi|]}|j|jf|“qSr)ÚphraseÚ description)Ú.0Úvrrrú esz!BaseHTTPRequestHandler.)NN)N)N)rere)N)*rrrrkr7r'rqÚ __version__rpÚDEFAULT_ERROR_MESSAGErTÚDEFAULT_ERROR_CONTENT_TYPErXr r;r6rGrHr,rRr<rSr=rbrZrDrgr[r\rnZ weekdaynamertrmr-r/r0Z HTTPMessager2rÚ __members__ÚvaluesrPrrrrrŽs<i`% 5     c@sxeZdZdeZdd„Zdd„Zdd„Zdd „Zd d „Z d d „Z dd„Z e j sVe jƒe jjƒZejdddddœƒdS)rz SimpleHTTP/c Cs.|jƒ}|r*z|j||jƒWd|jƒXdS)N)Ú send_headÚcopyfilerBr)rÚfrrrÚdo_GETzs zSimpleHTTPRequestHandler.do_GETcCs|jƒ}|r|jƒdS)N)r…r)rr‡rrrÚdo_HEADƒsz SimpleHTTPRequestHandler.do_HEADc Csx|j|jƒ}d}tjj|ƒrÄtjj|jƒ}|jjdƒsŒ|jt j ƒ|d|d|dd|d|df}tjj |ƒ}|j d|ƒ|j ƒdSx6dD]$}tjj||ƒ}tjj|ƒr’|}Pq’W|j|ƒS|j|ƒ}yt|d ƒ}Wn$tk �r|jt jd ƒdSXyZ|jt jƒ|j d |ƒtj|jƒƒ}|j d t|dƒƒ|j d|j|jƒƒ|j ƒ|S|jƒ‚YnXdS)NrrrrréZLocationú index.htmlú index.htmÚrbzFile not foundz Content-typezContent-Lengthéz Last-Modified)r‹rŒ)Útranslate_pathr.ÚosÚisdirÚurllibÚparseZurlsplitÚendswithrRrZMOVED_PERMANENTLYZ urlunsplitrSr=rdÚexistsÚlist_directoryÚ guess_typeÚopenÚOSErrorr,Ú NOT_FOUNDÚOKÚfstatÚfilenor#r\Úst_mtimer) rr.r‡ÚpartsZ new_partsZnew_urlÚindexZctypeZfsrrrr…‰sF            z"SimpleHTTPRequestHandler.send_headc CsØytj|ƒ}Wn"tk r0|jtjdƒdSX|jdd„d�g}ytjj |j dd�}Wn t k r|tjj |ƒ}YnXt j |dd�}tjƒ}d |}|jd ƒ|jd ƒ|jd |ƒ|jd |ƒ|jd|ƒ|jdƒx~|D]v}tj j||ƒ}|} } tj j|ƒ�r"|d} |d} tj j|ƒ�r8|d} |jdtjj| dd�t j | dd�fƒqêW|jdƒdj|ƒj|dƒ} tjƒ} | j| ƒ| jdƒ|jtjƒ|jdd|ƒ|jdtt| ƒƒƒ|jƒ| S)NzNo permission to list directorycSs|jƒS)N)r5)ÚarrrÚÉsz9SimpleHTTPRequestHandler.list_directory..)ÚkeyÚ surrogatepass)ÚerrorsF)rKzDirectory listing for %szZz z@z%s z

%s

z
    rú@z
  • %s
  • z

Ú Úsurrogateescaperz Content-typeztext/html; charset=%szContent-Length) r�Úlistdirr™r,rršÚsortr’r“Úunquoter.ÚUnicodeDecodeErrorrUrVrkÚgetfilesystemencodingr_rdr‘ÚislinkrKrWÚioÚBytesIOrYÚseekrRr›rSr#r(r=) rr.ÚlistÚrZ displaypathÚencÚtitleÚnameÚfullnameZ displaynameZlinknameZencodedr‡rrrr–ºs\          z'SimpleHTTPRequestHandler.list_directoryc CsÔ|jddƒd}|jddƒd}|jƒjdƒ}ytjj|dd�}Wn tk rbtjj|ƒ}YnXtj|ƒ}|jdƒ}t d|ƒ}t j ƒ}x8|D]0}t j j |ƒs�|t jt jfkr²q�t j j||ƒ}q�W|rÐ|d7}|S)Nú?rrú#rr¤)r¥)r'r%r”r’r“r«r¬Ú posixpathÚnormpathÚfilterr�Úgetcwdr.ÚdirnameÚcurdirÚpardirrd)rr.Ztrailing_slashr8Zwordrrrr�ôs$     z'SimpleHTTPRequestHandler.translate_pathcCstj||ƒdS)N)ÚshutilZ copyfileobj)rÚsourceZ outputfilerrrr†sz!SimpleHTTPRequestHandler.copyfilecCsLtj|ƒ\}}||jkr"|j|S|jƒ}||jkr>|j|S|jdSdS)Nr)rºÚsplitextÚextensions_mapr5)rr.ÚbaseZextrrrr—"s    z#SimpleHTTPRequestHandler.guess_typezapplication/octet-streamz text/plain)rz.pyz.cz.hN)rrrr€rprˆr‰r…r–r�r†r—Ú mimetypesZinitedZinitZ types_mapÚcopyrÄÚupdaterrrrrks   1: c CsÒ|jdƒ\}}}tjj|ƒ}|jdƒ}g}x<|dd…D],}|dkrN|jƒq8|r8|dkr8|j|ƒq8W|rœ|jƒ}|r |dkrŽ|jƒd}q |dkr d}nd}|r²dj||fƒ}ddj|ƒ|f}dj|ƒ}|S)Nr¸rrz..rréÿÿÿÿ)Ú partitionr’r“r«r'Úpopr_rd) r.Ú_ÚqueryÚ path_partsZ head_partsÚpartZ tail_partZ splitpathÚcollapsed_pathrrrÚ_url_collapse_pathGs.     rÑcCsptrtSy ddl}Wntk r(dSXy|jdƒdaWn.tk rjdtdd„|jƒDƒƒaYnXtS)NrrÚnobodyrcss|]}|dVqdS)rNr)r}rvrrrú …sznobody_uid..rÉ)rÒÚpwdÚ ImportErrorÚgetpwnamrQÚmaxZgetpwall)rÔrrrÚ nobody_uidys  rØcCstj|tjƒS)N)r�ÚaccessÚX_OK)r.rrrÚ executable‰srÛc@sReZdZeedƒZdZdd„Zdd„Zdd„Z d d gZ d d „Z d d„Z dd„Z dS)rÚforkrcCs$|jƒr|jƒn|jtjdƒdS)NzCan only POST to CGI scripts)Úis_cgiÚrun_cgir,rr@)rrrrÚdo_POSTŸs  zCGIHTTPRequestHandler.do_POSTcCs|jƒr|jƒStj|ƒSdS)N)rÝrÞrr…)rrrrr…­szCGIHTTPRequestHandler.send_headcCsPt|jƒ}|jddƒ}|d|…||dd…}}||jkrL||f|_dSdS)NrrTF)rÑr.ÚfindÚcgi_directoriesÚcgi_info)rrÐZdir_sepÚheadÚtailrrrrÝ´s    zCGIHTTPRequestHandler.is_cgiz/cgi-binz/htbincCst|ƒS)N)rÛ)rr.rrrÚ is_executableÎsz#CGIHTTPRequestHandler.is_executablecCstjj|ƒ\}}|jƒdkS)Nú.pyú.pyw)rærç)r�r.rÃr5)rr.rãrärrrÚ is_pythonÒszCGIHTTPRequestHandler.is_pythonc)Cs¸|j\}}|d|}|jdt|ƒdƒ}x`|dkrŠ|d|…}||dd…}|j|ƒ}tjj|ƒr†||}}|jdt|ƒdƒ}q,Pq,W|jdƒ\}}} |jdƒ}|dkrÊ|d|…||d…} }n |d} }|d| } |j| ƒ} tjj| ƒ�s|j t j d| ƒdStjj | ƒ�s2|j t j d| ƒdS|j| ƒ} |j�sL| �rn|j| ƒ�sn|j t j d| ƒdStjtjƒ}|jƒ|d <|jj|d <d |d <|j|d <t|jjƒ|d<|j|d<tjj|ƒ}||d<|j|ƒ|d<| |d<| �rö| |d<|jd|d<|jj dƒ}|�r¾|j!ƒ}t|ƒdk�r¾ddl"}ddl#}|d|d<|dj$ƒdk�r¾y"|dj%dƒ}|j&|ƒj'dƒ}Wn|j(t)fk �r˜Yn&X|j!dƒ}t|ƒdk�r¾|d|d<|jj dƒdk�rà|jj*ƒ|d<n|jd|d<|jj dƒ}|�r||d<|jj d ƒ}|�r"||d!<g}xN|jj+d"ƒD]>}|dd…d#k�rZ|j,|j-ƒƒn||d$d…j!d%ƒ}�q4Wd%j.|ƒ|d&<|jj d'ƒ}|�rž||d(<t/d|jj0d)gƒƒ}d*j.|ƒ}|�rÊ||d+<xdd1|ƒdSy\ytj?|ƒWnt@k �rÊYnXtjA|jd…}"|"d6g|!}!d0| k�r–|!j,| ƒ|jKd7| jL|!ƒƒy tM|ƒ}#WntNtOfk �rÒd}#YnX| jP|!| jQ| jQ| jQ|d8�}$|jj$ƒd9k�r|#dk�r|jd:|'ƒ|$jVjWƒ|$jXjWƒ|$jY}(|(�rª|j>d1|(ƒn |jKd;ƒdS)?Nrrrr¸rzNo such CGI script (%r)z#CGI script is not a plain file (%r)z!CGI script is not executable (%r)ZSERVER_SOFTWAREZ SERVER_NAMEzCGI/1.1ZGATEWAY_INTERFACEZSERVER_PROTOCOLZ SERVER_PORTZREQUEST_METHODZ PATH_INFOZPATH_TRANSLATEDZ SCRIPT_NAMEÚ QUERY_STRINGZ REMOTE_ADDRÚ authorizationrZ AUTH_TYPEZbasicÚasciiú:Z REMOTE_USERz content-typeZ CONTENT_TYPEzcontent-lengthÚCONTENT_LENGTHÚrefererÚ HTTP_REFERERÚacceptz éú,Z HTTP_ACCEPTz user-agentÚHTTP_USER_AGENTZcookiez, Ú HTTP_COOKIEÚ REMOTE_HOSTzScript output followsú+roú=zCGI script exit status %#xézw.exerrŠz-uz command: %s)ÚstdinÚstdoutrlÚenvZpostz%szCGI script exited OK)rérõrírórôrïéûÿÿÿéüÿÿÿ)Zrâràr(r�r�r.r‘rÊr•r,rršÚisfileZ FORBIDDENrèÚ have_forkrårÇÚdeepcopyÚenvironr[Zserverrr-r#rrr’r“r«rzr3r4r'Úbase64Úbinasciir5rWZ decodebytesÚdecodeÚErrorÚ UnicodeErrorZget_content_typeZgetallmatchingheadersr_Ústriprdr¼Zget_allÚ setdefaultrRr›rbrOrØrBrCrÜÚwaitpidÚselectr1ÚreadrDÚsetuidr™Údup2r�ÚexecveZ handle_errorZrequestÚ_exitÚ subprocessrkrÛr”rgZ list2cmdliner*Ú TypeErrorr)ÚPopenÚPIPEZ_sockZrecvZ communicaterYrlrrúÚ returncode))rÚdirÚrestr.ÚiZnextdirZnextrestZ scriptdirrÌrÍZscriptZ scriptnameZ scriptfileZispyrûZuqrestrêrrZlengthrîrðÚlineZuaÚcoZ cookie_strÚkZ decoded_queryrjrÒÚpidÚstsrZcmdlineZinterpÚnbytesÚpÚdatarúrlÚstatusrrrrÞ×s4                                                zCGIHTTPRequestHandler.run_cgiN)rrrr?r�rÿZrbufsizerßr…rÝrárårèrÞrrrrrŽs zHTTP/1.0i@rc Cs„||f}||_|||ƒ�b}|jjƒ}d}t|j|d|dd�ƒy |jƒWn&tk rttdƒtjdƒYnXWdQRXdS)Nz>Serving HTTP on {host} port {port} (http://{host}:{port}/) ...rr)rrz& Keyboard interrupt received, exiting.) r-r Z getsocknameÚprintriZ serve_foreverÚKeyboardInterruptrkÚexit) Ú HandlerClassZ ServerClassZprotocolrÚbindr ZhttpdZsaZ serve_messagerrrÚtest—s   r&Ú__main__z--cgiÚ store_truezRun as CGI Server)ÚactionÚhelpz--bindz-bZADDRESSz8Specify alternate bind address [default: all interfaces])ÚdefaultÚmetavarr*rÚstorer¸z&Specify alternate port [default: 8000])r)r+ÚtypeÚnargsr*)r$rr%).r€Ú__all__Z email.utilsrsrUZ http.clientr/r¯rÆr�rºr rÁr r rkrrZ urllib.parser’rÇÚargparserr�r‚r rZStreamRequestHandlerrrrÑrÒrØrÛrr&rÚArgumentParserÚparserÚ add_argumentr*Ú parse_argsrjZcgiZ handler_classrr%rrrrÚSsh  `]0