added more intelligent JSON parsing

This commit is contained in:
Ritchie Martori
2012-10-19 18:40:17 -07:00
parent 07a891af4b
commit 4589333a2d
2 changed files with 55 additions and 25 deletions

View File

@@ -14,33 +14,41 @@ exports.setup = function(req, res, next) {
, handler = corser.create({supportsCredentials: true, methods: ALLOWED_METHODS, origins: origins});
handler(req, res, function () {
if (req.method === "OPTIONS") {
// End CORS preflight request.
res.writeHead(204);
res.end();
} else {
var mime = req.headers['content-type'] || '';
mime = mime.split(';')[0]; //Just in case there's multiple mime types, pick the first
req.cookies = res.cookies = new Cookies(req, res);
if(~req.url.indexOf('?')) {
try {
req.query = parseQuery(req.url);
} catch (ex) {
res.setHeader('Content-Type', 'text/plain');
res.statusCode = 400;
res.end('Failed to parse querystring: ' + ex);
return;
}
}
switch(req.method) {
case 'OPTIONS':
// End CORS preflight request.
res.writeHead(204);
res.end();
break;
case 'POST':
case 'PUT':
case 'DELETE':
var mime = req.headers['content-type'] || 'application/json';
mime = mime.split(';')[0]; //Just in case there's multiple mime types, pick the first
req.cookies = res.cookies = new Cookies(req, res);
if(~req.url.indexOf('?')) {
try {
req.query = parseQuery(req.url);
} catch (ex) {
res.setHeader('Content-Type', 'text/plain');
res.statusCode = 400;
res.end('Failed to parse querystring: ' + ex);
return;
if(autoParse[mime]) {
autoParse[mime](req, res, mime, next);
} else {
if(req.headers['content-length']) req.pause();
next();
}
}
if(autoParse[mime]) {
autoParse[mime](req, res, mime, next);
} else {
if(req.headers['content-length']) req.pause();
break;
default:
next();
}
break;
}
});
};
@@ -68,7 +76,18 @@ var parseBody = exports.parseBody = function(req, res, mime, callback) {
}
try {
req.body = parser.parse(buf);
if(buf.length) {
if(mime === 'application/json' && '{' != buf[0] && '[' != buf[0]) {
res.setHeader('Content-Type', 'text/plain');
res.statusCode = 400;
res.end('Could not parse invalid JSON');
return;
}
req.body = parser.parse(buf);
} else {
req.body = {};
}
callback();
} catch (ex) {
res.setHeader('Content-Type', 'text/plain');