]> git.ozlabs.org Git - patchwork/commitdiff
filters: handle utf-8 characters when building filter querystring
authorJeremy Kerr <jk@ozlabs.org>
Thu, 8 Dec 2011 13:42:26 +0000 (21:42 +0800)
committerJeremy Kerr <jk@ozlabs.org>
Thu, 8 Dec 2011 13:45:22 +0000 (21:45 +0800)
Currently, we build the filter querystring by passing the raw string to
urllib.quote, which expects an encoded string. When the raw string (in
this case, a unicode object) contains a unicode character, quote()
raises a KeyError.

This fixes the problem by encoding the parameter name and values to
UTF-8 first.

Reported-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
apps/patchwork/filters.py
apps/patchwork/tests/filters.py

index 52fc03fe19d655f78324cea43ef3533a7d232b6e..002a0a855b491c93240eb23e77d404116e37406e 100644 (file)
@@ -445,8 +445,14 @@ class Filters:
             if remove.param in params.keys():
                 del params[remove.param]
 
-        return '?' + '&'.join(['%s=%s' % (quote(k), quote(v))
-                                for (k,v) in params.iteritems()])
+        pairs = params.iteritems()
+
+        def sanitise(s):
+            if not isinstance(s, basestring):
+                s = unicode(s)
+            return quote(s.encode('utf-8'))
+
+        return '?' + '&'.join(['%s=%s' % map(sanitise, p) for p in pairs])
 
     def querystring_without_filter(self, filter):
         return self.querystring(filter)
index 4744583cbf39d93898d85a58150b74f5ee56db9b..2c464e5f7fcd3b87ecba417353beba3f1b2b5880 100644 (file)
@@ -34,3 +34,12 @@ class FilterQueryStringTest(TestCase):
         self.failUnlessEqual(response.status_code, 200)
         self.failIf('submitter=a&amp;b=c' in response.content)
         self.failIf('submitter=a&b=c' in response.content)
+
+    def testUTF8QSHandling(self):
+        """test that non-ascii characters can be handled by the filter
+           code"""
+        project = defaults.project
+        defaults.project.save()
+        url = '/project/%s/list/?submitter=%%E2%%98%%83' % project.linkname
+        response = self.client.get(url)
+        self.failUnlessEqual(response.status_code, 200)