B /\F*…KÉgã@sædZdddddgZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlZddlZddlZddlmZdd lmZd Zd ZGd d„dejƒZGd d„dejeƒZGdd„dejƒZ Gdd„de ƒZ!dd„Z"da#dd„Z$dd„Z%Gdd„de!ƒZ&e edddfdd„Z'e(dkrâddl)Z)e) *¡Z+e+j,dddd e+j,d!d"dd#d$d%e+j,d&d'e  -¡d(d)e+j,d*d+de.d,d-d.e+ /¡Z0e0j1rÂe&Z2nee!e0j3d/Z2e'e2e0j4e0j5d0dS)1z0.6Ú HTTPServerÚThreadingHTTPServerÚBaseHTTPRequestHandlerÚSimpleHTTPRequestHandlerÚCGIHTTPRequestHandleréN)Úpartial)Ú 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écCs4tj |¡|jdd…\}}t |¡|_||_dS)Né)Ú socketserverÚ TCPServerÚ server_bindÚserver_addressÚsocketZgetfqdnÚ server_nameÚ server_port)ÚselfÚhostÚport©rú./opt/alt/python37/lib/python3.7/http/server.pyr ˆs  zHTTPServer.server_bindN)Ú__name__Ú __module__Ú __qualname__Zallow_reuse_addressr rrrrr„sc@seZdZdZdS)rTN)rrrZdaemon_threadsrrrrrsc @sFeZdZdej ¡dZdeZe Z e Z dZ dd„Zdd„Zd d „Zd d „ZdEdd„ZdFdd„ZdGdd„Zdd„Zdd„Zdd„ZdHdd„Zdd„Ze dd „e ed!ƒed"d#ƒ¡Dƒ¡Zd$ee d%ƒ<d&d'„Z!d(d)„Z"dId*d+„Z#d,d-„Z$d.d/d0d1d2d3d4gZ%d d5d6d7d8d9d:d;dd?d@g Z&dAdB„Z'dCZ(e)j*j+Z,dDd „e-j. /¡DƒZ0d S)JrzPython/rz BaseHTTP/zHTTP/0.9c Csâd|_|j|_}d|_t|jdƒ}| d¡}||_| ¡}t |ƒdkrLdSt |ƒdkr |d}yT|  d¡srt ‚| d d ¡d }| d ¡}t |ƒd krœt ‚t |dƒt |d ƒf}Wn*t t fk rà| tjd |¡dSX|dkrú|jdkrúd|_|dkr| tjd|¡dS||_d t |ƒkr:sz!BaseHTTPRequestHandler.é éé z\\ú\cGs2||}tj d| ¡| ¡| |j¡f¡dS)Nz%s - - [%s] %s )ÚsysÚstderrr]Úaddress_stringÚlog_date_time_stringÚ translateÚ_control_char_table)rrmrnrPrrrrk=s z"BaseHTTPRequestHandler.log_messagecCs|jd|jS)Nú )Úserver_versionÚ sys_version)rrrrr_Wsz%BaseHTTPRequestHandler.version_stringcCs |dkrt ¡}tjj|ddS)NT)Zusegmt)ÚtimeÚemailÚutilsZ formatdate)rZ timestamprrrr`[sz'BaseHTTPRequestHandler.date_time_stringc CsBt ¡}t |¡\ }}}}}}}} } d||j|||||f} | S)Nz%02d/%3s/%04d %02d:%02d:%02d)rZ localtimeÚ monthname) rZnowZyearZmonthZdayZhhZmmÚssÚxÚyÚzÚsrrrryas z+BaseHTTPRequestHandler.log_date_time_stringZMonZTueZWedZThuZFriZSatZSunZJanZFebZMarZAprZMayZJunZJulZAugZSepZOctZNovZDeccCs |jdS)Nr)Úclient_address)rrrrrxosz%BaseHTTPRequestHandler.address_stringzHTTP/1.0cCsi|]}|j|jf|“qSr)ÚphraseÚ description)roÚvrrrrq~s)NN)N)N)riri)N)1rrrrvr;r)r~Ú __version__r}ÚDEFAULT_ERROR_MESSAGErXÚDEFAULT_ERROR_CONTENT_TYPEr\r"r?r:rKrLr/rUr@rVrArfr^rHr%Ú maketransÚ itertoolsÚchainÚranger{Úordrkr_r`ryZ weekdaynamer‚rxr0r3r4Z HTTPMessager6rÚ __members__ÚvaluesrSrrrrr”sBij% 5  "    csŽeZdZdeZddœ‡fdd„ Zdd„Zdd „Zd d „Zd d „Z dd„Z dd„Z dd„Z e jshe  ¡e j ¡Ze dddddœ¡‡ZS)rz SimpleHTTP/N)Ú directorycs(|dkrt ¡}||_tƒj||ŽdS)N)ÚosÚgetcwdr–ÚsuperÚ__init__)rr–rnÚkwargs)Ú __class__rrrš“sz!SimpleHTTPRequestHandler.__init__cCs.| ¡}|r*z| ||j¡Wd| ¡XdS)N)Ú send_headÚcopyfilerFr )rÚfrrrÚdo_GET™s zSimpleHTTPRequestHandler.do_GETcCs| ¡}|r| ¡dS)N)rr )rrŸrrrÚdo_HEAD¢sz SimpleHTTPRequestHandler.do_HEADc Cs>| |j¡}d}tj |¡rÄtj |j¡}|j d¡sŒ| t j ¡|d|d|dd|d|df}tj  |¡}|  d|¡|  ¡dSx6dD]$}tj ||¡}tj |¡r’|}Pq’W| |¡S| |¡}yt|d ƒ}Wn$tk r| t jd ¡dSXyt | ¡¡}d |jkrØd |jkrØytj |jd ¡} Wnttttfk r`YnxX| j dkr~| j!t"j#j$d } | j t"j#j$krØt"j" %|j&t"j#j$¡} | j!dd} | | krØ| t j'¡|  ¡| (¡dS| t j)¡|  d|¡|  dt*|dƒ¡|  d| +|j&¡¡|  ¡|S| (¡‚YnXdS)Nrrr r réZLocation)z index.htmlz index.htmÚrbzFile not foundzIf-Modified-Sincez If-None-Match)Útzinfo)Z microsecondz Content-typezContent-Lengthéz Last-Modified),Útranslate_pathr1r—ÚisdirÚurllibÚparseZurlsplitÚendswithrUrZMOVED_PERMANENTLYZ urlunsplitrVrArhÚexistsÚlist_directoryÚ guess_typeÚopenÚOSErrorr/Ú NOT_FOUNDÚfstatÚfilenor7r€rZparsedate_to_datetimeÚ TypeErrorr.Ú OverflowErrorr,r¤rRÚdatetimeZtimezoneZutcZ fromtimestampÚst_mtimerWr ÚOKr%r`) rr1rŸÚpartsZ new_partsZnew_urlÚindexZctypeZfsZimsZ last_modifrrrr¨sl                  z"SimpleHTTPRequestHandler.send_headc CsÚyt |¡}Wn"tk r0| tjd¡dSX|jdd„dg}ytjj |j dd}Wn"t k r~tj  |j ¡}YnXt j |dd}t ¡}d |}| d ¡| d ¡| d |¡| d |¡| d|¡| d¡x~|D]v}tj  ||¡}|} } tj  |¡r$|d} |d} tj  |¡r:|d} | dtjj| ddt j | ddf¡qìW| d¡d |¡ |d¡} t ¡} |  | ¡|  d¡| tj¡| dd|¡| dtt| ƒƒ¡| ¡| S)NzNo permission to list directorycSs| ¡S)N)r9)ÚarrrÚrgz9SimpleHTTPRequestHandler.list_directory..)ÚkeyÚ surrogatepass)ÚerrorsF)rNzDirectory 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©Úunquoter1ÚUnicodeDecodeErrorrYrZrvÚgetfilesystemencodingrcrhr§ÚislinkrNr[ÚioÚBytesIOr]ÚseekrUr·rVr%r*rA) rr1ÚlistÚrZ displaypathÚencÚtitleÚnameÚfullnameZ displaynameZlinknameZencodedrŸrrrr¬÷s\          z'SimpleHTTPRequestHandler.list_directorycCsÒ| dd¡d}| dd¡d}| ¡ d¡}ytjj|dd}Wn tk rbtj |¡}YnXt |¡}| d¡}t d|ƒ}|j }x8|D]0}t j   |¡sŽ|t jt jfkr°qŽt j  ||¡}qŽW|rÎ|d7}|S)Nú?r rú#rr½)r¾)r)r'rªr¨r©rÄrÅÚ posixpathÚnormpathÚfilterr–r—r1ÚdirnameÚcurdirÚpardirrh)rr1Ztrailing_slashr<Zwordrrrr¦1s$     z'SimpleHTTPRequestHandler.translate_pathcCst ||¡dS)N)ÚshutilZ copyfileobj)rÚsourceZ outputfilerrrržOsz!SimpleHTTPRequestHandler.copyfilecCsLt |¡\}}||jkr"|j|S| ¡}||jkr>|j|S|jdSdS)Nr)rÓÚsplitextÚextensions_mapr9)rr1ÚbaseZextrrrr­_s    z#SimpleHTTPRequestHandler.guess_typezapplication/octet-streamz text/plain)rz.pyz.cz.h)rrrrŒr}ršr r¡rr¬r¦ržr­Ú mimetypesZinitedZinitZ types_mapÚcopyrÜÚupdateÚ __classcell__rr)rœrr„s"  O: c CsÒ| d¡\}}}tj |¡}| d¡}g}x<|dd…D],}|dkrN| ¡q8|r8|dkr8| |¡q8W|rœ| ¡}|r |dkrŽ| ¡d}q |dkr d}nd}|r²d ||f¡}dd |¡|f}d |¡}|S)NrÑrrz..rr)Ú partitionr¨r©rÄr)Úpoprcrh) r1Ú_ÚqueryÚ path_partsZ head_partsÚpartZ tail_partZ splitpathÚcollapsed_pathrrrÚ_url_collapse_path„s.     récCsptrtSy ddl}Wntk r(dSXy| d¡daWn.tk rjdtdd„| ¡DƒƒaYnXtS)NrrÚnobodyr r css|]}|dVqdS)r Nr)ror„rrrú Âsznobody_uid..)rêÚpwdÚ ImportErrorÚgetpwnamrTÚmaxZgetpwall)rìrrrÚ nobody_uid¶s  rðcCst |tj¡S)N)r—ÚaccessÚX_OK)r1rrrÚ executableÆsróc@sReZdZeedƒZdZdd„Zdd„Zdd„Z d d gZ d d „Z d d„Z dd„Z dS)rÚforkrcCs$| ¡r| ¡n| tjd¡dS)NzCan only POST to CGI scripts)Úis_cgiÚrun_cgir/rrD)rrrrÚdo_POSTÜs  zCGIHTTPRequestHandler.do_POSTcCs| ¡r| ¡St |¡SdS)N)rõrörr)rrrrrêszCGIHTTPRequestHandler.send_headcCsPt|jƒ}| dd¡}|d|…||dd…}}||jkrL||f|_dSdS)Nrr TF)rér1ÚfindÚcgi_directoriesÚcgi_info)rrèZdir_sepÚheadÚtailrrrrõñs    zCGIHTTPRequestHandler.is_cgiz/cgi-binz/htbincCst|ƒS)N)ró)rr1rrrÚ is_executable sz#CGIHTTPRequestHandler.is_executablecCstj |¡\}}| ¡dkS)N)z.pyz.pyw)r—r1rÛr9)rr1rûrürrrÚ is_pythonszCGIHTTPRequestHandler.is_pythonc) Cs¶|j\}}|d|}| dt|ƒd¡}x`|dkrŠ|d|…}||dd…}| |¡}tj |¡r†||}}| dt|ƒd¡}q,Pq,W| d¡\}}} | d¡}|dkrÊ|d|…||d…} }n |d} }|d| } | | ¡} tj | ¡s|  t j d| ¡dStj  | ¡s2|  t j d| ¡dS| | ¡} |jsJ| sl| | ¡sl|  t j d| ¡dSt tj¡}| ¡|d <|jj|d <d |d <|j|d <t|jjƒ|d<|j|d<tj |¡}||d<| |¡|d<| |d<| rô| |d<|jd|d<|j  d¡}|r¼| !¡}t|ƒdkr¼ddl"}ddl#}|d|d<|d $¡dkr¼y"|d %d¡}| &|¡ 'd¡}Wn|j(t)fk r–Yn&X| !d¡}t|ƒdkr¼|d|d<|j  d¡dkrÞ|j *¡|d<n|jd|d<|j  d¡}|r||d<|j  d ¡}|r ||d!<g}xN|j +d"¡D]>}|dd…d#krX| ,| -¡¡n||d$d… !d%¡}q2Wd% .|¡|d&<|j  d'¡}|rœ||d(<t/d|j 0d)g¡ƒ}d* .|¡}|rÈ||d+<xd,D]}| 1|d¡qÎW| 2t j3d-¡| 4¡|  5d.d/¡}|jr,| g}d0|kr(| ,|¡t6ƒ}|j7 8¡t 9¡}|dkr¢t :|d¡\}}x0t; ;|jd1|¡dSy\yt ?|¡Wnt@k rÈYnXt A|j< B¡d¡t A|j7 B¡d¡t C| ||¡Wn(|j D|jE|j¡t Fd2¡YnXn†ddlG} | g}!| | ¡r€tHjI}"|" $¡ Jd3¡rt|"dd4…|"d5d…}"|"d6g|!}!d0| kr”|! ,| ¡| Kd7|  L|!¡¡y tM|ƒ}#WntNtOfk rÐd}#YnX| jP|!| jQ| jQ| jQ|d8}$|j $¡d9kr|#dkr|j< =|#¡}%nd}%x4t; ;|jd:|'¡|$jV W¡|$jX W¡|$jY}(|(r¨| >d1|(¡n | Kd;¡dS)Serving HTTP on {host} port {port} (http://{host}:{port}/) ...rr )rrz& Keyboard interrupt received, exiting.) r0rZ getsocknameÚprintrmZ serve_foreverÚKeyboardInterruptrvÚexit) Ú HandlerClassZ ServerClassZprotocolrÚbindrZhttpdZsaZ serve_messagerrrÚtestÔs   r9Ú__main__z--cgiÚ store_truezRun as CGI Server)ÚactionÚhelpz--bindz-bZADDRESSz8Specify 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–)r7rr8)6rŒÚ__all__rßrµZ email.utilsr€rYZ http.clientr3rÈrrÞr—rÓrrÙrr rvrZ urllib.parser¨Ú functoolsrrrrŽr rZThreadingMixInrZStreamRequestHandlerrrrérêrðrórr9rÚargparseÚArgumentParserÚparserÚ add_argumentr˜r-Ú parse_argsrnZcgiZ handler_classr–rr8rrrrÚSsz   s0