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.
		
		
		
		
		
			
		
			
				
					
					
						
							90 lines
						
					
					
						
							2.4 KiB
						
					
					
				
			
		
		
	
	
							90 lines
						
					
					
						
							2.4 KiB
						
					
					
				| var fs = require('fs'),
 | |
|     WritableStream = require('stream').Writable
 | |
|                      || require('readable-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;
 |