From 08d6c98eff39b3e89fc3c36e307656153c53f8ff Mon Sep 17 00:00:00 2001 From: Timothy Gu Date: Wed, 1 Feb 2017 09:29:12 -0800 Subject: [PATCH] url: fix setting `url.search` to the empty string MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/11105 Fixes: https://github.com/nodejs/node/issues/11101 Fixes: 98bb65f641 "url: improving URLSearchParams" Reviewed-By: James M Snell Reviewed-By: Michaƫl Zasso Reviewed-By: Joyee Cheung --- lib/internal/url.js | 27 +++++++++---------- test/parallel/test-whatwg-url-searchparams.js | 4 +++ 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/lib/internal/url.js b/lib/internal/url.js index dc3c8a7cbdc98b..3fe6e106d5b1fa 100644 --- a/lib/internal/url.js +++ b/lib/internal/url.js @@ -188,12 +188,7 @@ function onParseSearchComplete(flags, protocol, username, password, if (flags & binding.URL_FLAGS_FAILED) return; const ctx = this[context]; - if (query) { - ctx.query = query; - ctx.flags |= binding.URL_FLAGS_HAS_QUERY; - } else { - ctx.flags &= ~binding.URL_FLAGS_HAS_QUERY; - } + ctx.query = query; } function onParseHashComplete(flags, protocol, username, password, @@ -486,13 +481,15 @@ Object.defineProperties(URL.prototype, { if (!search) { ctx.query = null; ctx.flags &= ~binding.URL_FLAGS_HAS_QUERY; - this[searchParams][searchParams] = {}; - return; + } else { + if (search[0] === '?') search = search.slice(1); + ctx.query = ''; + ctx.flags |= binding.URL_FLAGS_HAS_QUERY; + if (search) { + binding.parse(search, binding.kQuery, null, ctx, + onParseSearchComplete.bind(this)); + } } - if (search[0] === '?') search = search.slice(1); - ctx.query = ''; - binding.parse(search, binding.kQuery, null, ctx, - onParseSearchComplete.bind(this)); initSearchParams(this[searchParams], search); } }, @@ -610,9 +607,11 @@ function update(url, params) { } } -// Reused by the URL parse function invoked by -// the href setter, and the URLSearchParams constructor function initSearchParams(url, init) { + if (!init) { + url[searchParams] = []; + return; + } url[searchParams] = getParamsFromObject(querystring.parse(init)); } diff --git a/test/parallel/test-whatwg-url-searchparams.js b/test/parallel/test-whatwg-url-searchparams.js index fc395d8ace4cfa..d855ccee841851 100644 --- a/test/parallel/test-whatwg-url-searchparams.js +++ b/test/parallel/test-whatwg-url-searchparams.js @@ -21,6 +21,10 @@ assert(sp.has('a')); assert.strictEqual(sp.get('a'), '[object Object]'); sp.delete('a'); assert(!sp.has('a')); + +m.search = ''; +assert.strictEqual(sp.toString(), ''); + values.forEach((i) => sp.append('a', i)); assert(sp.has('a')); assert.strictEqual(sp.getAll('a').length, 6);