Fixed #31858 -- Reallowed whitespaces in URL paths outside of parameters.
Regression in 22394bd3a1
.
Thanks David Smith for the review.
This commit is contained in:
parent
a629139425
commit
ece18207cb
|
@ -208,8 +208,6 @@ def _route_to_regex(route, is_endpoint=False):
|
||||||
For example, 'foo/<int:pk>' returns '^foo\\/(?P<pk>[0-9]+)'
|
For example, 'foo/<int:pk>' returns '^foo\\/(?P<pk>[0-9]+)'
|
||||||
and {'pk': <django.urls.converters.IntConverter>}.
|
and {'pk': <django.urls.converters.IntConverter>}.
|
||||||
"""
|
"""
|
||||||
if not set(route).isdisjoint(string.whitespace):
|
|
||||||
raise ImproperlyConfigured("URL route '%s' cannot contain whitespace." % route)
|
|
||||||
original_route = route
|
original_route = route
|
||||||
parts = ['^']
|
parts = ['^']
|
||||||
converters = {}
|
converters = {}
|
||||||
|
@ -218,6 +216,11 @@ def _route_to_regex(route, is_endpoint=False):
|
||||||
if not match:
|
if not match:
|
||||||
parts.append(re.escape(route))
|
parts.append(re.escape(route))
|
||||||
break
|
break
|
||||||
|
elif not set(match.group()).isdisjoint(string.whitespace):
|
||||||
|
raise ImproperlyConfigured(
|
||||||
|
"URL route '%s' cannot contain whitespace in angle brackets "
|
||||||
|
"<…>." % original_route
|
||||||
|
)
|
||||||
parts.append(re.escape(route[:match.start()]))
|
parts.append(re.escape(route[:match.start()]))
|
||||||
route = route[match.end():]
|
route = route[match.end():]
|
||||||
parameter = match['parameter']
|
parameter = match['parameter']
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import string
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
from django.conf.urls import url as conf_url
|
from django.conf.urls import url as conf_url
|
||||||
|
@ -142,10 +143,19 @@ class SimplifiedURLTests(SimpleTestCase):
|
||||||
with self.assertRaisesMessage(ImproperlyConfigured, msg):
|
with self.assertRaisesMessage(ImproperlyConfigured, msg):
|
||||||
path('foo/<nonexistent:var>/', empty_view)
|
path('foo/<nonexistent:var>/', empty_view)
|
||||||
|
|
||||||
def test_space_in_route(self):
|
def test_whitespace_in_route(self):
|
||||||
msg = "URL route 'space/<int: num>' cannot contain whitespace."
|
msg = (
|
||||||
with self.assertRaisesMessage(ImproperlyConfigured, msg):
|
"URL route 'space/<int:num>/extra/<str:%stest>' cannot contain "
|
||||||
path('space/<int: num>', empty_view)
|
"whitespace in angle brackets <…>"
|
||||||
|
)
|
||||||
|
for whitespace in string.whitespace:
|
||||||
|
with self.subTest(repr(whitespace)):
|
||||||
|
with self.assertRaisesMessage(ImproperlyConfigured, msg % whitespace):
|
||||||
|
path('space/<int:num>/extra/<str:%stest>' % whitespace, empty_view)
|
||||||
|
# Whitespaces are valid in paths.
|
||||||
|
p = path('space%s/<int:num>/' % string.whitespace, empty_view)
|
||||||
|
match = p.resolve('space%s/1/' % string.whitespace)
|
||||||
|
self.assertEqual(match.kwargs, {'num': 1})
|
||||||
|
|
||||||
|
|
||||||
@override_settings(ROOT_URLCONF='urlpatterns.converter_urls')
|
@override_settings(ROOT_URLCONF='urlpatterns.converter_urls')
|
||||||
|
|
Loading…
Reference in New Issue