Skip to content

Commit c42f53b

Browse files
Fix encoding consistency with sorted and non-sorted URL parameters (#158)
Co-authored-by: Sindre Sorhus <[email protected]>
1 parent 6ea4038 commit c42f53b

File tree

2 files changed

+8
-2
lines changed

2 files changed

+8
-2
lines changed

Diff for: index.js

+5
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,11 @@ export default function normalizeUrl(urlString, options) {
206206
// Sort query parameters
207207
if (options.sortQueryParameters) {
208208
urlObject.searchParams.sort();
209+
210+
// Calling `.sort()` encodes the search parameters, so we need to decode them again.
211+
try {
212+
urlObject.search = decodeURIComponent(urlObject.search);
213+
} catch {}
209214
}
210215

211216
if (options.removeTrailingSlash) {

Diff for: test.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ test('main', t => {
2828
t.is(normalizeUrl('http://sindresorhus.com/?'), 'http://sindresorhus.com');
2929
t.is(normalizeUrl('êxample.com'), 'http://xn--xample-hva.com');
3030
t.is(normalizeUrl('http://sindresorhus.com/?b=bar&a=foo'), 'http://sindresorhus.com/?a=foo&b=bar');
31-
t.is(normalizeUrl('http://sindresorhus.com/?foo=bar*|<>:"'), 'http://sindresorhus.com/?foo=bar*%7C%3C%3E%3A%22');
31+
t.is(normalizeUrl('http://sindresorhus.com/?foo=bar*|<>:"'), 'http://sindresorhus.com/?foo=bar*|%3C%3E:%22');
3232
t.is(normalizeUrl('http://sindresorhus.com:5000'), 'http://sindresorhus.com:5000');
3333
t.is(normalizeUrl('//sindresorhus.com/', {normalizeProtocol: false}), '//sindresorhus.com');
3434
t.is(normalizeUrl('//sindresorhus.com:80/', {normalizeProtocol: false}), '//sindresorhus.com');
@@ -40,7 +40,7 @@ test('main', t => {
4040
t.is(normalizeUrl('sindre://www.sorhus.com'), 'sindre://sorhus.com');
4141
t.is(normalizeUrl('sindre://www.sorhus.com/'), 'sindre://sorhus.com');
4242
t.is(normalizeUrl('sindre://www.sorhus.com/foo/bar'), 'sindre://sorhus.com/foo/bar');
43-
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');
43+
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');
4444
});
4545

4646
test('stripAuthentication option', t => {
@@ -263,6 +263,7 @@ test('sortQueryParameters option', t => {
263263
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');
264264
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');
265265
t.is(normalizeUrl('http://sindresorhus.com/', options2), 'http://sindresorhus.com');
266+
t.is(normalizeUrl('http://sindresorhus.com/?a=/path', options1), normalizeUrl('http://sindresorhus.com/?a=/path', options2));
266267
});
267268

268269
test('invalid urls', t => {

0 commit comments

Comments
 (0)