From ce8299e8e0303ca7455312189f16098fb3054d6b Mon Sep 17 00:00:00 2001 From: Leo Horie Date: Sun, 25 May 2014 14:36:01 -0400 Subject: [PATCH] fix querystring parsing of array syntax --- mithril.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/mithril.js b/mithril.js index 8ccfd224..6d1a3536 100644 --- a/mithril.js +++ b/mithril.js @@ -331,7 +331,7 @@ Mithril = m = new function app(window) { return !void path.replace(matcher, function() { var keys = route.match(/:[^\/]+/g) || [] var values = [].slice.call(arguments, 1, -2) - for (var i = 0; i < keys.length; i++) routeParams[keys[i].replace(/:|\./g, "")] = decodeURIComponent(values[i]) + for (var i = 0; i < keys.length; i++) routeParams[keys[i].replace(/:|\./g, "")] = decodeSpace(values[i]) m.module(root, router[route]) }) } @@ -355,16 +355,18 @@ Mithril = m = new function app(window) { return str.join("&") } function parseQueryString(str) { - var derefParser = /\[?([^\]\[]+)\]?/g var pairs = str.split("&"), params = {} for (var i = 0; i < pairs.length; i++) { var pair = pairs[i].split("=") var key = decodeSpace(pair[0]) - var value = pair[1] ? decodeSpace(pair[1]) : (pair.length == 1 ? true : "") - if (key.indexOf('[') > -1) { - var subParams = params - while ((match = derefParser.exec(key)) !== null) { - subParams = subParams[match[1]] = (derefParser.lastIndex === key.length ? value : subParams[match[1]] || {}) + var value = pair[1] ? decodeSpace(pair[1]) : (pair.length === 1 ? true : "") + if (key.indexOf("[") != -1) { + var match, subKey, lastParams, queryParser = /\[?([^\]\[]+)\]?|\[\]|/g, subParams = params + while ((match = queryParser.exec(key)) !== null && match[0]) { + if ((match[1] === undefined || (/^\d+$/).test(match[1])) && (type.call(subParams) != "[object Array]")) subParams = lastParams[subKey] = [] + subKey = match[1] || subParams.length + lastParams = subParams + subParams = subParams[subKey] = (queryParser.lastIndex === key.length ? value : subParams[subKey] || {}) } } else params[key] = value