summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pyramid/tests/test_urldispatch.py4
-rw-r--r--pyramid/urldispatch.py10
2 files changed, 11 insertions, 3 deletions
diff --git a/pyramid/tests/test_urldispatch.py b/pyramid/tests/test_urldispatch.py
index 2d20b24c3..06f4ad793 100644
--- a/pyramid/tests/test_urldispatch.py
+++ b/pyramid/tests/test_urldispatch.py
@@ -485,11 +485,15 @@ class TestCompileRouteFunctional(unittest.TestCase):
def test_generator_functional_newstyle(self):
self.generates('/{x}', {'x':''}, '/')
self.generates('/{x}', {'x':'a'}, '/a')
+ self.generates('/{x}', {'x':'a/b/c'}, '/a/b/c')
+ self.generates('/{x}', {'x':':@&+$,'}, '/:@&+$,')
self.generates('zzz/{x}', {'x':'abc'}, '/zzz/abc')
self.generates('zzz/{x}*traverse', {'x':'abc', 'traverse':''},
'/zzz/abc')
self.generates('zzz/{x}*traverse', {'x':'abc', 'traverse':'/def/g'},
'/zzz/abc/def/g')
+ self.generates('zzz/{x}*traverse', {'x':':@&+$,', 'traverse':'/:@&+$,'},
+ '/zzz/:@&+$,/:@&+$,')
self.generates('/{x}', {'x':text_(b'/La Pe\xc3\xb1a', 'utf-8')},
'//La%20Pe%C3%B1a')
self.generates('/{x}*y', {'x':text_(b'/La Pe\xc3\xb1a', 'utf-8'),
diff --git a/pyramid/urldispatch.py b/pyramid/urldispatch.py
index c88ad9590..0f7dd1490 100644
--- a/pyramid/urldispatch.py
+++ b/pyramid/urldispatch.py
@@ -207,6 +207,10 @@ def _compile_route(route):
return d
gen = ''.join(gen)
+
+ def q(v):
+ return quote_path_segment(v, safe='/:@&+$,')
+
def generator(dict):
newdict = {}
for k, v in dict.items():
@@ -223,17 +227,17 @@ def _compile_route(route):
# a stararg argument
if is_nonstr_iter(v):
v = '/'.join(
- [quote_path_segment(x, safe='/') for x in v]
+ [q(x) for x in v]
) # native
else:
if v.__class__ not in string_types:
v = str(v)
- v = quote_path_segment(v, safe='/')
+ v = q(v)
else:
if v.__class__ not in string_types:
v = str(v)
# v may be bytes (py2) or native string (py3)
- v = quote_path_segment(v, safe='/')
+ v = q(v)
# at this point, the value will be a native string
newdict[k] = v