/*! * Connect - urlencoded * Copyright(c) 2010 Sencha Inc. * Copyright(c) 2011 TJ Holowaychuk * MIT Licensed */ /** * Module dependencies. */ var utils = require('../utils') , _limit = require('./limit') , qs = require('qs'); /** * noop middleware. */ function noop(req, res, next) { next(); } /** * Urlencoded: * * Parse x-ww-form-urlencoded request bodies, * providing the parsed object as `req.body`. * * Options: * * - `limit` byte limit disabled by default * * @param {Object} options * @return {Function} * @api public */ exports = module.exports = function(options){ options = options || {}; var limit = options.limit ? _limit(options.limit) : noop; return function urlencoded(req, res, next) { if (req._body) return next(); req.body = req.body || {}; if (!utils.hasBody(req)) return next(); // check Content-Type if ('application/x-www-form-urlencoded' != utils.mime(req)) return next(); // flag as parsed req._body = true; // parse limit(req, res, function(err){ if (err) return next(err); var buf = ''; req.setEncoding('utf8'); req.on('data', function(chunk){ buf += chunk }); req.on('end', function(){ try { req.body = buf.length ? qs.parse(buf, options) : {}; next(); } catch (err){ err.body = buf; next(err); } }); }); } };