a
    »ô_k¦  ã                   @   s\  d Z ddlmZ ddlZejdkr&eZzddlZW n e	yL   ddlZY n0 ddl
Z
ddlZddlZddlZddlZddlZddlmZmZmZmZmZ ddlmZmZmZmZ ddlmZmZmZ dd	lm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)mZm*Z* dd
l+m,Z, e -e.¡Z/G dd„ de0ƒZ1e2ddddddZ3G dd„ de4ƒZ5dd„ Z6e.dkrXdS )z*Pythonic simple SOAP Client implementationé    )Úunicode_literalsNÚ3é   )Ú
__author__Ú__copyright__Ú__license__Ú__version__ÚTIMEOUT)ÚSimpleXMLElementÚTYPE_MAPÚREVERSE_TYPE_MAPÚStruct)Úget_http_wrapperÚset_http_wrapperÚget_Http)ÚAliasÚfetchÚ	sort_dictÚmake_keyÚprocess_elementÚpostprocess_elementÚget_messageÚpreprocess_schemaÚget_local_nameÚget_namespace_prefixr   Úurlsplit)ÚUsernameTokenc                   @   s>   e Zd Zddd„Zdd„ Zejdkr*eZndd„ Zd	d
„ ZdS )Ú	SoapFaultNc                 C   s&   || _ || _|| _t | |||¡ d S ©N)Ú	faultcodeÚfaultstringÚdetailÚRuntimeErrorÚ__init__)Úselfr   r    r!   © r%   ú5/usr/lib/python3/dist-packages/pysimplesoap/client.pyr#   +   s    zSoapFault.__init__c                 C   s   d| j | jf S )Nú%s: %s)r   r    ©r$   r%   r%   r&   Ú__unicode__1   s    zSoapFault.__unicode__r   c                 C   s   |   ¡  dd¡S )NÚasciiÚignore)r)   Úencoder(   r%   r%   r&   Ú__str__7   s    zSoapFault.__str__c                 C   s    dt | jƒt | jƒt | jƒf S )Nz6SoapFault(faultcode = %s, faultstring %s, detail = %s))Úreprr   r    r!   r(   r%   r%   r&   Ú__repr__:   s    
þzSoapFault.__repr__)N)	Ú__name__Ú
__module__Ú__qualname__r#   r)   ÚsysÚversionr-   r/   r%   r%   r%   r&   r   *   s   

r   z)http://schemas.xmlsoap.org/soap/envelope/z"http://www.w3.org/2003/05/soap-envz'http://www.w3.org/2003/05/soap-envelope)Úsoap11ÚsoapÚsoapenvÚsoap12Z	soap12envc                   @   sÖ   e Zd ZdZddddddddddddddedddddddfdd„Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ ZdddœZdZdZdZd d!„ Zd"d#„ Zd,d$d%„Zd&d'„ Zd(d)„ Zd*d+„ ZdS )-Ú
SoapClientzSimple SOAP Client (simil PHP)NTÚ Fc           !      C   sà  || _ || _|| _|| _|| _|| _d | _| _|p6i | _|p@g | _	|| _
|	rx|
dkrxt|	ƒ\}}}}}tj || ¡}
|
| _|r¬|du r’tj}n|}tj|d t |¡ |s¼|s¼d| _n|sÌ|rÌd| _n|| _|| _i | _d| _|r4| d¡r4t ¡ \}}t |dd	¡}t d
| ¡ | |¡ |}| ¡  || _ t!ƒ } | ||||d| _"|rz|rzt#| j"dƒrz| j" $||¡ |r¦|r¦t#| j"dƒr¦| j"j%||dd || _&|sºd| _'nd| _'|	oÒ| j(|	|d| _)d| _*dS )zf
        :param http_headers: Additional HTTP Headers; example: {'Host': 'ipsec.example.com'}
        r:   T)Úlevelr6   r7   Nz-----BEGIN CERTIFICATE-----zw+béÿÿÿÿzSaving CA certificate to %s)ÚtimeoutÚcacertÚproxyÚsessionsÚadd_credentialsÚadd_certificate)ÚkeyÚcertZdomainaW  <?xml version="1.0" encoding="UTF-8"?>
<%(soap_ns)s:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:%(soap_ns)s="%(soap_uri)s">
<%(soap_ns)s:Header/>
<%(soap_ns)s:Body>
    <%(method)s xmlns="%(namespace)s">
    </%(method)s>
</%(soap_ns)s:Body>
</%(soap_ns)s:Envelope>zõ<?xml version="1.0" encoding="UTF-8"?>
<%(soap_ns)s:Envelope xmlns:%(soap_ns)s="%(soap_uri)s" xmlns:%(ns)s="%(namespace)s">
<%(soap_ns)s:Header/>
<%(soap_ns)s:Body><%(ns)s:%(method)s></%(ns)s:%(method)s></%(soap_ns)s:Body></%(soap_ns)s:Envelope>)Úcache)+ZcertsslZkeysslÚlocationÚactionÚ	namespaceÚ
exceptionsÚxml_requestÚxml_responseÚhttp_headersÚpluginsÚstrictr   ÚosÚpathÚdirnameÚwsdl_basedirÚloggingÚDEBUGZbasicConfigÚlogZsetLevelÚ_SoapClient__soap_nsÚ_SoapClient__soap_serverÚ_SoapClient__headersÚ_SoapClient__call_headersÚ
startswithÚtempfileZmkstempÚfdopenÚdebugÚwriteÚcloser>   r   ÚhttpÚhasattrrA   rB   Ú_SoapClient__nsÚ_SoapClient__xmlÚ
wsdl_parseÚservicesÚservice_port)!r$   rF   rG   rH   rD   rI   r?   ÚnsÚsoap_nsÚwsdlrR   rE   r>   r@   Zsoap_serverr=   rL   ZtraceZusernameZpasswordZkey_filerM   rN   Z
url_schemeZnetlocrP   ZqueryZfragmentr;   ÚfdÚfilenameÚfZHttpr%   r%   r&   r#   L   sd    



zSoapClient.__init__c                    s&   ˆj s‡ ‡fdd„S ‡ ‡fdd„S dS )z)Return a pseudo-method that can be calledc                     s   ˆj ˆ g| ¢R i |¤ŽS r   )Úcall©ÚargsÚkwargs©Úattrr$   r%   r&   Ú<lambda>¯   ó    z(SoapClient.__getattr__.<locals>.<lambda>c                     s   ˆj ˆ g| ¢R i |¤ŽS r   )Ú	wsdl_callrn   rq   r%   r&   rs   ±   rt   N)re   )r$   rr   r%   rq   r&   Ú__getattr__¬   s    zSoapClient.__getattr__c              
   O   s^  t | j }| jt|| j| j| j|d }t|| jo6| j| jd}| dd¡}|r^t| 	¡ ƒ}n|}|r¢t
|d tƒr¢|dtt  ¡ ƒd}	t|	|ƒ |	 |d ¡ n|r| jdks¼| jd	u rÀdnd
}
|D ]@\}}t|dƒrî|
rî|j dd
¡}n|
}t||ƒj|||d qÈn&| jdv r2t|dtt  ¡ ƒd|ƒ | jr\| js\tdd„ | j 	¡ D ƒƒ| _d| jv rŠ| jsŠt dt¡ | j tƒ ¡ | jrè|dtt  ¡ ƒd}| j 	¡ D ]6\}}t
|tƒrÐ| |¡ n|j||| jd	d q°|r|dtt  ¡ ƒd}| ¡ D ]}| |¡ q
| jD ]}| | ||||| j|¡ q"|  ¡ | _!|  "|| j!¡| _#t| j#| j| jdv d}| j$r4|dtt  ¡ ƒd	dr4|dtt  ¡ ƒd	d}d}|r| ¡ r| jdur|  %|¡}| ¡ d  &¡ }|d  |¡pöt'}| ¡ d j(|d	d}nt)| ¡ ƒ}t*t'|j+ƒt'|j,ƒ|ƒ‚| jD ]}| -| ||||| j|¡ q:|S )zùPrepare xml request and make SOAP call, returning a SimpleXMLElement.

        If a keyword argument called "headers" is passed with a value of a
        SimpleXMLElement object, then these headers will be inserted into the
        request.
        )ÚmethodrH   rg   rh   Úsoap_uri)rH   ÚprefixÚheadersNr   ÚBody©rg   ÚjettyFTÚ
namespaces)Zjbossas6c                 S   s"   g | ]\}}|  d ¡s||f‘qS )zwsse:)rZ   ©Ú.0ÚkÚvr%   r%   r&   Ú
<listcomp>á   s   
ÿz#SoapClient.call.<locals>.<listcomp>zwsse:Securityz/Replace wsse:Security with UsernameToken pluginZHeader)rg   Zadd_children_ns)r}   )rH   r}   ZFault©rg   Úerrorr!   Úfaults©rN   ).Úsoap_namespacesrV   rc   ÚdictrH   rb   r
   ÚpopÚlistÚitemsÚ
isinstanceÚvaluesÚdelattrÚimport_noderW   Ú	qualifiedra   r~   ÚgetÚgetattrZmarshallrX   re   rY   rM   ÚwarningsÚwarnÚDeprecationWarningÚappendr   ÚchildrenZ
preprocessZas_xmlrJ   ÚsendrK   rI   Úget_operationZget_nameÚunicodeÚ
unmarshallr.   r   r   r    Zpostprocess)r$   rw   ro   rp   rx   ÚxmlÚrequestZrequest_headersÚ
parametersÚbodyZuse_nsr   r‚   rg   ÚheaderZ	subheaderZpluginÚresponseZ	detailXmlr!   Ú	operationZ
fault_nameÚfaultr%   r%   r&   rm   ³   s    	
üÿ
ÿ
ÿ

ÿ 

þ
ÿzSoapClient.callc           	      C   s  | j dkrdS tdƒ}t| j ƒ}| jr2t| jƒ}nt| jƒ| }dtt|ƒƒdœ}| jdurld| d |d< | | j¡ t d| ¡ t 	d	 
d
d„ | ¡ D ƒ¡¡ t 	|¡ tjdk rÎtdd„ | ¡ D ƒƒ}| jj||||d\}}|| _|| _t 	d	 
dd„ | ¡ D ƒ¡¡ t 	|¡ |S )zSend SOAP request using HTTPÚtestNZPOSTztext/xml; charset="UTF-8")zContent-typezContent-lengthú"Z
SOAPActionzPOST %sÚ
c                 S   s   g | ]\}}d ||f ‘qS ©r'   r%   r   r%   r%   r&   rƒ   3  rt   z#SoapClient.send.<locals>.<listcomp>r   c                 s   s"   | ]\}}t |ƒt |ƒfV  qd S r   )Ústrr   r%   r%   r&   Ú	<genexpr>;  rt   z"SoapClient.send.<locals>.<genexpr>)r    rz   c                 S   s   g | ]\}}d ||f ‘qS r¨   r%   r   r%   r%   r&   rƒ   B  rt   )rF   r©   re   rG   ÚlenÚupdaterL   rU   Úinfor]   ÚjoinrŒ   r3   r4   r‰   r`   rž   r¢   Úcontent)	r$   rw   r   Zhttp_methodrF   Zsoap_actionrz   r¢   r¯   r%   r%   r&   r™     s2    

þ


ÿ

zSoapClient.sendc                 C   sÌ   | j  d¡rdpd}| jsv| j ¡ D ]N\}}dd„ |d  ¡ D ƒD ]"\}}|d |krB||f| _ q$qBtd| ƒ‚q$n| j| jd  d | jd	  }| js¤|d
 | _|d  |¡}|sÈtd|| jf ƒ‚|S )Nr8   r5   c                 S   s   g | ]}|‘qS r%   r%   )r€   Úportr%   r%   r&   rƒ   K  rt   z,SoapClient.get_operation.<locals>.<listcomp>ÚportsÚsoap_verz2Cannot determine service in WSDL: SOAP version: %sr   r   rF   Ú
operationsz5Operation %s not found in WSDL: Service/Port Type: %s)rV   rZ   rf   re   rŒ   r"   rF   r’   )r$   rw   r²   Úservice_nameÚserviceZ	port_namer°   r£   r%   r%   r&   rš   F  s&    
ÿ

þzSoapClient.get_operationc                 O   s   |   |||¡S )úFPre and post process SOAP call, input and output parameters using WSDL)Úwsdl_call_with_args)r$   rw   ro   rp   r%   r%   r&   ru   ]  s    zSoapClient.wsdl_callc                 C   sÈ   t | j }|  |¡}|d }|d }| d¡}d|v r@|d | _d|v r`|d pRd| _|d | _|rrt|| jƒ| _	|  
||||¡\}}	| j|g|	¢R Ž }
|
d|d	 ¡ j|| jd
}|oÆt| ¡ ƒd S )r¶   ÚinputÚoutputr¡   rG   rH   r:   r‘   r{   r|   r‡   r   )rˆ   rV   rš   r’   rG   rH   r‘   r   rX   rY   Úwsdl_call_get_paramsrm   r˜   rœ   rN   r‹   rŽ   )r$   rw   ro   rp   rx   r£   r¸   r¹   r¡   Úparamsr¢   Zrespr%   r%   r&   r·   a  s     




zSoapClient.wsdl_call_with_argsc                 C   sz  d } }}i }|r,t | ¡ ƒd }|| }|rœ|rœi }	t|ƒD ]L\}
}t | ¡ ƒ|
 }t|tƒr„||vrvtd| ƒ‚|| |	|< q@||	|< q@| ||	i¡ |rd|s¬|rd|r¾| ||i¡ |  ||¡\}}}|sàtd| ƒ‚t	||ƒ}t | 
¡ ƒd }g }| ¡ D ]D\}}|j| }|j| s:t|tƒr:||jd< | ||f¡ q| jdv r^|}n|}n|op| ¡ }||fS )z'Build params from input and args/kwargsNr   z)Unhandled key %s. use client.help(method)z"Invalid Args Structure. Errors: %s)Zaxis)r‹   ÚkeysÚ	enumerater   r‰   ÚKeyErrorr¬   Úwsdl_validate_paramsÚ
ValueErrorr   rŽ   rŒ   r~   Ú
referencesr   r—   rW   )r$   rw   r¸   ro   rp   r»   Z	inputnameZ	inputargsZall_argsÚdÚidxÚargrC   ÚvalidÚerrorsr”   ZtreeÚrootr   r‚   Zroot_nsr%   r%   r&   rº   |  sD    




zSoapClient.wsdl_call_get_paramsc              
   C   sŒ  g }g }d}t |ƒt |ƒkr d}t|tƒs:t|tƒr:d}nd}|tkrJt}t|tttfƒsº|t ¡ v rºt |ƒ|ks¶|dur¶z||ƒ W n.   d}| 	dt |ƒ|t |ƒ|f ¡ Y n0 nÈt|tƒrt
|ƒdkrt|tƒs|  |d |¡\}}}	|sþd}| |¡ | |	¡ nlt|tƒr|rÂ|rÂ|D ]b}
|
|vrZd}| 	d|
||f ¡ n8|  ||
 ||
 ¡\}}}	|s~d}| |¡ | |	¡ q2|D ]$}
|
|vrš| 	d|
||f ¡ qšnD|râ|sâ| 	d	||f ¡ n$|s‚|r‚d}| 	d
||f ¡ n nzt|tƒrZ|d }|D ]6}|  ||¡\}}}	|s@d}| |¡ | |	¡ q n(|s‚d}| 	dt |ƒ|t |ƒ|f ¡ |||fS )z‚Validate the arguments (actual values) for the parameters structure.
           Fail for any invalid arguments or type mismatches.TFNzBType mismatch for argument value. parameter(%s): %s, value(%s): %sr   r   z9Argument key %s not in parameter. parameter: %s, args: %sz6Parameter key %s not in args. parameter: %s, value: %sz3parameter keys not in args. parameter: %s, args: %sz3Args keys not in parameter. parameter: %s, args: %sz/Type mismatch. parameter(%s): %s, value(%s): %s)Útyper   r‰   r©   r›   r‹   Útupler   r¼   r—   r«   r¿   Úextend)r$   ZstructÚvaluerÆ   r”   rÅ   Z	typematchZ
next_validZnext_errorsZnext_warningsrC   Zstruct_list_valueÚitemr%   r%   r&   r¿   °  sn    (&




zSoapClient.wsdl_validate_paramsc                 C   s¼   |   |¡}| d¡}|o.| ¡ o.t| ¡ ƒd }t|tƒrTd dd„ | ¡ D ƒ¡}nt|tƒrft|ƒ}| d¡}|rˆt|d  ¡ ƒd }| d¡p”d}d	||p d
|r¨|pªd
| dd
¡|f S )zDReturn operation documentation and invocation/returned value exampler¸   r   z, c                 s   s"   | ]\}}d |t |ƒf V  qdS )z%s=%sN)r.   r   r%   r%   r&   rª   ý  rt   z"SoapClient.help.<locals>.<genexpr>r¹   rz   Nz%s(%s)
 -> %s:

%s
Headers: %sr:   Údocumentation)	rš   r’   rŽ   r‹   r   r‰   r®   rŒ   r.   )r$   rw   r£   r¸   r¹   rz   r%   r%   r&   Úhelp÷  s$    






ûzSoapClient.helpr5   r8   )z%http://schemas.xmlsoap.org/wsdl/soap/z'http://schemas.xmlsoap.org/wsdl/soap12/z http://schemas.xmlsoap.org/wsdl/z http://www.w3.org/2001/XMLSchemaz)http://www.w3.org/2001/XMLSchema-instancec                 C   sò   t || j||| j| jƒ}t|| jd}d| _t|dddƒp>d| _i }| 	¡ pPg D ]š}| 
¡ dv rR|d }|d }	|	d	u rŠt d
| ¡ qR|	|v r¢t d|	 ¡ qR|||	< t d||	f ¡ t |	| j||| j| jƒ}t|| jd}
| |
¡ qR|S )zJUnmarshall the WSDL at the given url into a tree of SimpleXMLElement nodes)rH   r:   rÍ   F©r…   ÚimportrH   rF   Nz"WSDL location not provided for %s!zWSDL %s already imported!zImporting wsdl %s from %s)r   r`   rR   rL   r
   Úwsdl_urirH   r›   rÍ   r˜   r   rU   Zwarningr]   Úxsd_urir   )r$   ÚurlrE   Úforce_downloadr   ri   Zimported_wsdlsÚelementZwsdl_namespaceZwsdl_locationZimported_wsdlr%   r%   r&   Ú_url_to_xml_tree  s*    zSoapClient._url_to_xml_treec           K      C   s0	  d}i }|dd… D ]D\}}|| j v r<| d¡r<||t|ƒ< || jkr| d¡rt|ƒ}qi }i }	i }
i }i }dt|dd… ƒ ¡ v râ|dddrÂ|jd| jd}t|dd… ƒ}| d	| j¡| _| jrÒ| jd
krâ|d	 pÞ| j| _i }d| ji}|dddpþg D ]L}|d| jdd}|pg D ]*}t	|||| j| j
| j||| j|d
 qq t|g ƒ |jD ]|}|dddptg D ]`}i }|d }|s–|d }t|ƒ}| |¡}|d p´d}|| jkrRt|ƒ}t |d¡}||i}|d |f|	vrtƒ }||jd< |d |i|	|d |f< n|	|d |f  ¡ d }||j|< d|j|< | |¡ n„t|ƒ}| t|d|ƒ¡}|s¾| t|d|ƒ¡}tƒ }|||< ||jd< ||j|< d|j|< |d |i}n||i}||	|d |f< qvq^|jD ],}|d }i  }|
|< i  }|d< |jD ]þ} | d }!i  }"||!< | d |"d< | d p@d d¡|"d< t| dddƒp`d|"d< | dddr¢t| jd ƒ|"d< t| jd ƒ}#|  |#¡|"d< | dddrÂt| jd ƒ|"d< i  }$|"d < | d!dd}%|%dur| d!ddD ]}&t|&d ƒ|$|&d < qðqqä|jD ] }'t|'d ƒ}||
vr:q|
| }|'d }(|'d"t| ¡ ƒdd})|)rp|)d# prd}*|)r„|)d p†d}+|(t  |d ¡||*|+d$œ },||(< |'jD ]} | d }!| d%t| ¡ ƒdd}-|-oà|-d& }.|,d  !|!i ¡}"|!|"d< |" d|+¡|"d< |.dur|.|"d'< | ddd}/|/oB|/d(t| ¡ ƒdd}0|0rT|0d) pVd}1g }2|/ov|/d*t| ¡ ƒdd}3|3p€g D ]"}4|4d |4d d+œ}5|2 "|5¡ q‚d|"v r¤i }3|2D ]J}6t|6 d¡ƒ}7t|6 d¡ƒ}8t#|	|7pè|"d |8ƒ}5|5r¸|3 |5¡ n q¸t#|	|"d |1|"d ƒ|"d< |3|"d*< z(t|"d  ¡ ƒd }|jd }9|j$}:W n6 t%t&fy„ }; z|"d }9d}:W Y d};~;n
d};~;0 0 |9rœ|9|"d< |:|"d,< |"d= nd|"d< d|"d*< | ddd}<|<oÚ|<d(t| ¡ ƒdd}0|0rì|0d) pîd}=d|"v rt#|	|"d |=ƒ|"d< |"d= nd|"d< d |"v rhi  }%|"d-< |"d   ¡ D ]&}>t#|	|>|=ƒ}?t|?ƒd }@|?|%|@< q@g }A|<o†|<d*t| ¡ ƒdd}3|3pg D ]"}4|4d |4d d+œ}5|A "|5¡ q’q°q|d.ddpÎg D ]è}B|Bd }C|CsæqÐ| !|Ci ¡}Di  }E|Dd/< |Bd p
d|Dd< |Bj'D ]ž}Ft|Fd" ƒ}(|(|vr4qt  ||( ¡ },|E|Fd < |Fd0t| ¡ ƒdd}G|Grt|Gd1 pvd}H|GoŠ| |G (¡ ¡}I|Ioœ| j  |I¡}J|, |H|C|I|Jd2œ¡ qqÐ|sÐd/ddii|d< td3d4„ | ¡ D ƒƒt)d5d4„ | ¡ D ƒƒ }d};g | _*|D ] }|;|k	r$| j* "|¡ |};	q
|S )6zNConvert SimpleXMLElement tree representation of the WSDL into pythonic objectsNzxmlns:zhttp://xml.apache.org/xml-soapÚtypesFrÏ   Úschemar|   ZtargetNamespacezurn:DefaultNamespacer„   )Úglobal_namespacesÚpartrÕ   rÈ   Únamer   ZcomplexTyper³   ÚstyleZparameterOrderr:   ú Zparameter_orderrÍ   r¸   ÚmessageZ	input_msgrH   r¹   Z
output_msgÚ
fault_msgsr¤   ÚbindingÚ	transport)rÛ   r³   Úport_type_namerá   rÜ   r£   Z
soapActionrG   r    Úpartsr¡   )rÞ   rÚ   r‘   r†   rµ   r±   ÚaddressrF   )rF   r´   rx   r²   c                 s   s   | ]}t |ƒt u r|V  qd S r   ©rÈ   ©r€   Úer%   r%   r&   rª   6  rt   z3SoapClient._xml_tree_to_services.<locals>.<genexpr>c                 s   s   | ]}t |ƒt ur|V  qd S r   rå   ræ   r%   r%   r&   rª   6  rt   )+Úsoap_ns_urisrZ   r   rÒ   r‰   rŽ   r×   r’   rH   r   rW   r`   rR   r   rÞ   r   Zget_namespace_urir   r   r~   rÁ   r¬   r   ZportTyper£   Úsplitr›   r¸   r¹   rà   r‹   ÚcopyÚdeepcopyÚ
setdefaultr—   r   r‘   ÚAttributeErrorr¾   r°   Z
get_prefixÚsortedÚelements)Kr$   ri   rE   rÔ   Zxsd_nsZ	soap_urisr   r‚   rï   ZmessagesZ
port_typesZbindingsre   rØ   ÚattrsZimported_schemasrÙ   r×   ZschemasrÞ   rÚ   rÕ   Zelement_nameZtype_nsZtype_uriZ	part_nameÚfnZodZport_type_noderâ   Z	port_typer³   Zoperation_nodeZop_nameÚoprg   rß   r†   r¤   Zbinding_nodeZbinding_nameZsoap_bindingrá   rÜ   rà   Zop_oprG   r¸   r    Zparts_input_bodyZparts_input_headersrz   r¡   ZhdrZinput_headerZ
header_msgZheader_partZns_urir‘   rç   r¹   Zparts_output_bodyÚmsgZmsg_objZtag_nameZparts_output_headersrµ   r´   Zservr±   r°   rä   rF   rx   r²   r%   r%   r&   Ú_xml_tree_to_services7  sz   


ý









 
û







ü,z SoapClient._xml_tree_to_servicesc           	      C   sr  t  d| ¡ d}|rdt |¡ ¡  }t|tƒrBtj 	||¡}tj 
|¡rt  d|f ¡ t|dƒ}t |¡}| ¡  |d dd… t d	¡d
 dd… ks®|d |krìt dt¡ t  d|d tf ¡ t  d|d |f ¡ d}n|d | _|d | _|d S ttd< |  |||¡}|  |||¡}|rnt|dƒ}t d	¡d
 || j| j|dœ}t ||¡ | ¡  |S )z"Parse Web Service Description v1.1zParsing wsdl url: %sFz%s.pklzUnpickle file %sÚrr4   Nr<   rÝ   r   rÓ   z/version or url mismatch! discarding cached wsdlzVersion: %s %sz
URL: %s %sTrH   rÍ   re   ÚstringÚwb)r4   rÓ   rH   rÍ   re   )rU   r]   ÚhashlibZmd5Z	hexdigestr   Z
basestringrO   rP   r®   ÚexistsÚopenÚpickleÚloadr_   r   ré   r”   r•   ÚRuntimeWarningrH   rÍ   r©   r   rÖ   rô   Údump)	r$   rÓ   rE   rÔ   Zfilename_pklrl   Zpklri   re   r%   r%   r&   rd   ?  sB    


2


ûzSoapClient.wsdl_parsec                 C   s   || j |< dS )zCSet SOAP Header value - this header will be sent for every request.N)rX   )r$   rÌ   rË   r%   r%   r&   Ú__setitem__r  s    zSoapClient.__setitem__c                 C   s:   | j  ¡  | j t ¡ ¡r6t d| j ¡ t 	| j¡ dS )z+Finish the connection and remove temp fileszremoving %sN)
r`   r_   r>   rZ   r[   Z
gettempdirrU   r]   rO   Úunlinkr(   r%   r%   r&   r_   v  s    
zSoapClient.closec              	   C   s&  d}|d7 }| j D ]X}t|tƒr(|j}n6t|tƒr:|j}n$t|tƒr|jd dkrt|ƒ}nq|d| 7 }q| j	D ]¬}|d| 7 }| j	| d }|D ]†}|| }|d d kr²q–|d	|d
  7 }|d|d  7 }|d|d  7 }|d|d  7 }|d7 }|d }t
|ƒD ]}|  |¡}| d¡}|oB| ¡ oBt| ¡ ƒd }d}	t|tƒrÎd|vsl|d d krÎ| ¡ D ]X\}
}t|tƒr|j}n*t|tƒr¤|j}nt|tƒrº|jd }|	d|
|f 7 }	qt| d¡}|ròt|d  ¡ ƒd }|d|d
 |	d d… f 7 }|d| 7 }q
q–qr|S )NzSOAP CLIENTz

 ELEMENTSr   rÕ   z
  %sz
 SERVICE (%s)r±   r²   z
   PORT (%s)rÛ   z
    Location: %srF   z
    Soap ver: %sz
    Soap URI: %srx   z
    OPERATIONSr³   r¸   r   r:   rŸ   z%s: %s, r¹   z
     %s(%s)éþÿÿÿz
      > %s)rï   r   rÈ   r0   r   Zxml_typer   rC   r.   re   rî   rš   r’   rŽ   r‹   r‰   rŒ   )r$   Úsrç   rµ   r±   r°   r³   r£   r¸   Z	input_strr   r‚   r¹   r%   r%   r&   r/   }  s^    






 


þzSoapClient.__repr__)F)r0   r1   r2   Ú__doc__r	   r#   rv   rm   r™   rš   ru   r·   rº   r¿   rÎ   rè   rÑ   rÒ   Zxsi_urirÖ   rô   rd   rÿ   r_   r/   r%   r%   r%   r&   r9   J   s@   
ú
`j)4Gþ#  

3r9   c                 C   s€   i }| du rdS d| v r(|   d¡\}}n
d|  }}d|v r^|  d¡\}}|t|ƒ |d< |d< d|v r||  d¡\|d< |d< |S )	zJParses proxy address user:pass@host:port into a dict suitable for httplib2Nú@r:   ú:Z
proxy_hostZ
proxy_portZ
proxy_userZ
proxy_pass)ré   Úint)Z	proxy_strZ
proxy_dictZ	user_passZ	host_portZhostr°   r%   r%   r&   Úparse_proxy°  s    
r  Ú__main__)7r  Z
__future__r   r3   r4   r©   r›   ZcPicklerû   ÚImportErrorrê   rø   rS   rO   r[   r”   r:   r   r   r   r   r	   Z	simplexmlr
   r   r   r   rá   r   r   r   Zhelpersr   r   r   r   r   r   r   r   r   r   r   Zwsser   Z	getLoggerr0   rU   r"   r   r‰   rˆ   Úobjectr9   r  r%   r%   r%   r&   Ú<module>   sL   
8
û	      l
