Name: js-handler/node_modules/restify/lib/plugins/multipart_parser.js 
1:
// Copyright 2012 Mark Cavage, Inc.  All rights reserved.
2:
 
3:
var assert = require('assert-plus');
4:
var formidable = require('formidable');
5:
 
6:
var errors = require('../errors');
7:
 
8:
 
9:
 
10:
///--- Globals
11:
 
12:
var BadRequestError = errors.BadRequestError;
13:
 
14:
 
15:
 
16:
///--- API
17:
 
18:
/**
19:
 * Returns a plugin that will parse the HTTP request body IFF the
20:
 * contentType is multipart/form-data
21:
 *
22:
 * If req.params already contains a given key, that key is skipped and an
23:
 * error is logged.
24:
 *
25:
 * @return {Function} restify handler.
26:
 * @throws {TypeError} on bad input
27:
 */
28:
function multipartBodyParser(options) {
29:
        if (!options)
30:
                options = {};
31:
        assert.object(options, 'options');
32:
 
33:
        var override = options.overrideParams;
34:
        function parseMultipartBody(req, res, next) {
35:
                if (req.getContentType() !== 'multipart/form-data' ||
36:
                    (req.getContentLength() === 0 && !req.isChunked()))
37:
                        return (next());
38:
 
39:
                var form = new formidable.IncomingForm();
40:
                form.keepExtensions = options.keepExtensions ? true : false;
41:
                if (options.uploadDir)
42:
                        form.uploadDir = options.uploadDir;
43:
 
44:
                form.parse(req, function (err, fields, files) {
45:
                        if (err)
46:
                                return (next(new BadRequestError(err.message)));
47:
 
48:
                           req.body = fields;
49:
                           req.files = files;
50:
 
51:
                           if (options.mapParams !== false) {
52:
                                   Object.keys(fields).forEach(function (k) {
53:
                                           if (req.params[k] && !override)
54:
                                                   return (false);
55:
 
56:
                                           req.params[k] = fields[k];
57:
                                           return (true);
58:
                                   });
59:
 
60:
                                   Object.keys(files).forEach(function (f) {
61:
                                           if (req.params[f] && !override)
62:
                                                   return (false);
63:
                                           var fs = require('fs');
64:
                                           return fs.readFile(
65:
                                               files[f].path,
66:
                                               'utf8',
67:
                                               function (ex, data) {
68:
                                                   if (ex) {
69:
                                                        return (false);
70:
                                                   }
71:
                                                   req.params[f] = data;
72:
                                                   return (true);
73:
                                           });
74:
                                   });
75:
                           }
76:
 
77:
                           return (next());
78:
                });
79:
 
80:
                return (false);
81:
        }
82:
 
83:
        return (parseMultipartBody);
84:
}
85:
 
86:
module.exports = multipartBodyParser;