Home | History | Annotate | Download | only in library
      1 :mod:`xmlrpclib` --- XML-RPC client access
      2 ==========================================
      3 
      4 .. module:: xmlrpclib
      5    :synopsis: XML-RPC client access.
      6 .. moduleauthor:: Fredrik Lundh <fredrik (a] pythonware.com>
      7 .. sectionauthor:: Eric S. Raymond <esr (a] snark.thyrsus.com>
      8 
      9 .. note::
     10    The :mod:`xmlrpclib` module has been renamed to :mod:`xmlrpc.client` in
     11    Python 3.  The :term:`2to3` tool will automatically adapt imports when
     12    converting your sources to Python 3.
     13 
     14 
     15 .. XXX Not everything is documented yet.  It might be good to describe
     16    Marshaller, Unmarshaller, getparser, dumps, loads, and Transport.
     17 
     18 .. versionadded:: 2.2
     19 
     20 **Source code:** :source:`Lib/xmlrpclib.py`
     21 
     22 --------------
     23 
     24 XML-RPC is a Remote Procedure Call method that uses XML passed via HTTP(S) as a
     25 transport.  With it, a client can call methods with parameters on a remote
     26 server (the server is named by a URI) and get back structured data.  This module
     27 supports writing XML-RPC client code; it handles all the details of translating
     28 between conformable Python objects and XML on the wire.
     29 
     30 
     31 .. warning::
     32 
     33    The :mod:`xmlrpclib` module is not secure against maliciously
     34    constructed data.  If you need to parse untrusted or unauthenticated data see
     35    :ref:`xml-vulnerabilities`.
     36 
     37 .. versionchanged:: 2.7.9
     38 
     39    For HTTPS URIs, :mod:`xmlrpclib` now performs all the necessary certificate
     40    and hostname checks by default.
     41 
     42 .. class:: ServerProxy(uri[, transport[, encoding[, verbose[, allow_none[, use_datetime[, context]]]]]])
     43 
     44    A :class:`ServerProxy` instance is an object that manages communication with a
     45    remote XML-RPC server.  The required first argument is a URI (Uniform Resource
     46    Indicator), and will normally be the URL of the server.  The optional second
     47    argument is a transport factory instance; by default it is an internal
     48    :class:`SafeTransport` instance for https: URLs and an internal HTTP
     49    :class:`Transport` instance otherwise.  The optional third argument is an
     50    encoding, by default UTF-8. The optional fourth argument is a debugging flag.
     51 
     52    The following parameters govern the use of the returned proxy instance.
     53    If *allow_none* is true,  the Python constant ``None`` will be translated into
     54    XML; the default behaviour is for ``None`` to raise a :exc:`TypeError`. This is
     55    a commonly-used extension to the XML-RPC specification, but isn't supported by
     56    all clients and servers; see `http://ontosys.com/xml-rpc/extensions.php
     57    <https://web.archive.org/web/20130120074804/http://ontosys.com/xml-rpc/extensions.php>`_
     58    for a description.
     59    The *use_datetime* flag can be used to cause date/time values to
     60    be presented as :class:`datetime.datetime` objects; this is false by default.
     61    :class:`datetime.datetime` objects may be passed to calls.
     62 
     63    Both the HTTP and HTTPS transports support the URL syntax extension for HTTP
     64    Basic Authentication: ``http://user:pass@host:port/path``.  The ``user:pass``
     65    portion will be base64-encoded as an HTTP 'Authorization' header, and sent to
     66    the remote server as part of the connection process when invoking an XML-RPC
     67    method.  You only need to use this if the remote server requires a Basic
     68    Authentication user and password. If an HTTPS URL is provided, *context* may
     69    be :class:`ssl.SSLContext` and configures the SSL settings of the underlying
     70    HTTPS connection.
     71 
     72    The returned instance is a proxy object with methods that can be used to invoke
     73    corresponding RPC calls on the remote server.  If the remote server supports the
     74    introspection API, the proxy can also be used to query the remote server for the
     75    methods it supports (service discovery) and fetch other server-associated
     76    metadata.
     77 
     78    Types that are conformable (e.g. that can be marshalled through XML),
     79    include the following (and except where noted, they are unmarshalled
     80    as the same Python type):
     81 
     82    .. tabularcolumns:: |l|L|
     83 
     84    +----------------------+-------------------------------------------------------+
     85    | XML-RPC type         | Python type                                           |
     86    +======================+=======================================================+
     87    | ``boolean``          | :class:`bool`                                         |
     88    +----------------------+-------------------------------------------------------+
     89    | ``int`` or ``i4``    | :class:`int` or :class:`long` in range from           |
     90    |                      | -2147483648 to 2147483647.                            |
     91    +----------------------+-------------------------------------------------------+
     92    | ``double``           | :class:`float`                                        |
     93    +----------------------+-------------------------------------------------------+
     94    | ``string``           | :class:`str` or :class:`unicode`                      |
     95    +----------------------+-------------------------------------------------------+
     96    | ``array``            | :class:`list` or :class:`tuple` containing            |
     97    |                      | conformable elements.  Arrays are returned as         |
     98    |                      | :class:`lists <list>`.                                |
     99    +----------------------+-------------------------------------------------------+
    100    | ``struct``           | :class:`dict`.  Keys must be strings, values may be   |
    101    |                      | any conformable type.  Objects of user-defined        |
    102    |                      | classes can be passed in; only their                  |
    103    |                      | :attr:`~object.__dict__` attribute is transmitted.    |
    104    +----------------------+-------------------------------------------------------+
    105    | ``dateTime.iso8601`` | :class:`DateTime` or :class:`datetime.datetime`.      |
    106    |                      | Returned type depends on values of the *use_datetime* |
    107    |                      | flags.                                                |
    108    +----------------------+-------------------------------------------------------+
    109    | ``base64``           | :class:`Binary`                                       |
    110    +----------------------+-------------------------------------------------------+
    111    | ``nil``              | The ``None`` constant.  Passing is allowed only if    |
    112    |                      | *allow_none* is true.                                 |
    113    +----------------------+-------------------------------------------------------+
    114 
    115    This is the full set of data types supported by XML-RPC.  Method calls may also
    116    raise a special :exc:`Fault` instance, used to signal XML-RPC server errors, or
    117    :exc:`ProtocolError` used to signal an error in the HTTP/HTTPS transport layer.
    118    Both :exc:`Fault` and :exc:`ProtocolError` derive from a base class called
    119    :exc:`Error`.  Note that even though starting with Python 2.2 you can subclass
    120    built-in types, the xmlrpclib module currently does not marshal instances of such
    121    subclasses.
    122 
    123    When passing strings, characters special to XML such as ``<``, ``>``, and ``&``
    124    will be automatically escaped.  However, it's the caller's responsibility to
    125    ensure that the string is free of characters that aren't allowed in XML, such as
    126    the control characters with ASCII values between 0 and 31 (except, of course,
    127    tab, newline and carriage return); failing to do this will result in an XML-RPC
    128    request that isn't well-formed XML.  If you have to pass arbitrary strings via
    129    XML-RPC, use the :class:`Binary` wrapper class described below.
    130 
    131    :class:`Server` is retained as an alias for :class:`ServerProxy` for backwards
    132    compatibility.  New code should use :class:`ServerProxy`.
    133 
    134    .. versionchanged:: 2.5
    135       The *use_datetime* flag was added.
    136 
    137    .. versionchanged:: 2.6
    138       Instances of :term:`new-style class`\es can be passed in if they have an
    139       *__dict__* attribute and don't have a base class that is marshalled in a
    140       special way.
    141 
    142    .. versionchanged:: 2.7.9
    143       Added the *context* argument.
    144 
    145 
    146 .. seealso::
    147 
    148    `XML-RPC HOWTO <http://www.tldp.org/HOWTO/XML-RPC-HOWTO/index.html>`_
    149       A good description of XML-RPC operation and client software in several languages.
    150       Contains pretty much everything an XML-RPC client developer needs to know.
    151 
    152    `XML-RPC Introspection <http://xmlrpc-c.sourceforge.net/introspection.html>`_
    153       Describes the XML-RPC protocol extension for introspection.
    154 
    155    `XML-RPC Specification <http://www.xmlrpc.com/spec>`_
    156       The official specification.
    157 
    158    `Unofficial XML-RPC Errata <http://effbot.org/zone/xmlrpc-errata.htm>`_
    159       Fredrik Lundh's "unofficial errata, intended to clarify certain
    160       details in the XML-RPC specification, as well as hint at
    161       'best practices' to use when designing your own XML-RPC
    162       implementations."
    163 
    164 .. _serverproxy-objects:
    165 
    166 ServerProxy Objects
    167 -------------------
    168 
    169 A :class:`ServerProxy` instance has a method corresponding to each remote
    170 procedure call accepted by the XML-RPC server.  Calling the method performs an
    171 RPC, dispatched by both name and argument signature (e.g. the same method name
    172 can be overloaded with multiple argument signatures).  The RPC finishes by
    173 returning a value, which may be either returned data in a conformant type or a
    174 :class:`Fault` or :class:`ProtocolError` object indicating an error.
    175 
    176 Servers that support the XML introspection API support some common methods
    177 grouped under the reserved :attr:`~ServerProxy.system` attribute:
    178 
    179 
    180 .. method:: ServerProxy.system.listMethods()
    181 
    182    This method returns a list of strings, one for each (non-system) method
    183    supported by the XML-RPC server.
    184 
    185 
    186 .. method:: ServerProxy.system.methodSignature(name)
    187 
    188    This method takes one parameter, the name of a method implemented by the XML-RPC
    189    server. It returns an array of possible signatures for this method. A signature
    190    is an array of types. The first of these types is the return type of the method,
    191    the rest are parameters.
    192 
    193    Because multiple signatures (ie. overloading) is permitted, this method returns
    194    a list of signatures rather than a singleton.
    195 
    196    Signatures themselves are restricted to the top level parameters expected by a
    197    method. For instance if a method expects one array of structs as a parameter,
    198    and it returns a string, its signature is simply "string, array". If it expects
    199    three integers and returns a string, its signature is "string, int, int, int".
    200 
    201    If no signature is defined for the method, a non-array value is returned. In
    202    Python this means that the type of the returned  value will be something other
    203    than list.
    204 
    205 
    206 .. method:: ServerProxy.system.methodHelp(name)
    207 
    208    This method takes one parameter, the name of a method implemented by the XML-RPC
    209    server.  It returns a documentation string describing the use of that method. If
    210    no such string is available, an empty string is returned. The documentation
    211    string may contain HTML markup.
    212 
    213 
    214 .. _boolean-objects:
    215 
    216 Boolean Objects
    217 ---------------
    218 
    219 This class may be initialized from any Python value; the instance returned
    220 depends only on its truth value.  It supports various Python operators through
    221 :meth:`__cmp__`, :meth:`__repr__`, :meth:`__int__`, and :meth:`__nonzero__`
    222 methods, all implemented in the obvious ways.
    223 
    224 It also has the following method, supported mainly for internal use by the
    225 unmarshalling code:
    226 
    227 
    228 .. method:: Boolean.encode(out)
    229 
    230    Write the XML-RPC encoding of this Boolean item to the out stream object.
    231 
    232 A working example follows. The server code::
    233 
    234    import xmlrpclib
    235    from SimpleXMLRPCServer import SimpleXMLRPCServer
    236 
    237    def is_even(n):
    238        return n % 2 == 0
    239 
    240    server = SimpleXMLRPCServer(("localhost", 8000))
    241    print "Listening on port 8000..."
    242    server.register_function(is_even, "is_even")
    243    server.serve_forever()
    244 
    245 The client code for the preceding server::
    246 
    247    import xmlrpclib
    248 
    249    proxy = xmlrpclib.ServerProxy("http://localhost:8000/")
    250    print "3 is even: %s" % str(proxy.is_even(3))
    251    print "100 is even: %s" % str(proxy.is_even(100))
    252 
    253 .. _datetime-objects:
    254 
    255 DateTime Objects
    256 ----------------
    257 
    258 .. class:: DateTime
    259 
    260    This class may be initialized with seconds since the epoch, a time
    261    tuple, an ISO 8601 time/date string, or a :class:`datetime.datetime`
    262    instance.  It has the following methods, supported mainly for internal
    263    use by the marshalling/unmarshalling code:
    264 
    265 
    266    .. method:: decode(string)
    267 
    268       Accept a string as the instance's new time value.
    269 
    270 
    271    .. method:: encode(out)
    272 
    273       Write the XML-RPC encoding of this :class:`DateTime` item to the *out* stream
    274       object.
    275 
    276    It also supports certain of Python's built-in operators through :meth:`__cmp__`
    277    and :meth:`__repr__` methods.
    278 
    279 A working example follows. The server code::
    280 
    281    import datetime
    282    from SimpleXMLRPCServer import SimpleXMLRPCServer
    283    import xmlrpclib
    284 
    285    def today():
    286        today = datetime.datetime.today()
    287        return xmlrpclib.DateTime(today)
    288 
    289    server = SimpleXMLRPCServer(("localhost", 8000))
    290    print "Listening on port 8000..."
    291    server.register_function(today, "today")
    292    server.serve_forever()
    293 
    294 The client code for the preceding server::
    295 
    296    import xmlrpclib
    297    import datetime
    298 
    299    proxy = xmlrpclib.ServerProxy("http://localhost:8000/")
    300 
    301    today = proxy.today()
    302    # convert the ISO8601 string to a datetime object
    303    converted = datetime.datetime.strptime(today.value, "%Y%m%dT%H:%M:%S")
    304    print "Today: %s" % converted.strftime("%d.%m.%Y, %H:%M")
    305 
    306 .. _binary-objects:
    307 
    308 Binary Objects
    309 --------------
    310 
    311 .. class:: Binary
    312 
    313    This class may be initialized from string data (which may include NULs). The
    314    primary access to the content of a :class:`Binary` object is provided by an
    315    attribute:
    316 
    317 
    318    .. attribute:: data
    319 
    320       The binary data encapsulated by the :class:`Binary` instance.  The data is
    321       provided as an 8-bit string.
    322 
    323    :class:`Binary` objects have the following methods, supported mainly for
    324    internal use by the marshalling/unmarshalling code:
    325 
    326 
    327    .. method:: decode(string)
    328 
    329       Accept a base64 string and decode it as the instance's new data.
    330 
    331 
    332    .. method:: encode(out)
    333 
    334       Write the XML-RPC base 64 encoding of this binary item to the *out* stream object.
    335 
    336       The encoded data will have newlines every 76 characters as per
    337       `RFC 2045 section 6.8 <https://tools.ietf.org/html/rfc2045#section-6.8>`_,
    338       which was the de facto standard base64 specification when the
    339       XML-RPC spec was written.
    340 
    341    It also supports certain of Python's built-in operators through a
    342    :meth:`__cmp__` method.
    343 
    344 Example usage of the binary objects.  We're going to transfer an image over
    345 XMLRPC::
    346 
    347    from SimpleXMLRPCServer import SimpleXMLRPCServer
    348    import xmlrpclib
    349 
    350    def python_logo():
    351         with open("python_logo.jpg", "rb") as handle:
    352             return xmlrpclib.Binary(handle.read())
    353 
    354    server = SimpleXMLRPCServer(("localhost", 8000))
    355    print "Listening on port 8000..."
    356    server.register_function(python_logo, 'python_logo')
    357 
    358    server.serve_forever()
    359 
    360 The client gets the image and saves it to a file::
    361 
    362    import xmlrpclib
    363 
    364    proxy = xmlrpclib.ServerProxy("http://localhost:8000/")
    365    with open("fetched_python_logo.jpg", "wb") as handle:
    366        handle.write(proxy.python_logo().data)
    367 
    368 .. _fault-objects:
    369 
    370 Fault Objects
    371 -------------
    372 
    373 .. class:: Fault
    374 
    375    A :class:`Fault` object encapsulates the content of an XML-RPC fault tag. Fault
    376    objects have the following attributes:
    377 
    378 
    379    .. attribute:: faultCode
    380 
    381       A string indicating the fault type.
    382 
    383 
    384    .. attribute:: faultString
    385 
    386       A string containing a diagnostic message associated with the fault.
    387 
    388 In the following example we're going to intentionally cause a :exc:`Fault` by
    389 returning a complex type object.  The server code::
    390 
    391    from SimpleXMLRPCServer import SimpleXMLRPCServer
    392 
    393    # A marshalling error is going to occur because we're returning a
    394    # complex number
    395    def add(x, y):
    396        return x+y+0j
    397 
    398    server = SimpleXMLRPCServer(("localhost", 8000))
    399    print "Listening on port 8000..."
    400    server.register_function(add, 'add')
    401 
    402    server.serve_forever()
    403 
    404 The client code for the preceding server::
    405 
    406    import xmlrpclib
    407 
    408    proxy = xmlrpclib.ServerProxy("http://localhost:8000/")
    409    try:
    410        proxy.add(2, 5)
    411    except xmlrpclib.Fault as err:
    412        print "A fault occurred"
    413        print "Fault code: %d" % err.faultCode
    414        print "Fault string: %s" % err.faultString
    415 
    416 
    417 
    418 .. _protocol-error-objects:
    419 
    420 ProtocolError Objects
    421 ---------------------
    422 
    423 .. class:: ProtocolError
    424 
    425    A :class:`ProtocolError` object describes a protocol error in the underlying
    426    transport layer (such as a 404 'not found' error if the server named by the URI
    427    does not exist).  It has the following attributes:
    428 
    429 
    430    .. attribute:: url
    431 
    432       The URI or URL that triggered the error.
    433 
    434 
    435    .. attribute:: errcode
    436 
    437       The error code.
    438 
    439 
    440    .. attribute:: errmsg
    441 
    442       The error message or diagnostic string.
    443 
    444 
    445    .. attribute:: headers
    446 
    447       A string containing the headers of the HTTP/HTTPS request that triggered the
    448       error.
    449 
    450 In the following example we're going to intentionally cause a :exc:`ProtocolError`
    451 by providing a URI that doesn't point to an XMLRPC server::
    452 
    453    import xmlrpclib
    454 
    455    # create a ServerProxy with a URI that doesn't respond to XMLRPC requests
    456    proxy = xmlrpclib.ServerProxy("http://www.google.com/")
    457 
    458    try:
    459        proxy.some_method()
    460    except xmlrpclib.ProtocolError as err:
    461        print "A protocol error occurred"
    462        print "URL: %s" % err.url
    463        print "HTTP/HTTPS headers: %s" % err.headers
    464        print "Error code: %d" % err.errcode
    465        print "Error message: %s" % err.errmsg
    466 
    467 MultiCall Objects
    468 -----------------
    469 
    470 .. versionadded:: 2.4
    471 
    472 The :class:`MultiCall` object provides a way to encapsulate multiple calls to a
    473 remote server into a single request [#]_.
    474 
    475 
    476 .. class:: MultiCall(server)
    477 
    478    Create an object used to boxcar method calls. *server* is the eventual target of
    479    the call. Calls can be made to the result object, but they will immediately
    480    return ``None``, and only store the call name and parameters in the
    481    :class:`MultiCall` object. Calling the object itself causes all stored calls to
    482    be transmitted as a single ``system.multicall`` request. The result of this call
    483    is a :term:`generator`; iterating over this generator yields the individual
    484    results.
    485 
    486 A usage example of this class follows.  The server code ::
    487 
    488    from SimpleXMLRPCServer import SimpleXMLRPCServer
    489 
    490    def add(x,y):
    491        return x+y
    492 
    493    def subtract(x, y):
    494        return x-y
    495 
    496    def multiply(x, y):
    497        return x*y
    498 
    499    def divide(x, y):
    500        return x/y
    501 
    502    # A simple server with simple arithmetic functions
    503    server = SimpleXMLRPCServer(("localhost", 8000))
    504    print "Listening on port 8000..."
    505    server.register_multicall_functions()
    506    server.register_function(add, 'add')
    507    server.register_function(subtract, 'subtract')
    508    server.register_function(multiply, 'multiply')
    509    server.register_function(divide, 'divide')
    510    server.serve_forever()
    511 
    512 The client code for the preceding server::
    513 
    514    import xmlrpclib
    515 
    516    proxy = xmlrpclib.ServerProxy("http://localhost:8000/")
    517    multicall = xmlrpclib.MultiCall(proxy)
    518    multicall.add(7,3)
    519    multicall.subtract(7,3)
    520    multicall.multiply(7,3)
    521    multicall.divide(7,3)
    522    result = multicall()
    523 
    524    print "7+3=%d, 7-3=%d, 7*3=%d, 7/3=%d" % tuple(result)
    525 
    526 
    527 Convenience Functions
    528 ---------------------
    529 
    530 
    531 .. function:: boolean(value)
    532 
    533    Convert any Python value to one of the XML-RPC Boolean constants, ``True`` or
    534    ``False``.
    535 
    536 
    537 .. function:: dumps(params[, methodname[,  methodresponse[, encoding[, allow_none]]]])
    538 
    539    Convert *params* into an XML-RPC request. or into a response if *methodresponse*
    540    is true. *params* can be either a tuple of arguments or an instance of the
    541    :exc:`Fault` exception class.  If *methodresponse* is true, only a single value
    542    can be returned, meaning that *params* must be of length 1. *encoding*, if
    543    supplied, is the encoding to use in the generated XML; the default is UTF-8.
    544    Python's :const:`None` value cannot be used in standard XML-RPC; to allow using
    545    it via an extension,  provide a true value for *allow_none*.
    546 
    547 
    548 .. function:: loads(data[, use_datetime])
    549 
    550    Convert an XML-RPC request or response into Python objects, a ``(params,
    551    methodname)``.  *params* is a tuple of argument; *methodname* is a string, or
    552    ``None`` if no method name is present in the packet. If the XML-RPC packet
    553    represents a fault condition, this function will raise a :exc:`Fault` exception.
    554    The *use_datetime* flag can be used to cause date/time values to be presented as
    555    :class:`datetime.datetime` objects; this is false by default.
    556 
    557    .. versionchanged:: 2.5
    558       The *use_datetime* flag was added.
    559 
    560 
    561 .. _xmlrpc-client-example:
    562 
    563 Example of Client Usage
    564 -----------------------
    565 
    566 ::
    567 
    568    # simple test program (from the XML-RPC specification)
    569    from xmlrpclib import ServerProxy, Error
    570 
    571    # server = ServerProxy("http://localhost:8000") # local server
    572    server = ServerProxy("http://betty.userland.com")
    573 
    574    print server
    575 
    576    try:
    577        print server.examples.getStateName(41)
    578    except Error as v:
    579        print "ERROR", v
    580 
    581 To access an XML-RPC server through a HTTP proxy, you need to define a custom
    582 transport.  The following example shows how:
    583 
    584 .. Example taken from http://lowlife.jp/nobonobo/wiki/xmlrpcwithproxy.html
    585 
    586 ::
    587 
    588    import xmlrpclib, httplib
    589 
    590    class ProxiedTransport(xmlrpclib.Transport):
    591        def set_proxy(self, proxy):
    592            self.proxy = proxy
    593 
    594        def make_connection(self, host):
    595            self.realhost = host
    596            h = httplib.HTTPConnection(self.proxy)
    597            return h
    598 
    599        def send_request(self, connection, handler, request_body):
    600            connection.putrequest("POST", 'http://%s%s' % (self.realhost, handler))
    601 
    602        def send_host(self, connection, host):
    603            connection.putheader('Host', self.realhost)
    604 
    605    p = ProxiedTransport()
    606    p.set_proxy('proxy-server:8080')
    607    server = xmlrpclib.ServerProxy('http://time.xmlrpc.com/RPC2', transport=p)
    608    print server.currentTime.getCurrentTime()
    609 
    610 
    611 Example of Client and Server Usage
    612 ----------------------------------
    613 
    614 See :ref:`simplexmlrpcserver-example`.
    615 
    616 
    617 .. rubric:: Footnotes
    618 
    619 .. [#] This approach has been first presented in `a discussion on xmlrpc.com
    620    <https://web.archive.org/web/20060624230303/http://www.xmlrpc.com/discuss/msgReader$1208?mode=topic>`_.
    621 .. the link now points to webarchive since the one at
    622 .. http://www.xmlrpc.com/discuss/msgReader%241208 is broken (and webadmin
    623 .. doesn't reply)
    624