From c42f53bb05ec6666514580107925207ff54ad8d0 Mon Sep 17 00:00:00 2001 From: Ludovico Fischer <43557+ludofischer@users.noreply.github.com> Date: Tue, 18 Jan 2022 13:09:24 +0100 Subject: [PATCH] Fix encoding consistency with sorted and non-sorted URL parameters (#158) Co-authored-by: Sindre Sorhus --- index.js | 5 +++++ test.js | 5 +++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index 4727186..70673a8 100644 --- a/index.js +++ b/index.js @@ -206,6 +206,11 @@ export default function normalizeUrl(urlString, options) { // Sort query parameters if (options.sortQueryParameters) { urlObject.searchParams.sort(); + + // Calling `.sort()` encodes the search parameters, so we need to decode them again. + try { + urlObject.search = decodeURIComponent(urlObject.search); + } catch {} } if (options.removeTrailingSlash) { diff --git a/test.js b/test.js index 149b51a..4483b5b 100644 --- a/test.js +++ b/test.js @@ -28,7 +28,7 @@ test('main', t => { t.is(normalizeUrl('http://sindresorhus.com/?'), 'http://sindresorhus.com'); t.is(normalizeUrl('êxample.com'), 'http://xn--xample-hva.com'); t.is(normalizeUrl('http://sindresorhus.com/?b=bar&a=foo'), 'http://sindresorhus.com/?a=foo&b=bar'); - t.is(normalizeUrl('http://sindresorhus.com/?foo=bar*|<>:"'), 'http://sindresorhus.com/?foo=bar*%7C%3C%3E%3A%22'); + t.is(normalizeUrl('http://sindresorhus.com/?foo=bar*|<>:"'), 'http://sindresorhus.com/?foo=bar*|%3C%3E:%22'); t.is(normalizeUrl('http://sindresorhus.com:5000'), 'http://sindresorhus.com:5000'); t.is(normalizeUrl('//sindresorhus.com/', {normalizeProtocol: false}), '//sindresorhus.com'); t.is(normalizeUrl('//sindresorhus.com:80/', {normalizeProtocol: false}), '//sindresorhus.com'); @@ -40,7 +40,7 @@ test('main', t => { t.is(normalizeUrl('sindre://www.sorhus.com'), 'sindre://sorhus.com'); t.is(normalizeUrl('sindre://www.sorhus.com/'), 'sindre://sorhus.com'); t.is(normalizeUrl('sindre://www.sorhus.com/foo/bar'), 'sindre://sorhus.com/foo/bar'); - t.is(normalizeUrl('https://i.vimeocdn.com/filter/overlay?src0=https://i.vimeocdn.com/video/598160082_1280x720.jpg&src1=https://f.vimeocdn.com/images_v6/share/play_icon_overlay.png'), 'https://i.vimeocdn.com/filter/overlay?src0=https%3A%2F%2Fi.vimeocdn.com%2Fvideo%2F598160082_1280x720.jpg&src1=https%3A%2F%2Ff.vimeocdn.com%2Fimages_v6%2Fshare%2Fplay_icon_overlay.png'); + t.is(normalizeUrl('https://i.vimeocdn.com/filter/overlay?src0=https://i.vimeocdn.com/video/598160082_1280x720.jpg&src1=https://f.vimeocdn.com/images_v6/share/play_icon_overlay.png'), 'https://i.vimeocdn.com/filter/overlay?src0=https://i.vimeocdn.com/video/598160082_1280x720.jpg&src1=https://f.vimeocdn.com/images_v6/share/play_icon_overlay.png'); }); test('stripAuthentication option', t => { @@ -263,6 +263,7 @@ test('sortQueryParameters option', t => { t.is(normalizeUrl('http://sindresorhus.com/?b=Y&c=X&a=Z&d=W', options2), 'http://sindresorhus.com/?b=Y&c=X&a=Z&d=W'); t.is(normalizeUrl('http://sindresorhus.com/?a=Z&d=W&b=Y&c=X', options2), 'http://sindresorhus.com/?a=Z&d=W&b=Y&c=X'); t.is(normalizeUrl('http://sindresorhus.com/', options2), 'http://sindresorhus.com'); + t.is(normalizeUrl('http://sindresorhus.com/?a=/path', options1), normalizeUrl('http://sindresorhus.com/?a=/path', options2)); }); test('invalid urls', t => {