From a45a3fdfdb9706791ff36128399b302c4fa37c52 Mon Sep 17 00:00:00 2001 From: Jeremy Kerr Date: Thu, 8 Dec 2011 21:42:26 +0800 Subject: [PATCH 1/1] 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 Signed-off-by: Jeremy Kerr --- apps/patchwork/filters.py | 10 ++++++++-- apps/patchwork/tests/filters.py | 9 +++++++++ 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&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) -- 2.39.2