Skip to content

Commit

Permalink
Fix encoding consistency with sorted and non-sorted URL parameters (#158
Browse files Browse the repository at this point in the history
)

Co-authored-by: Sindre Sorhus <sindresorhus@gmail.com>
  • Loading branch information
ludofischer and sindresorhus committed Jan 18, 2022
1 parent 6ea4038 commit c42f53b
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 2 deletions.
5 changes: 5 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
5 changes: 3 additions & 2 deletions test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Expand All @@ -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 => {
Expand Down Expand Up @@ -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 => {
Expand Down

0 comments on commit c42f53b

Please sign in to comment.