1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | 1× 1× 1× 1× 1× 1× 1× 1× 13× 13× 13× 93× 93× 93× 93× 93× 93× 89× 93× 1× 93× 93× 93× 93× 93× 93× 89× 8× 8× 20× 20× 4× 20× 61× 61× 93× 93× 24× 24× 24× 24× 4× 4× 4× 4× 4× 4× 4× 4× 24× 12× 12× 12× 24× 16× 16× 8× 4× 24× 20× 20× 4× 4× 4× 4× 24× 1× 1× 24× | 'use strict'; var debug = require('debug')('swagger:swagger_params_parser'); var debugContent = require('debug')('swagger:content'); var path = require('path'); var helpers = require('../lib/helpers'); var bodyParser = require('body-parser'); var async = require('async'); var _ = require('lodash'); module.exports = function create(fittingDef, bagpipes) { debug('config: %j', fittingDef); _.defaults(fittingDef, { jsonOptions: { type: ['json', '*+json'] }, urlencodedOptions: { extended: false }, multerOptions: { inMemory: true }, textOptions: { type: '*/*' } }); return function swagger_params_parser(context, next) { debug('exec'); var req = context.request; parseRequest(req, fittingDef, function(err) { Iif (err) { /* istanbul ignore next */ return next(err); } var params = req.swagger.params = {}; req.swagger.operation.parameterObjects.forEach(function(parameter) { params[parameter.name] = parameter.getValue(req); // note: we do not check for errors here }); next(null, params); }); } }; function parseRequest(req, fittingDef, cb) { Iif (req.query && req.body && req.files) { return cb(); } var shouldParseBody = false; var shouldParseForm = false; var shouldParseQuery = false; var multFields = []; req.swagger.operation.parameterObjects.forEach(function(parameter) { switch (parameter.in) { case 'body': shouldParseBody = true; break; case 'formData': shouldParseForm = true; if (parameter.type === 'file') { multFields.push({ name: parameter.name }); } break; case 'query': shouldParseQuery = true; break; } }); if (!req.query && shouldParseQuery) { helpers.queryString(req); } if (req.body || (!shouldParseBody && !shouldParseForm)) { return cb(); } var res = null; debugContent('parsing req.body for content-type: %s', req.headers['content-type']); async.series([ function parseMultipart(cb) { if (multFields.length === 0) { return cb(); } var mult = require('multer')(fittingDef.multerOptions); mult.fields(multFields)(req, res, function(err) { Iif (err) { /* istanbul ignore next */ return cb(err); } Eif (req.files) { _.forEach(req.files, function(file, name) { req.files[name] = (Array.isArray(file) && file.length === 1) ? file[0] : file; }); } debugContent('multer parsed req.body:', req.body); cb(); }); }, function parseUrlencoded(cb) { if (req.body || !shouldParseForm) { return cb(); } Iif (skipParse(fittingDef.urlencodedOptions, req)) { return cb(); } // hack: see skipParse function var urlEncodedBodyParser = bodyParser.urlencoded(fittingDef.urlencodedOptions); urlEncodedBodyParser(req, res, cb); }, function parseJson(cb) { if (req.body) { debugContent('urlencoded parsed req.body:', req.body); return cb(); } if (skipParse(fittingDef.jsonOptions, req)) { return cb(); } // hack: see skipParse function bodyParser.json(fittingDef.jsonOptions)(req, res, cb); }, function parseText(cb) { if (req.body) { debugContent('json parsed req.body:', req.body); return cb(); } Iif (skipParse(fittingDef.textOptions, req)) { return cb(); } // hack: see skipParse function bodyParser.text(fittingDef.textOptions)(req, res, function(err) { Eif (req.body) { debugContent('text parsed req.body:', req.body); } cb(err); }); } ], function finishedParseBody(err) { return cb(err); }); } // hack: avoids body-parser issue: https://github.com/expressjs/body-parser/issues/128 var typeis = require('type-is').is; function skipParse(options, req) { return typeof options.type !== 'function' && !Boolean(typeis(req, options.type)); } |