From 5342c4307c6156a7bd8722804ca264ace789bd70 Mon Sep 17 00:00:00 2001 From: Erik Dubbelboer Date: Fri, 11 Aug 2017 11:52:43 +0200 Subject: [PATCH] Add url.parse option to not decode the whole URL See: https://github.com/prebid/Prebid.js/pull/1480 --- modules/atomxBidAdapter.js | 2 +- src/ajax.js | 2 +- src/url.js | 8 ++++++-- test/spec/url_spec.js | 9 +++++---- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/modules/atomxBidAdapter.js b/modules/atomxBidAdapter.js index 383547af3ecb..69bb04a227b7 100644 --- a/modules/atomxBidAdapter.js +++ b/modules/atomxBidAdapter.js @@ -32,7 +32,7 @@ var AtomxAdapter = function AtomxAdapter() { id: bid.params.id, size: sizes[j], prebid: bid.placementCode - }, {method: 'GET'}); + }, {method: 'GET', noDecodeWholeURL: true}); } } else { var bidObject = bidfactory.createBid(CONSTANTS.STATUS.NO_BID, bid); diff --git a/src/ajax.js b/src/ajax.js index 02b699d7e9ad..44ff00a0fe07 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -76,7 +76,7 @@ export function ajax(url, callback, data, options = {}) { } if (method === 'GET' && data) { - let urlInfo = parseURL(url); + let urlInfo = parseURL(url, options); Object.assign(urlInfo.search, data); url = formatURL(urlInfo); } diff --git a/src/url.js b/src/url.js index 0682ece573a7..5bfeb9c3151f 100644 --- a/src/url.js +++ b/src/url.js @@ -24,9 +24,13 @@ export function formatQS(query) { .join('&'); } -export function parse(url) { +export function parse(url, options) { let parsed = document.createElement('a'); - parsed.href = decodeURIComponent(url); + if (options && 'noDecodeWholeURL' in options && options.noDecodeWholeURL) { + parsed.href = url; + } else { + parsed.href = decodeURIComponent(url); + } return { protocol: (parsed.protocol || '').replace(/:$/, ''), hostname: parsed.hostname, diff --git a/test/spec/url_spec.js b/test/spec/url_spec.js index 2b60549ef630..d5a011d274e3 100644 --- a/test/spec/url_spec.js +++ b/test/spec/url_spec.js @@ -6,7 +6,7 @@ describe('helpers.url', () => { let parsed; beforeEach(() => { - parsed = parse('http://example.com:3000/pathname/?search=test&foo=bar#hash'); + parsed = parse('http://example.com:3000/pathname/?search=test&foo=bar&bar=foo%26foo%3Dxxx#hash', {noDecodeWholeURL: true}); }); it('extracts the protocol', () => { @@ -29,7 +29,8 @@ describe('helpers.url', () => { expect(parsed).to.have.property('search'); expect(parsed.search).to.eql({ foo: 'bar', - search: 'test' + search: 'test', + bar: 'foo%26foo%3Dxxx', }); }); @@ -49,9 +50,9 @@ describe('helpers.url', () => { hostname: 'example.com', port: 3000, pathname: '/pathname/', - search: {foo: 'bar', search: 'test'}, + search: {foo: 'bar', search: 'test', bar: 'foo%26foo%3Dxxx'}, hash: 'hash' - })).to.equal('http://example.com:3000/pathname/?foo=bar&search=test#hash'); + })).to.equal('http://example.com:3000/pathname/?foo=bar&search=test&bar=foo%26foo%3Dxxx#hash'); }); it('will use defaults for missing properties', () => {