diff --git a/public/app/core/specs/url.test.ts b/public/app/core/specs/url.test.ts index b5994488128..3b7f81494f9 100644 --- a/public/app/core/specs/url.test.ts +++ b/public/app/core/specs/url.test.ts @@ -14,3 +14,12 @@ describe('toUrlParams', () => { expect(url).toBe('server=backend-01&hasSpace=has%20space&many=1&many=2&many=3&true&number=20&isNull=&isUndefined='); }); }); + +describe('toUrlParams', () => { + it('should encode the same way as angularjs', () => { + const url = toUrlParams({ + server: ':@', + }); + expect(url).toBe('server=:@'); + }); +}); diff --git a/public/app/core/utils/explore.ts b/public/app/core/utils/explore.ts index 45b70672bc6..7a9f54a0cae 100644 --- a/public/app/core/utils/explore.ts +++ b/public/app/core/utils/explore.ts @@ -84,7 +84,7 @@ export async function getExploreUrl( } const exploreState = JSON.stringify(state); - url = renderUrl('/explore', { state: exploreState }); + url = renderUrl('/explore', { left: exploreState }); } return url; } diff --git a/public/app/core/utils/url.ts b/public/app/core/utils/url.ts index ab8be8ad222..824e0e4e9c9 100644 --- a/public/app/core/utils/url.ts +++ b/public/app/core/utils/url.ts @@ -11,6 +11,16 @@ export function renderUrl(path: string, query: UrlQueryMap | undefined): string return path; } +export function encodeURIComponentAsAngularJS(val, pctEncodeSpaces) { + return encodeURIComponent(val). + replace(/%40/gi, '@'). + replace(/%3A/gi, ':'). + replace(/%24/g, '$'). + replace(/%2C/gi, ','). + replace(/%3B/gi, ';'). + replace(/%20/g, (pctEncodeSpaces ? '%20' : '+')); +} + export function toUrlParams(a) { const s = []; const rbracket = /\[\]$/; @@ -22,9 +32,9 @@ export function toUrlParams(a) { const add = (k, v) => { v = typeof v === 'function' ? v() : v === null ? '' : v === undefined ? '' : v; if (typeof v !== 'boolean') { - s[s.length] = encodeURIComponent(k) + '=' + encodeURIComponent(v); + s[s.length] = encodeURIComponentAsAngularJS(k, true) + '=' + encodeURIComponentAsAngularJS(v, true); } else { - s[s.length] = encodeURIComponent(k); + s[s.length] = encodeURIComponentAsAngularJS(k, true); } };