o
    bn                     @   sP   d Z ddlZddlmZ ddlmZmZmZ G dd dejZ	G dd dZ
dS )	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)clientresourceserverc                   @   sJ   e Zd ZdZdZdZdd Zdd Zdd	 Zd
d Z	dd Z
dddZdS )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.
       zUTF-8c                 C   s   t | d| dS )zLookup published SOAP function.

        Override in subclasses. Default behaviour - publish methods
        starting with soap_.

        @return: callable or None if not found.
        zsoap_%sN)getattr)selffunctionName r   2/usr/lib/python3/dist-packages/twisted/web/soap.pylookupFunction(   s   zSOAPPublisher.lookupFunctionc                 C   s   |j  }t|ddd\}}}}|j|j|j}}}	t|r#| }t|	r*|	 }	| |}
|
s:| 	|| t
jS t|
drZi }|	 D ]
\}}||t|< qEtj|
fi |}n	tj|
g|R  }|| j|| || j|| t
jS )zHandle a SOAP command.r   useKeywords)contentreadSOAPpyparseSOAPRPC_name_aslist_asdictcallabler   _methodNotFoundr   NOT_DONE_YEThasattritemsstrr   maybeDeferredaddCallback
_gotResult
addErrback	_gotError)r	   requestdatapheaderbodyattrs
methodNameargskwargsfunctionkeywordskvdr   r   r   render2   s(   


zSOAPPublisher.renderc                 C   s8   t jt dt jj d| | jd}| j||dd d S )Nz	%s:ClientzMethod %s not foundencoding  status)r   	buildSOAP	faultTypeNSENV_Tr1   _sendResponse)r	   r!   r'   responser   r   r   r   R   s   zSOAPPublisher._methodNotFoundc                 C   s<   t |tjs
d|i}tjd| |i| jd}| || d S )NResultz
%sResponse)kwr1   )
isinstancer   voidTyper5   r1   r9   )r	   resultr!   r'   r:   r   r   r   r   [   s   zSOAPPublisher._gotResultc                 C   sT   |j }t|tjr|}ntdtjj d| }tj|| jd}| j||dd d S )Nz	%s:ServerzMethod %s failed.r0   r2   r3   )	valuer=   r   r6   r7   r8   r5   r1   r9   )r	   failurer!   r'   efaultr:   r   r   r   r    c   s   zSOAPPublisher._gotError   c                 C   sZ   | | | jd urd| j }nd}|d| |dtt| || |  d S )Nztext/xml; charset="%s"text/xmlzContent-typezContent-length)setResponseCoder1   	setHeaderr   lenwritefinish)r	   r!   r:   r4   mimeTyper   r   r   r9   n   s   


zSOAPPublisher._sendResponseN)rD   )__name__
__module____qualname____doc__isLeafr1   r   r/   r   r   r    r9   r   r   r   r   r      s    
 	r   c                   @   s*   e Zd ZdZd	ddZdd Zdd ZdS )
Proxya  A 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'.
    Nc                 C   s   || _ || _|| _d S )N)url	namespacer$   )r	   rR   rS   r$   r   r   r   __init__   s   
zProxy.__init__c                 C   s2   t |}t|dr|jS t|dkr|d S |S )Nr;   r   r   )r   r   r   r;   rH   )r	   r?   r   r   r   _cbGotResult   s   

zProxy._cbGotResultc                 O   s:   t j|||| j| jd}tj| j|dd|dd| jS )N)r(   r<   methodr$   rS   POSTrE   )zcontent-type
SOAPAction)postdatarV   headers)	r   r5   r$   rS   r   getPagerR   r   rU   )r	   rV   r(   r)   payloadr   r   r   
callRemote   s   zProxy.callRemote)NN)rL   rM   rN   rO   rT   rU   r]   r   r   r   r   rQ   {   s
    

rQ   )rO   r   twisted.internetr   twisted.webr   r   r   Resourcer   rQ   r   r   r   r   <module>   s   `