You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
2.3 KiB
89 lines
2.3 KiB
4 years ago
|
var fs = require('fs'),
|
||
|
WritableStream = require('stream').Writable,
|
||
|
inherits = require('util').inherits;
|
||
|
|
||
|
var parseParams = require('./utils').parseParams;
|
||
|
|
||
|
function Busboy(opts) {
|
||
|
if (!(this instanceof Busboy))
|
||
|
return new Busboy(opts);
|
||
|
if (opts.highWaterMark !== undefined)
|
||
|
WritableStream.call(this, { highWaterMark: opts.highWaterMark });
|
||
|
else
|
||
|
WritableStream.call(this);
|
||
|
|
||
|
this._done = false;
|
||
|
this._parser = undefined;
|
||
|
this._finished = false;
|
||
|
|
||
|
this.opts = opts;
|
||
|
if (opts.headers && typeof opts.headers['content-type'] === 'string')
|
||
|
this.parseHeaders(opts.headers);
|
||
|
else
|
||
|
throw new Error('Missing Content-Type');
|
||
|
}
|
||
|
inherits(Busboy, WritableStream);
|
||
|
|
||
|
Busboy.prototype.emit = function(ev) {
|
||
|
if (ev === 'finish') {
|
||
|
if (!this._done) {
|
||
|
this._parser && this._parser.end();
|
||
|
return;
|
||
|
} else if (this._finished) {
|
||
|
return;
|
||
|
}
|
||
|
this._finished = true;
|
||
|
}
|
||
|
WritableStream.prototype.emit.apply(this, arguments);
|
||
|
};
|
||
|
|
||
|
Busboy.prototype.parseHeaders = function(headers) {
|
||
|
this._parser = undefined;
|
||
|
if (headers['content-type']) {
|
||
|
var parsed = parseParams(headers['content-type']),
|
||
|
matched, type;
|
||
|
for (var i = 0; i < TYPES.length; ++i) {
|
||
|
type = TYPES[i];
|
||
|
if (typeof type.detect === 'function')
|
||
|
matched = type.detect(parsed);
|
||
|
else
|
||
|
matched = type.detect.test(parsed[0]);
|
||
|
if (matched)
|
||
|
break;
|
||
|
}
|
||
|
if (matched) {
|
||
|
var cfg = {
|
||
|
limits: this.opts.limits,
|
||
|
headers: headers,
|
||
|
parsedConType: parsed,
|
||
|
highWaterMark: undefined,
|
||
|
fileHwm: undefined,
|
||
|
defCharset: undefined,
|
||
|
preservePath: false
|
||
|
};
|
||
|
if (this.opts.highWaterMark)
|
||
|
cfg.highWaterMark = this.opts.highWaterMark;
|
||
|
if (this.opts.fileHwm)
|
||
|
cfg.fileHwm = this.opts.fileHwm;
|
||
|
cfg.defCharset = this.opts.defCharset;
|
||
|
cfg.preservePath = this.opts.preservePath;
|
||
|
this._parser = type(this, cfg);
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
throw new Error('Unsupported content type: ' + headers['content-type']);
|
||
|
};
|
||
|
|
||
|
Busboy.prototype._write = function(chunk, encoding, cb) {
|
||
|
if (!this._parser)
|
||
|
return cb(new Error('Not ready to parse. Missing Content-Type?'));
|
||
|
this._parser.write(chunk, cb);
|
||
|
};
|
||
|
|
||
|
var TYPES = [
|
||
|
require('./types/multipart'),
|
||
|
require('./types/urlencoded'),
|
||
|
];
|
||
|
|
||
|
module.exports = Busboy;
|