o bn@sPdZddlZddlmZddlmZmZmZGdddejZ GdddZ dS) z SOAP support for twisted.web. Requires SOAPpy 0.10.1 or later. Maintainer: Itamar Shtull-Trauring Future plans: SOAPContext support of some kind. Pluggable method lookup policies. N)defer)clientresourceserverc@sJeZdZdZdZdZddZddZdd Zd d Z d d Z dddZ dS) SOAPPublisherzPublish SOAP methods. By default, publish methods beginning with 'soap_'. If the method has an attribute 'useKeywords', it well get the arguments passed as keyword args. zUTF-8cCst|d|dS)zLookup published SOAP function. Override in subclasses. Default behaviour - publish methods starting with soap_. @return: callable or None if not found. zsoap_%sN)getattr)self functionNamer 2/usr/lib/python3/dist-packages/twisted/web/soap.pylookupFunction(szSOAPPublisher.lookupFunctioncCs|j}t|ddd\}}}}|j|j|j}}} t|r#|}t| r*| } ||} | s:| ||t j St | drZi} | D] \} } | | t| <qEtj| fi| }n tj| g|R}||j||||j||t j S)zHandle a SOAP command.r useKeywords)contentreadSOAPpy parseSOAPRPC_name_aslist_asdictcallabler _methodNotFoundr NOT_DONE_YEThasattritemsstrr maybeDeferred addCallback _gotResult addErrback _gotError)r requestdatapheaderbodyattrs methodNameargskwargsfunctionkeywordskvdr r r render2s(    zSOAPPublisher.rendercCs8tjtdtjjd||jd}|j||dddS)Nz %s:ClientzMethod %s not foundencodingstatus)r buildSOAP faultTypeNSENV_Tr1 _sendResponse)r r!r'responser r r rRszSOAPPublisher._methodNotFoundcCs<t|tjs d|i}tjd||i|jd}|||dS)NResultz %sResponse)kwr1) isinstancervoidTyper5r1r9)r resultr!r'r:r r r r[s zSOAPPublisher._gotResultcCsT|j}t|tjr |}n tdtjjd|}tj||jd}|j||dddS)Nz %s:ServerzMethod %s failed.r0r2r3) valuer=rr6r7r8r5r1r9)r failurer!r'efaultr:r r r r cs zSOAPPublisher._gotErrorcCsZ|||jdurd|j}nd}|d||dtt||||dS)Nztext/xml; charset="%s"text/xmlz Content-typezContent-length)setResponseCoder1 setHeaderrlenwritefinish)r r!r:r4mimeTyper r r r9ns      zSOAPPublisher._sendResponseN)rD) __name__ __module__ __qualname____doc__isLeafr1r r/rrr r9r r r r rs    rc@s*eZdZdZd ddZddZddZdS) ProxyaA Proxy for making remote SOAP calls. Pass the URL of the remote SOAP server to the constructor. Use proxy.callRemote('foobar', 1, 2) to call remote method 'foobar' with args 1 and 2, proxy.callRemote('foobar', x=1) will call foobar with named argument 'x'. NcCs||_||_||_dS)N)url namespacer$)r rRrSr$r r r __init__s zProxy.__init__cCs2t|}t|dr |jSt|dkr|dS|S)Nr;rr)rrrr;rH)r r?r r r _cbGotResults   zProxy._cbGotResultcOs:tj||||j|jd}tj|j|dd|dd|jS)N)r(r<methodr$rSPOSTrE)z content-type SOAPAction)postdatarVheaders) rr5r$rSrgetPagerRrrU)r rVr(r)payloadr r r callRemoteszProxy.callRemote)NN)rLrMrNrOrTrUr]r r r r rQ{s   rQ) rOrtwisted.internetr twisted.webrrrResourcerrQr r r r s  `