diff options
author | Jeremy Kerr <jk@ozlabs.org> | 2011-12-08 21:42:26 +0800 |
---|---|---|
committer | Jeremy Kerr <jk@ozlabs.org> | 2011-12-08 21:45:22 +0800 |
commit | a45a3fdfdb9706791ff36128399b302c4fa37c52 (patch) | |
tree | b10456566934f66081b56177b80e2c56d889ac3d | |
parent | fa999187bfc23bc0d674875c554c360601f8f6b4 (diff) | |
download | patchwork-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>
-rw-r--r-- | apps/patchwork/filters.py | 10 | ||||
-rw-r--r-- | 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) |