http: better querystring parsing.

This commit is contained in:
Christopher Jeffrey 2016-10-05 04:23:26 -07:00
parent ac483eaedd
commit c3ff43c85b
No known key found for this signature in database
GPG Key ID: 8962AB9DE6666BBD

View File

@ -10,6 +10,7 @@
var AsyncObject = require('../utils/async'); var AsyncObject = require('../utils/async');
var utils = require('../utils/utils'); var utils = require('../utils/utils');
var assert = require('assert'); var assert = require('assert');
var url = require('url');
/** /**
* HTTPBase * HTTPBase
@ -92,12 +93,12 @@ HTTPBase.prototype._initRouter = function _initRouter() {
function done(err) { function done(err) {
if (err) { if (err) {
send(res, 400, { error: err.message + '' }); send(res, err.statusCode || 400, { error: err.message + '' });
try { try {
req.destroy(); req.destroy();
req.socket.destroy(); req.socket.destroy();
} catch (e) { } catch (e) {
self.emit('error', e); ;
} }
self.emit('error', err); self.emit('error', err);
} }
@ -512,35 +513,40 @@ function parseBody(req, callback) {
}); });
} }
function parsePairs(str, del, eq) { function parsePairs(str) {
var out, s, i, parts; var parts = str.split('&');
var data = {};
var i, index, pair, key, value;
if (!str) for (i = 0; i < parts.length; i++) {
return {}; pair = parts[i];
index = pair.indexOf('=');
if (!del) if (index === -1) {
del = '&'; key = pair;
value = '';
if (!eq) } else {
eq = '='; key = pair.substring(0, index);
value = pair.substring(index + 1);
out = {};
s = str.split(del);
for (i = 0; i < s.length; i++) {
parts = s[i].split(eq);
if (parts[0]) {
parts[0] = unescape(parts[0]);
parts[1] = parts[1] ? unescape(parts[1]) : '';
out[parts[0]] = parts[1];
} }
key = unescape(key);
if (key.length === 0)
continue;
value = unescape(value);
if (value.length === 0)
continue;
data[key] = value;
} }
return out; return data;
} }
function parsePath(req) { function parsePath(req) {
var url = require('url');
var uri = url.parse(req.url); var uri = url.parse(req.url);
var pathname = uri.pathname || '/'; var pathname = uri.pathname || '/';