diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2016-01-20 08:41:33 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2016-01-20 08:41:33 (GMT) |
commit | 5ccbf79eaea74814a16618879919ff470dc5131f (patch) | |
tree | 84a426749f34b3efcabc25bd6429f7eda02806ac /Lib | |
parent | 5d69e6871a2a0b7e06ca9304eca47428b82e3d38 (diff) | |
parent | aebb6d3682e08c93d8468a9291180c5cbdc2df1b (diff) | |
download | cpython-5ccbf79eaea74814a16618879919ff470dc5131f.zip cpython-5ccbf79eaea74814a16618879919ff470dc5131f.tar.gz cpython-5ccbf79eaea74814a16618879919ff470dc5131f.tar.bz2 |
Issue #26147: xmlrpc now works with strings not encodable with used
non-UTF-8 encoding.
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/test/test_xmlrpc.py | 30 | ||||
-rw-r--r-- | Lib/xmlrpc/client.py | 4 | ||||
-rw-r--r-- | Lib/xmlrpc/server.py | 4 |
3 files changed, 27 insertions, 11 deletions
diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py index f9af09c..d142a15 100644 --- a/Lib/test/test_xmlrpc.py +++ b/Lib/test/test_xmlrpc.py @@ -184,19 +184,26 @@ class XMLRPCTestCase(unittest.TestCase): self.assertRaises(TypeError, xmlrpclib.dumps, (arg1,)) def test_dump_encoding(self): - value = '\u20ac' + value = {'key\u20ac\xa4': + 'value\u20ac\xa4'} strg = xmlrpclib.dumps((value,), encoding='iso-8859-15') strg = "<?xml version='1.0' encoding='iso-8859-15'?>" + strg self.assertEqual(xmlrpclib.loads(strg)[0][0], value) - strg = strg.encode('iso-8859-15') + strg = strg.encode('iso-8859-15', 'xmlcharrefreplace') self.assertEqual(xmlrpclib.loads(strg)[0][0], value) strg = xmlrpclib.dumps((value,), encoding='iso-8859-15', methodresponse=True) self.assertEqual(xmlrpclib.loads(strg)[0][0], value) - strg = strg.encode('iso-8859-15') + strg = strg.encode('iso-8859-15', 'xmlcharrefreplace') self.assertEqual(xmlrpclib.loads(strg)[0][0], value) + methodname = 'method\u20ac\xa4' + strg = xmlrpclib.dumps((value,), encoding='iso-8859-15', + methodname=methodname) + self.assertEqual(xmlrpclib.loads(strg)[0][0], value) + self.assertEqual(xmlrpclib.loads(strg)[1], methodname) + def test_dump_bytes(self): sample = b"my dog has fleas" self.assertEqual(sample, xmlrpclib.Binary(sample)) @@ -430,6 +437,7 @@ def http_server(evt, numrequests, requestHandler=None, encoding=None): serv.register_multicall_functions() serv.register_function(pow) serv.register_function(lambda x,y: x+y, 'add') + serv.register_function(lambda x: x, 'têšt') serv.register_function(my_function) testInstance = TestInstanceClass() serv.register_instance(testInstance, allow_dotted_names=True) @@ -599,7 +607,7 @@ class SimpleServerTestCase(BaseServerTestCase): def test_client_encoding(self): start_string = '\u20ac' - end_string = '\xa3' + end_string = '\xa4' try: p = xmlrpclib.ServerProxy(URL, encoding='iso-8859-15') @@ -611,6 +619,16 @@ class SimpleServerTestCase(BaseServerTestCase): # protocol error; provide additional information in test output self.fail("%s\n%s" % (e, getattr(e, "headers", ""))) + def test_nonascii_methodname(self): + try: + p = xmlrpclib.ServerProxy(URL, encoding='ascii') + self.assertEqual(p.têšt(42), 42) + except (xmlrpclib.ProtocolError, socket.error) as e: + # ignore failures due to non-blocking socket unavailable errors. + if not is_unavailable_exception(e): + # protocol error; provide additional information in test output + self.fail("%s\n%s" % (e, getattr(e, "headers", ""))) + # [ch] The test 404 is causing lots of false alarms. def XXXtest_404(self): # send POST with http.client, it should return 404 header and @@ -624,7 +642,7 @@ class SimpleServerTestCase(BaseServerTestCase): self.assertEqual(response.reason, 'Not Found') def test_introspection1(self): - expected_methods = set(['pow', 'div', 'my_function', 'add', + expected_methods = set(['pow', 'div', 'my_function', 'add', 'têšt', 'system.listMethods', 'system.methodHelp', 'system.methodSignature', 'system.multicall', 'Fixture']) @@ -767,7 +785,7 @@ class SimpleServerEncodingTestCase(BaseServerTestCase): def test_server_encoding(self): start_string = '\u20ac' - end_string = '\xa3' + end_string = '\xa4' try: p = xmlrpclib.ServerProxy(URL) diff --git a/Lib/xmlrpc/client.py b/Lib/xmlrpc/client.py index 25e684f..bf42835 100644 --- a/Lib/xmlrpc/client.py +++ b/Lib/xmlrpc/client.py @@ -955,8 +955,6 @@ def dumps(params, methodname=None, methodresponse=None, encoding=None, # standard XML-RPC wrappings if methodname: # a method call - if not isinstance(methodname, str): - methodname = methodname.encode(encoding) data = ( xmlheader, "<methodCall>\n" @@ -1422,7 +1420,7 @@ class ServerProxy: # call a method on the remote server request = dumps(params, methodname, encoding=self.__encoding, - allow_none=self.__allow_none).encode(self.__encoding) + allow_none=self.__allow_none).encode(self.__encoding, 'xmlcharrefreplace') response = self.__transport.request( self.__host, diff --git a/Lib/xmlrpc/server.py b/Lib/xmlrpc/server.py index 304e218..5b5bf7c 100644 --- a/Lib/xmlrpc/server.py +++ b/Lib/xmlrpc/server.py @@ -269,7 +269,7 @@ class SimpleXMLRPCDispatcher: encoding=self.encoding, allow_none=self.allow_none, ) - return response.encode(self.encoding) + return response.encode(self.encoding, 'xmlcharrefreplace') def system_listMethods(self): """system.listMethods() => ['add', 'subtract', 'multiple'] @@ -622,7 +622,7 @@ class MultiPathXMLRPCServer(SimpleXMLRPCServer): response = dumps( Fault(1, "%s:%s" % (exc_type, exc_value)), encoding=self.encoding, allow_none=self.allow_none) - response = response.encode(self.encoding) + response = response.encode(self.encoding, 'xmlcharrefreplace') return response class CGIXMLRPCRequestHandler(SimpleXMLRPCDispatcher): |