cpython: 0175883d9513 (original) (raw)

Mercurial > cpython

changeset 73575:0175883d9513

Closes #13297: use bytes type to send and receive binary data through XMLRPC. [#13297]

Florent Xicluna florent.xicluna@gmail.com
date Tue, 15 Nov 2011 20:53:25 +0100
parents 12940d9f8031
children d42811b93357 cea2d28f2855
files Doc/library/xmlrpc.client.rst Lib/test/test_xmlrpc.py Lib/xmlrpc/client.py Misc/NEWS
diffstat 4 files changed, 130 insertions(+), 46 deletions(-)[+] [-] Doc/library/xmlrpc.client.rst 53 Lib/test/test_xmlrpc.py 69 Lib/xmlrpc/client.py 52 Misc/NEWS 2

line wrap: on

line diff

--- a/Doc/library/xmlrpc.client.rst +++ b/Doc/library/xmlrpc.client.rst @@ -8,7 +8,7 @@ .. XXX Not everything is documented yet. It might be good to describe

Source code: :source:Lib/xmlrpc/client.py @@ -21,7 +21,12 @@ supports writing XML-RPC client code; it between conformable Python objects and XML on the wire. -.. class:: ServerProxy(uri, transport=None, encoding=None, verbose=False, allow_none=False, use_datetime=False) +.. class:: ServerProxy(uri, transport=None, encoding=None, verbose=False, [](#l1.17)

+

A :class:ServerProxy instance is an object that manages communication with a remote XML-RPC server. The required first argument is a URI (Uniform Resource @@ -34,9 +39,13 @@ between conformable Python objects and X XML; the default behaviour is for None to raise a :exc:TypeError. This is a commonly-used extension to the XML-RPC specification, but isn't supported by all clients and servers; see http://ontosys.com/xml-rpc/extensions.php for a

-This class may be initialized from string data (which may include NULs). The +This class may be initialized from bytes data (which may include NULs). The primary access to the content of a :class:Binary object is provided by an attribute: @@ -257,15 +267,15 @@ attribute: .. attribute:: Binary.data The binary data encapsulated by the :class:Binary instance. The data is

:class:Binary objects have the following methods, supported mainly for internal use by the marshalling/unmarshalling code: -.. method:: Binary.decode(string) +.. method:: Binary.decode(bytes)

.. method:: Binary.encode(out) @@ -471,14 +481,21 @@ Convenience Functions it via an extension, provide a true value for allow_none. -.. function:: loads(data, use_datetime=False) +.. function:: loads(data, use_datetime=False, use_builtin_types=False) Convert an XML-RPC request or response into Python objects, a (params,[](#l1.107) methodname). params is a tuple of argument; methodname is a string, or None if no method name is present in the packet. If the XML-RPC packet represents a fault condition, this function will raise a :exc:Fault exception.

.. _xmlrpc-client-example:

--- a/Lib/test/test_xmlrpc.py +++ b/Lib/test/test_xmlrpc.py @@ -24,6 +24,8 @@ alist = [{'astring': 'foo@bar.baz.spam', 'ashortlong': 2, 'anotherlist': ['.zyx.41'], 'abase64': xmlrpclib.Binary(b"my dog has fleas"),

@@ -44,27 +46,54 @@ class XMLRPCTestCase(unittest.TestCase): def test_dump_bare_datetime(self): # This checks that an unwrapped datetime.date object can be handled # by the marshalling code. This can't be done via test_dump_load()

+

+

+

+ def test_datetime_before_1900(self): # same as before but with a date before 1900 dt = datetime.datetime(1, 2, 10, 11, 41, 23)

+

def test_bug_1164912 (self): d = xmlrpclib.DateTime() @@ -133,6 +162,25 @@ class XMLRPCTestCase(unittest.TestCase): xmlrpclib.loads(strg)[0][0]) self.assertRaises(TypeError, xmlrpclib.dumps, (arg1,))

+

+

+ def test_get_host_info(self): # see bug #3613, this raised a TypeError transp = xmlrpc.client.Transport() @@ -140,9 +188,6 @@ class XMLRPCTestCase(unittest.TestCase): ('host.tld', [('Authorization', 'Basic dXNlcg==')], {}))

- def test_ssl_presence(self): try: import ssl

--- a/Lib/xmlrpc/client.py +++ b/Lib/xmlrpc/client.py @@ -386,8 +386,8 @@ class Binary: if data is None: data = b"" else:

@@ -559,6 +559,14 @@ class Marshaller: write("\n") dispatch[str] = dump_unicode

+ def dump_array(self, value, write): i = id(value) if i in self.memo: @@ -629,7 +637,7 @@ class Unmarshaller: # and again, if you don't understand what's going on in here, # that's perfectly ok.

@@ -637,7 +645,8 @@ class Unmarshaller: self._methodname = None self._encoding = "utf-8" self.append = self._stack.append

def close(self): # return response tuple and target method @@ -749,6 +758,8 @@ class Unmarshaller: def end_base64(self, data): value = Binary() value.decode(data.encode("ascii"))

#

return A (parser, unmarshaller) tuple.

-def getparser(use_datetime=False): +def getparser(use_datetime=False, use_builtin_types=False): """getparser() -> parser, unmarshaller Create an instance of the fastest available parser, and attach it to an unmarshalling object. Return both objects. """ if FastParser and FastUnmarshaller:

@@ -912,7 +928,7 @@ def dumps(params, methodname=None, metho encoding: the packet encoding (default is UTF-8)

(None if not present).

@see Fault

-def loads(data, use_datetime=False): +def loads(data, use_datetime=False, use_builtin_types=False): """data -> unmarshalled data, method name Convert an XML-RPC packet to unmarshalled data plus a method @@ -980,7 +996,7 @@ def loads(data, use_datetime=False): If the XML-RPC packet represents a fault condition, this function raises a Fault exception. """

@@ -1154,7 +1171,8 @@ class Transport: def getparser(self): # get parser and unmarshaller

## # Get authorization info from host parameter @@ -1361,7 +1379,7 @@ class ServerProxy: """ def init(self, uri, transport=None, encoding=None, verbose=False,

# get the url @@ -1375,9 +1393,11 @@ class ServerProxy: if transport is None: if type == "https":

self.__encoding = encoding or 'utf-8'

--- a/Misc/NEWS +++ b/Misc/NEWS @@ -374,6 +374,8 @@ Core and Builtins Library ------- +- Issue #13297: Use bytes type to send and receive binary data through XMLRPC. +