Skip to content

Commit 766fe5f

Browse files
committed
fix decode uri parameters
1 parent 14a57ba commit 766fe5f

File tree

8 files changed

+150
-50
lines changed

8 files changed

+150
-50
lines changed

dist/url.js

Lines changed: 91 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,24 @@
1919

2020
/**
2121
* @param query
22+
* @param decode
2223
* @returns {{}}
2324
*/
2425

2526
function _buildParams(query) {
27+
var decode =
28+
arguments.length > 1 && arguments[1] !== undefined
29+
? arguments[1]
30+
: true;
2631
var params = {};
2732

2833
if (query) {
2934
query.split('&').forEach(function(_query) {
35+
// %26 => &
36+
if (decode) {
37+
_query = decodeUrlParameter(_query);
38+
}
39+
3040
var row = _query.split('=', 2);
3141

3242
var key = row[0];
@@ -42,9 +52,9 @@
4252
params[key] = [];
4353
}
4454

45-
params[key].push(decodeUrlParameter(value));
55+
params[key].push(value);
4656
} else {
47-
params[key] = decodeUrlParameter(value);
57+
params[key] = value;
4858
}
4959
});
5060
}
@@ -119,29 +129,47 @@
119129

120130
/**
121131
* @param query
132+
* @param decode
122133
* @returns {{}}
123134
*/
124135

125136
function _buildParamsExtended(query) {
137+
var decode =
138+
arguments.length > 1 && arguments[1] !== undefined
139+
? arguments[1]
140+
: true;
126141
var params = {};
127-
query.split('&').forEach(function(_query, i) {
128-
var row = _query.split('=', 2);
129142

130-
var key = row[0];
131-
var value = row[1] || ''; // @todo написать получение ключей по-нормальному
143+
if (query) {
144+
query.split('&').forEach(function(_query, i) {
145+
// %26 => &
146+
if (decode) {
147+
_query = decodeUrlParameter(_query);
148+
}
149+
150+
var row = _query.split('=', 2);
151+
152+
var key = row[0];
153+
var value = row[1] || ''; // @todo написать получение ключей по-нормальному
132154

133-
var match = key.match(/(.+?)(\[(.*)\])/i);
155+
var match = key.match(/(.+?)(\[(.*)\])/i); // example.com?s%5B%5D=4%264&s%5B%5D=3&r=s+s%2Bs
156+
//@todo не срабатывает, так как r без []
134157

135-
if (match) {
136-
var raw = match[3] || String(i);
137-
var array = raw.split('][');
138-
array.unshift(match[1]);
158+
if (match) {
159+
var raw = match[3] || String(i);
160+
var array = raw.split('][');
161+
array.unshift(match[1]);
139162

140-
var nesting = _buildNesting(array, decodeUrlParameter(value));
163+
var nesting = _buildNesting(
164+
array,
165+
decodeUrlParameter(value)
166+
);
167+
168+
params = _mergeObjectsDeep(params, nesting);
169+
}
170+
});
171+
}
141172

142-
params = _mergeObjectsDeep(params, nesting);
143-
}
144-
});
145173
return params;
146174
}
147175
/**
@@ -153,9 +181,14 @@
153181

154182
/**
155183
* @param params
184+
* @param encode
156185
* @returns {string}
157186
*/
158187
function _buildQuery(params) {
188+
var encode =
189+
arguments.length > 1 && arguments[1] !== undefined
190+
? arguments[1]
191+
: false;
159192
var queries = [];
160193

161194
var _loop = function _loop(key) {
@@ -176,6 +209,12 @@
176209
_loop(key);
177210
}
178211

212+
if (encode) {
213+
queries = queries.map(function(query) {
214+
return encodeURIComponent(query);
215+
});
216+
}
217+
179218
return queries.join('&');
180219
}
181220
/**
@@ -230,10 +269,15 @@
230269

231270
/**
232271
* @param params
272+
* @param encode
233273
* @returns {string}
234274
*/
235275

236276
function _buildQueryDeep(params) {
277+
var encode =
278+
arguments.length > 1 && arguments[1] !== undefined
279+
? arguments[1]
280+
: false;
237281
var tree = [];
238282

239283
_simplifyObject(params, [], tree);
@@ -249,6 +293,13 @@
249293
}
250294
}, '');
251295
});
296+
297+
if (encode) {
298+
parts = parts.map(function(part) {
299+
return encodeURIComponent(part);
300+
});
301+
}
302+
252303
return parts.join('&');
253304
}
254305
/**
@@ -309,40 +360,61 @@
309360
arguments.length > 0 && arguments[0] !== undefined
310361
? arguments[0]
311362
: window.location.href;
363+
var decode =
364+
arguments.length > 1 && arguments[1] !== undefined
365+
? arguments[1]
366+
: true;
312367
var splitUrl = url.split('?', 2);
313-
return _buildParams(splitUrl.length === 2 ? splitUrl[1] : '');
368+
return _buildParams(splitUrl.length === 2 ? splitUrl[1] : '', decode);
314369
}
315370

316371
function getParamsExtended() {
317372
var url =
318373
arguments.length > 0 && arguments[0] !== undefined
319374
? arguments[0]
320375
: window.location.href;
376+
var decode =
377+
arguments.length > 1 && arguments[1] !== undefined
378+
? arguments[1]
379+
: true;
321380
var splitUrl = url.split('?', 2);
322-
return _buildParamsExtended(splitUrl.length === 2 ? splitUrl[1] : '');
381+
return _buildParamsExtended(
382+
splitUrl.length === 2 ? splitUrl[1] : '',
383+
decode
384+
);
323385
}
324386

325387
function addParams(url, newParams) {
388+
var encode =
389+
arguments.length > 2 && arguments[2] !== undefined
390+
? arguments[2]
391+
: false;
392+
326393
if (newParams instanceof Object) {
327394
var uri = url.split('?', 2)[0];
328395
var currentParams = getParams(url);
329396

330397
var params = _mergeObjects(currentParams, newParams);
331398

332-
url = ''.concat(uri, '?').concat(_buildQuery(params));
399+
url = ''.concat(uri, '?').concat(_buildQuery(params, encode));
333400
}
334401

335402
return url;
336403
}
337404

338405
function addParamsExtended(url, newParams) {
406+
var encode =
407+
arguments.length > 2 && arguments[2] !== undefined
408+
? arguments[2]
409+
: false;
410+
339411
if (newParams instanceof Object) {
340412
var uri = url.split('?', 2)[0];
341413
var currentParams = getParams(url);
342414

343415
var params = _mergeObjectsDeep(currentParams, newParams);
344416

345-
url = ''.concat(uri, '?').concat(_buildQueryDeep(params));
417+
url = ''.concat(uri, '?').concat(_buildQueryDeep(params, encode));
346418
}
347419

348420
return url;

dist/url.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/_buildParams.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,19 @@ import _decodeUrlParameter from './_decodeUrlParameter';
22

33
/**
44
* @param query
5+
* @param decode
56
* @returns {{}}
67
*/
7-
export default function _buildParams(query) {
8+
export default function _buildParams(query, decode = true) {
89
const params = {};
910

1011
if (query) {
1112
query.split('&').forEach(_query => {
13+
// %26 => &
14+
if (decode) {
15+
_query = _decodeUrlParameter(_query);
16+
}
17+
1218
const row = _query.split('=', 2);
1319

1420
let key = row[0];
@@ -21,9 +27,9 @@ export default function _buildParams(query) {
2127
params[key] = [];
2228
}
2329

24-
params[key].push(_decodeUrlParameter(value));
30+
params[key].push(value);
2531
} else {
26-
params[key] = _decodeUrlParameter(value);
32+
params[key] = value;
2733
}
2834
});
2935
}

src/_buildParamsExtended.js

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,30 +4,41 @@ import _decodeUrlParameter from './_decodeUrlParameter';
44

55
/**
66
* @param query
7+
* @param decode
78
* @returns {{}}
89
*/
9-
export default function _buildParamsExtended(query) {
10+
export default function _buildParamsExtended(query, decode = true) {
1011
let params = {};
1112

12-
query.split('&').forEach((_query, i) => {
13-
const row = _query.split('=', 2);
13+
if (query) {
14+
query.split('&').forEach((_query, i) => {
15+
// %26 => &
16+
if (decode) {
17+
_query = _decodeUrlParameter(_query);
18+
}
1419

15-
let key = row[0];
16-
let value = row[1] || '';
20+
const row = _query.split('=', 2);
1721

18-
// @todo написать получение ключей по-нормальному
19-
const match = key.match(/(.+?)(\[(.*)\])/i);
22+
let key = row[0];
23+
let value = row[1] || '';
2024

21-
if (match) {
22-
const raw = match[3] || String(i);
23-
const array = raw.split('][');
24-
array.unshift(match[1]);
25+
// @todo написать получение ключей по-нормальному
26+
const match = key.match(/(.+?)(\[(.*)\])/i);
2527

26-
const nesting = _buildNesting(array, _decodeUrlParameter(value));
28+
// example.com?s%5B%5D=4%264&s%5B%5D=3&r=s+s%2Bs
29+
//@todo не срабатывает, так как r без []
2730

28-
params = _mergeObjectsDeep(params, nesting);
29-
}
30-
});
31+
if (match) {
32+
const raw = match[3] || String(i);
33+
const array = raw.split('][');
34+
array.unshift(match[1]);
35+
36+
const nesting = _buildNesting(array, _decodeUrlParameter(value));
37+
38+
params = _mergeObjectsDeep(params, nesting);
39+
}
40+
});
41+
}
3142

3243
return params;
3344
}

src/_buildQuery.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
/**
22
* @param params
3+
* @param encode
34
* @returns {string}
45
*/
5-
export default function _buildQuery(params) {
6-
const queries = [];
6+
export default function _buildQuery(params, encode = false) {
7+
let queries = [];
78

89
for (let key in params) {
910
if (params.hasOwnProperty(key)) {
@@ -19,6 +20,10 @@ export default function _buildQuery(params) {
1920
}
2021
}
2122

23+
if (encode) {
24+
queries = queries.map(query => encodeURIComponent(query));
25+
}
26+
2227
return queries.join('&');
2328
}
2429

src/_buildQueryDeep.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@ import _simplifyObject from './_simplifyObject';
22

33
/**
44
* @param params
5+
* @param encode
56
* @returns {string}
67
*/
7-
export default function _buildQueryDeep(params) {
8+
export default function _buildQueryDeep(params, encode = false) {
89
const tree = [];
910

1011
_simplifyObject(params, [], tree);
1112

12-
const parts = tree.map(branch => {
13+
let parts = tree.map(branch => {
1314
return branch.reduce((str, item, i) => {
1415
if (!str) {
1516
return str + item;
@@ -21,6 +22,10 @@ export default function _buildQueryDeep(params) {
2122
}, '');
2223
});
2324

25+
if (encode) {
26+
parts = parts.map(part => encodeURIComponent(part));
27+
}
28+
2429
return parts.join('&');
2530
}
2631

0 commit comments

Comments
 (0)