Close #1360 url: Allow _ in hostnames.
authorisaacs <i@izs.me>
Tue, 19 Jul 2011 16:55:01 +0000 (09:55 -0700)
committerisaacs <i@izs.me>
Tue, 19 Jul 2011 16:55:01 +0000 (09:55 -0700)
lib/url.js
test/simple/test-url.js

index a30fa8a..e4fcf77 100644 (file)
@@ -46,8 +46,8 @@ var protocolPattern = /^([a-z0-9]+:)/i,
       .concat(unwise).concat(autoEscape),
     nonAuthChars = ['/', '@', '?', '#'].concat(delims),
     hostnameMaxLen = 255,
-    hostnamePartPattern = /^[a-zA-Z0-9][a-z0-9A-Z-]{0,62}$/,
-    hostnamePartStart = /^([a-zA-Z0-9][a-z0-9A-Z-]{0,62})(.*)$/,
+    hostnamePartPattern = /^[a-zA-Z0-9][a-z0-9A-Z_-]{0,62}$/,
+    hostnamePartStart = /^([a-zA-Z0-9][a-z0-9A-Z_-]{0,62})(.*)$/,
     // protocols that can allow "unsafe" and "unwise" chars.
     unsafeProtocol = {
       'javascript': true,
@@ -226,7 +226,7 @@ function urlParse(url, parseQueryString, slashesDenoteHost) {
     var newOut = [];
     for (var i = 0; i < domainArray.length; ++i) {
       var s = domainArray[i];
-      newOut.push(s.match(/[^A-Za-z0-9-]/) ?
+      newOut.push(s.match(/[^A-Za-z0-9_-]/) ?
         'xn--' + punycode.encode(s) : s);
     }
     out.hostname = newOut.join('.');
index f07edb5..fdf8bde 100644 (file)
@@ -327,8 +327,17 @@ var parseTests = {
     'host': 'xn--hgi.ws',
     'hostname': 'xn--hgi.ws',
     'pathname': '/➡'
+  },
+  'http://bucket_name.s3.amazonaws.com/image.jpg': {
+    protocol: 'http:',
+    slashes: true,
+    host: 'bucket_name.s3.amazonaws.com',
+    hostname: 'bucket_name.s3.amazonaws.com',
+    pathname: '/image.jpg',
+    href: 'http://bucket_name.s3.amazonaws.com/image.jpg'
   }
 };
+
 for (var u in parseTests) {
   var actual = url.parse(u),
       expected = parseTests[u];