summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin v. Löwis <martin@v.loewis.de>2006-11-19 18:51:54 (GMT)
committerMartin v. Löwis <martin@v.loewis.de>2006-11-19 18:51:54 (GMT)
commit07529354dba821ddfa8ee0a14a9302e352eb8173 (patch)
tree48143b330356fc0f25a75dbecbb66e48e8f17740
parent9eec51c04ff9d04c74724aa6cd499457b64c75f9 (diff)
downloadcpython-07529354dba821ddfa8ee0a14a9302e352eb8173.zip
cpython-07529354dba821ddfa8ee0a14a9302e352eb8173.tar.gz
cpython-07529354dba821ddfa8ee0a14a9302e352eb8173.tar.bz2
Patch #1070046: Marshal new-style objects like InstanceType
in xmlrpclib.
-rw-r--r--Doc/lib/libxmlrpclib.tex9
-rw-r--r--Lib/test/test_xmlrpc.py9
-rw-r--r--Lib/xmlrpclib.py16
-rw-r--r--Misc/NEWS3
4 files changed, 33 insertions, 4 deletions
diff --git a/Doc/lib/libxmlrpclib.tex b/Doc/lib/libxmlrpclib.tex
index 3645b82..e3caab3 100644
--- a/Doc/lib/libxmlrpclib.tex
+++ b/Doc/lib/libxmlrpclib.tex
@@ -68,7 +68,10 @@ Python type):
\lineii{arrays}{Any Python sequence type containing conformable
elements. Arrays are returned as lists}
\lineii{structures}{A Python dictionary. Keys must be strings,
- values may be any conformable type.}
+ values may be any conformable type. Objects
+ of user-defined classes can be passed in;
+ only their \var{__dict__} attribute is
+ transmitted.}
\lineii{dates}{in seconds since the epoch (pass in an instance of the
\class{DateTime} class) or a
\class{\refmodule{datetime}.datetime},
@@ -100,6 +103,10 @@ described below.
compatibility. New code should use \class{ServerProxy}.
\versionchanged[The \var{use_datetime} flag was added]{2.5}
+
+\versionchanged[Instances of new-style classes can be passed in
+if they have an \var{__dict__} attribute and don't have a base class
+that is marshalled in a special way.}{2.6}
\end{classdesc}
diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py
index 64d8fe8..ccc1b60 100644
--- a/Lib/test/test_xmlrpc.py
+++ b/Lib/test/test_xmlrpc.py
@@ -86,6 +86,15 @@ class XMLRPCTestCase(unittest.TestCase):
s = xmlrpclib.dumps((new_d,), methodresponse=True)
self.assert_(isinstance(s, str))
+ def test_newstyle_class(self):
+ class T(object):
+ pass
+ t = T()
+ t.x = 100
+ t.y = "Hello"
+ ((t2,), dummy) = xmlrpclib.loads(xmlrpclib.dumps((t,)))
+ self.assertEquals(t2, t.__dict__)
+
def test_dump_big_long(self):
self.assertRaises(OverflowError, xmlrpclib.dumps, (2L**99,))
diff --git a/Lib/xmlrpclib.py b/Lib/xmlrpclib.py
index 6fb6c68..3864dad 100644
--- a/Lib/xmlrpclib.py
+++ b/Lib/xmlrpclib.py
@@ -630,9 +630,19 @@ class Marshaller:
try:
f = self.dispatch[type(value)]
except KeyError:
- raise TypeError, "cannot marshal %s objects" % type(value)
- else:
- f(self, value, write)
+ # check if this object can be marshalled as a structure
+ try:
+ value.__dict__
+ except:
+ raise TypeError, "cannot marshal %s objects" % type(value)
+ # check if this class is a sub-class of a basic type,
+ # because we don't know how to marshal these types
+ # (e.g. a string sub-class)
+ for type_ in type(value).__mro__:
+ if type_ in self.dispatch.keys():
+ raise TypeError, "cannot marshal %s objects" % type(value)
+ f = self.dispatch[InstanceType]
+ f(self, value, write)
def dump_nil (self, value, write):
if not self.allow_none:
diff --git a/Misc/NEWS b/Misc/NEWS
index 9b2aeba..849911b 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -101,6 +101,9 @@ Core and builtins
Library
-------
+- Patch #1070046: Marshal new-style objects like InstanceType
+ in xmlrpclib.
+
- cStringIO.truncate(-1) now raises an IOError, like StringIO and
regular files.