B kCh @sddlmZmZmZmZmZddlmZddlm Z ddl m Z ddl Z ddlZ ddlZddlZddlZddlZddlZddlZy ddlZWnek rdZYnXd*ddZd d ZGd d d ZGd ddeZGdddejeZGdddeZGdddeZGdddejZGdddZ GdddeZ!Gdddee Z"Gdddee Z#e$dkr ddl%Z%Gd d!d!Z&ed"~Z'e'(e)e'(d#d$d%e'j*e&dd&e'+e,d'e,d(y e'-Wn(e.k re,d)e/dYnXWdQRXdS)+)Faultdumpsloads gzip_encode gzip_decode)BaseHTTPRequestHandler)partial) signatureNTcCsJ|r|d}n|g}x.|D]&}|dr8td|qt||}qW|S)N._z(attempt to access private attribute "%s")split startswithAttributeErrorgetattr)objattrallow_dotted_namesZattrsir0/opt/alt/python37/lib/python3.7/xmlrpc/server.pyresolve_dotted_attribute|s     rcsfddtDS)Ncs(g|] }|dstt|r|qS)r )r callabler).0member)rrr s z'list_public_methods..)dir)rr)rrlist_public_methodssrc@sleZdZdddZdddZdddZd d Zd d Zdd dZddZ ddZ ddZ ddZ ddZ dS)SimpleXMLRPCDispatcherFNcCs&i|_d|_||_|pd|_||_dS)Nzutf-8)funcsinstance allow_noneencodinguse_builtin_types)selfr r!r"rrr__init__s  zSimpleXMLRPCDispatcher.__init__cCs||_||_dS)N)rr)r#rrrrrregister_instances!z(SimpleXMLRPCDispatcher.register_instancecCs2|dkrt|j|dS|dkr$|j}||j|<|S)N)name)rregister_function__name__r)r#Zfunctionr&rrrr's  z(SimpleXMLRPCDispatcher.register_functioncCs|j|j|j|jddS)N)zsystem.listMethodszsystem.methodSignaturezsystem.methodHelp)rupdatesystem_listMethodssystem_methodSignaturesystem_methodHelp)r#rrr register_introspection_functionss z7SimpleXMLRPCDispatcher.register_introspection_functionscCs|jd|jidS)Nzsystem.multicall)rr)system_multicall)r#rrrregister_multicall_functionssz3SimpleXMLRPCDispatcher.register_multicall_functionsc CsyPt||jd\}}|dk r(|||}n |||}|f}t|d|j|jd}Wntk r}zt||j|jd}Wdd}~XYnNt\}} } z$ttdd|| f|j|jd}Wdd}} } XYnX| |jdS)N)r")Zmethodresponser r!)r r!z%s:%s)r!r xmlcharrefreplace) rr" _dispatchrr r!rsysexc_infoencode) r#datadispatch_methodpathparamsmethodresponsefaultexc_type exc_valueexc_tbrrr_marshaled_dispatchs&   z*SimpleXMLRPCDispatcher._marshaled_dispatchcCs^t|j}|jdk rVt|jdr8|t|jO}nt|jdsV|tt|jO}t|S)N _listMethodsr2)setrkeysrhasattrrArsorted)r#methodsrrrr*s   z)SimpleXMLRPCDispatcher.system_listMethodscCsdS)Nzsignatures not supportedr)r# method_namerrrr+/s z-SimpleXMLRPCDispatcher.system_methodSignaturecCsd}||jkr|j|}nX|jdk rrt|jdr<|j|St|jdsryt|j||j}Wntk rpYnX|dkr~dSt|SdS)N _methodHelpr2) rrrDrHrrrpydocgetdoc)r#rGr:rrrr,<s"       z(SimpleXMLRPCDispatcher.system_methodHelpc Csg}x|D]}|d}|d}y||||gWq tk rl}z||j|jdWdd}~XYq t\}}} z|dd||fdWdd}}} XYq Xq W|S)NZ methodNamer9) faultCode faultStringr0z%s:%s)appendr2rrLrMr3r4) r#Z call_listresultsZcallrGr9r<r=r>r?rrrr.[s$  z'SimpleXMLRPCDispatcher.system_multicallcCsy|j|}Wntk r"YnX|dk r4||Std||jdk rt|jdrd|j||Syt|j||j}Wntk rYnX|dk r||Std|dS)Nzmethod "%s" is not supportedr2) rKeyError ExceptionrrDr2rrr)r#r:r9funcrrrr2s(    z SimpleXMLRPCDispatcher._dispatch)FNF)F)NN)NN)r( __module__ __qualname__r$r%r'r-r/r@r*r+r,r.r2rrrrrs   $   ) $rc@sbeZdZdZdZdZdZedej ej BZ ddZ dd Z d d Zd d ZddZdddZdS)SimpleXMLRPCRequestHandler)/z/RPC2ixTz \s* ([^\s;]+) \s* #content-coding (;\s* q \s*=\s* ([0-9\.]+))? #q cCsbi}|jdd}xJ|dD]<}|j|}|r|d}|rHt|nd}|||d<qW|S)NzAccept-EncodingrI,g?r0)headersgetr aepatternmatchgroupfloat)r#rZaeer]vrrraccept_encodingss  z+SimpleXMLRPCRequestHandler.accept_encodingscCs|jr|j|jkSdSdS)NT) rpc_pathsr8)r#rrris_rpc_path_valids z,SimpleXMLRPCRequestHandler.is_rpc_path_validc Cs|s|dSyd}t|jd}g}x>|rjt||}|j|}|sNP|||t|d8}q.Wd |}| |}|dkrdS|j |t |dd|j}Wntk r8}zp|dt|j dr|j jr|dt|t} t| d d d } |d | |d d |Wdd}~XYnX|d|dd|jdk rt||jkr|dd} | ryt|}|ddWntk rYnX|d tt|||j|dS)Nizcontent-lengthrWr2i_send_traceback_headerz X-exceptionASCIIbackslashreplacez X-tracebackzContent-length0z Content-typeztext/xmlgziprzContent-Encoding) re report_404intrZminZrfilereadrNlenjoindecode_request_contentserverr@rr8rQ send_responserDrg send_headerstr traceback format_excr5 end_headersencode_thresholdrcr[rNotImplementedErrorwfilewrite) r#Zmax_chunk_sizeZsize_remainingLZ chunk_sizechunkr6r;raZtraceqrrrdo_POSTsX            z"SimpleXMLRPCRequestHandler.do_POSTcCs|jdd}|dkr|S|dkrtyt|Stk rR|dd|Yqtk rp|ddYqXn|dd||dd |dS) Nzcontent-encodingidentityrlizencoding %r not supportedizerror decoding gzip contentzContent-lengthrj) rZr[lowerrr|ru ValueErrorrvrz)r#r6r!rrrrs$s z1SimpleXMLRPCRequestHandler.decode_request_contentcCsF|dd}|dd|dtt|||j|dS)Nis No such pagez Content-typez text/plainzContent-length)rurvrwrqrzr}r~)r#r;rrrrm5s   z%SimpleXMLRPCRequestHandler.report_404-cCs|jjrt|||dS)N)rt logRequestsr log_request)r#codesizerrrr>sz&SimpleXMLRPCRequestHandler.log_requestN)rr)r(rSrTrdr{ZwbufsizeZdisable_nagle_algorithmrecompileVERBOSE IGNORECASEr\rcrerrsrmrrrrrrUs  G rUc@s*eZdZdZdZedddddfddZdS)SimpleXMLRPCServerTFNcCs,||_t||||tj||||dS)N)rrr$ socketserver TCPServer)r#addrrequestHandlerrr r!bind_and_activater"rrrr$WszSimpleXMLRPCServer.__init__)r(rSrTZallow_reuse_addressrgrUr$rrrrrDs  rc@s<eZdZedddddfddZddZdd Zd d d ZdS) MultiPathXMLRPCServerTFNc Cs2t||||||||i|_||_|p*d|_dS)Nzutf-8)rr$ dispatchersr r!)r#rrrr r!rr"rrrr$hs  zMultiPathXMLRPCServer.__init__cCs||j|<|S)N)r)r#r8Z dispatcherrrradd_dispatcherrs z$MultiPathXMLRPCServer.add_dispatchercCs |j|S)N)r)r#r8rrrget_dispatchervsz$MultiPathXMLRPCServer.get_dispatcherc Cs|y|j||||}Wn^tdd\}}z2ttdd||f|j|jd}||jd}Wdd}}XYnX|S)Nr0z%s:%s)r!r r1) rr@r3r4rrr!r r5)r#r6r7r8r;r=r>rrrr@ys z)MultiPathXMLRPCServer._marshaled_dispatch)NN)r(rSrTrUr$rrr@rrrrr`s rc@s0eZdZd ddZddZddZd d d ZdS) CGIXMLRPCRequestHandlerFNcCst||||dS)N)rr$)r#r r!r"rrrr$sz CGIXMLRPCRequestHandler.__init__cCsP||}tdtdt|ttjtjj|tjjdS)NzContent-Type: text/xmlzContent-Length: %d)r@printrqr3stdoutflushbufferr~)r# request_textr;rrr handle_xmlrpcs  z%CGIXMLRPCRequestHandler.handle_xmlrpccCsd}tj|\}}tjj|||d}|d}td||ftdtjjtdt|tt j t j j |t j j dS)Ni)rmessageexplainzutf-8z Status: %d %szContent-Type: %szContent-Length: %d)rZ responseshttprtZDEFAULT_ERROR_MESSAGEr5rZDEFAULT_ERROR_CONTENT_TYPErqr3rrrr~)r#rrrr;rrr handle_gets   z"CGIXMLRPCRequestHandler.handle_getc Csz|dkr$tjdddkr$|nRyttjdd}Wnttfk rVd}YnX|dkrltj |}| |dS)NZREQUEST_METHODZGETZCONTENT_LENGTHrW) osenvironr[rrnr TypeErrorr3stdinrpr)r#rlengthrrrhandle_requests   z&CGIXMLRPCRequestHandler.handle_request)FNF)N)r(rSrTr$rrrrrrrrs  rc@s:eZdZdiiifddZdiiidfddZddZdS) ServerHTMLDocNcCs^|p|j}g}d}td}x|||} | s2P| \} } ||||| | \} } }}}}| r|| dd}|d||fn|rdt|}|d||| fn~|rdt|}|d||| fnV|| | dd kr|| ||||n(|r$|d |n|| ||| }q W||||dd |S) NrzM\b((http|ftp)://\S+[\w/]|RFC[- ]?(\d+)|PEP[- ]?(\d+)|(self\.)?((?:\w|\.)+))\b"z"z%sz'http://www.rfc-editor.org/rfc/rfc%d.txtz(http://www.python.org/dev/peps/pep-%04d/r0(zself.%srI) escaperrsearchspanrNgroupsreplacernZnamelinkrr)r#textrrclassesrFrOherepatternr]startendallZschemeZrfcZpepZselfdotr&Zurlrrrmarkups8      zServerHTMLDoc.markupcCs|r |jp dd|}d} d||||f} t|rHtt|} nd} t|trp|dp`| } |dpld} n t|} | | | o| d| } | | |j |||}|od|}d | |fS) NrIrz$%sz(...)rr0z'%sz
%s
z
%s
%s
) r(rrrwr isinstancetuplerJrKZgreyr preformat)r#objectr&modrrrFZclZanchorZnotetitleZargspecZ docstringZdecldocrrr docroutines"     zServerHTMLDoc.docroutinec Csi}x,|D] \}}d|||<||||<qW||}d|}||dd}|||j|} | old| } |d| }g} t|} x&| D]\}}| |j|||dqW||ddd d | }|S) Nz#-z)%sz#ffffffz#7799eez %sz

%s

)rZMethodsz#eeaa77rI) itemsrheadingrrrErNrZ bigsectionrr) r# server_nameZpackage_documentationrFZfdictkeyvalueheadresultrcontentsZ method_itemsrrr docservers"     zServerHTMLDoc.docserver)r(rSrTrrrrrrrrs)rc@s4eZdZddZddZddZddZd d Zd S) XMLRPCDocGeneratorcCsd|_d|_d|_dS)NzXML-RPC Server DocumentationzGThis server exports the following methods through the XML-RPC protocol.)rserver_documentation server_title)r#rrrr$:szXMLRPCDocGenerator.__init__cCs ||_dS)N)r)r#rrrrset_server_titleBsz#XMLRPCDocGenerator.set_server_titlecCs ||_dS)N)r)r#rrrrset_server_nameGsz"XMLRPCDocGenerator.set_server_namecCs ||_dS)N)r)r#rrrrset_server_documentationLsz+XMLRPCDocGenerator.set_server_documentationc Csi}x|D]}||jkr(|j|}n|jdk rddg}t|jdrV|j||d<t|jdrr|j||d<t|}|dkr|}qt|jdsyt|j|}Wqtk r|}YqXq|}n|||<qWt }| |j |j |}| t|j|S)N_get_method_argstringrrHr0)NNr2)r*rrrDrrHrrrrrrrZpagehtmlrr)r#rFrGr:Z method_infoZ documenterZ documentationrrrgenerate_html_documentationQs8          z.XMLRPCDocGenerator.generate_html_documentationN)r(rSrTr$rrrrrrrrr3s rc@seZdZddZdS)DocXMLRPCRequestHandlercCsf|s|dS|jd}|d|dd|dtt|| |j |dS)Nzutf-8rkz Content-typez text/htmlzContent-length) rermrtrr5rurvrwrqrzr}r~)r#r;rrrdo_GETs  zDocXMLRPCRequestHandler.do_GETN)r(rSrTrrrrrrs rc@s"eZdZedddddfddZdS)DocXMLRPCServerTFNc Cs&t||||||||t|dS)N)rr$r)r#rrrr r!rr"rrrr$s zDocXMLRPCServer.__init__)r(rSrTrr$rrrrrsrc@seZdZddZddZdS)DocCGIXMLRPCRequestHandlercCsT|d}tdtdt|ttjtjj|tjjdS)Nzutf-8zContent-Type: text/htmlzContent-Length: %d) rr5rrqr3rrrr~)r#r;rrrrs z%DocCGIXMLRPCRequestHandler.handle_getcCst|t|dS)N)rr$r)r#rrrr$s z#DocCGIXMLRPCRequestHandler.__init__N)r(rSrTrr$rrrrrsr__main__c@s"eZdZddZGdddZdS)ExampleServicecCsdS)NZ42r)r#rrrgetDataszExampleService.getDatac@seZdZeddZdS)zExampleService.currentTimecCs tjS)N)datetimeZnowrrrrgetCurrentTimesz)ExampleService.currentTime.getCurrentTimeN)r(rSrT staticmethodrrrrr currentTimesrN)r(rSrTrrrrrrrsr)Z localhosti@cCs||S)Nr)xyrrrrfradd)rz&Serving XML-RPC on localhost port 8000zKIt is advisable to run this example server within a secure, closed network.z& Keyboard interrupt received, exiting.)T)0Z xmlrpc.clientrrrrrZ http.serverr functoolsrinspectr rrrr3rrrJrxZfcntl ImportErrorrrrrUrrrrZHTMLDocrrrrrr(rrrtr'powr%r/rZ serve_foreverKeyboardInterruptexitrrrrks`      ,EbQ