From b474ffe63a3f99daeef2324a674f7ddfbb653c41 Mon Sep 17 00:00:00 2001
From: Claude Paroz <claude@2xlibre.net>
Date: Mon, 1 Apr 2013 15:37:37 +0200
Subject: [PATCH] Fixed #20172 -- Ensured urlize supports IPv4/IPv6 addresses

Thanks Marc Aymerich for the report and the initial patch.
---
 django/utils/html.py          | 2 +-
 tests/defaultfilters/tests.py | 5 +++++
 2 files changed, 6 insertions(+), 1 deletion(-)

diff --git a/django/utils/html.py b/django/utils/html.py
index a9ebd17935..650e8485ab 100644
--- a/django/utils/html.py
+++ b/django/utils/html.py
@@ -26,7 +26,7 @@ DOTS = ['&middot;', '*', '\u2022', '&#149;', '&bull;', '&#8226;']
 unencoded_ampersands_re = re.compile(r'&(?!(\w+|#\d+);)')
 unquoted_percents_re = re.compile(r'%(?![0-9A-Fa-f]{2})')
 word_split_re = re.compile(r'(\s+)')
-simple_url_re = re.compile(r'^https?://\w', re.IGNORECASE)
+simple_url_re = re.compile(r'^https?://\[?\w', re.IGNORECASE)
 simple_url_2_re = re.compile(r'^www\.|^(?!http)\w[^@]+\.(com|edu|gov|int|mil|net|org)$', re.IGNORECASE)
 simple_email_re = re.compile(r'^\S+@\S+\.\S+$')
 link_target_attribute_re = re.compile(r'(<a [^>]*?)target=[^\s>]+')
diff --git a/tests/defaultfilters/tests.py b/tests/defaultfilters/tests.py
index 8596f8c801..21734faf95 100644
--- a/tests/defaultfilters/tests.py
+++ b/tests/defaultfilters/tests.py
@@ -314,6 +314,11 @@ class DefaultFiltersTests(TestCase):
         self.assertEqual(urlize('see test[at[example.com'),
             'see <a href="http://test[at[example.com" rel="nofollow">test[at[example.com</a>' )
 
+        # Check urlize works with IPv4/IPv6 addresses
+        self.assertEqual(urlize('http://192.168.0.15/api/9'),
+            '<a href="http://192.168.0.15/api/9" rel="nofollow">http://192.168.0.15/api/9</a>')
+        self.assertEqual(urlize('http://[2001:db8:cafe::2]/api/9'),
+            '<a href="http://[2001:db8:cafe::2]/api/9" rel="nofollow">http://[2001:db8:cafe::2]/api/9</a>')
 
     def test_wordcount(self):
         self.assertEqual(wordcount(''), 0)