12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- 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;
|