;ς ΚΐBc @s;dZdZdkZdkZdkZdkZdkZdkZdkZydkl Z Wne j od„Z nXd„Z dei fd„ƒYZ y dkZWne j o e Zn1Xdeifd „ƒYZd e fd „ƒYZd d „Zdddd d„Zdd gd d d ddd„ZdS(s4 msHTTPServer.py - stand-alone single-web-application server (c) by Michael Stroeder This module is distributed under the terms of the GPL (GNU GENERAL PUBLIC LICENSE) Version 2 (see http://www.gnu.org/copyleft/gpl.html) $Id: msHTTPServer.py,v 1.62 2005/02/23 17:43:38 michael Exp $ s0.2.0N(sgetuidcCstSdS(N(sNone(((s./pylib/msHTTPServer.pysgetuidscCs¬|idƒ}t|ƒdjoIti|diƒƒp|dt|diƒƒp|df}n:t|ƒdjo |dt|iƒƒf}nt ‚|SdS(sE Split a server address string host:port, with fall-back to port s:iiiN( svssplitsadrslenssockets gethostbynamesstripsserver_addresssints ValueError(svsserver_addresssadr((s./pylib/msHTTPServer.pyssplit_server_addresssI s HTTPServercBs;tZdZd„Zd„Zd„Zd„Zd„ZRS(s# Base class for a HTTP server. cCstii|||ƒdS(N(s SocketServers TCPServers__init__sselfsserver_addresssRequestHandlerClass(sselfsserver_addresssRequestHandlerClass((s./pylib/msHTTPServer.pys__init__,scCs0|iititidƒtii|ƒdS(s+Override server_bind to set socket options.iN(sselfssockets setsockopts SOL_SOCKETs SO_REUSEADDRs SocketServers TCPServers server_bind(sself((s./pylib/msHTTPServer.pys server_bind/scCsJtiidtidtitiƒƒƒ|d|d|fgƒSdS(Ns %s %s:%d %s s%Y-%m-%dT%H:%M:%SZii(sosslinesepsjoinstimesstrftimesgmtimesclient_addressslog_msg(sselfslog_msgsclient_address((s./pylib/msHTTPServer.pys format_log4scCs‰y|iƒ\}}Wntij o dSnX|i||ƒo?y|i||ƒWq…|i||ƒ|i |ƒq…XndS(s&Handle one request, possibly blocking.N( sselfs get_requestsrequestsclient_addressssocketserrorsverify_requestsprocess_requests handle_errors close_request(sselfsrequestsclient_address((s./pylib/msHTTPServer.pyshandle_request?s c Cs‚tiƒ\}}}t|tƒo t‚n5t|tƒo©|idjp |idjo-ti i |i dt |iƒ|ƒƒqc|idjo&ti i |i t|ƒ|ƒƒqctii |i t|ƒ|ƒƒn|t|tiƒo-tii |i dt |iƒ|ƒƒn<tii |i dditi|||dƒƒ|ƒƒt}t}t}~~~d S( s6 Generic low-level handler for exceptions i ihs1IOError %s: User probably interrupted connection.isSocket error: %ssUnhandled exception: siN(ssyssexc_infosexc_objs exc_values exc_tracebacks isinstancesKeyboardInterruptsIOErrorserrnosstdoutswritesselfs format_logsreprsclient_addresssstrsstderrssocketserrorsargssjoins tracebacksformat_exceptionsNone(sselfsrequestsclient_addresssexc_objs exc_tracebacks exc_value((s./pylib/msHTTPServer.pys handle_errorLs(  1 (s__name__s __module__s__doc__s__init__s server_binds format_logshandle_requests handle_error(((s./pylib/msHTTPServer.pys HTTPServer's    s HTTPThreadcBs2tZdZd„Zd„Zd„Zd„ZRS(s$Thread class for HTTP handler threadcCsq||_||_||_||_||_ t i ƒ|_ t i i|ƒ|i|ii|iƒdƒdS(Ni(sserverInstancesselfsfuncs_funcsrequests_requestsclient_addresss_client_addresss handle_errors _handle_errorstimesstarteds threadingsThreads__init__ssetNames __class__s__name__sgetName(sselfsserverInstancesfuncsrequestsclient_addresss handle_error((s./pylib/msHTTPServer.pys__init__~s     cCsDd|id|id|iƒtidti|iƒƒfSdS(Ns%s:%d - %s started %siis%Y-%m-%dT%H:%M:%SZ(sselfs_client_addresssgetNamestimesstrftimesgmtimesstarted(sself((s./pylib/msHTTPServer.pys__repr__‰scCs8y|iidƒ}Wntj o dSnXdSdS(s:Check if remote end is still alive by sending empty stringsiiN(sselfs_requestssends bytessentsIOError(sselfs bytessent((s./pylib/msHTTPServer.pysisAlives  cCsnzMy t|i|i|ifƒWn&t|i|i|ifƒ‚nXWd|ii|iƒX|`dS(N(sapplysselfs_funcs_requests_client_addresss _handle_errorsserverInstances close_request(sself((s./pylib/msHTTPServer.pysrun—s   (s__name__s __module__s__doc__s__init__s__repr__sisAlivesrun(((s./pylib/msHTTPServer.pys HTTPThread|s   sThreadingHTTPServercBs.tZd„Zeidjo d„ZnRS(NcCs,t||i|||iƒ}|iƒdS(s*Start a new thread to process the request.N(s HTTPThreadsselfsfinish_requestsrequestsclient_addresss handle_errorstsstart(sselfsrequestsclient_addressst((s./pylib/msHTTPServer.pysprocess_requestͺss0.3cCsdSdS(sQWork around bug in SocketServer.BaseServer.handle_request() of Python 2.1N((sselfsrequest((s./pylib/msHTTPServer.pys close_request±s(s__name__s __module__sprocess_requests SocketServers __version__s close_request(((s./pylib/msHTTPServer.pysThreadingHTTPServer¨s scCs5dtidGH|o d|GHntidƒdS(Ns} usage: %s [options] Options: -h or -? Print out this message -d on/off demon mode (detach from console) Default: on -t on/off Run multi-threaded HTTP server. If starting multi-threaded fails the script falls backs to running a single-threaded HTTP server. Default: on -s on/off Have SSL on/off. -l [hostname:]port Listen to hostname:port. Either hostname:port or port is allowed. Default: your hostname:1760 -u numeric uid or username Switch to given UID or username after binding to socket. Default: Current UID if not started as root. nobody if started as root. is *** Error: %si(ssyssargvsErrorMsgsexit(sErrorMsg((s./pylib/msHTTPServer.pys PrintUsage·s" iicCsztƒ} | tj o¬y dk} Wntj o d}qΙXtiƒdjptiƒdjoMy| i|ƒd}WqΉt j o#| idƒd}d|GHqΉXn| }d}n| }dk }y#|i t iddƒ\}} Wn5|ij o&}tt|ƒƒt idƒnXx%|D]\} }| djoM|iƒ} | dd gjo | djo tid j}qštd ƒn| d jo­yt|ƒ}WqTtj oŠ| tjod GHt idƒn|odGHt idƒny| i|ƒd}WqPt j od|GHt idƒqPXqTXn| djo7yt||ƒ}Wq˜tj otdƒq˜Xn| djo=|iƒ} | dd gjo| dj}qβtdƒn| djo=|iƒ} | dd gjo| dj}q,tdƒn| djp | djo tƒq4q4W|d|df||||fSdS(NiiisnobodysfWarning: User %s (specified by configuration) does not exist on your system => using nobody as defaults ?hs:d:t:u:l:s-dsonsoffsposixs,Detach option (option -d) must be on or off.s-us9Changing UID is not available on this platform. Aborting.s5Module pwd is not available on this system. Aborting.sKFatal Error: User %s (specified by option -u) does not exist on your systems-ls,Bind address (option -l) has invalid format.s-ts/Threading option (option -t) must be on or off.s-ss)SSL option (option -s) must be on or off.s-hs-?("sgetuids current_uidsNonespwds ImportErrorsnopwdsossgeteuidsgetpwnamsuidparamsuidsKeyErrorsgetoptssyssargvsoptlistsargsserrorses PrintUsagesstrsexitsksvslowersflagsnames run_detachedsints ValueErrorssplit_server_addresssserver_addresss run_threadeds ssl_enabled(sserver_addresss run_detacheds run_threadeds ssl_enabledsuidparamsuidsoptlistsnopwdsgetopts current_uidsargsspwdsksflagsvse((s./pylib/msHTTPServer.pysGetCommandlineParamsΰsz   &  #            c  Cs‡tiiƒtiitii|idƒƒ od|idGHn|ot dƒnhdt <dt <|} | ||ƒ} | idoNy!ti| idƒd| _Wq tij o| id| _q Xn&tititiƒƒƒd| _| id| _tiidtidtitiƒƒƒhdd<dd <|| i| ihdd <dd <|fƒtiid d igi}|i D]}|t"i#|ƒƒq¬~ƒƒdhdd<dd<|| i| i|i$fGH|o;|i&t_'|i(t_z| i)ƒWd| iiƒXn7y| i)ƒWn%t*j odGH| iiƒnXdSdS(Ns DOCUMENT_ROOTs)Warning: document_root %s does not exist.sSSL currently not supported!iis.%s Started %s web server on %s:%s with SSL %s s%Y-%m-%d %H:%M:%Sssingle-threadedsmulti-threadedsdisabledsenabledsAccepted IP address ranges: %ss,sN Point your favourite browser to %s://%s:%s%s to access the web application.shttpshttpssShutting down web server(+ssyssstdinsclosesosspathsisdirsabspathsHTTPHandlerClasss server_envs ssl_enableds PrintUsages HTTPServersThreadingHTTPServers run_threadeds ServerClasssserver_addresssServerInstancessockets gethostbyaddrs server_nameserrors gethostbynames gethostnames server_portsstderrswritestimesstrftimes localtimesjoinsappends_[1]saccess_allowedsasipadrsAddrMask_Tuple2Strs script_names run_detacheds debug_logsstdouts error_logs serve_foreversKeyboardInterrupt(sHTTPHandlerClasssserver_addresss run_detacheds run_threadeds ssl_enableds ssl_randfiles ssl_Protocolssssl_CertificateFilesssl_CertificateKeyFilesssl_CACertificateFilesssl_VerifyClientsssl_VerifyDepths ServerClasssServerInstancesas_[1]((s./pylib/msHTTPServer.pys RunServer=s< '!%p J4   (s__doc__s __version__ssyssosstimesipadrs SocketServerssockets tracebacksgetuids ImportErrorssplit_server_addresss TCPServers HTTPServers threadingsThreadingHTTPServersThreads HTTPThreads PrintUsagesGetCommandlineParamss RunServer(s PrintUsagesThreadingHTTPServers __version__sgetuidssockets SocketServers HTTPThreads tracebacks RunServerssyss threadings HTTPServerstimessplit_server_addresssGetCommandlineParamssipadrsos((s./pylib/msHTTPServer.pys? s"? O  , )]