summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_xmlrpc.py42
-rw-r--r--Lib/xmlrpclib.py2
2 files changed, 43 insertions, 1 deletions
diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py
index 1f533d2..3a4d808 100644
--- a/Lib/test/test_xmlrpc.py
+++ b/Lib/test/test_xmlrpc.py
@@ -3,6 +3,13 @@ import unittest
import xmlrpclib
from test import test_support
+try:
+ unicode
+except NameError:
+ have_unicode = False
+else:
+ have_unicode = True
+
alist = [{'astring': 'foo@bar.baz.spam',
'afloat': 7283.43,
'anint': 2**20,
@@ -39,6 +46,41 @@ class XMLRPCTestCase(unittest.TestCase):
xmlrpclib.loads(strg)[0][0])
self.assertRaises(TypeError, xmlrpclib.dumps, (arg1,))
+ def test_default_encoding_issues(self):
+ # SF bug #1115989: wrong decoding in '_stringify'
+ utf8 = """<?xml version='1.0' encoding='iso-8859-1'?>
+ <params>
+ <param><value>
+ <string>abc \x95</string>
+ </value></param>
+ <param><value>
+ <struct>
+ <member>
+ <name>def \x96</name>
+ <value><string>ghi \x97</string></value>
+ </member>
+ </struct>
+ </value></param>
+ </params>
+ """
+ old_encoding = sys.getdefaultencoding()
+ reload(sys) # ugh!
+ sys.setdefaultencoding("iso-8859-1")
+ try:
+ (s, d), m = xmlrpclib.loads(utf8)
+ finally:
+ sys.setdefaultencoding(old_encoding)
+ items = d.items()
+ if have_unicode:
+ self.assertEquals(s, u"abc \x95")
+ self.assert_(isinstance(s, unicode))
+ self.assertEquals(items, [(u"def \x96", u"ghi \x97")])
+ self.assert_(isinstance(items[0][0], unicode))
+ self.assert_(isinstance(items[0][1], unicode))
+ else:
+ self.assertEquals(s, "abc \xc2\x95")
+ self.assertEquals(items, [("def \xc2\x96", "ghi \xc2\x97")])
+
def test_main():
test_support.run_unittest(XMLRPCTestCase)
diff --git a/Lib/xmlrpclib.py b/Lib/xmlrpclib.py
index 7b68196..0c7cee2 100644
--- a/Lib/xmlrpclib.py
+++ b/Lib/xmlrpclib.py
@@ -168,7 +168,7 @@ if unicode:
def _stringify(string):
# convert to 7-bit ascii if possible
try:
- return str(string)
+ return string.encode("ascii")
except UnicodeError:
return string
else: