blob: 27d92e324722eabdd4d8518d4c1f43a33d4ce1e3 [file] [log] [blame]
Georg Brandl38eceaa2008-05-26 11:14:17 +00001:mod:`xmlrpc.client` --- XML-RPC client access
2==============================================
Georg Brandl116aa622007-08-15 14:28:22 +00003
Georg Brandl38eceaa2008-05-26 11:14:17 +00004.. module:: xmlrpc.client
Georg Brandl116aa622007-08-15 14:28:22 +00005 :synopsis: XML-RPC client access.
Terry Jan Reedyfa089b92016-06-11 15:02:54 -04006
Georg Brandl116aa622007-08-15 14:28:22 +00007.. moduleauthor:: Fredrik Lundh <fredrik@pythonware.com>
8.. sectionauthor:: Eric S. Raymond <esr@snark.thyrsus.com>
9
Terry Jan Reedyfa089b92016-06-11 15:02:54 -040010**Source code:** :source:`Lib/xmlrpc/client.py`
Georg Brandl116aa622007-08-15 14:28:22 +000011
Christian Heimes5b5e81c2007-12-31 16:14:33 +000012.. XXX Not everything is documented yet. It might be good to describe
Florent Xicluna61665192011-11-15 20:53:25 +010013 Marshaller, Unmarshaller, getparser and Transport.
Georg Brandl116aa622007-08-15 14:28:22 +000014
Raymond Hettinger3029aff2011-02-10 08:09:36 +000015--------------
16
Serhiy Storchakada7880a2016-05-07 08:44:15 +030017XML-RPC is a Remote Procedure Call method that uses XML passed via HTTP(S) as a
Georg Brandl116aa622007-08-15 14:28:22 +000018transport. With it, a client can call methods with parameters on a remote
19server (the server is named by a URI) and get back structured data. This module
20supports writing XML-RPC client code; it handles all the details of translating
21between conformable Python objects and XML on the wire.
22
23
Christian Heimes7380a672013-03-26 17:35:55 +010024.. warning::
25
26 The :mod:`xmlrpc.client` module is not secure against maliciously
27 constructed data. If you need to parse untrusted or unauthenticated data see
28 :ref:`xml-vulnerabilities`.
29
Benjamin Petersone39bba22014-11-29 23:34:30 -050030.. versionchanged:: 3.5
Benjamin Peterson77a75b32014-10-13 11:54:50 -040031
Martin Panterfe289c02016-05-28 02:20:39 +000032 For HTTPS URIs, :mod:`xmlrpc.client` now performs all the necessary
Serhiy Storchakada7880a2016-05-07 08:44:15 +030033 certificate and hostname checks by default.
Christian Heimes7380a672013-03-26 17:35:55 +010034
Florent Xicluna61665192011-11-15 20:53:25 +010035.. class:: ServerProxy(uri, transport=None, encoding=None, verbose=False, \
36 allow_none=False, use_datetime=False, \
Benjamin Petersonb7138e22014-11-29 23:38:17 -050037 use_builtin_types=False, *, context=None)
Florent Xicluna61665192011-11-15 20:53:25 +010038
39 .. versionchanged:: 3.3
40 The *use_builtin_types* flag was added.
Georg Brandl116aa622007-08-15 14:28:22 +000041
42 A :class:`ServerProxy` instance is an object that manages communication with a
43 remote XML-RPC server. The required first argument is a URI (Uniform Resource
44 Indicator), and will normally be the URL of the server. The optional second
45 argument is a transport factory instance; by default it is an internal
46 :class:`SafeTransport` instance for https: URLs and an internal HTTP
47 :class:`Transport` instance otherwise. The optional third argument is an
48 encoding, by default UTF-8. The optional fourth argument is a debugging flag.
Serhiy Storchakada7880a2016-05-07 08:44:15 +030049
50 The following parameters govern the use of the returned proxy instance.
Georg Brandl116aa622007-08-15 14:28:22 +000051 If *allow_none* is true, the Python constant ``None`` will be translated into
52 XML; the default behaviour is for ``None`` to raise a :exc:`TypeError`. This is
53 a commonly-used extension to the XML-RPC specification, but isn't supported by
Serhiy Storchakada7880a2016-05-07 08:44:15 +030054 all clients and servers; see `http://ontosys.com/xml-rpc/extensions.php
Serhiy Storchaka64099ea2016-05-07 10:05:02 +030055 <https://web.archive.org/web/20130120074804/http://ontosys.com/xml-rpc/extensions.php>`_
Serhiy Storchakada7880a2016-05-07 08:44:15 +030056 for a description.
57 The *use_builtin_types* flag can be used to cause date/time values
Florent Xicluna61665192011-11-15 20:53:25 +010058 to be presented as :class:`datetime.datetime` objects and binary data to be
59 presented as :class:`bytes` objects; this flag is false by default.
Serhiy Storchakada7880a2016-05-07 08:44:15 +030060 :class:`datetime.datetime`, :class:`bytes` and :class:`bytearray` objects
61 may be passed to calls.
Florent Xicluna61665192011-11-15 20:53:25 +010062 The obsolete *use_datetime* flag is similar to *use_builtin_types* but it
63 applies only to date/time values.
Georg Brandl116aa622007-08-15 14:28:22 +000064
65 Both the HTTP and HTTPS transports support the URL syntax extension for HTTP
66 Basic Authentication: ``http://user:pass@host:port/path``. The ``user:pass``
67 portion will be base64-encoded as an HTTP 'Authorization' header, and sent to
68 the remote server as part of the connection process when invoking an XML-RPC
69 method. You only need to use this if the remote server requires a Basic
Martin Panterfe289c02016-05-28 02:20:39 +000070 Authentication user and password. If an HTTPS URL is provided, *context* may
Benjamin Petersonc1da3d12014-11-29 23:32:57 -050071 be :class:`ssl.SSLContext` and configures the SSL settings of the underlying
72 HTTPS connection.
Georg Brandl116aa622007-08-15 14:28:22 +000073
74 The returned instance is a proxy object with methods that can be used to invoke
75 corresponding RPC calls on the remote server. If the remote server supports the
76 introspection API, the proxy can also be used to query the remote server for the
77 methods it supports (service discovery) and fetch other server-associated
78 metadata.
79
Serhiy Storchakada7880a2016-05-07 08:44:15 +030080 Types that are conformable (e.g. that can be marshalled through XML),
81 include the following (and except where noted, they are unmarshalled
82 as the same Python type):
Georg Brandl116aa622007-08-15 14:28:22 +000083
Georg Brandl44ea77b2013-03-28 13:28:44 +010084 .. tabularcolumns:: |l|L|
85
Serhiy Storchakada7880a2016-05-07 08:44:15 +030086 +----------------------+-------------------------------------------------------+
87 | XML-RPC type | Python type |
88 +======================+=======================================================+
89 | ``boolean`` | :class:`bool` |
90 +----------------------+-------------------------------------------------------+
Serhiy Storchaka352601c2016-09-11 11:23:38 +030091 | ``int``, ``i1``, | :class:`int` in range from -2147483648 to 2147483647. |
92 | ``i2``, ``i4``, | Values get the ``<int>`` tag. |
93 | ``i8`` or | |
94 | ``biginteger`` | |
Serhiy Storchakada7880a2016-05-07 08:44:15 +030095 +----------------------+-------------------------------------------------------+
Serhiy Storchaka352601c2016-09-11 11:23:38 +030096 | ``double`` or | :class:`float`. Values get the ``<double>`` tag. |
97 | ``float`` | |
Serhiy Storchakada7880a2016-05-07 08:44:15 +030098 +----------------------+-------------------------------------------------------+
99 | ``string`` | :class:`str` |
100 +----------------------+-------------------------------------------------------+
101 | ``array`` | :class:`list` or :class:`tuple` containing |
102 | | conformable elements. Arrays are returned as |
Serhiy Storchaka64099ea2016-05-07 10:05:02 +0300103 | | :class:`lists <list>`. |
Serhiy Storchakada7880a2016-05-07 08:44:15 +0300104 +----------------------+-------------------------------------------------------+
105 | ``struct`` | :class:`dict`. Keys must be strings, values may be |
106 | | any conformable type. Objects of user-defined |
Serhiy Storchaka64099ea2016-05-07 10:05:02 +0300107 | | classes can be passed in; only their |
108 | | :attr:`~object.__dict__` attribute is transmitted. |
Serhiy Storchakada7880a2016-05-07 08:44:15 +0300109 +----------------------+-------------------------------------------------------+
110 | ``dateTime.iso8601`` | :class:`DateTime` or :class:`datetime.datetime`. |
111 | | Returned type depends on values of |
112 | | *use_builtin_types* and *use_datetime* flags. |
113 +----------------------+-------------------------------------------------------+
114 | ``base64`` | :class:`Binary`, :class:`bytes` or |
115 | | :class:`bytearray`. Returned type depends on the |
116 | | value of the *use_builtin_types* flag. |
117 +----------------------+-------------------------------------------------------+
118 | ``nil`` | The ``None`` constant. Passing is allowed only if |
119 | | *allow_none* is true. |
120 +----------------------+-------------------------------------------------------+
Serhiy Storchaka352601c2016-09-11 11:23:38 +0300121 | ``bigdecimal`` | :class:`decimal.Decimal`. Returned type only. |
122 +----------------------+-------------------------------------------------------+
Georg Brandl116aa622007-08-15 14:28:22 +0000123
124 This is the full set of data types supported by XML-RPC. Method calls may also
125 raise a special :exc:`Fault` instance, used to signal XML-RPC server errors, or
126 :exc:`ProtocolError` used to signal an error in the HTTP/HTTPS transport layer.
127 Both :exc:`Fault` and :exc:`ProtocolError` derive from a base class called
Georg Brandl38eceaa2008-05-26 11:14:17 +0000128 :exc:`Error`. Note that the xmlrpc client module currently does not marshal
Georg Brandl22b34312009-07-26 14:54:51 +0000129 instances of subclasses of built-in types.
Georg Brandl116aa622007-08-15 14:28:22 +0000130
131 When passing strings, characters special to XML such as ``<``, ``>``, and ``&``
132 will be automatically escaped. However, it's the caller's responsibility to
133 ensure that the string is free of characters that aren't allowed in XML, such as
134 the control characters with ASCII values between 0 and 31 (except, of course,
135 tab, newline and carriage return); failing to do this will result in an XML-RPC
Florent Xicluna61665192011-11-15 20:53:25 +0100136 request that isn't well-formed XML. If you have to pass arbitrary bytes
Serhiy Storchakada7880a2016-05-07 08:44:15 +0300137 via XML-RPC, use :class:`bytes` or :class:`bytearray` classes or the
138 :class:`Binary` wrapper class described below.
Georg Brandl116aa622007-08-15 14:28:22 +0000139
140 :class:`Server` is retained as an alias for :class:`ServerProxy` for backwards
141 compatibility. New code should use :class:`ServerProxy`.
142
Benjamin Petersone39bba22014-11-29 23:34:30 -0500143 .. versionchanged:: 3.5
Benjamin Petersonc1da3d12014-11-29 23:32:57 -0500144 Added the *context* argument.
145
Serhiy Storchaka352601c2016-09-11 11:23:38 +0300146 .. versionchanged:: 3.6
Serhiy Storchakab7e35352016-09-11 16:47:59 +0300147 Added support of type tags with prefixes (e.g. ``ex:nil``).
Xtreakc151f782018-06-16 10:38:31 +0530148 Added support of unmarshalling additional types used by Apache XML-RPC
Serhiy Storchaka352601c2016-09-11 11:23:38 +0300149 implementation for numerics: ``i1``, ``i2``, ``i8``, ``biginteger``,
150 ``float`` and ``bigdecimal``.
151 See http://ws.apache.org/xmlrpc/types.html for a description.
152
Georg Brandl116aa622007-08-15 14:28:22 +0000153
154.. seealso::
155
156 `XML-RPC HOWTO <http://www.tldp.org/HOWTO/XML-RPC-HOWTO/index.html>`_
Christian Heimesa62da1d2008-01-12 19:39:10 +0000157 A good description of XML-RPC operation and client software in several languages.
Georg Brandl116aa622007-08-15 14:28:22 +0000158 Contains pretty much everything an XML-RPC client developer needs to know.
159
Christian Heimesa62da1d2008-01-12 19:39:10 +0000160 `XML-RPC Introspection <http://xmlrpc-c.sourceforge.net/introspection.html>`_
161 Describes the XML-RPC protocol extension for introspection.
Georg Brandl116aa622007-08-15 14:28:22 +0000162
Georg Brandl5d941342016-02-26 19:37:12 +0100163 `XML-RPC Specification <http://xmlrpc.scripting.com/spec.html>`_
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000164 The official specification.
165
166 `Unofficial XML-RPC Errata <http://effbot.org/zone/xmlrpc-errata.htm>`_
167 Fredrik Lundh's "unofficial errata, intended to clarify certain
168 details in the XML-RPC specification, as well as hint at
169 'best practices' to use when designing your own XML-RPC
170 implementations."
Georg Brandl116aa622007-08-15 14:28:22 +0000171
172.. _serverproxy-objects:
173
174ServerProxy Objects
175-------------------
176
177A :class:`ServerProxy` instance has a method corresponding to each remote
178procedure call accepted by the XML-RPC server. Calling the method performs an
179RPC, dispatched by both name and argument signature (e.g. the same method name
180can be overloaded with multiple argument signatures). The RPC finishes by
181returning a value, which may be either returned data in a conformant type or a
182:class:`Fault` or :class:`ProtocolError` object indicating an error.
183
184Servers that support the XML introspection API support some common methods
Serhiy Storchakada7880a2016-05-07 08:44:15 +0300185grouped under the reserved :attr:`~ServerProxy.system` attribute:
Georg Brandl116aa622007-08-15 14:28:22 +0000186
187
188.. method:: ServerProxy.system.listMethods()
189
190 This method returns a list of strings, one for each (non-system) method
191 supported by the XML-RPC server.
192
193
194.. method:: ServerProxy.system.methodSignature(name)
195
196 This method takes one parameter, the name of a method implemented by the XML-RPC
Georg Brandl94606482009-05-04 20:46:44 +0000197 server. It returns an array of possible signatures for this method. A signature
Georg Brandl116aa622007-08-15 14:28:22 +0000198 is an array of types. The first of these types is the return type of the method,
199 the rest are parameters.
200
201 Because multiple signatures (ie. overloading) is permitted, this method returns
202 a list of signatures rather than a singleton.
203
204 Signatures themselves are restricted to the top level parameters expected by a
205 method. For instance if a method expects one array of structs as a parameter,
206 and it returns a string, its signature is simply "string, array". If it expects
207 three integers and returns a string, its signature is "string, int, int, int".
208
209 If no signature is defined for the method, a non-array value is returned. In
210 Python this means that the type of the returned value will be something other
Georg Brandl94606482009-05-04 20:46:44 +0000211 than list.
Georg Brandl116aa622007-08-15 14:28:22 +0000212
213
214.. method:: ServerProxy.system.methodHelp(name)
215
216 This method takes one parameter, the name of a method implemented by the XML-RPC
217 server. It returns a documentation string describing the use of that method. If
218 no such string is available, an empty string is returned. The documentation
219 string may contain HTML markup.
220
Brett Cannon33a40002014-03-21 11:24:40 -0400221.. versionchanged:: 3.5
222
223 Instances of :class:`ServerProxy` support the :term:`context manager` protocol
224 for closing the underlying transport.
225
Georg Brandl116aa622007-08-15 14:28:22 +0000226
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000227A working example follows. The server code::
228
Georg Brandl38eceaa2008-05-26 11:14:17 +0000229 from xmlrpc.server import SimpleXMLRPCServer
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000230
231 def is_even(n):
Serhiy Storchakadba90392016-05-10 12:01:23 +0300232 return n % 2 == 0
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000233
234 server = SimpleXMLRPCServer(("localhost", 8000))
Georg Brandlf6945182008-02-01 11:56:49 +0000235 print("Listening on port 8000...")
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000236 server.register_function(is_even, "is_even")
237 server.serve_forever()
238
239The client code for the preceding server::
240
Georg Brandl38eceaa2008-05-26 11:14:17 +0000241 import xmlrpc.client
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000242
Brett Cannon33a40002014-03-21 11:24:40 -0400243 with xmlrpc.client.ServerProxy("http://localhost:8000/") as proxy:
244 print("3 is even: %s" % str(proxy.is_even(3)))
245 print("100 is even: %s" % str(proxy.is_even(100)))
Georg Brandl116aa622007-08-15 14:28:22 +0000246
247.. _datetime-objects:
248
249DateTime Objects
250----------------
251
Serhiy Storchakada7880a2016-05-07 08:44:15 +0300252.. class:: DateTime
253
254 This class may be initialized with seconds since the epoch, a time
255 tuple, an ISO 8601 time/date string, or a :class:`datetime.datetime`
256 instance. It has the following methods, supported mainly for internal
257 use by the marshalling/unmarshalling code:
Georg Brandl116aa622007-08-15 14:28:22 +0000258
259
Serhiy Storchakada7880a2016-05-07 08:44:15 +0300260 .. method:: decode(string)
Georg Brandl116aa622007-08-15 14:28:22 +0000261
Serhiy Storchakada7880a2016-05-07 08:44:15 +0300262 Accept a string as the instance's new time value.
Georg Brandl116aa622007-08-15 14:28:22 +0000263
264
Serhiy Storchakada7880a2016-05-07 08:44:15 +0300265 .. method:: encode(out)
Georg Brandl116aa622007-08-15 14:28:22 +0000266
Serhiy Storchakada7880a2016-05-07 08:44:15 +0300267 Write the XML-RPC encoding of this :class:`DateTime` item to the *out* stream
268 object.
Georg Brandl116aa622007-08-15 14:28:22 +0000269
Serhiy Storchakada7880a2016-05-07 08:44:15 +0300270 It also supports certain of Python's built-in operators through rich comparison
271 and :meth:`__repr__` methods.
Georg Brandl116aa622007-08-15 14:28:22 +0000272
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000273A working example follows. The server code::
274
275 import datetime
Georg Brandl38eceaa2008-05-26 11:14:17 +0000276 from xmlrpc.server import SimpleXMLRPCServer
277 import xmlrpc.client
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000278
279 def today():
280 today = datetime.datetime.today()
Georg Brandl38eceaa2008-05-26 11:14:17 +0000281 return xmlrpc.client.DateTime(today)
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000282
283 server = SimpleXMLRPCServer(("localhost", 8000))
Georg Brandlf6945182008-02-01 11:56:49 +0000284 print("Listening on port 8000...")
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000285 server.register_function(today, "today")
286 server.serve_forever()
287
288The client code for the preceding server::
289
Georg Brandl38eceaa2008-05-26 11:14:17 +0000290 import xmlrpc.client
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000291 import datetime
292
Georg Brandl38eceaa2008-05-26 11:14:17 +0000293 proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000294
295 today = proxy.today()
296 # convert the ISO8601 string to a datetime object
297 converted = datetime.datetime.strptime(today.value, "%Y%m%dT%H:%M:%S")
Georg Brandlf6945182008-02-01 11:56:49 +0000298 print("Today: %s" % converted.strftime("%d.%m.%Y, %H:%M"))
Georg Brandl116aa622007-08-15 14:28:22 +0000299
300.. _binary-objects:
301
302Binary Objects
303--------------
304
Serhiy Storchakada7880a2016-05-07 08:44:15 +0300305.. class:: Binary
306
307 This class may be initialized from bytes data (which may include NULs). The
308 primary access to the content of a :class:`Binary` object is provided by an
309 attribute:
Georg Brandl116aa622007-08-15 14:28:22 +0000310
311
Serhiy Storchakada7880a2016-05-07 08:44:15 +0300312 .. attribute:: data
Georg Brandl116aa622007-08-15 14:28:22 +0000313
Serhiy Storchakada7880a2016-05-07 08:44:15 +0300314 The binary data encapsulated by the :class:`Binary` instance. The data is
315 provided as a :class:`bytes` object.
Georg Brandl116aa622007-08-15 14:28:22 +0000316
Serhiy Storchakada7880a2016-05-07 08:44:15 +0300317 :class:`Binary` objects have the following methods, supported mainly for
318 internal use by the marshalling/unmarshalling code:
Georg Brandl116aa622007-08-15 14:28:22 +0000319
320
Serhiy Storchakada7880a2016-05-07 08:44:15 +0300321 .. method:: decode(bytes)
Georg Brandl116aa622007-08-15 14:28:22 +0000322
Serhiy Storchakada7880a2016-05-07 08:44:15 +0300323 Accept a base64 :class:`bytes` object and decode it as the instance's new data.
Georg Brandl116aa622007-08-15 14:28:22 +0000324
325
Serhiy Storchakada7880a2016-05-07 08:44:15 +0300326 .. method:: encode(out)
Georg Brandl116aa622007-08-15 14:28:22 +0000327
Serhiy Storchakada7880a2016-05-07 08:44:15 +0300328 Write the XML-RPC base 64 encoding of this binary item to the *out* stream object.
Georg Brandl116aa622007-08-15 14:28:22 +0000329
Serhiy Storchakada7880a2016-05-07 08:44:15 +0300330 The encoded data will have newlines every 76 characters as per
Serhiy Storchaka0a36ac12018-05-31 07:39:00 +0300331 :rfc:`RFC 2045 section 6.8 <2045#section-6.8>`,
Serhiy Storchakada7880a2016-05-07 08:44:15 +0300332 which was the de facto standard base64 specification when the
333 XML-RPC spec was written.
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000334
Serhiy Storchakada7880a2016-05-07 08:44:15 +0300335 It also supports certain of Python's built-in operators through :meth:`__eq__`
336 and :meth:`__ne__` methods.
Georg Brandl116aa622007-08-15 14:28:22 +0000337
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000338Example usage of the binary objects. We're going to transfer an image over
339XMLRPC::
340
Georg Brandl38eceaa2008-05-26 11:14:17 +0000341 from xmlrpc.server import SimpleXMLRPCServer
342 import xmlrpc.client
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000343
344 def python_logo():
Victor Stinner757db832010-01-30 02:16:55 +0000345 with open("python_logo.jpg", "rb") as handle:
346 return xmlrpc.client.Binary(handle.read())
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000347
348 server = SimpleXMLRPCServer(("localhost", 8000))
Georg Brandlf6945182008-02-01 11:56:49 +0000349 print("Listening on port 8000...")
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000350 server.register_function(python_logo, 'python_logo')
351
352 server.serve_forever()
353
354The client gets the image and saves it to a file::
355
Georg Brandl38eceaa2008-05-26 11:14:17 +0000356 import xmlrpc.client
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000357
Georg Brandl38eceaa2008-05-26 11:14:17 +0000358 proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")
Victor Stinner757db832010-01-30 02:16:55 +0000359 with open("fetched_python_logo.jpg", "wb") as handle:
360 handle.write(proxy.python_logo().data)
Georg Brandl116aa622007-08-15 14:28:22 +0000361
362.. _fault-objects:
363
364Fault Objects
365-------------
366
Serhiy Storchakada7880a2016-05-07 08:44:15 +0300367.. class:: Fault
368
369 A :class:`Fault` object encapsulates the content of an XML-RPC fault tag. Fault
370 objects have the following attributes:
Georg Brandl116aa622007-08-15 14:28:22 +0000371
372
Serhiy Storchakada7880a2016-05-07 08:44:15 +0300373 .. attribute:: faultCode
Georg Brandl116aa622007-08-15 14:28:22 +0000374
Serhiy Storchakada7880a2016-05-07 08:44:15 +0300375 A string indicating the fault type.
Georg Brandl116aa622007-08-15 14:28:22 +0000376
377
Serhiy Storchakada7880a2016-05-07 08:44:15 +0300378 .. attribute:: faultString
Georg Brandl116aa622007-08-15 14:28:22 +0000379
Serhiy Storchakada7880a2016-05-07 08:44:15 +0300380 A string containing a diagnostic message associated with the fault.
Georg Brandl116aa622007-08-15 14:28:22 +0000381
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000382In the following example we're going to intentionally cause a :exc:`Fault` by
383returning a complex type object. The server code::
384
Georg Brandl38eceaa2008-05-26 11:14:17 +0000385 from xmlrpc.server import SimpleXMLRPCServer
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000386
387 # A marshalling error is going to occur because we're returning a
388 # complex number
Serhiy Storchakadba90392016-05-10 12:01:23 +0300389 def add(x, y):
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000390 return x+y+0j
391
392 server = SimpleXMLRPCServer(("localhost", 8000))
Georg Brandlf6945182008-02-01 11:56:49 +0000393 print("Listening on port 8000...")
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000394 server.register_function(add, 'add')
395
396 server.serve_forever()
397
398The client code for the preceding server::
399
Georg Brandl38eceaa2008-05-26 11:14:17 +0000400 import xmlrpc.client
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000401
Georg Brandl38eceaa2008-05-26 11:14:17 +0000402 proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000403 try:
404 proxy.add(2, 5)
Georg Brandl0dedf452009-05-22 16:44:06 +0000405 except xmlrpc.client.Fault as err:
Georg Brandl2ee470f2008-07-16 12:55:28 +0000406 print("A fault occurred")
Georg Brandlf6945182008-02-01 11:56:49 +0000407 print("Fault code: %d" % err.faultCode)
408 print("Fault string: %s" % err.faultString)
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000409
410
Georg Brandl116aa622007-08-15 14:28:22 +0000411
412.. _protocol-error-objects:
413
414ProtocolError Objects
415---------------------
416
Serhiy Storchakada7880a2016-05-07 08:44:15 +0300417.. class:: ProtocolError
418
419 A :class:`ProtocolError` object describes a protocol error in the underlying
420 transport layer (such as a 404 'not found' error if the server named by the URI
421 does not exist). It has the following attributes:
Georg Brandl116aa622007-08-15 14:28:22 +0000422
423
Serhiy Storchakada7880a2016-05-07 08:44:15 +0300424 .. attribute:: url
Georg Brandl116aa622007-08-15 14:28:22 +0000425
Serhiy Storchakada7880a2016-05-07 08:44:15 +0300426 The URI or URL that triggered the error.
Georg Brandl116aa622007-08-15 14:28:22 +0000427
428
Serhiy Storchakada7880a2016-05-07 08:44:15 +0300429 .. attribute:: errcode
Georg Brandl116aa622007-08-15 14:28:22 +0000430
Serhiy Storchakada7880a2016-05-07 08:44:15 +0300431 The error code.
Georg Brandl116aa622007-08-15 14:28:22 +0000432
433
Serhiy Storchakada7880a2016-05-07 08:44:15 +0300434 .. attribute:: errmsg
Georg Brandl116aa622007-08-15 14:28:22 +0000435
Serhiy Storchakada7880a2016-05-07 08:44:15 +0300436 The error message or diagnostic string.
Georg Brandl116aa622007-08-15 14:28:22 +0000437
438
Serhiy Storchakada7880a2016-05-07 08:44:15 +0300439 .. attribute:: headers
Georg Brandl116aa622007-08-15 14:28:22 +0000440
Serhiy Storchakada7880a2016-05-07 08:44:15 +0300441 A dict containing the headers of the HTTP/HTTPS request that triggered the
442 error.
Georg Brandl116aa622007-08-15 14:28:22 +0000443
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000444In the following example we're going to intentionally cause a :exc:`ProtocolError`
445by providing an invalid URI::
446
Georg Brandl38eceaa2008-05-26 11:14:17 +0000447 import xmlrpc.client
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000448
Martin Panter6245cb32016-04-15 02:14:19 +0000449 # create a ServerProxy with a URI that doesn't respond to XMLRPC requests
Benjamin Peterson5e55b3e2010-02-03 02:35:45 +0000450 proxy = xmlrpc.client.ServerProxy("http://google.com/")
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000451
452 try:
453 proxy.some_method()
Georg Brandl0dedf452009-05-22 16:44:06 +0000454 except xmlrpc.client.ProtocolError as err:
Georg Brandl2ee470f2008-07-16 12:55:28 +0000455 print("A protocol error occurred")
Georg Brandlf6945182008-02-01 11:56:49 +0000456 print("URL: %s" % err.url)
457 print("HTTP/HTTPS headers: %s" % err.headers)
458 print("Error code: %d" % err.errcode)
459 print("Error message: %s" % err.errmsg)
Georg Brandl116aa622007-08-15 14:28:22 +0000460
461MultiCall Objects
462-----------------
463
Sandro Tosi9daf98d2011-08-20 17:05:56 +0200464The :class:`MultiCall` object provides a way to encapsulate multiple calls to a
465remote server into a single request [#]_.
Georg Brandl116aa622007-08-15 14:28:22 +0000466
467
468.. class:: MultiCall(server)
469
470 Create an object used to boxcar method calls. *server* is the eventual target of
471 the call. Calls can be made to the result object, but they will immediately
472 return ``None``, and only store the call name and parameters in the
473 :class:`MultiCall` object. Calling the object itself causes all stored calls to
474 be transmitted as a single ``system.multicall`` request. The result of this call
Georg Brandl9afde1c2007-11-01 20:32:30 +0000475 is a :term:`generator`; iterating over this generator yields the individual
476 results.
Georg Brandl116aa622007-08-15 14:28:22 +0000477
Andrew Kuchlingc3db3732013-06-20 21:33:05 -0400478A usage example of this class follows. The server code::
Georg Brandl116aa622007-08-15 14:28:22 +0000479
Georg Brandl38eceaa2008-05-26 11:14:17 +0000480 from xmlrpc.server import SimpleXMLRPCServer
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000481
Ezio Melotti79016e12013-08-08 15:45:56 +0300482 def add(x, y):
483 return x + y
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000484
485 def subtract(x, y):
Ezio Melotti79016e12013-08-08 15:45:56 +0300486 return x - y
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000487
488 def multiply(x, y):
Ezio Melotti79016e12013-08-08 15:45:56 +0300489 return x * y
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000490
491 def divide(x, y):
Andrew Kuchlingc3db3732013-06-20 21:33:05 -0400492 return x // y
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000493
494 # A simple server with simple arithmetic functions
495 server = SimpleXMLRPCServer(("localhost", 8000))
Georg Brandlf6945182008-02-01 11:56:49 +0000496 print("Listening on port 8000...")
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000497 server.register_multicall_functions()
498 server.register_function(add, 'add')
499 server.register_function(subtract, 'subtract')
500 server.register_function(multiply, 'multiply')
501 server.register_function(divide, 'divide')
502 server.serve_forever()
503
504The client code for the preceding server::
505
Georg Brandl38eceaa2008-05-26 11:14:17 +0000506 import xmlrpc.client
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000507
Georg Brandl38eceaa2008-05-26 11:14:17 +0000508 proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")
509 multicall = xmlrpc.client.MultiCall(proxy)
Ezio Melotti79016e12013-08-08 15:45:56 +0300510 multicall.add(7, 3)
511 multicall.subtract(7, 3)
512 multicall.multiply(7, 3)
513 multicall.divide(7, 3)
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000514 result = multicall()
515
Ezio Melotti79016e12013-08-08 15:45:56 +0300516 print("7+3=%d, 7-3=%d, 7*3=%d, 7//3=%d" % tuple(result))
Georg Brandl116aa622007-08-15 14:28:22 +0000517
518
519Convenience Functions
520---------------------
521
Georg Brandl7f01a132009-09-16 15:58:14 +0000522.. function:: dumps(params, methodname=None, methodresponse=None, encoding=None, allow_none=False)
Georg Brandl116aa622007-08-15 14:28:22 +0000523
524 Convert *params* into an XML-RPC request. or into a response if *methodresponse*
525 is true. *params* can be either a tuple of arguments or an instance of the
526 :exc:`Fault` exception class. If *methodresponse* is true, only a single value
527 can be returned, meaning that *params* must be of length 1. *encoding*, if
528 supplied, is the encoding to use in the generated XML; the default is UTF-8.
529 Python's :const:`None` value cannot be used in standard XML-RPC; to allow using
530 it via an extension, provide a true value for *allow_none*.
531
532
Florent Xicluna61665192011-11-15 20:53:25 +0100533.. function:: loads(data, use_datetime=False, use_builtin_types=False)
Georg Brandl116aa622007-08-15 14:28:22 +0000534
535 Convert an XML-RPC request or response into Python objects, a ``(params,
536 methodname)``. *params* is a tuple of argument; *methodname* is a string, or
537 ``None`` if no method name is present in the packet. If the XML-RPC packet
538 represents a fault condition, this function will raise a :exc:`Fault` exception.
Florent Xicluna61665192011-11-15 20:53:25 +0100539 The *use_builtin_types* flag can be used to cause date/time values to be
540 presented as :class:`datetime.datetime` objects and binary data to be
541 presented as :class:`bytes` objects; this flag is false by default.
542
543 The obsolete *use_datetime* flag is similar to *use_builtin_types* but it
544 applies only to date/time values.
545
546 .. versionchanged:: 3.3
547 The *use_builtin_types* flag was added.
Georg Brandl116aa622007-08-15 14:28:22 +0000548
Georg Brandl116aa622007-08-15 14:28:22 +0000549
550.. _xmlrpc-client-example:
551
552Example of Client Usage
553-----------------------
554
555::
556
557 # simple test program (from the XML-RPC specification)
Georg Brandl38eceaa2008-05-26 11:14:17 +0000558 from xmlrpc.client import ServerProxy, Error
Georg Brandl116aa622007-08-15 14:28:22 +0000559
560 # server = ServerProxy("http://localhost:8000") # local server
Brett Cannon33a40002014-03-21 11:24:40 -0400561 with ServerProxy("http://betty.userland.com") as proxy:
Georg Brandl116aa622007-08-15 14:28:22 +0000562
Brett Cannon33a40002014-03-21 11:24:40 -0400563 print(proxy)
Georg Brandl116aa622007-08-15 14:28:22 +0000564
Brett Cannon33a40002014-03-21 11:24:40 -0400565 try:
566 print(proxy.examples.getStateName(41))
567 except Error as v:
568 print("ERROR", v)
Georg Brandl116aa622007-08-15 14:28:22 +0000569
Martin Panter1c5e7152016-02-22 09:04:22 +0000570To access an XML-RPC server through a HTTP proxy, you need to define a custom
Berker Peksag0aa78872016-10-09 18:18:21 +0300571transport. The following example shows how::
Georg Brandl116aa622007-08-15 14:28:22 +0000572
Berker Peksag0aa78872016-10-09 18:18:21 +0300573 import http.client
574 import xmlrpc.client
Georg Brandl116aa622007-08-15 14:28:22 +0000575
Georg Brandl38eceaa2008-05-26 11:14:17 +0000576 class ProxiedTransport(xmlrpc.client.Transport):
Berker Peksag0aa78872016-10-09 18:18:21 +0300577
578 def set_proxy(self, host, port=None, headers=None):
579 self.proxy = host, port
580 self.proxy_headers = headers
Serhiy Storchakadba90392016-05-10 12:01:23 +0300581
Georg Brandl116aa622007-08-15 14:28:22 +0000582 def make_connection(self, host):
Berker Peksag0aa78872016-10-09 18:18:21 +0300583 connection = http.client.HTTPConnection(*self.proxy)
584 connection.set_tunnel(host, headers=self.proxy_headers)
585 self._connection = host, connection
586 return connection
Serhiy Storchakadba90392016-05-10 12:01:23 +0300587
Berker Peksag0aa78872016-10-09 18:18:21 +0300588 transport = ProxiedTransport()
589 transport.set_proxy('proxy-server', 8080)
590 server = xmlrpc.client.ServerProxy('http://betty.userland.com', transport=transport)
591 print(server.examples.getStateName(41))
Georg Brandl116aa622007-08-15 14:28:22 +0000592
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000593
594Example of Client and Server Usage
595----------------------------------
596
597See :ref:`simplexmlrpcserver-example`.
598
599
Sandro Tosi9daf98d2011-08-20 17:05:56 +0200600.. rubric:: Footnotes
601
602.. [#] This approach has been first presented in `a discussion on xmlrpc.com
Serhiy Storchaka6dff0202016-05-07 10:49:07 +0300603 <https://web.archive.org/web/20060624230303/http://www.xmlrpc.com/discuss/msgReader$1208?mode=topic>`_.
Sandro Tosi9daf98d2011-08-20 17:05:56 +0200604.. the link now points to webarchive since the one at
605.. http://www.xmlrpc.com/discuss/msgReader%241208 is broken (and webadmin
606.. doesn't reply)