On python 2, the reference implementation of the XML-RPC unmarshaller
decodes strings to unicode with the selected encoding (utf-8 by default)
but it tries to re-encode the unicode strings to ascii bytes before
returning the values. If it fails, it leaves the value as unicode.
See these links for more details:
https://hg.python.org/cpython/file/2.7/Lib/xmlrpclib.py#l878
https://hg.python.org/cpython/file/2.7/Lib/xmlrpclib.py#l180
https://hg.python.org/cpython/file/3.6/Lib/xmlrpc/client.py#l753
Monkey-patch the internal xmlrpclib._stringify() function only on python
2 to force it to preserve unicode strings. This allows to have similar
behaviour in both python 2 and python 3.
Signed-off-by: Robin Jarry <robin.jarry@6wind.com>
Signed-off-by: Stephen Finucane <stephen@that.guru>
return str(self.d)
+if sys.version_info[0] < 3:
+ # the python 2.7 reference implementation tries to re-encode to
+ # ascii bytes here but leaves unicode if it fails. Do not try to
+ # re-encode to ascii byte string to have a more predictive behavior.
+ xmlrpclib._stringify = lambda s: s
+
+
class Transport(xmlrpclib.SafeTransport):
def __init__(self, url):