Skip to content

Commit

Permalink
url: detect hostname more reliably in url.parse()
Browse files Browse the repository at this point in the history
Based on existing tests and code comments, url.parse() is expected to
treat any URL containing user@host as having a hostname. However, it
turns out this behavior relies on the URL having a hash which is
surprising, to put it mildly. Detect the host even without the hash.

PR-URL: nodejs#41031
Reviewed-By: Ruben Bridgewater <[email protected]>
Reviewed-By: Myles Borins <[email protected]>
  • Loading branch information
Trott authored Dec 2, 2021
1 parent 9e0fb1a commit 1086468
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 2 deletions.
6 changes: 5 additions & 1 deletion lib/url.js
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,7 @@ Url.prototype.parse = function parse(url, parseQueryString, slashesDenoteHost) {
// Back slashes before the query string get converted to forward slashes
// See: https://code.google.com/p/chromium/issues/detail?id=25916
let hasHash = false;
let hasAt = false;
let start = -1;
let end = -1;
let rest = '';
Expand Down Expand Up @@ -219,6 +220,9 @@ Url.prototype.parse = function parse(url, parseQueryString, slashesDenoteHost) {
// Only convert backslashes while we haven't seen a split character
if (!split) {
switch (code) {
case CHAR_AT:
hasAt = true;
break;
case CHAR_HASH:
hasHash = true;
// Fall through
Expand Down Expand Up @@ -259,7 +263,7 @@ Url.prototype.parse = function parse(url, parseQueryString, slashesDenoteHost) {
}
}

if (!slashesDenoteHost && !hasHash) {
if (!slashesDenoteHost && !hasHash && !hasAt) {
// Try fast path regexp
const simplePath = simplePathPattern.exec(rest);
if (simplePath) {
Expand Down
32 changes: 31 additions & 1 deletion test/parallel/test-url-parse-format.js
Original file line number Diff line number Diff line change
Expand Up @@ -946,7 +946,37 @@ const parseTests = {
pathname: '/',
path: '/',
href: 'wss://www.example.com/'
}
},

'//[email protected]/everybody-to-the-limit': {
protocol: null,
slashes: true,
auth: 'fhqwhgads',
host: 'example.com',
port: null,
hostname: 'example.com',
hash: null,
search: null,
query: null,
pathname: '/everybody-to-the-limit',
path: '/everybody-to-the-limit',
href: '//[email protected]/everybody-to-the-limit'
},

'//[email protected]/everybody#to-the-limit': {
protocol: null,
slashes: true,
auth: 'fhqwhgads',
host: 'example.com',
port: null,
hostname: 'example.com',
hash: '#to-the-limit',
search: null,
query: null,
pathname: '/everybody',
path: '/everybody',
href: '//[email protected]/everybody#to-the-limit'
},
};

for (const u in parseTests) {
Expand Down

0 comments on commit 1086468

Please sign in to comment.