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 )ÚSOAPPublisherz»Publish 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 )z»Lookup 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   `