var QueryString = exports; var util = require('util'); function hasOwnProperty(obj, prop){ return Object.prototype.hasOwnProperty.call(obj, prop); } function charCode(c){ return c.charCodeAt(0); } QueryString.unescapeBuffer = function (s, decodeSpaces){ var out = new Buffer((_AN_Read_length('length', s))); var state = 'CHAR'; var n, m, hexchar; for (var inIndex = 0, outIndex = 0; inIndex <= _AN_Read_length('length', s); inIndex++ ){ var c = s.charCodeAt(inIndex); switch (state){ case 'CHAR': switch (c){ case charCode('%'): n = 0; m = 0; state = 'HEX0'; break ; case charCode('+'): if (decodeSpaces) c = charCode(' '); default : { out[outIndex++ ] = c; break ; } } break ; case 'HEX0': state = 'HEX1'; hexchar = c; if (charCode('0') <= c && c <= charCode('9')) { n = c - charCode('0'); } else if (charCode('a') <= c && c <= charCode('f')) { n = c - charCode('a') + 10; } else if (charCode('A') <= c && c <= charCode('F')) { n = c - charCode('A') + 10; } else { out[outIndex++ ] = charCode('%'); out[outIndex++ ] = c; state = 'CHAR'; break ; } break ; case 'HEX1': state = 'CHAR'; if (charCode('0') <= c && c <= charCode('9')) { m = c - charCode('0'); } else if (charCode('a') <= c && c <= charCode('f')) { m = c - charCode('a') + 10; } else if (charCode('A') <= c && c <= charCode('F')) { m = c - charCode('A') + 10; } else { out[outIndex++ ] = charCode('%'); out[outIndex++ ] = hexchar; out[outIndex++ ] = c; break ; } out[outIndex++ ] = 16 * n + m; break ; } } return out.slice(0, outIndex - 1); } ; QueryString.unescape = function (s, decodeSpaces){ return QueryString.unescapeBuffer(s, decodeSpaces).toString(); } ; QueryString.escape = function (str){ return encodeURIComponent(str); } ; var stringifyPrimitive = function (v){ if (util.isString(v)) return v; if (util.isBoolean(v)) return v? 'true': 'false'; if (util.isNumber(v)) return isFinite(v)? v: ''; return ''; } ; QueryString.stringify = QueryString.encode = function (obj, sep, eq){ sep = sep || '&'; eq = eq || '='; if (util.isNull(obj)) { obj = undefined; } if (util.isObject(obj)) { return Object.keys(obj).map(function (k){ var ks = QueryString.escape(stringifyPrimitive(k)) + eq; if (util.isArray(obj[k])) { return obj[k].map(function (v){ return ks + QueryString.escape(stringifyPrimitive(v)); } ).join(sep); } else { return ks + QueryString.escape(stringifyPrimitive(obj[k])); } } ).join(sep); } return ''; } ; QueryString.parse = QueryString.decode = function (qs, sep, eq, options){ sep = sep || '&'; eq = eq || '='; var obj = { } ; if (!util.isString(qs) || _AN_Read_length('length', qs) === 0) { return obj; } var regexp = /\+/g; qs = qs.split(sep); var maxKeys = 1000; if (options && util.isNumber(options.maxKeys)) { maxKeys = options.maxKeys; } var len = _AN_Read_length('length', qs); if (maxKeys > 0 && len > maxKeys) { len = maxKeys; } for (var i = 0; i < len; ++i){ var x = _AN_Call_replace('replace', qs[i], regexp, '%20'), idx = x.indexOf(eq), kstr, vstr, k, v; if (idx >= 0) { kstr = x.substr(0, idx); vstr = x.substr(idx + 1); } else { kstr = x; vstr = ''; } try { k = decodeURIComponent(kstr); v = decodeURIComponent(vstr); } catch (e) { k = QueryString.unescape(kstr, true ); v = QueryString.unescape(vstr, true ); } if (!hasOwnProperty(obj, k)) { obj[k] = v; } else if (util.isArray(obj[k])) { obj[k].push(v); } else { obj[k] = [obj[k], v] ; } } return obj; } ;