Skip to content

Commit

Permalink
url: do not truncate long hostnames
Browse files Browse the repository at this point in the history
Currently, around line 417 lib/url.js is truncating hostname and put the
rest of hostname to the path if hostname length after `.`  is equal or
more than 63. This behavior is different from browser behavior. I
changed the code so that it doesn’t truncate.

I also added the test example which has more than 63 length in after
`.` in hostname in test url.

PR-URL: nodejs#9292
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Rich Trott <rtrott@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Brian White <mscdex@mscdex.net>
  • Loading branch information
jun-oka authored and italoacasas committed Jan 18, 2017
1 parent 6020904 commit cb5220d
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 25 deletions.
39 changes: 14 additions & 25 deletions lib/url.js
Original file line number Diff line number Diff line change
Expand Up @@ -411,33 +411,22 @@ Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) {
};

function validateHostname(self, rest, hostname) {
for (var i = 0, lastPos; i <= hostname.length; ++i) {
var code;
if (i < hostname.length)
code = hostname.charCodeAt(i);
if (code === 46/*.*/ || i === hostname.length) {
if (i - lastPos > 0) {
if (i - lastPos > 63) {
self.hostname = hostname.slice(0, lastPos + 63);
return '/' + hostname.slice(lastPos + 63) + rest;
}
}
lastPos = i + 1;
continue;
} else if ((code >= 48/*0*/ && code <= 57/*9*/) ||
(code >= 97/*a*/ && code <= 122/*z*/) ||
code === 45/*-*/ ||
(code >= 65/*A*/ && code <= 90/*Z*/) ||
code === 43/*+*/ ||
code === 95/*_*/ ||
code > 127) {
continue;
}
for (var i = 0; i < hostname.length; ++i) {
const code = hostname.charCodeAt(i);
const isValid = (code >= 97/*a*/ && code <= 122/*z*/) ||
code === 46/*.*/ ||
(code >= 65/*A*/ && code <= 90/*Z*/) ||
(code >= 48/*0*/ && code <= 57/*9*/) ||
code === 45/*-*/ ||
code === 43/*+*/ ||
code === 95/*_*/ ||
code > 127;

// Invalid host character
self.hostname = hostname.slice(0, i);
if (i < hostname.length)
if (!isValid) {
self.hostname = hostname.slice(0, i);
return '/' + hostname.slice(i) + rest;
break;
}
}
}

Expand Down
11 changes: 11 additions & 0 deletions test/parallel/test-url.js
Original file line number Diff line number Diff line change
Expand Up @@ -1225,6 +1225,17 @@ var formatTests = {
path: '/node'
},

// greater than or equal to 63 characters after `.` in hostname
[`http://www.${'z'.repeat(63)}example.com/node`]: {
href: `http://www.${'z'.repeat(63)}example.com/node`,
protocol: 'http:',
slashes: true,
host: `www.${'z'.repeat(63)}example.com`,
hostname: `www.${'z'.repeat(63)}example.com`,
pathname: '/node',
path: '/node'
},

// https://github.com/nodejs/node/issues/3361
'file:///home/user': {
href: 'file:///home/user',
Expand Down

0 comments on commit cb5220d

Please sign in to comment.