diff options
author | isaacs <i@izs.me> | 2010-06-14 21:13:09 -0700 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2010-06-15 19:28:09 -0700 |
commit | 4ce100fa622d97de51d7cccde2301653ee95bbe7 (patch) | |
tree | e444343839119234c17da0175d2bf48ada39ce1a /lib/querystring.js | |
parent | ed5f4f3a444e155292db2be6b499528c279fdefb (diff) | |
download | android-node-v8-4ce100fa622d97de51d7cccde2301653ee95bbe7.tar.gz android-node-v8-4ce100fa622d97de51d7cccde2301653ee95bbe7.tar.bz2 android-node-v8-4ce100fa622d97de51d7cccde2301653ee95bbe7.zip |
A replacement for decodeURIComponent that doesn't throw.
And add a few more tests.
Diffstat (limited to 'lib/querystring.js')
-rw-r--r-- | lib/querystring.js | 34 |
1 files changed, 11 insertions, 23 deletions
diff --git a/lib/querystring.js b/lib/querystring.js index df19123351..eb415bca3b 100644 --- a/lib/querystring.js +++ b/lib/querystring.js @@ -1,10 +1,10 @@ // Query String Utilities var QueryString = exports; +var urlDecode = process.binding('http_parser').urlDecode; -QueryString.unescape = function (str, decodeSpaces) { - return decodeURIComponent(decodeSpaces ? str.replace(/\+/g, " ") : str); -}; +// a safe fast alternative to decodeURIComponent +QueryString.unescape = urlDecode; QueryString.escape = function (str) { return encodeURIComponent(str); @@ -25,17 +25,17 @@ var stack = []; * @param name {String} (optional) Name of the current key, for handling children recursively. * @static */ -QueryString.stringify = function (obj, sep, eq, munge, name) { +QueryString.stringify = QueryString.encode = function (obj, sep, eq, munge, name) { munge = typeof(munge) == "undefined" ? true : munge; sep = sep || "&"; eq = eq || "="; if (isA(obj, null) || isA(obj, undefined) || typeof(obj) === 'function') { - return name ? encodeURIComponent(name) + eq : ''; + return name ? QueryString.escape(name) + eq : ''; } if (isBool(obj)) obj = +obj; if (isNumber(obj) || isString(obj)) { - return encodeURIComponent(name) + eq + encodeURIComponent(obj); + return QueryString.escape(name) + eq + QueryString.escape(obj); } if (isA(obj, [])) { var s = []; @@ -71,11 +71,11 @@ QueryString.stringify = function (obj, sep, eq, munge, name) { return s; }; -QueryString.parseQuery = QueryString.parse = function (qs, sep, eq) { +QueryString.parse = QueryString.decode = function (qs, sep, eq) { return (qs || '') .split(sep||"&") .map(pieceParser(eq||"=")) - .reduce(mergeParams); + .reduce(mergeParams) }; // Parse a key=val string. @@ -87,26 +87,14 @@ QueryString.parseQuery = QueryString.parse = function (qs, sep, eq) { // return parse(foo[bar], [{bla:"baz"}]) // return parse(foo, {bar:[{bla:"baz"}]}) // return {foo:{bar:[{bla:"baz"}]}} -var trimmerPattern = /^\s+|\s+$/g, - slicerPattern = /(.*)\[([^\]]*)\]$/; +var slicerPattern = /(.*)\[([^\]]*)\]$/; var pieceParser = function (eq) { return function parsePiece (key, val) { if (arguments.length !== 2) { // key=val, called from the map/reduce key = key.split(eq); - return parsePiece( - QueryString.unescape(key.shift(), true), - QueryString.unescape(key.join(eq), true) - ); - } - key = key.replace(trimmerPattern, ''); - if (isString(val)) { - val = val.replace(trimmerPattern, ''); - // convert numerals to numbers - if (!isNaN(val)) { - var numVal = +val; - if (val === numVal.toString(10)) val = numVal; - } + return parsePiece(QueryString.unescape(key.shift(), true), + QueryString.unescape(key.join(eq), true)); } var sliced = slicerPattern.exec(key); if (!sliced) { |