summary refs log tree commit diff
diff options
context:
space:
mode:
authorDavid Baker <dave@matrix.org>2016-03-08 10:04:38 +0000
committerDavid Baker <dave@matrix.org>2016-03-08 10:04:38 +0000
commit7bcee4733a05b239161d73461abd4d0e32caf4ac (patch)
treece693ce8e3de8ee7162b2046bbff1717d7bc2e1a
parentMerge pull request #626 from matrix-org/erikj/visibility (diff)
downloadsynapse-7bcee4733a05b239161d73461abd4d0e32caf4ac.tar.xz
Encode unicode objects given to post_urlencode* otherwise urllib.urlencode chokes.
-rw-r--r--synapse/http/client.py14
1 files changed, 12 insertions, 2 deletions
diff --git a/synapse/http/client.py b/synapse/http/client.py
index fdd90b1c3c..b3cd5ff26a 100644
--- a/synapse/http/client.py
+++ b/synapse/http/client.py
@@ -103,7 +103,7 @@ class SimpleHttpClient(object):
         # TODO: Do we ever want to log message contents?
         logger.debug("post_urlencoded_get_json args: %s", args)
 
-        query_bytes = urllib.urlencode(args, True)
+        query_bytes = urllib.urlencode(encode_urlencode_args(args), True)
 
         response = yield self.request(
             "POST",
@@ -249,7 +249,7 @@ class CaptchaServerHttpClient(SimpleHttpClient):
 
     @defer.inlineCallbacks
     def post_urlencoded_get_raw(self, url, args={}):
-        query_bytes = urllib.urlencode(args, True)
+        query_bytes = urllib.urlencode(encode_urlencode_args(args), True)
 
         response = yield self.request(
             "POST",
@@ -268,6 +268,16 @@ class CaptchaServerHttpClient(SimpleHttpClient):
             # twisted dislikes google's response, no content length.
             defer.returnValue(e.response)
 
+def encode_urlencode_args(args):
+    return { k: encode_urlencode_arg(v) for k, v in args.items() }
+
+def encode_urlencode_arg(arg):
+    if isinstance(arg, unicode):
+        return arg.encode('utf-8')
+    elif isinstance(arg, list):
+        return [ encode_urlencode_arg(i) for i in arg ]
+    else:
+        return arg
 
 def _print_ex(e):
     if hasattr(e, "reasons") and e.reasons: