/ lib / xmlrpc / client.pyc
client.pyc
  1  o

  2  6�Hc���
  3  @sjdZddlZddlZddlZddlmZddlmZddlZddl	Z
  4  ddlmZddl
Z
ddlmZzddlZWneyCdZYnwdd�Zd	ejdd
  5  �ZdZdZd
ZdZdZdZdZd
ZdZdZdZdZ dZ!dZ"Gdd�de#�Z$Gdd�de$�Z%Gdd�de$�Z&Gdd�de$�Z'e(Z)Z*eddd�Z+d d!�Z,e,d"�r�d#d$�Z-n
e,d%�r�d&d$�Z-nd'd$�Z-[+[,d(d)�Z.Gd*d+�d+�Z/d,d-�Z0d.d/�Z1Gd0d1�d1�Z2d2d3�Z3e/e2fZ4Gd4d5�d5�Z5Gd6d7�d7�Z6Gd8d9�d9�Z7Gd:d;�d;�Z8Gd<d=�d=�Z9Gd>d?�d?�Z:dZ;Z<Z=dZdAdB�Z>		@d[dCdD�Z?dZdEdF�Z@dGdH�ZAd\dJdK�ZBGdLdM�dMe�r*ejCneD�ZEGdNdO�dO�ZFGdPdQ�dQ�ZGGdRdS�dSeG�ZHGdTdU�dU�ZIeIZJeKdVk�r�eIdW�ZLz	eMeLjN�O��Wne$�yvZPzeMdXeP�WYdZP[PndZP[Pwwe:eL�ZQeQ�R�eQ�Sd
  6  dY�eQ�Tdd
  7  �zeQ�D]ZUeMeU��q�WdSe$�y�ZPzeMdXeP�WYdZP[PdSdZP[PwwdS)]a�
  8  An XML-RPC client interface for Python.
  9  
 10  The marshalling and response parser code can also be used to
 11  implement XML-RPC servers.
 12  
 13  Exported exceptions:
 14  
 15    Error          Base class for client errors
 16    ProtocolError  Indicates an HTTP protocol error
 17    ResponseError  Indicates a broken response package
 18    Fault          Indicates an XML-RPC fault package
 19  
 20  Exported classes:
 21  
 22    ServerProxy    Represents a logical connection to an XML-RPC server
 23  
 24    MultiCall      Executor of boxcared xmlrpc requests
 25    DateTime       dateTime wrapper for an ISO 8601 string or time tuple or
 26                   localtime integer value to generate a "dateTime.iso8601"
 27                   XML-RPC value
 28    Binary         binary data wrapper
 29  
 30    Marshaller     Generate an XML-RPC params chunk from a Python data structure
 31    Unmarshaller   Unmarshal an XML-RPC response from incoming XML event message
 32    Transport      Handles an HTTP transaction to an XML-RPC server
 33    SafeTransport  Handles an HTTPS transaction to an XML-RPC server
 34  
 35  Exported constants:
 36  
 37    (none)
 38  
 39  Exported functions:
 40  
 41    getparser      Create instance of the fastest available parser & attach
 42                   to an unmarshalling object
 43    dumps          Convert an argument tuple or a Fault instance to an XML-RPC
 44                   request (or response, if the methodresponse option is used).
 45    loads          Convert an XML-RPC packet to unmarshalled data plus a method
 46                   name (None if not present).
 47  �N)�datetime)�Decimal)�expat)�BytesIOcCs$|�dd�}|�dd�}|�dd�S)N�&z&amp;�<z&lt;�>z&gt;)�replace)�s�r�uC:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.2800.0_x64__qbz5n2kfra8p0\lib\xmlrpc\client.py�escape�sr
z%d.%d�i���i�iD���i����i���ip���iԁ��iC���iB���i����i����i����c@seZdZdZejZdS)�ErrorzBase class for client errors.N)�__name__�
 48  __module__�__qualname__�__doc__�object�__str__rrrrr�s
 49  rc@� eZdZdZdd�Zdd�ZdS)�
ProtocolErrorz!Indicates an HTTP protocol error.cCs&t�|�||_||_||_||_dS�N)r�__init__�url�errcode�errmsg�headers)�selfrrrrrrrr�s
 50  
 51  
 52  zProtocolError.__init__cCsd|jj|j|j|jfS)Nz<%s for %s: %s %s>)�	__class__rrrr�rrrr�__repr__�s��zProtocolError.__repr__N�rrrrrr!rrrrr�src@seZdZdZdS)�
ResponseErrorz$Indicates a broken response package.N)rrrrrrrrr#�sr#c@r)�Faultz#Indicates an XML-RPC fault package.cKst�|�||_||_dSr)rr�	faultCode�faultString)rr%r&�extrarrrr��
 53  
 54  zFault.__init__cC�d|jj|j|jfS)Nz<%s %s: %r>)rrr%r&r rrrr!�s�zFault.__repr__Nr"rrrrr$�sr$�cCs&zt�|�dkWStyYdSw)NZ0001F)�_day0�strftime�
 55  ValueError)�fmtrrr�_trys
 56  �r/z%YcC�
 57  |�d�S�N�%Y%m%dT%H:%M:%S�r,��valuerrr�_iso8601_format�
 58  r6z%4YcCr0)Nz%4Y%m%dT%H:%M:%Sr3r4rrrr6r7cCs|�d��d�S)Nr2�)r,�zfillr4rrrr6�cCsLt|t�r	t|�St|ttjf�s|dkrt��}t�|�}d|dd�S)Nrz%04d%02d%02dT%02d:%02d:%02d�)�
 59  isinstancerr6�tuple�time�struct_time�	localtimer4rrr�	_strftimes
 60  
 61  rAc@sreZdZdZddd�Zdd�Zdd�Zd	d
 62  �Zdd�Zd
d�Z	dd�Z
 63  dd�Zdd�Zdd�Z
dd�Zdd�ZdS)�DateTimez�DateTime wrapper for an ISO 8601 string or time tuple or
 64      localtime integer value to generate 'dateTime.iso8601' XML-RPC
 65      value.
 66      rcCs"t|t�r
 67  ||_dSt|�|_dSr)r<�strr5rA)rr5rrrr.s
 68  
 69  zDateTime.__init__cCs�t|t�r|j}|j}||fSt|t�r|j}t|�}||fSt|t�r-|j}|}||fSt|d�r>|��}|��}||fS|}t}||fS)N�	timetuple)	r<rBr5rr6rC�hasattrrD�NotImplemented�r�otherr
 70  �orrr�make_comparable4s&
 71  
 72  �
 73  
 74  �
 75  ��zDateTime.make_comparablecCs"|�|�\}}|tur
tS||kSr�rJrFrGrrr�__lt__F�zDateTime.__lt__cCs"|�|�\}}|tur
tS||kSrrKrGrrr�__le__LrMzDateTime.__le__cCs"|�|�\}}|tur
tS||kSrrKrGrrr�__gt__RrMzDateTime.__gt__cCs"|�|�\}}|tur
tS||kSrrKrGrrr�__ge__XrMzDateTime.__ge__cCs"|�|�\}}|tur
tS||kSrrKrGrrr�__eq__^rMzDateTime.__eq__cCst�|jd�Sr1)r>�strptimer5r rrrrDd�zDateTime.timetuplecC�|jSrr4r rrrrl�zDateTime.__str__cCsd|jj|jt|�fS)Nz<%s %r at %#x>)rrr5�idr rrrr!oszDateTime.__repr__cCst|���|_dSr)rC�stripr5�r�datarrr�decoder�zDateTime.decodecCs$|�d�|�|j�|�d�dS�Nz<value><dateTime.iso8601>z</dateTime.iso8601></value>
 76  )�writer5)r�outrrr�encodeus
 77  zDateTime.encodeN)r)rrrrrrJrLrNrOrPrQrDrr!rZr_rrrrrB(s
 78  rBcC�t�}|�|�|Sr)rBrZ�rYr5rrr�	_datetimez�
 79  rbcCst�|d�Sr1)rrR)rYrrr�_datetime_type��rdc@s:eZdZdZd
dd�Zdd�Zdd�Zd	d
 80  �Zdd�ZdS)�BinaryzWrapper for binary data.NcCs>|durd}nt|ttf�std|jj��t|�}||_dS)N�z#expected bytes or bytearray, not %s)r<�bytes�	bytearray�	TypeErrorrrrYrXrrrr�s�
 81  zBinary.__init__cCst|jd�S)Nzlatin-1)rCrYr rrrr�rezBinary.__str__cCst|t�r|j}|j|kSr)r<rfrY)rrHrrrrQ�r(z
Binary.__eq__cCst�|�|_dSr)�base64�decodebytesrYrXrrrrZ�r:z
Binary.decodecCs4|�d�t�|j�}|�|�d��|�d�dS�Nz<value><base64>
 82  �asciiz</base64></value>
 83  )r]rk�encodebytesrYrZ)rr^�encodedrrrr_�s
 84  z
Binary.encoder)	rrrrrrrQrZr_rrrrrf�s
 85  rfcCr`r)rfrZrarrr�_binary�rcrqc@�$eZdZdd�Zdd�Zdd�ZdS)�ExpatParsercCsDt�dd�|_}||_|j|_|j|_|j|_	d}|�
 86  |d�dSr)r�ParserCreate�_parser�_target�start�StartElementHandler�end�EndElementHandlerrY�CharacterDataHandler�xml)r�target�parser�encodingrrrr�szExpatParser.__init__cCs|j�|d�dS�NF)ru�ParserXrrr�feed�r[zExpatParser.feedcCs8z|j}Wn
 87  tyYdSw|`|`|�dd�dS)NrgT)ru�AttributeErrorrvr�)rr~rrr�close�s
 88  �zExpatParser.closeN)rrrrr�r�rrrrrs�s	rsc@s�eZdZdZddd�ZiZdd�Zdd	�Zd
 89  d�Zeee	d�<dd
�Z
 90  e
 91  ee<dd�Zeee
<eZdd�Zeee<efdd�Zeee<dd�Zeee<eee<dd�Zeee<eee<efdd�Zeee<dd�Zeee<dd�Zeee<eee <eed<dS) �
 92  MarshalleravGenerate an XML-RPC params chunk from a Python data structure.
 93  
 94      Create a Marshaller instance for each set of parameters, and use
 95      the "dumps" method to convert your data (represented as a tuple)
 96      to an XML-RPC params chunk.  To write a fault response, pass a
 97      Fault instance instead.  You may prefer to use the "dumps" module
 98      function for this purpose.
 99      NFcCsi|_d|_||_||_dSr)�memorYr�
100  allow_none)rrr�rrrr�s
101  zMarshaller.__init__cCs�g}|j}|j}t|t�r |d�||j|jd�|�|d�n|d�|D]}|d�|||�|d�q&|d�d�|�}|S)	Nz<fault>
102  )r%r&z	</fault>
103  z	<params>
104  z<param>
105  z	</param>
106  z
107  </params>
108  �)�append�_Marshaller__dumpr<r$r%r&�join)r�valuesr^r]�dump�v�resultrrr�dumps�s&
109  ��
110  
111  
112  
113  zMarshaller.dumpscCs�z	|jt|�}Wn2ty;t|d�stdt|���t|�jD]}||j��vr3tdt|���q"|jd}Ynw||||�dS)N�__dict__zcannot marshal %s objects�_arbitrary_instance)�dispatch�type�KeyErrorrErj�__mro__�keys)rr5r]�f�type_rrrZ__dumps
114  ��
zMarshaller.__dumpcCs|jstd��|d�dS)Nz0cannot marshal None unless allow_none is enabledz<value><nil/></value>)r�rj�rr5r]rrr�dump_nilszMarshaller.dump_nilcCs$|d�||r	dp
115  d�|d�dS)Nz<value><boolean>�1�0z</boolean></value>
116  rr�rrr�	dump_bool szMarshaller.dump_boolcCs<|tks|tkrtd��|d�|tt|���|d�dS)Nzint exceeds XML-RPC limitsz<value><int>z</int></value>
117  )�MAXINT�MININT�
OverflowErrorrC�intr�rrr�	dump_long&s
118  zMarshaller.dump_longcC� |d�|t|��|d�dS)Nz<value><double>z</double></value>
119  )�reprr�rrr�dump_double1�zMarshaller.dump_doublecCs |d�|||��|d�dS)Nz<value><string>z</string></value>
120  r)rr5r]r
rrr�dump_unicode7r�zMarshaller.dump_unicodecCs,|d�t�|�}||�d��|d�dSrm)rkrorZ)rr5r]rprrr�
121  dump_bytes=s
122  zMarshaller.dump_bytescCsZt|�}||jvr
td��d|j|<|j}|d�|D]}|||�q|d�|j|=dS)Nz"cannot marshal recursive sequencesz<value><array><data>
123  z</data></array></value>
124  )rVr�rjr�)rr5r]�ir�r�rrr�
125  dump_arrayEs
126  
127  zMarshaller.dump_arraycCs�t|�}||jvr
td��d|j|<|j}|d�|��D]"\}}|d�t|t�s.td��|d||��|||�|d�q|d�|j|=dS)Nz%cannot marshal recursive dictionariesz<value><struct>
128  z	<member>
129  zdictionary key must be stringz<name>%s</name>
130  z
131  </member>
132  z</struct></value>
133  )rVr�rjr��itemsr<rC)rr5r]r
r�r��kr�rrr�dump_structSs
134  
135  
136  
137  
138  zMarshaller.dump_structcCr�r\)rAr�rrr�
dump_datetimeer�zMarshaller.dump_datetimecCs4|jtvr||_|�|�|`dS|�|j|�dSr)r�WRAPPERSr]r_r�r�r�rrr�
dump_instanceks
139  
140  
141  zMarshaller.dump_instancer�r�)!rrrrrr�r�r�r�r�r��boolr�r�Zdump_intr��floatr
r�rCr�rhrir�r=�listr��dictr�rr�rBrfrrrrr��s>
142  	r�c@sneZdZdZdEdd�Zdd�Zdd�Zd	d
143  �Zdd�Zd
d�Z	dd�Z
144  dd�ZiZdd�Z
e
ed<dd�Zeed<dd�Zeed<eed<eed<eed<eed<eed <d!d"�Zeed#<eed$<d%d&�Zeed'<d(d)�Zeed*<eed+<d,d-�Zeed.<d/d0�Zeed1<d2d3�Zeed4<d5d6�Zeed7<d8d9�Zeed:<d;d<�Zeed=<d>d?�Zeed@<dAdB�ZeedC<dDS)F�UnmarshalleraUnmarshal an XML-RPC response, based on incoming XML event
145      messages (start, data, end).  Call close() to get the resulting
146      data structure.
147  
148      Note that this reader is fairly tolerant, and gladly accepts bogus
149      XML-RPC data without complaining (but not bogus XML).
150      FcCsHd|_g|_g|_g|_d|_d|_d|_|jj|_|p||_||_	dS)NF�utf-8)
151  �_type�_stack�_marks�_data�_value�_methodname�	_encodingr��
_use_datetime�
152  _use_bytes)r�use_datetime�use_builtin_typesrrrr�s
153  
154  
155  zUnmarshaller.__init__cCs>|jdus|jrt��|jdkrtdi|jd���t|j�S)N�faultrr)r�r�r#r$r�r=r rrrr��s
156  
157  
158  zUnmarshaller.closecCrTr)r�r rrr�
getmethodname�rUzUnmarshaller.getmethodnamecC�
159  ||_dSr)r�)rr�
160  standalonerrrr|�r7zUnmarshaller.xmlcCshd|vr|�d�d}|dks|dkr|j�t|j��g|_|jr-||jvr-td|��|dk|_dS)N�:������array�structzunknown tag %rr5)	�splitr�r��lenr�r�r�r�r#)r�tag�attrsrrrrw�szUnmarshaller.startcCs|j�|�dSr)r�r�)r�textrrrrY�r:zUnmarshaller.datacCsrz|j|}Wn(ty/d|vrYdSz|j|�d�d}Wnty,YYdSwYnw||d�|j��S)Nr�r�r�)r�r�r�r�r�)rr�r�rrrry�s���zUnmarshaller.endcCsjz|j|}Wn(ty/d|vrYdSz|j|�d�d}Wnty,YYdSwYnw|||�S)Nr�r�)r�r�r�)rr�rYr�rrr�end_dispatch�s���
161  zUnmarshaller.end_dispatchcCs|�d�d|_dS�Nr)r�r�rXrrr�end_nil�s
162  
163  zUnmarshaller.end_nil�nilcCs:|dkr
164  |�d�n|dkr|�d�ntd��d|_dS)Nr�Fr�Tzbad boolean valuer)r�rjr�rXrrr�end_boolean�s
165  zUnmarshaller.end_boolean�booleancC�|�t|��d|_dSr�)r�r�r�rXrrr�end_int��
166  zUnmarshaller.end_int�i1�i2�i4�i8r�Z
167  bigintegercCr�r�)r�r�r�rXrrr�
168  end_double�r�zUnmarshaller.end_double�doubler�cCr�r�)r�rr�rXrrr�end_bigdecimal�r�zUnmarshaller.end_bigdecimalZ
169  bigdecimalcCs&|jr	|�|j�}|�|�d|_dSr�)r�rZr�r�rXrrr�
170  end_string�s
171  
172  zUnmarshaller.end_string�string�namecCs.|j��}|j|d�g|j|d�<d|_dSr�)r��popr�r�)rrY�markrrr�	end_arrays
173  
174  zUnmarshaller.end_arrayr�cCs`|j��}i}|j|d�}tdt|�d�D]}||d|||<q|g|j|d�<d|_dS)Nrrr*)r�r�r��ranger�r�)rrYr�r�r�r�rrr�
175  end_structs
176  
177  zUnmarshaller.end_structr�cCs6t�}|�|�d��|jr|j}|�|�d|_dS)Nrnr)rfrZr_r�rYr�r��rrYr5rrr�
178  end_base64s
179  
180  zUnmarshaller.end_base64rkcCs,t�}|�|�|jrt|�}|�|�dSr)rBrZr�rdr�r�rrr�end_dateTime s
181  
182  zUnmarshaller.end_dateTimezdateTime.iso8601cCs|jr
183  |�|�dSdSr)r�r�rXrrr�	end_value(s�zUnmarshaller.end_valuer5cC�
184  d|_dS)N�params�r�rXrrr�
185  end_params/r7zUnmarshaller.end_paramsr�cCr�)Nr�r�rXrrr�	end_fault3r7zUnmarshaller.end_faultr�cCs"|jr	|�|j�}||_d|_dS)N�
186  methodName)r�rZr�r�rXrrr�end_methodName7s
187  zUnmarshaller.end_methodNamer�N�FF)rrrrrr�r�r|rwrYryr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrr�s\
188  	r�c@rr)�_MultiCallMethodcC�||_||_dSr)�_MultiCallMethod__call_list�_MultiCallMethod__name)r�	call_listr�rrrrD�
189  z_MultiCallMethod.__init__cC�t|jd|j|f�S�Nz%s.%s)r�r�r��rr�rrr�__getattr__G�z_MultiCallMethod.__getattr__cGs|j�|j|f�dSr)r�r�r��r�argsrrr�__call__Ir�z_MultiCallMethod.__call__N�rrrrr�rrrrrr�A�r�c@r)�MultiCallIteratorzaIterates over the results of a multicall. Exceptions are
190      raised in response to xmlrpc faults.cCr�r)�results)rrrrrrPr7zMultiCallIterator.__init__cCsL|j|}t|�ti�krt|d|d��t|�tg�kr"|dStd��)Nr%r&rz#unexpected type in multicall result)rr�r$r-)rr��itemrrr�__getitem__Ss
191  zMultiCallIterator.__getitem__N)rrrrrrrrrrrLsrc@s0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
192  S)�	MultiCalla~server -> an object used to boxcar method calls
193  
194      server should be a ServerProxy object.
195  
196      Methods can be added to the MultiCall using normal
197      method call syntax e.g.:
198  
199      multicall = MultiCall(server_proxy)
200      multicall.add(2,3)
201      multicall.get_address("Guido")
202  
203      To execute the multicall, call the MultiCall object e.g.:
204  
205      add_result, address = multicall()
206      cCs||_g|_dSr)�_MultiCall__server�_MultiCall__call_list)r�serverrrrrmr�zMultiCall.__init__cCsd|jjt|�fS)Nz<%s at %#x>)rrrVr rrrr!qszMultiCall.__repr__cC�t|j|�Sr)r�r
207  r�rrrr�trezMultiCall.__getattr__cCs6g}|jD]\}}|�||d��qt|jj�|��S)N)r�r�)r
208  r�rr	�systemZ	multicall)rZmarshalled_listr�rrrrrwszMultiCall.__call__N)rrrrrr!r�rrrrrr\srFcCs~tr'tr'|rt}tj}n|rt}t}nt}t}tdd||t�}t|�}||fSt||d�}tr7t|�}||fSt	|�}||fS)z�getparser() -> parser, unmarshaller
209  
210      Create an instance of the fastest available parser, and attach it
211      to an unmarshalling object.  Return both objects.
212      TF�r�r�)
213214  FastParser�FastUnmarshallerrdrkrlrqrbr$r�rs)r�r�Z
215  mkdatetimeZmkbytesr}r~rrr�	getparser�s$��rcCs�t|ttf�sJd��t|t�rd}n|r$t|t�r$t|�dks$Jd��|s(d}tr/t|�}nt||�}|�|�}|dkrDdt|�}nd}|rQ|d|d|d	f}n|rZ|d
216  |df}n|Sd�|�S)
a�data [,options] -> marshalled data
217  
218      Convert an argument tuple or a Fault instance to an XML-RPC
219      request (or response, if the methodresponse option is used).
220  
221      In addition to the data object, the following options can be given
222      as keyword arguments:
223  
224          methodname: the method name for a methodCall packet
225  
226          methodresponse: true to create a methodResponse packet.
227          If this option is used with a tuple, the tuple must be
228          a singleton (i.e. it can contain only one element).
229  
230          encoding: the packet encoding (default is UTF-8)
231  
232      All byte strings in the data structure are assumed to use the
233      packet encoding.  Unicode strings are automatically converted,
234      where necessary.
235      z(argument must be tuple or Fault instancer*z"response tuple must be a singletonr�z$<?xml version='1.0' encoding='%s'?>
236  z<?xml version='1.0'?>
237  z<methodCall>
238  <methodName>z</methodName>
239  z</methodCall>
240  z<methodResponse>
241  z</methodResponse>
242  r�)	r<r=r$r��FastMarshallerr�r�rCr�)r��
243  methodname�methodresponserr��mrYZ	xmlheaderrrrr��s:
244  
245  
246  
247  ��
248  r�cCs2t||d�\}}|�|�|��|��|��fS)z�data -> unmarshalled data, method name
249  
250      Convert an XML-RPC packet to unmarshalled data plus a method
251      name (None if not present).
252  
253      If the XML-RPC packet represents a fault condition, this function
254      raises a Fault exception.
255      r)rr�r�r�)rYr�r��p�urrr�loads�s	
256  rcCsVtst�t�}tjd|dd��}|�|�Wd�|��S1s"wY|��S)zhdata -> gzip encoded data
257  
258      Encode data using the gzip content encoding as described in RFC 1952
259      �wbr*)�mode�fileobj�
compresslevelN)�gzip�NotImplementedErrorr�GzipFiler]�getvalue)rYr��gzfrrr�gzip_encodes
260  ��r"�@c	Cs�tst�tjdt|�d��&}z|dkr|��}n|�|d�}Wnty+td��wWd�n1s6wY|dkrIt|�|krItd��|S)zrgzip encoded data -> unencoded data
261  
262      Decode data using the gzip content encoding as described in RFC 1952
263      �rb�rrrr*zinvalid dataNz#max gzipped payload length exceeded)rrrr�read�OSErrorr-r�)rYZ
264  max_decoder!�decodedrrr�gzip_decode)s 
265  ����r)c@r)�GzipDecodedResponsezha file-like object to decode a response encoded with the gzip
266      method, as described in RFC 1952.
267      cCs.tst�t|���|_tjj|d|jd�dS)Nr$r%)rrrr&�iorr)r�responserrrrGszGzipDecodedResponse.__init__cCs*ztj�|�W|j��dS|j��wr)rrr�r+r rrrr�OszGzipDecodedResponse.closeN)rrrrrr�rrrrr*Csr*c@rr)�_MethodcCr�r��
_Method__send�
_Method__name)r�sendr�rrrr\r�z_Method.__init__cCr�r�)r-r/r0r�rrrr�_r�z_Method.__getattr__cGs|�|j|�Srr.r�rrrrarSz_Method.__call__Nrrrrrr-Yrr-c@s�eZdZdZdeZdZdZddd�dd	�Zdd
268  d�Z	ddd
�Z
269  dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�ZdS) �	Transportz1Handles an HTTP transaction to an XML-RPC server.zPython-xmlrpc/%sTNFr)rcCs&||_||_d|_t|�|_g|_dS�N)NN)r��_use_builtin_types�_connectionr��_headers�_extra_headers)rr�r�rrrrrxs
270  
271  
272  zTransport.__init__cCs~dD]:}z|�||||�WStjjy|r�Yqty<}z|s1|jtjtjtjfvr2�WYd}~qd}~wwdS)N)rr*)	�single_request�http�client�RemoteDisconnectedr'�errno�
273  ECONNRESET�ECONNABORTED�EPIPE)r�host�handler�request_body�verboser��errr�request�s ������zTransport.requestcCs�z|�||||�}|��}|jdkr||_|�|�WSWnty$�ty/|���w|�dd�r:|�	�t
274  |||j|jt|�
����)N��zcontent-lengthr�)�send_request�getresponse�statusrC�parse_responser$�	Exceptionr��	getheaderr&r�reasonr��
275  getheaders)rr@rArBrC�	http_conn�resprrrr8�s(
276  ��
277  �zTransport.single_requestcCst|j|jd�S)Nr)rr�r4r rrrr�s�zTransport.getparsercCsri}t|t�r|\}}tj�|�\}}|r2tj�|�}t�|��d�}d�	|�
278  ��}dd|fg}ng}|||fS)Nr�r��
AuthorizationzBasic )r<r=�urllib�parse�
279  _splituser�unquote_to_bytesrkrorZr�r�)rr@�x509�authZ
extra_headersrrr�
get_host_info�s
280  
281  �
282  zTransport.get_host_infocCsL|jr||jdkr|jdS|�|�\}|_}|tj�|�f|_|jdS)Nrr*)r5rXr7r9r:�HTTPConnection�rr@ZchostrVrrr�make_connection�s
283  
284  
285  zTransport.make_connectioncCs$|j\}}|rd|_|��dSdSr3)r5r�)rr@�
286  connectionrrrr��s
287  
288  �zTransport.closecCs�|�|�}|j|j}|r|�d�|jr%tr%|jd|dd�|�d�n|�d|�|�d�|�d|jf�|�	||�|�
289  ||�|S)Nr*�POSTT)�skip_accept_encoding)zAccept-Encodingr)zContent-Typeztext/xmlz
290  User-Agent)r[r6r7�set_debuglevel�accept_gzip_encodingr�
291  putrequestr��
292  user_agent�send_headers�send_content)rr@rArB�debugr\rrrrrG�s
293  
294  
295  
296  zTransport.send_requestcCs|D]
297  \}}|�||�qdSr)�	putheader)rr\r�key�valrrrrcs�zTransport.send_headerscCsR|jdur|jt|�krtr|�dd�t|�}|�dtt|���|�|�dS)N�Content-EncodingrzContent-Length)�encode_thresholdr�rrfr"rC�
298  endheaders)rr\rBrrrrd s
299  �zTransport.send_contentcCs�t|d�r|�dd�dkrt|�}n|}n|}|��\}}	|�d�}|s&n|jr0tdt|��|�|�q||ur>|�	�|�	�|�	�S)NrLrir�rr*izbody:)
300  rErLr*rr&rC�printr�r�r�)rr,�streamrrrYrrrrJ1s$
301  
302  
303  
304  �zTransport.parse_responser�)F)rrrr�__version__rbr`rjrrEr8rrXr[r�rGrcrdrJrrrrr2js$�
305  
306  
!r2cs2eZdZdZd
307  ddd��fdd�Zdd	�Z�ZS)�
SafeTransportz2Handles an HTTPS transaction to an XML-RPC server.FrN�r�contextcst�j|||d�||_dS)N�r�r�r)�superrrq)rr�r�rrq�rrrrRs
308  �
309  zSafeTransport.__init__cCst|jr||jdkr|jdSttjd�std��|�|�\}|_}|tjj|dfd|ji|p0i��f|_|jdS)Nrr*�HTTPSConnectionz1your version of http.client doesn't support HTTPSrq)	r5rEr9r:rrXr7rurqrZrrrr[[s
310  �
311  ��
312313  zSafeTransport.make_connectionr�)rrrrrr[�
__classcell__rrrtrroOs�	roc@s^eZdZdZ		dddd�dd�Zdd	�Zd
314  d�Zdd
�Zdd�Zdd�Z	dd�Z
315  dd�ZdS)�ServerProxya�uri [,options] -> a logical connection to an XML-RPC server
316  
317      uri is the connection point on the server, given as
318      scheme://host/target.
319  
320      The standard implementation always supports the "http" scheme.  If
321      SSL socket support is available (Python 2.0), it also supports
322      "https".
323  
324      If the target part and the slash preceding it are both omitted,
325      "/RPC2" is assumed.
326  
327      The following options can be given as keyword arguments:
328  
329          transport: a transport factory
330          encoding: the request encoding (default is UTF-8)
331  
332      All 8-bit strings passed to the server proxy are assumed to use
333      the given encoding.
334      NFrrpc
Cs�tj�|�}
335  |
336  jdvrtd��|
337  j|_tj�ddg|
338  dd���|_|js(d|_|durG|
339  jdkr8t	}d|	i}nt
340  }i}|d
341  |||d�|��}||_|pMd	|_||_
||_dS)N)r9�httpszunsupported XML-RPC protocolr�rz/RPC2rxrqrrr�r)rRrS�urlsplit�schemer'�netloc�_ServerProxy__host�
342  urlunsplit�_ServerProxy__handlerror2�_ServerProxy__transport�_ServerProxy__encoding�_ServerProxy__verbose�_ServerProxy__allow_none)
r�uri�	transportrrCr�r�r�rrqrrA�extra_kwargsrrrr�s.
343  
344  
345  ��
346  
347  zServerProxy.__init__cCs|j��dSr)rr�r rrrZ__close�rSzServerProxy.__closecCsPt|||j|jd��|jd�}|jj|j|j||jd�}t	|�dkr&|d}|S)N)rr��xmlcharrefreplace)rCr*r)
348  r�r�r�r_rrEr|r~r�r�)rrr�rEr,rrrZ	__request�s
349  �
350  ��zServerProxy.__requestcCr))Nz
<%s for %s%s>)rrr|r~r rrrr!�s��zServerProxy.__repr__cCrr)r-�_ServerProxy__requestr�rrrr��szServerProxy.__getattr__cCs*|dkr|jS|dkr|jStd|f��)z|A workaround to get special attributes on the ServerProxy
351             without interfering with the magic __getattr__
352          r�r�zAttribute %r not found)�_ServerProxy__closerr�)r�attrrrrr�s
353  zServerProxy.__call__cCs|Srrr rrr�	__enter__�szServerProxy.__enter__cGs|��dSr)r�r�rrr�__exit__�rezServerProxy.__exit__)NNFFFF)rrrrrr�r�r!r�rr�r�rrrrrwzs��
354  rw�__main__zhttp://localhost:8000�ERROR�	r�)NNNF)r#)Vrrk�sysr>r�decimalr�http.clientr9�urllib.parserR�xml.parsersrr<r+rr�ImportErrorr
�version_infornr�r��PARSE_ERROR�SERVER_ERROR�APPLICATION_ERROR�SYSTEM_ERROR�TRANSPORT_ERROR�NOT_WELLFORMED_ERROR�UNSUPPORTED_ENCODING�INVALID_ENCODING_CHAR�INVALID_XMLRPC�METHOD_NOT_FOUND�INVALID_METHOD_PARAMS�INTERNAL_ERRORrKrrr#r$r�r��Booleanr+r/r6rArBrbrdrfrqr�rsr�r�r�rrrrrrr�rr"r)rrr*r-r2rorw�Serverrrrl�currentTime�getCurrentTimer��multi�getData�pow�addr,rrrr�<module>s�X*�

355  
356  R	#!(C%
357  '
358359  K
360  f+i
361  ��
362  ����