summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorJeremy Kerr <jk@ozlabs.org>2011-12-08 21:42:26 +0800
committerJeremy Kerr <jk@ozlabs.org>2011-12-08 21:45:22 +0800
commita45a3fdfdb9706791ff36128399b302c4fa37c52 (patch)
treeb10456566934f66081b56177b80e2c56d889ac3d /apps
parentfa999187bfc23bc0d674875c554c360601f8f6b4 (diff)
downloadpatchwork-a45a3fdfdb9706791ff36128399b302c4fa37c52.tar.bz2
patchwork-a45a3fdfdb9706791ff36128399b302c4fa37c52.tar.xz
filters: handle utf-8 characters when building filter querystring
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>
Diffstat (limited to 'apps')
-rw-r--r--apps/patchwork/filters.py10
-rw-r--r--apps/patchwork/tests/filters.py9
2 files changed, 17 insertions, 2 deletions
diff --git a/apps/patchwork/filters.py b/apps/patchwork/filters.py
index 52fc03f..002a0a8 100644
--- a/apps/patchwork/filters.py
+++ b/apps/patchwork/filters.py
@@ -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)
diff --git a/apps/patchwork/tests/filters.py b/apps/patchwork/tests/filters.py
index 4744583..2c464e5 100644
--- a/apps/patchwork/tests/filters.py
+++ b/apps/patchwork/tests/filters.py
@@ -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)