Merge pull request #573 from tominsam/master

Fixed #19070: urlize template filter raises exception in some cases
This commit is contained in:
Andrew Godwin 2012-12-04 02:18:10 -08:00
commit 501c7a221c
2 changed files with 13 additions and 5 deletions

View File

@ -150,13 +150,17 @@ fix_ampersands = allow_lazy(fix_ampersands, six.text_type)
def smart_urlquote(url): def smart_urlquote(url):
"Quotes a URL if it isn't already quoted." "Quotes a URL if it isn't already quoted."
# Handle IDN before quoting. # Handle IDN before quoting.
scheme, netloc, path, query, fragment = urlsplit(url)
try: try:
netloc = netloc.encode('idna').decode('ascii') # IDN -> ACE scheme, netloc, path, query, fragment = urlsplit(url)
except UnicodeError: # invalid domain part try:
netloc = netloc.encode('idna').decode('ascii') # IDN -> ACE
except UnicodeError: # invalid domain part
pass
else:
url = urlunsplit((scheme, netloc, path, query, fragment))
except ValueError:
# invalid IPv6 URL (normally square brackets in hostname part).
pass pass
else:
url = urlunsplit((scheme, netloc, path, query, fragment))
# An URL is considered unquoted if it contains no % characters or # An URL is considered unquoted if it contains no % characters or
# contains a % not followed by two hexadecimal digits. See #9655. # contains a % not followed by two hexadecimal digits. See #9655.

View File

@ -310,6 +310,10 @@ class DefaultFiltersTests(TestCase):
self.assertEqual(urlize('[see www.example.com]'), self.assertEqual(urlize('[see www.example.com]'),
'[see <a href="http://www.example.com" rel="nofollow">www.example.com</a>]' ) '[see <a href="http://www.example.com" rel="nofollow">www.example.com</a>]' )
# Check urlize doesn't crash when square bracket is prepended to url (#19070)
self.assertEqual(urlize('see test[at[example.com'),
'see <a href="http://test[at[example.com" rel="nofollow">test[at[example.com</a>' )
def test_wordcount(self): def test_wordcount(self):
self.assertEqual(wordcount(''), 0) self.assertEqual(wordcount(''), 0)