Skip to content

Commit

Permalink
url: fix url.parse() for @hostname
Browse files Browse the repository at this point in the history
Make url.parse() behave more like browsers and WHATWHG URL when dealing
with URLs that of the format `http:@example.com`. This is the same as
`http://example.com`.

This issue was reported by P0cas. https://github.com/P0cas

PR-URL: #42136
Reviewed-By: Darshan Sen <raisinten@gmail.com>
Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
  • Loading branch information
Trott authored and sxa committed Mar 7, 2022
1 parent ee02739 commit 9aeda47
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 9 deletions.
23 changes: 15 additions & 8 deletions lib/url.js
Original file line number Diff line number Diff line change
Expand Up @@ -294,22 +294,29 @@ Url.prototype.parse = function parse(url, parseQueryString, slashesDenoteHost) {
rest = rest.slice(proto.length);
}

// Figure out if it's got a host
// user@server is *always* interpreted as a hostname, and url
// Figure out if it's got a host.
// user@server is *always* interpreted as a hostname, and URL
// resolution will treat //foo/bar as host=foo,path=bar because that's
// how the browser resolves relative URLs.
// how the browser resolves relative URLs. http:@example.com is treated
// the same as http://example.com.
let slashes;
let at;
if (slashesDenoteHost || proto || hostPattern.test(rest)) {
slashes = rest.charCodeAt(0) === CHAR_FORWARD_SLASH &&
rest.charCodeAt(1) === CHAR_FORWARD_SLASH;
if (slashes && !(proto && hostlessProtocol.has(lowerProto))) {
rest = rest.slice(2);
this.slashes = true;
rest.charCodeAt(1) === CHAR_FORWARD_SLASH;
at = rest.charCodeAt(0) === CHAR_AT;
if (!(proto && hostlessProtocol.has(lowerProto))) {
if (slashes) {
rest = rest.slice(2);
this.slashes = true;
} else if (at) {
rest = rest.slice(1);
}
}
}

if (!hostlessProtocol.has(lowerProto) &&
(slashes || (proto && !slashedProtocol.has(proto)))) {
(slashes || at || (proto && !slashedProtocol.has(proto)))) {

// there's a hostname.
// the first instance of /, ?, ;, or # ends the host.
Expand Down
17 changes: 16 additions & 1 deletion test/parallel/test-url-parse-format.js
Original file line number Diff line number Diff line change
Expand Up @@ -975,7 +975,22 @@ const parseTests = {
query: null,
pathname: '/everybody',
path: '/everybody',
href: '//fhqwhgads@example.com/everybody#to-the-limit'
href: '//fhqwhgads@example.com/everybody#to-the-limit',
},

'http:@localhost': {
protocol: 'http:',
slashes: null,
auth: null,
host: 'localhost',
port: null,
hostname: 'localhost',
hash: null,
search: null,
query: null,
pathname: '/',
path: '/',
href: 'http://localhost/',
},
};

Expand Down

0 comments on commit 9aeda47

Please sign in to comment.