From 7e4404e8946a3a45ccfd74f1fc111f3845674ecc Mon Sep 17 00:00:00 2001 From: Wylie Conlon Date: Fri, 28 Feb 2020 17:57:44 -0500 Subject: [PATCH] Stop double-encoding --- .../common/url/encode_uri_query.test.ts | 23 +++++++++++++++++++ .../common/url/encode_uri_query.ts | 5 +++- src/plugins/kibana_utils/common/url/index.ts | 3 ++- .../public/history/remove_query_param.ts | 4 ++-- .../public/state_management/url/format.ts | 4 ++-- .../state_management/url/kbn_url_storage.ts | 6 ++--- .../infra/public/utils/use_url_state.ts | 10 ++++---- 7 files changed, 40 insertions(+), 15 deletions(-) diff --git a/src/plugins/kibana_utils/common/url/encode_uri_query.test.ts b/src/plugins/kibana_utils/common/url/encode_uri_query.test.ts index b600822946299f..c255cf4699334f 100644 --- a/src/plugins/kibana_utils/common/url/encode_uri_query.test.ts +++ b/src/plugins/kibana_utils/common/url/encode_uri_query.test.ts @@ -67,4 +67,27 @@ describe('encodeQuery', () => { g: 'null', }); }); + + test('encodeQuery without encoding', () => { + expect( + encodeQuery( + { + a: 'asdf1234asdf', + b: "-_.!~*'() -_.!~*'()", + c: ':@$, :@$,', + d: "&;=+# &;=+#'", + f: ' ', + g: 'null', + }, + v => v + ) + ).toEqual({ + a: 'asdf1234asdf', + b: "-_.!~*'() -_.!~*'()", + c: ':@$, :@$,', + d: "&;=+# &;=+#'", + f: ' ', + g: 'null', + }); + }); }); diff --git a/src/plugins/kibana_utils/common/url/encode_uri_query.ts b/src/plugins/kibana_utils/common/url/encode_uri_query.ts index 3d61aa376bba27..616a5aeea9fb10 100644 --- a/src/plugins/kibana_utils/common/url/encode_uri_query.ts +++ b/src/plugins/kibana_utils/common/url/encode_uri_query.ts @@ -17,7 +17,7 @@ * under the License. */ -import { ParsedUrlQuery } from 'querystring'; +import { stringify, ParsedUrlQuery } from 'querystring'; import { transform } from 'lodash'; /** @@ -55,3 +55,6 @@ export const encodeQuery = ( ); } }); + +export const makeUrlFromQuery = (query: ParsedUrlQuery | {}) => + stringify(query, undefined, undefined, { encodeURIComponent: encodeUriQuery }); diff --git a/src/plugins/kibana_utils/common/url/index.ts b/src/plugins/kibana_utils/common/url/index.ts index 7b74f07e598ee2..6621e6ce8b802b 100644 --- a/src/plugins/kibana_utils/common/url/index.ts +++ b/src/plugins/kibana_utils/common/url/index.ts @@ -17,9 +17,10 @@ * under the License. */ -import { encodeUriQuery, encodeQuery } from './encode_uri_query'; +import { encodeUriQuery, encodeQuery, makeUrlFromQuery } from './encode_uri_query'; export const url = { encodeQuery, encodeUriQuery, + makeUrlFromQuery, }; diff --git a/src/plugins/kibana_utils/public/history/remove_query_param.ts b/src/plugins/kibana_utils/public/history/remove_query_param.ts index 868829548651ce..929ae36033d918 100644 --- a/src/plugins/kibana_utils/public/history/remove_query_param.ts +++ b/src/plugins/kibana_utils/public/history/remove_query_param.ts @@ -17,7 +17,7 @@ * under the License. */ -import { parse, stringify } from 'querystring'; +import { parse } from 'querystring'; import { History, Location } from 'history'; import { url } from '../../common'; @@ -28,7 +28,7 @@ export function removeQueryParam(history: History, param: string, replace: boole delete query[param]; - const newSearch = stringify(url.encodeQuery(query)); + const newSearch = url.makeUrlFromQuery(query); const newLocation: Location = { ...oldLocation, search: newSearch, diff --git a/src/plugins/kibana_utils/public/state_management/url/format.ts b/src/plugins/kibana_utils/public/state_management/url/format.ts index 456bd9f5bf3fa5..cd25d0724e7e63 100644 --- a/src/plugins/kibana_utils/public/state_management/url/format.ts +++ b/src/plugins/kibana_utils/public/state_management/url/format.ts @@ -18,7 +18,7 @@ */ import { format as formatUrl } from 'url'; -import { stringify, ParsedUrlQuery } from 'querystring'; +import { ParsedUrlQuery } from 'querystring'; import { parseUrl, parseUrlHash } from './parse'; import { url as urlUtils } from '../../../common'; @@ -29,7 +29,7 @@ export function replaceUrlHashQuery( const url = parseUrl(rawUrl); const hash = parseUrlHash(rawUrl); const newQuery = queryReplacer(hash?.query || {}); - const searchQueryString = stringify(urlUtils.encodeQuery(newQuery)); + const searchQueryString = urlUtils.makeUrlFromQuery(newQuery); if ((!hash || !hash.search) && !searchQueryString) return rawUrl; // nothing to change. return original url return formatUrl({ diff --git a/src/plugins/kibana_utils/public/state_management/url/kbn_url_storage.ts b/src/plugins/kibana_utils/public/state_management/url/kbn_url_storage.ts index 923a0215b3e952..9003427d88ab7b 100644 --- a/src/plugins/kibana_utils/public/state_management/url/kbn_url_storage.ts +++ b/src/plugins/kibana_utils/public/state_management/url/kbn_url_storage.ts @@ -18,7 +18,7 @@ */ import { format as formatUrl } from 'url'; -import { stringify } from 'querystring'; +// import { stringify } from 'querystring'; import { createBrowserHistory, History } from 'history'; import { decodeState, encodeState } from '../state_encoder'; import { getCurrentUrl, parseUrl, parseUrlHash } from './parse'; @@ -244,11 +244,11 @@ export function getRelativeToHistoryPath(absoluteUrl: string, history: History): return formatUrl({ pathname: stripBasename(parsedUrl.pathname), - search: stringify(urlUtils.encodeQuery(parsedUrl.query)), + search: urlUtils.makeUrlFromQuery(parsedUrl.query), hash: parsedHash ? formatUrl({ pathname: parsedHash.pathname, - search: stringify(urlUtils.encodeQuery(parsedHash.query)), + search: urlUtils.makeUrlFromQuery(parsedHash.query), }) : parsedUrl.hash, }); diff --git a/x-pack/plugins/infra/public/utils/use_url_state.ts b/x-pack/plugins/infra/public/utils/use_url_state.ts index 574457d54c51f3..edae4df309ba26 100644 --- a/x-pack/plugins/infra/public/utils/use_url_state.ts +++ b/x-pack/plugins/infra/public/utils/use_url_state.ts @@ -115,12 +115,10 @@ export const replaceStateKeyInQueryString = ( const encodedUrlState = typeof urlState !== 'undefined' ? encodeRisonUrlState(urlState) : undefined; - return stringify( - url.encodeQuery({ - ...previousQueryValues, - [stateKey]: encodedUrlState, - }) - ); + return url.makeUrlFromQuery({ + ...previousQueryValues, + [stateKey]: encodedUrlState, + }); }; const replaceQueryStringInLocation = (location: Location, queryString: string): Location => {