UNPKG

2.66 kBJavaScriptView Raw
1/**
2 * @license
3 * MOST Web Framework 2.0 Codename Blueshift
4 * Copyright (c) 2017, THEMOST LP All rights reserved
5 *
6 * Use of this source code is governed by an BSD-3-Clause license that can be
7 * found in the LICENSE file at https://themost.io/license
8 */
9var formidable = require('formidable');
10var _ = require('lodash');
11var semver = require('semver');
12var LangUtils = require('@themost/common/utils').LangUtils;
13
14if (semver.gte(process.versions.node, "6.0.0")) {
15 var multipart_parser = require('formidable/lib/multipart_parser'),
16 MultipartParser = multipart_parser.MultipartParser;
17 MultipartParser.prototype.initWithBoundary = function(str) {
18 this.boundary = new Buffer(str.length+4);
19 this.boundary.write('\r\n--', 0, 4 , 'ascii');
20 this.boundary.write(str, 4, str.length, 'ascii');
21 this.lookbehind = new Buffer(this.boundary.length+8);
22 this.state = multipart_parser.START;
23 this.boundaryChars = {};
24 for (var i = 0; i < this.boundary.length; i++) {
25 this.boundaryChars[this.boundary[i]] = true;
26 }
27 };
28}
29
30/**
31 * @class
32 * @constructor
33 * @implements BeginRequestHandler
34 */
35function MultipartHandler() {
36
37}
38
39MultipartHandler.prototype.beginRequest = function(context, callback) {
40 var request = context.request;
41 request.headers = request.headers || {};
42 var contentType = request.headers['content-type'];
43 if (/^multipart\/form-data/i.test(contentType)) {
44 //use formidable to parse request data
45 var f = new formidable.IncomingForm();
46 f.parse(request, function (err, form, files) {
47 if (err) {
48 callback(err);
49 return;
50 }
51 try {
52 //add form
53 if (form) {
54 _.assign(context.params, LangUtils.parseForm(form));
55 }
56 //add files
57 if (files) {
58 _.forEach(_.keys(files),function(key) {
59 if (context.params.hasOwnProperty(key)) {
60 _.assign(context.params[key], files[key]);
61 }
62 else {
63 context.params[key] = files[key];
64 }
65 });
66
67 }
68 callback();
69 }
70 catch (e) {
71 callback(e);
72 }
73 });
74 }
75 else {
76 callback();
77 }
78};
79
80if (typeof exports !== 'undefined') {
81 module.exports.MultipartHandler = MultipartHandler;
82 module.exports.createInstance = function() { return new MultipartHandler(); };
83}