Fixed #31858 -- Reallowed whitespaces in URL paths outside of parameters.

Regression in 22394bd3a1.

Thanks David Smith for the review.
This commit is contained in:
Tim Park 2020-08-29 12:17:58 -07:00 committed by Mariusz Felisiak
parent a629139425
commit ece18207cb
2 changed files with 19 additions and 6 deletions

View File

@ -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']

View File

@ -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')