B
    v9a^              
   @   sf  d dl Z d dlZd dlZd dlmZ d dlmZ d dlZd dlZ	d dl
mZ d dlZd dlmZ yd dlZW n ek
r   dZY nX dd Zdejdd	  Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!G dd de"Z#G dd de#Z$G dd de#Z%G dd de#Z&e' Z(Z)edddZ*e*+dd krFd!d" Z,n"e*+d#d kr`d$d" Z,nd%d" Z,[*d&d' Z-G d(d) d)Z.d*d+ Z/d,d- Z0G d.d/ d/Z1d0d1 Z2e.e1fZ3G d2d3 d3Z4G d4d5 d5Z5G d6d7 d7Z6G d8d9 d9Z7G d:d; d;Z8G d<d= d=Z9d Z: Z;Z<dXd?d@Z=dYdAdBZ>dZdCdDZ?dEdF Z@d[dHdIZAG dJdK dKerTejBneCZDG dLdM dMZEG dNdO dOZFG dPdQ dQeFZGG dRdS dSZHeHZIeJdTkrbeHdUZKyeLeKjMN  W n. e#k
r ZO zeLdVeO W ddZO[OX Y nX e9eKZPePQ  ePRd	dW ePSdd	 yxeP D ]ZTeLeT qW W n. e#k
r` ZO zeLdVeO W ddZO[OX Y nX dS )\    N)datetime)Decimal)expat)BytesIOc             C   s$   |  dd} |  dd} |  ddS )N&z&amp;<z&lt;>z&gt;)replace)s r   /usr/lib/python3.7/client.pyescape   s    r   z%d.%d   ii   iDiiipiԁiCiBiiic               @   s   e Zd Zdd ZdS )Errorc             C   s   t | S )N)repr)selfr   r   r   __str__   s    zError.__str__N)__name__
__module____qualname__r   r   r   r   r   r      s   r   c               @   s   e Zd Zdd Zdd ZdS )ProtocolErrorc             C   s&   t |  || _|| _|| _|| _d S )N)r   __init__urlerrcodeerrmsgheaders)r   r   r   r   r   r   r   r   r      s
    
zProtocolError.__init__c             C   s   d| j j| j| j| jf S )Nz<%s for %s: %s %s>)	__class__r   r   r   r   )r   r   r   r   __repr__   s    zProtocolError.__repr__N)r   r   r   r   r   r   r   r   r   r      s   r   c               @   s   e Zd ZdS )ResponseErrorN)r   r   r   r   r   r   r   r      s   r   c               @   s   e Zd Zdd Zdd ZdS )Faultc             K   s   t |  || _|| _d S )N)r   r   	faultCodefaultString)r   r    r!   Zextrar   r   r   r      s    
zFault.__init__c             C   s   d| j j| j| jf S )Nz<%s %s: %r>)r   r   r    r!   )r   r   r   r   r      s    zFault.__repr__N)r   r   r   r   r   r   r   r   r   r      s   r      z%YZ0001c             C   s
   |  dS )Nz%Y%m%dT%H:%M:%S)strftime)valuer   r   r   _iso8601_format  s    r%   z%4Yc             C   s
   |  dS )Nz%4Y%m%dT%H:%M:%S)r#   )r$   r   r   r   r%     s    c             C   s   |  ddS )Nz%Y%m%dT%H:%M:%S   )r#   zfill)r$   r   r   r   r%     s    c             C   sL   t | trt| S t | ttjfs<| dkr2t } t| } d| d d  S )Nr   z%04d%02d%02dT%02d:%02d:%02d   )
isinstancer   r%   tupletimeZstruct_timeZ	localtime)r$   r   r   r   	_strftime  s    

r,   c               @   sn   e Zd Zd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 Zdd ZdS )DateTimer   c             C   s    t |tr|| _n
t|| _d S )N)r)   strr$   r,   )r   r$   r   r   r   r   )  s    
zDateTime.__init__c             C   s   t |tr| j}|j}nzt |tr2| j}t|}n`t |trH| j}|}nJt|drd|  }| }n.t|drv|jj	p|t
|}td| jj	|f ||fS )N	timetupler   zCan't compare %s and %s)r)   r-   r$   r   r%   r.   hasattrr/   r   r   type	TypeError)r   otherr
   oZotyper   r   r   make_comparable/  s$    






zDateTime.make_comparablec             C   s   |  |\}}||k S )N)r5   )r   r3   r
   r4   r   r   r   __lt__D  s    zDateTime.__lt__c             C   s   |  |\}}||kS )N)r5   )r   r3   r
   r4   r   r   r   __le__H  s    zDateTime.__le__c             C   s   |  |\}}||kS )N)r5   )r   r3   r
   r4   r   r   r   __gt__L  s    zDateTime.__gt__c             C   s   |  |\}}||kS )N)r5   )r   r3   r
   r4   r   r   r   __ge__P  s    zDateTime.__ge__c             C   s   |  |\}}||kS )N)r5   )r   r3   r
   r4   r   r   r   __eq__T  s    zDateTime.__eq__c             C   s   t | jdS )Nz%Y%m%dT%H:%M:%S)r+   strptimer$   )r   r   r   r   r/   X  s    zDateTime.timetuplec             C   s   | j S )N)r$   )r   r   r   r   r   `  s    zDateTime.__str__c             C   s   d| j j| jt| f S )Nz<%s %r at %#x>)r   r   r$   id)r   r   r   r   r   c  s    zDateTime.__repr__c             C   s   t | | _d S )N)r.   stripr$   )r   datar   r   r   decodef  s    zDateTime.decodec             C   s$   | d | | j | d d S )Nz<value><dateTime.iso8601>z</dateTime.iso8601></value>
)writer$   )r   outr   r   r   encodei  s    
zDateTime.encodeN)r   )r   r   r   r   r5   r6   r7   r8   r9   r:   r/   r   r   r?   rB   r   r   r   r   r-   #  s   
r-   c             C   s   t  }||  |S )N)r-   r?   )r>   r$   r   r   r   	_datetimen  s    
rC   c             C   s   t | dS )Nz%Y%m%dT%H:%M:%S)r   r;   )r>   r   r   r   _datetime_typet  s    rD   c               @   s6   e Zd ZdddZdd Zdd Zdd	 Zd
d ZdS )BinaryNc             C   s>   |d krd}n&t |ttfs,td|jj t|}|| _d S )N    z#expected bytes or bytearray, not %s)r)   bytes	bytearrayr2   r   r   r>   )r   r>   r   r   r   r     s    zBinary.__init__c             C   s   t | jdS )Nzlatin-1)r.   r>   )r   r   r   r   r     s    zBinary.__str__c             C   s   t |tr|j}| j|kS )N)r)   rE   r>   )r   r3   r   r   r   r:     s    
zBinary.__eq__c             C   s   t || _d S )N)base64decodebytesr>   )r   r>   r   r   r   r?     s    zBinary.decodec             C   s4   | d t| j}| |d | d d S )Nz<value><base64>
asciiz</base64></value>
)r@   rI   encodebytesr>   r?   )r   rA   encodedr   r   r   rB     s    
zBinary.encode)N)r   r   r   r   r   r:   r?   rB   r   r   r   r   rE   }  s
   
rE   c             C   s   t  }||  |S )N)rE   r?   )r>   r$   r   r   r   _binary  s    
rN   c               @   s$   e Zd Zdd Zdd Zdd ZdS )ExpatParserc             C   sD   t d d  | _}|| _|j|_|j|_|j|_	d }|
|d  d S )N)r   ZParserCreate_parser_targetstartZStartElementHandlerendZEndElementHandlerr>   ZCharacterDataHandlerxml)r   targetparserencodingr   r   r   r     s    zExpatParser.__init__c             C   s   | j |d d S )Nr   )rP   Parse)r   r>   r   r   r   feed  s    zExpatParser.feedc             C   s8   y
| j }W n tk
r   Y nX | `| ` |dd d S )NrF   T)rP   AttributeErrorrQ   rX   )r   rV   r   r   r   close  s    
zExpatParser.closeN)r   r   r   r   rY   r[   r   r   r   r   rO     s   	rO   c               @   s   e Zd ZdddZi Zdd Zdd Zd	d
 Zeeed< dd Z	e	ee
< dd Zeee< eZdd Zeee< efddZeee< dd Zeee< eee< dd Zeee< eee< efddZeee< dd Zeee< dd Zeee< eee< eed< dS )
MarshallerNFc             C   s   i | _ d | _|| _|| _d S )N)memor>   rW   
allow_none)r   rW   r^   r   r   r   r     s    zMarshaller.__init__c             C   s   g }|j }| j}t|tr@|d ||j|jd| |d n8|d x&|D ]}|d ||| |d qNW |d d|}|S )	Nz<fault>
)r    r!   z	</fault>
z	<params>
z<param>
z	</param>
z
</params>
 )append_Marshaller__dumpr)   r   r    r!   join)r   valuesrA   r@   dumpvresultr   r   r   dumps  s"    




zMarshaller.dumpsc             C   s   y| j t| }W nj tk
r|   t|ds<tdt| x0t|jD ]"}|| j  krHtdt| qHW | j d }Y nX || || d S )N__dict__zcannot marshal %s objects_arbitrary_instance)dispatchr1   KeyErrorr0   r2   __mro__keys)r   r$   r@   fZtype_r   r   r   Z__dump  s    
zMarshaller.__dumpc             C   s   | j std|d d S )Nz0cannot marshal None unless allow_none is enabledz<value><nil/></value>)r^   r2   )r   r$   r@   r   r   r   dump_nil  s    zMarshaller.dump_nilc             C   s$   |d ||rdpd |d d S )Nz<value><boolean>10z</boolean></value>
r   )r   r$   r@   r   r   r   	dump_bool  s    zMarshaller.dump_boolc             C   s<   |t ks|tk rtd|d |tt| |d d S )Nzint exceeds XML-RPC limitsz<value><int>z</int></value>
)MAXINTMININTOverflowErrorr.   int)r   r$   r@   r   r   r   	dump_long  s
    zMarshaller.dump_longc             C   s    |d |t | |d d S )Nz<value><double>z</double></value>
)r   )r   r$   r@   r   r   r   dump_double%  s    zMarshaller.dump_doublec             C   s    |d ||| |d d S )Nz<value><string>z</string></value>
r   )r   r$   r@   r   r   r   r   dump_unicode+  s    zMarshaller.dump_unicodec             C   s,   |d t |}||d |d d S )Nz<value><base64>
rK   z</base64></value>
)rI   rL   r?   )r   r$   r@   rM   r   r   r   
dump_bytes1  s    
zMarshaller.dump_bytesc             C   s^   t |}|| jkrtdd | j|< | j}|d x|D ]}||| q8W |d | j|= d S )Nz"cannot marshal recursive sequencesz<value><array><data>
z</data></array></value>
)r<   r]   r2   ra   )r   r$   r@   ird   re   r   r   r   
dump_array9  s    


zMarshaller.dump_arrayc             C   s   t |}|| jkrtdd | j|< | j}|d xP| D ]D\}}|d t|ts^td|d||  ||| |d q<W |d | j|= d S )Nz%cannot marshal recursive dictionariesz<value><struct>
z	<member>
zdictionary key must be stringz<name>%s</name>
z
</member>
z</struct></value>
)r<   r]   r2   ra   itemsr)   r.   )r   r$   r@   r   r{   rd   kre   r   r   r   dump_structG  s    



zMarshaller.dump_structc             C   s    |d |t | |d d S )Nz<value><dateTime.iso8601>z</dateTime.iso8601></value>
)r,   )r   r$   r@   r   r   r   dump_datetimeY  s    zMarshaller.dump_datetimec             C   s2   |j tkr || _||  | `n| |j| d S )N)r   WRAPPERSr@   rB   r   rh   )r   r$   r@   r   r   r   dump_instance_  s
    

zMarshaller.dump_instanceri   )NF) r   r   r   r   rj   rg   ra   ro   r1   rr   boolrw   rv   Zdump_intrx   floatr   ry   r.   rz   rG   rH   r|   r*   listr   dictr   r   r   r-   rE   r   r   r   r   r\     s:   
	r\   c               @   sj  e Zd ZdDddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
i Zdd Zeed< dd Zeed< dd Zeed< eed< eed< eed< eed< eed< d d! Zeed"< eed#< d$d% Zeed&< d'd( Zeed)< eed*< d+d, Zeed-< d.d/ Zeed0< d1d2 Zeed3< d4d5 Zeed6< d7d8 Zeed9< d:d; Zeed<< d=d> Zeed?< d@dA ZeedB< dCS )EUnmarshallerFc             C   sH   d | _ g | _g | _g | _d| _d | _d| _| jj| _|p:|| _|| _	d S )NFzutf-8)
_type_stack_marks_data_value_methodname	_encodingr`   _use_datetime
_use_bytes)r   use_datetimeuse_builtin_typesr   r   r   r     s    

zUnmarshaller.__init__c             C   s:   | j d ks| jrt | j dkr0tf | jd t| jS )Nfaultr   )r   r   r   r   r   r*   )r   r   r   r   r[     s
    
zUnmarshaller.closec             C   s   | j S )N)r   )r   r   r   r   getmethodname  s    zUnmarshaller.getmethodnamec             C   s
   || _ d S )N)r   )r   rW   Z
standaloner   r   r   rT     s    zUnmarshaller.xmlc             C   sh   d|kr| dd }|dks&|dkr8| jt| j g | _| jrZ|| jkrZtd| |dk| _d S )N:arraystructzunknown tag %rr$   )	splitr   r`   lenr   r   r   rj   r   )r   tagZattrsr   r   r   rR     s    zUnmarshaller.startc             C   s   | j | d S )N)r   r`   )r   textr   r   r   r>     s    zUnmarshaller.datac             C   sp   y| j | }W nN tk
r\   d|kr*d S y| j |dd  }W n tk
rV   d S X Y nX || d| jS )Nr   r   r_   )rj   rk   r   rb   r   )r   r   rn   r   r   r   rS     s    zUnmarshaller.endc             C   sh   y| j | }W nN tk
r\   d|kr*d S y| j |dd  }W n tk
rV   d S X Y nX || |S )Nr   r   )rj   rk   r   )r   r   r>   rn   r   r   r   end_dispatch  s    zUnmarshaller.end_dispatchc             C   s   |  d  d| _d S )Nr   )r`   r   )r   r>   r   r   r   end_nil  s    
zUnmarshaller.end_nilZnilc             C   s:   |dkr|  d n|dkr(|  d ntdd| _d S )Nrq   Frp   Tzbad boolean valuer   )r`   r2   r   )r   r>   r   r   r   end_boolean  s    zUnmarshaller.end_booleanbooleanc             C   s   |  t| d| _d S )Nr   )r`   rv   r   )r   r>   r   r   r   end_int  s    zUnmarshaller.end_intZi1Zi2Zi4Zi8rv   Z
bigintegerc             C   s   |  t| d| _d S )Nr   )r`   r   r   )r   r>   r   r   r   
end_double  s    zUnmarshaller.end_doubleZdoubler   c             C   s   |  t| d| _d S )Nr   )r`   r   r   )r   r>   r   r   r   end_bigdecimal  s    zUnmarshaller.end_bigdecimalZ
bigdecimalc             C   s&   | j r|| j }| | d| _d S )Nr   )r   r?   r`   r   )r   r>   r   r   r   
end_string  s    
zUnmarshaller.end_stringstringnamec             C   s.   | j  }| j|d  g| j|d < d| _d S )Nr   )r   popr   r   )r   r>   markr   r   r   	end_array  s    
zUnmarshaller.end_arrayr   c             C   sd   | j  }i }| j|d  }x,tdt|dD ]}||d  ||| < q.W |g| j|d < d| _d S )Nr   r   r"   )r   r   r   ranger   r   )r   r>   r   r   r}   r{   r   r   r   
end_struct   s    
zUnmarshaller.end_structr   c             C   s6   t  }||d | jr"|j}| | d| _d S )NrK   r   )rE   r?   rB   r   r>   r`   r   )r   r>   r$   r   r   r   
end_base64  s    
zUnmarshaller.end_base64rI   c             C   s,   t  }|| | jrt|}| | d S )N)r-   r?   r   rD   r`   )r   r>   r$   r   r   r   end_dateTime  s
    
zUnmarshaller.end_dateTimezdateTime.iso8601c             C   s   | j r| | d S )N)r   r   )r   r>   r   r   r   	end_value  s    zUnmarshaller.end_valuer$   c             C   s
   d| _ d S )Nparams)r   )r   r>   r   r   r   
end_params#  s    zUnmarshaller.end_paramsr   c             C   s
   d| _ d S )Nr   )r   )r   r>   r   r   r   	end_fault'  s    zUnmarshaller.end_faultr   c             C   s"   | j r|| j }|| _d| _d S )N
methodName)r   r?   r   r   )r   r>   r   r   r   end_methodName+  s    zUnmarshaller.end_methodNamer   N)FF)r   r   r   r   r[   r   rT   rR   r>   rS   r   rj   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s  sX   
	r   c               @   s$   e Zd Zdd Zdd Zdd ZdS )_MultiCallMethodc             C   s   || _ || _d S )N)_MultiCallMethod__call_list_MultiCallMethod__name)r   Z	call_listr   r   r   r   r   8  s    z_MultiCallMethod.__init__c             C   s   t | jd| j|f S )Nz%s.%s)r   r   r   )r   r   r   r   r   __getattr__;  s    z_MultiCallMethod.__getattr__c             G   s   | j | j|f d S )N)r   r`   r   )r   argsr   r   r   __call__=  s    z_MultiCallMethod.__call__N)r   r   r   r   r   r   r   r   r   r   r   5  s   r   c               @   s   e Zd Zdd Zdd ZdS )MultiCallIteratorc             C   s
   || _ d S )N)results)r   r   r   r   r   r   D  s    zMultiCallIterator.__init__c             C   sR   | j | }t|ti kr.t|d |d n t|tg krF|d S tdd S )Nr    r!   r   z#unexpected type in multicall result)r   r1   r   
ValueError)r   r{   itemr   r   r   __getitem__G  s    
zMultiCallIterator.__getitem__N)r   r   r   r   r   r   r   r   r   r   @  s   r   c               @   s0   e Zd Zdd Zdd ZeZdd Zdd Zd	S )
	MultiCallc             C   s   || _ g | _d S )N)_MultiCall__server_MultiCall__call_list)r   serverr   r   r   r   a  s    zMultiCall.__init__c             C   s   d| j jt| f S )Nz<%s at %#x>)r   r   r<   )r   r   r   r   r   e  s    zMultiCall.__repr__c             C   s   t | j|S )N)r   r   )r   r   r   r   r   r   j  s    zMultiCall.__getattr__c             C   s:   g }x"| j D ]\}}|||d qW t| jj|S )N)r   r   )r   r`   r   r   systemZ	multicall)r   Zmarshalled_listr   r   r   r   r   r   m  s    zMultiCall.__call__N)r   r   r   r   r   r   r   r   r   r   r   r   r   P  s
   r   Fc             C   sr   t rHtrH|rt}tj}n| r&t}t}nt}t}tdd||t}t |}n"t| |d}t rbt |}nt	|}||fS )NTF)r   r   )

FastParserFastUnmarshallerrD   rI   rJ   rN   rC   r   r   rO   )r   r   Z
mkdatetimeZmkbytesrU   rV   r   r   r   	getparser  s     

r   c             C   s   t | trd}n|rt | tr|s&d}tr4t|}n
t||}|| }|dkr^dt| }nd}|rx|d|d|df}n|r|d|d	f}n|S d
|S )Nr"   zutf-8z$<?xml version='1.0' encoding='%s'?>
z<?xml version='1.0'?>
z<methodCall>
<methodName>z</methodName>
z</methodCall>
z<methodResponse>
z</methodResponse>
r_   )r)   r   r*   FastMarshallerr\   rg   r.   rb   )r   
methodnameZmethodresponserW   r^   mr>   Z	xmlheaderr   r   r   rg     s2    



rg   c             C   s2   t ||d\}}||  |  | | fS )N)r   r   )r   rY   r[   r   )r>   r   r   pur   r   r   loads  s    	
r   c          	   C   s<   t stt }t jd|dd}||  W d Q R X | S )Nwbr"   )modefileobjZcompresslevel)gzipNotImplementedErrorr   GzipFiler@   getvalue)r>   rn   gzfr   r   r   gzip_encode  s    r     @c          	   C   s   t stt jdt| dH}y$|dk r0| }n||d }W n tk
r\   tdY nX W d Q R X |dkrt||krtd|S )Nrb)r   r   r   r"   zinvalid dataz#max gzipped payload length exceeded)r   r   r   r   readOSErrorr   r   )r>   Z
max_decoder   Zdecodedr   r   r   gzip_decode  s    
r   c               @   s   e Zd Zdd Zdd ZdS )GzipDecodedResponsec             C   s.   t stt| | _t jj| d| jd d S )Nr   )r   r   )r   r   r   r   ior   r   )r   responser   r   r   r   =  s    zGzipDecodedResponse.__init__c             C   s"   zt j|  W d | j  X d S )N)r   r   r[   r   )r   r   r   r   r[   E  s    zGzipDecodedResponse.closeN)r   r   r   r   r[   r   r   r   r   r   9  s   r   c               @   s$   e Zd Zdd Zdd Zdd ZdS )_Methodc             C   s   || _ || _d S )N)_Method__send_Method__name)r   sendr   r   r   r   r   R  s    z_Method.__init__c             C   s   t | jd| j|f S )Nz%s.%s)r   r   r   )r   r   r   r   r   r   U  s    z_Method.__getattr__c             G   s   |  | j|S )N)r   r   )r   r   r   r   r   r   W  s    z_Method.__call__N)r   r   r   r   r   r   r   r   r   r   r   O  s   r   c               @   sz   e Zd Zde ZdZdZdddZdddZd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S )	TransportzPython-xmlrpc/%sTNFc             C   s   || _ || _d| _g | _d S )N)NN)r   _use_builtin_types_connection_extra_headers)r   r   r   r   r   r   r   n  s    zTransport.__init__c             C   s~   xxdD ]p}y|  ||||S  tjjk
r8   |r4 Y q tk
rt } z |sb|jtjtjtjfkrd W d d }~X Y qX qW d S )N)r   r"   )	single_requesthttpclientZRemoteDisconnectedr   errnoZ
ECONNRESETZECONNABORTEDZEPIPE)r   hosthandlerrequest_bodyverboser{   er   r   r   request~  s    

zTransport.requestc             C   s   y6|  ||||}| }|jdkr4|| _| |S W n2 tk
rL    Y n tk
rh   |    Y nX |ddr~|	  t
|| |j|jt| d S )N   zcontent-lengthr_   )send_requestZgetresponsestatusr   parse_responser   	Exceptionr[   	getheaderr   r   reasonr   Z
getheaders)r   r   r   r   r   Z	http_connZrespr   r   r   r     s"    
zTransport.single_requestc             C   s   t | j| jdS )N)r   r   )r   r   r   )r   r   r   r   r     s    zTransport.getparserc             C   sr   i }t |tr|\}}tj|\}}|rdtj|}t|d}d	|
 }dd| fg}ng }|||fS )Nzutf-8r_   ZAuthorizationzBasic )r)   r*   urllibparseZ	splituserZunquote_to_bytesrI   rL   r?   rb   r   )r   r   x509ZauthZextra_headersr   r   r   get_host_info  s    
zTransport.get_host_infoc             C   sL   | j r|| j d kr| j d S | |\}| _}|tj|f| _ | j d S )Nr   r"   )r   r   r   r   r   ZHTTPConnection)r   r   chostr   r   r   r   make_connection  s
    
zTransport.make_connectionc             C   s    | j \}}|rd| _ |  d S )N)NN)r   r[   )r   r   
connectionr   r   r   r[     s    
zTransport.closec             C   s   |  |}| jd d  }|r&|d | jrLtrL|jd|dd |d n|d| |d |d| jf | || | 	|| |S )Nr"   ZPOSTT)Zskip_accept_encoding)zAccept-Encodingr   )zContent-Typeztext/xmlz
User-Agent)
r   r   Zset_debuglevelaccept_gzip_encodingr   Z
putrequestr`   
user_agentsend_headerssend_content)r   r   r   r   debugr   r   r   r   r   r     s    



zTransport.send_requestc             C   s"   x|D ]\}}| || qW d S )N)	putheader)r   r   r   keyvalr   r   r   r   	  s    zTransport.send_headersc             C   sR   | j d k	r0| j t|k r0tr0|dd t|}|dtt| || d S )NzContent-Encodingr   zContent-Length)encode_thresholdr   r   r  r   r.   Z
endheaders)r   r   r   r   r   r   r    s    
zTransport.send_contentc             C   s   t |dr*|dddkr$t|}q.|}n|}|  \}}x2|d}|sLP | jr`tdt| || q<W ||k	r~|	  |	  |	 S )Nr   zContent-Encodingr_   r   i   zbody:)
r0   r   r   r   r   r   printr   rY   r[   )r   r   streamr   r   r>   r   r   r   r   %  s"    


zTransport.parse_response)FF)F)F)r   r   r   __version__r   r   r  r   r   r   r   r   r   r[   r   r   r  r   r   r   r   r   r   `  s   


!r   c                   s,   e Zd Zddd fddZdd Z  ZS )	SafeTransportFN)contextc               s   t  j||d || _d S )N)r   r   )superr   r  )r   r   r   r  )r   r   r   r   F  s    zSafeTransport.__init__c             C   st   | j r|| j d kr| j d S ttjds2td| |\}| _}|tjj|d fd| ji|p`i f| _ | j d S )Nr   r"   HTTPSConnectionz1your version of http.client doesn't support HTTPSr  )	r   r0   r   r   r   r   r   r  r  )r   r   r   r   r   r   r   r   M  s    

zSafeTransport.make_connection)FF)r   r   r   r   r   __classcell__r   r   )r   r   r
  C  s   r
  c               @   sX   e Zd ZdddddZdd Zdd	 Zd
d ZeZdd Zdd Z	dd Z
dd ZdS )ServerProxyNF)r  c            C   s   t j|\}	}|	dkr tdt j|\| _| _| js@d| _|d krz|	dkr^t}
d|i}nt}
i }|
f ||d|}|| _	|pd| _
|| _|| _d S )N)r   httpszunsupported XML-RPC protocolz/RPC2r  r  )r   r   zutf-8)r   r   Z	splittyper   Z	splithost_ServerProxy__host_ServerProxy__handlerr
  r   _ServerProxy__transport_ServerProxy__encoding_ServerProxy__verbose_ServerProxy__allow_none)r   Zuri	transportrW   r   r^   r   r   r  r1   r   Zextra_kwargsr   r   r   r     s&    

zServerProxy.__init__c             C   s   | j   d S )N)r  r[   )r   r   r   r   Z__close  s    zServerProxy.__closec             C   sP   t ||| j| jd| jd}| jj| j| j|| jd}t	|dkrL|d }|S )N)rW   r^   xmlcharrefreplace)r   r"   r   )
rg   r  r  rB   r  r   r  r  r  r   )r   r   r   r   r   r   r   r   Z	__request  s    

zServerProxy.__requestc             C   s   d| j j| j| jf S )Nz<%s for %s%s>)r   r   r  r  )r   r   r   r   r     s    zServerProxy.__repr__c             C   s   t | j|S )N)r   _ServerProxy__request)r   r   r   r   r   r     s    zServerProxy.__getattr__c             C   s.   |dkr| j S |dkr| jS td|f d S )Nr[   r  zAttribute %r not found)_ServerProxy__closer  rZ   )r   attrr   r   r   r     s
    zServerProxy.__call__c             C   s   | S )Nr   )r   r   r   r   	__enter__  s    zServerProxy.__enter__c             G   s   |    d S )N)r  )r   r   r   r   r   __exit__  s    zServerProxy.__exit__)NNFFFF)r   r   r   r   r  r  r   r   r   r   r  r  r   r   r   r   r  l  s    
r  __main__zhttp://localhost:8000ZERROR	   )FF)NNNF)FF)r   )UrI   sysr+   r   decimalr   Zhttp.clientr   Zurllib.parser   Zxml.parsersr   r   r   r   r   ImportErrorr   version_infor	  rs   rt   ZPARSE_ERRORZSERVER_ERRORZAPPLICATION_ERRORZSYSTEM_ERRORZTRANSPORT_ERRORZNOT_WELLFORMED_ERRORZUNSUPPORTED_ENCODINGZINVALID_ENCODING_CHARZINVALID_XMLRPCZMETHOD_NOT_FOUNDZINVALID_METHOD_PARAMSZINTERNAL_ERRORr   r   r   r   r   r   r   ZBooleanZ_day0r#   r%   r,   r-   rC   rD   rE   rN   r   rO   r\   r   r   r   r   r   r   r   r   rg   r   r   r   r   objectr   r   r   r
  r  ZServerr   r   r  ZcurrentTimeZgetCurrentTimere   ZmultiZgetDatapowaddr   r   r   r   r   <module>   s   


K	#! ( C'
' 
J

 d)i
