Skip to content

Commit

Permalink
url: use "empty" object for empty query strings
Browse files Browse the repository at this point in the history
This makes things consistent with the way that the querystring
module creates parsed results.

PR-URL: #6289
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Michaël Zasso <mic.besace@gmail.com>
Reviewed-By: Сковорода Никита Андреевич <chalkerx@gmail.com>
Reviewed-By: Minwoo Jung <jmwsoft@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
  • Loading branch information
mscdex authored and jasnell committed Apr 26, 2016
1 parent 809ed52 commit 59737b2
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 3 deletions.
10 changes: 8 additions & 2 deletions lib/url.js
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,12 @@ const slashedProtocol = {
};
const querystring = require('querystring');

// This constructor is used to store parsed query string values. Instantiating
// this is faster than explicitly calling `Object.create(null)` to get a
// "clean" empty object (tested with v8 v4.9).
function ParsedQueryString() {}
ParsedQueryString.prototype = Object.create(null);

function urlParse(url, parseQueryString, slashesDenoteHost) {
if (url instanceof Url) return url;

Expand Down Expand Up @@ -168,7 +174,7 @@ Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) {
}
} else if (parseQueryString) {
this.search = '';
this.query = {};
this.query = new ParsedQueryString();
}
return this;
}
Expand Down Expand Up @@ -358,7 +364,7 @@ Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) {
} else if (parseQueryString) {
// no query string, but parseQueryString still requested
this.search = '';
this.query = {};
this.query = new ParsedQueryString();
}

var firstIdx = (questionIdx !== -1 &&
Expand Down
4 changes: 3 additions & 1 deletion test/parallel/test-url.js
Original file line number Diff line number Diff line change
Expand Up @@ -927,7 +927,7 @@ var parseTestsWithQueryString = {
path: '/example',
href: '/example'
},
'/example?query=value':{
'/example?query=value': {
protocol: null,
slashes: null,
auth: null,
Expand All @@ -951,6 +951,8 @@ for (const u in parseTestsWithQueryString) {
}
}

assert.notStrictEqual(Object.getPrototypeOf(actual.query), Object.prototype);

assert.deepEqual(actual, expected);
}

Expand Down

0 comments on commit 59737b2

Please sign in to comment.