all files / swagger-node-runner/fittings/ swagger_params_parser.js

96.25% Statements 77/80
81.63% Branches 40/49
100% Functions 15/15
100% Lines 69/69
2 statements Ignored     
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          13×   13×                             13× 93×   93× 93× 93×   93× 93× 89×     93×           93×   93× 93× 93× 93×   93×   89×         20× 20×   20×     61× 61×       93×   93×   24× 24× 24×   24×           24× 12× 12× 12×     24× 16× 16×       24× 20× 20×         24×           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));
}