Code

Ticket #12989: 12989.diff

File 12989.diff, 2.8 KB (added by frasern, 4 years ago)
Line 
1Index: django/core/validators.py
2===================================================================
3--- django/core/validators.py   (revision 12617)
4+++ django/core/validators.py   (working copy)
5@@ -58,23 +58,18 @@
6         except ValidationError, e:
7             # Trivial case failed. Try for possible IDN domain
8             if value:
9-                original = value
10                 value = smart_unicode(value)
11-                splitted = urlparse.urlsplit(value)
12+                scheme, netloc, path, query, fragment = urlparse.urlsplit(value)
13                 try:
14-                    netloc_ace = splitted[1].encode('idna') # IDN -> ACE
15+                    netloc = netloc.encode('idna') # IDN -> ACE
16                 except UnicodeError: # invalid domain part
17                     raise e
18-                value = value.replace(splitted[1], netloc_ace)
19-                # If no URL path given, assume /
20-                if not splitted[2]:
21-                    value += u'/'
22-                super(URLValidator, self).__call__(value)
23-                # After validation revert ACE encoded domain-part to
24-                # original (IDN) value as suggested by RFC 3490
25-                value = original
26+                url = urlparse.urlunsplit((scheme, netloc, path, query, fragment))
27+                super(URLValidator, self).__call__(url)
28             else:
29                 raise
30+        else:
31+            url = value
32 
33         if self.verify_exists:
34             import urllib2
35@@ -86,7 +81,7 @@
36                 "User-Agent": self.user_agent,
37             }
38             try:
39-                req = urllib2.Request(value, None, headers)
40+                req = urllib2.Request(url, None, headers)
41                 u = urllib2.urlopen(req)
42             except ValueError:
43                 raise ValidationError(_(u'Enter a valid URL.'), code='invalid')
44Index: tests/regressiontests/forms/fields.py
45===================================================================
46--- tests/regressiontests/forms/fields.py       (revision 12617)
47+++ tests/regressiontests/forms/fields.py       (working copy)
48@@ -531,6 +531,13 @@
49             f.clean('http://google.com/we-love-microsoft.html') # good domain, bad page
50         except ValidationError, e:
51             self.assertEqual("[u'This URL appears to be a broken link.']", str(e))
52+        # Valid and existent IDN
53+        self.assertEqual(u'http://\u05e2\u05d1\u05e8\u05d9\u05ea.idn.icann.org/', f.clean(u'http://עברית.idn.icann.org/'))
54+        # Valid but non-existent IDN
55+        try:
56+            f.clean(u'http://broken.עברית.idn.icann.org/')
57+        except ValidationError, e:
58+            self.assertEqual("[u'This URL appears to be a broken link.']", str(e))
59 
60     def test_urlfield_40(self):
61         f = URLField(verify_exists=True, required=False)