]> git.ipfire.org Git - thirdparty/patchwork.git/commitdiff
pwclient: Force xmlrpc client to return unicode strings
authorRobin Jarry <robin.jarry@6wind.com>
Tue, 23 May 2017 13:24:07 +0000 (15:24 +0200)
committerStephen Finucane <stephen@that.guru>
Wed, 24 May 2017 05:48:06 +0000 (06:48 +0100)
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>
patchwork/bin/pwclient

index 5fcb0844b92307ae736440072b198090e74167e8..ceccbf3f2d3ea522d43e48d5b53e76a28a02025b 100755 (executable)
@@ -97,6 +97,13 @@ class Filter(object):
         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):