mirror of
https://github.com/django/django.git
synced 2024-12-22 17:16:24 +00:00
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]+)'
|
||||
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
|
||||
parts = ['^']
|
||||
converters = {}
|
||||
@ -218,6 +216,11 @@ def _route_to_regex(route, is_endpoint=False):
|
||||
if not match:
|
||||
parts.append(re.escape(route))
|
||||
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()]))
|
||||
route = route[match.end():]
|
||||
parameter = match['parameter']
|
||||
|
@ -1,3 +1,4 @@
|
||||
import string
|
||||
import uuid
|
||||
|
||||
from django.conf.urls import url as conf_url
|
||||
@ -142,10 +143,19 @@ class SimplifiedURLTests(SimpleTestCase):
|
||||
with self.assertRaisesMessage(ImproperlyConfigured, msg):
|
||||
path('foo/<nonexistent:var>/', empty_view)
|
||||
|
||||
def test_space_in_route(self):
|
||||
msg = "URL route 'space/<int: num>' cannot contain whitespace."
|
||||
with self.assertRaisesMessage(ImproperlyConfigured, msg):
|
||||
path('space/<int: num>', empty_view)
|
||||
def test_whitespace_in_route(self):
|
||||
msg = (
|
||||
"URL route 'space/<int:num>/extra/<str:%stest>' cannot contain "
|
||||
"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')
|
||||
|
Loading…
Reference in New Issue
Block a user