diff --git a/packages/url/src/get-query-args.js b/packages/url/src/get-query-args.js index 5ba4760a47af81..45626f1d8a1e94 100644 --- a/packages/url/src/get-query-args.js +++ b/packages/url/src/get-query-args.js @@ -1,6 +1,7 @@ /** * Internal dependencies */ +import { safeDecodeURIComponent } from './safe-decode-uri-component'; import { getQueryString } from './get-query-string'; /** @typedef {import('./get-query-arg').QueryArgParsed} QueryArgParsed */ @@ -85,7 +86,7 @@ export function getQueryArgs( url ) { // Filtering avoids decoding as `undefined` for value, where // default is restored in destructuring assignment. .filter( Boolean ) - .map( decodeURIComponent ); + .map( safeDecodeURIComponent ); if ( key ) { const segments = key.replace( /\]/g, '' ).split( '[' ); diff --git a/packages/url/src/test/index.js b/packages/url/src/test/index.js index 19a0bf161c34b8..6ff0253d0fd2ae 100644 --- a/packages/url/src/test/index.js +++ b/packages/url/src/test/index.js @@ -723,6 +723,16 @@ describe( 'getQueryArgs', () => { ) ).toEqual( data ); } ); + + it( 'should not blow up on malformed params', () => { + const url = 'https://andalouses.example/beach?foo=bar&baz=%E0%A4%A'; + + expect( () => getQueryArgs( url ) ).not.toThrow(); + expect( getQueryArgs( url ) ).toEqual( { + baz: '%E0%A4%A', + foo: 'bar', + } ); + } ); } ); } );