u('query'): [u('bytes'), u('c3a9')],
})
+ def test_decode_argument_plus(self):
+ # These urls are all equivalent.
+ urls = ["/decode_arg/1%20%2B%201?foo=1%20%2B%201&encoding=utf-8",
+ "/decode_arg/1%20+%201?foo=1+%2B+1&encoding=utf-8"]
+ for url in urls:
+ response = self.fetch(url)
+ response.rethrow()
+ data = json_decode(response.body)
+ self.assertEqual(data, {u('path'): [u('unicode'), u('1 + 1')],
+ u('query'): [u('unicode'), u('1 + 1')],
+ })
+
def test_reverse_url(self):
self.assertEqual(self.app.reverse_url('decode_arg', 'foo'),
'/decode_arg/foo')
'/decode_arg/%E9')
self.assertEqual(self.app.reverse_url('decode_arg', u('\u00e9')),
'/decode_arg/%C3%A9')
+ self.assertEqual(self.app.reverse_url('decode_arg', '1 + 1'),
+ '/decode_arg/1%20%2B%201')
def test_uimodule_unescaped(self):
response = self.fetch("/linkify")
def unquote(s):
if s is None:
return s
- return escape.url_unescape(s, encoding=None)
+ return escape.url_unescape(s, encoding=None,
+ plus=False)
# Pass matched groups to the handler. Since
# match.groups() includes both named and unnamed groups,
# we want to use either groups or groupdict but not both.
for a in args:
if not isinstance(a, (unicode_type, bytes_type)):
a = str(a)
- converted_args.append(escape.url_escape(utf8(a)))
+ converted_args.append(escape.url_escape(utf8(a), plus=False))
return self._path % tuple(converted_args)
url = URLSpec
environ = {
"REQUEST_METHOD": request.method,
"SCRIPT_NAME": "",
- "PATH_INFO": to_wsgi_str(escape.url_unescape(request.path, encoding=None)),
+ "PATH_INFO": to_wsgi_str(escape.url_unescape(
+ request.path, encoding=None, plus=False)),
"QUERY_STRING": request.query,
"REMOTE_ADDR": request.remote_ip,
"SERVER_NAME": host,