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.
		
		
		
		
		
			
		
			
				
					84 lines
				
				2.1 KiB
			
		
		
			
		
	
	
					84 lines
				
				2.1 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								const WritableStream = require('stream').Writable
							 | 
						||
| 
								 | 
							
								const { inherits } = require('util')
							 | 
						||
| 
								 | 
							
								const Dicer = require('../deps/dicer/lib/Dicer')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const MultipartParser = require('./types/multipart')
							 | 
						||
| 
								 | 
							
								const UrlencodedParser = require('./types/urlencoded')
							 | 
						||
| 
								 | 
							
								const parseParams = require('./utils').parseParams
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function Busboy (opts) {
							 | 
						||
| 
								 | 
							
								  if (!(this instanceof Busboy)) { return new Busboy(opts) }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (typeof opts !== 'object') {
							 | 
						||
| 
								 | 
							
								    throw new TypeError('Busboy expected an options-Object.')
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  if (typeof opts.headers !== 'object') {
							 | 
						||
| 
								 | 
							
								    throw new TypeError('Busboy expected an options-Object with headers-attribute.')
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  if (typeof opts.headers['content-type'] !== 'string') {
							 | 
						||
| 
								 | 
							
								    throw new TypeError('Missing Content-Type-header.')
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const {
							 | 
						||
| 
								 | 
							
								    headers,
							 | 
						||
| 
								 | 
							
								    ...streamOptions
							 | 
						||
| 
								 | 
							
								  } = opts
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  this.opts = {
							 | 
						||
| 
								 | 
							
								    autoDestroy: false,
							 | 
						||
| 
								 | 
							
								    ...streamOptions
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  WritableStream.call(this, this.opts)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  this._done = false
							 | 
						||
| 
								 | 
							
								  this._parser = this.getParserByHeaders(headers)
							 | 
						||
| 
								 | 
							
								  this._finished = false
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								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.getParserByHeaders = function (headers) {
							 | 
						||
| 
								 | 
							
								  const parsed = parseParams(headers['content-type'])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const cfg = {
							 | 
						||
| 
								 | 
							
								    defCharset: this.opts.defCharset,
							 | 
						||
| 
								 | 
							
								    fileHwm: this.opts.fileHwm,
							 | 
						||
| 
								 | 
							
								    headers,
							 | 
						||
| 
								 | 
							
								    highWaterMark: this.opts.highWaterMark,
							 | 
						||
| 
								 | 
							
								    isPartAFile: this.opts.isPartAFile,
							 | 
						||
| 
								 | 
							
								    limits: this.opts.limits,
							 | 
						||
| 
								 | 
							
								    parsedConType: parsed,
							 | 
						||
| 
								 | 
							
								    preservePath: this.opts.preservePath
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (MultipartParser.detect.test(parsed[0])) {
							 | 
						||
| 
								 | 
							
								    return new MultipartParser(this, cfg)
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  if (UrlencodedParser.detect.test(parsed[0])) {
							 | 
						||
| 
								 | 
							
								    return new UrlencodedParser(this, cfg)
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  throw new Error('Unsupported Content-Type.')
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Busboy.prototype._write = function (chunk, encoding, cb) {
							 | 
						||
| 
								 | 
							
								  this._parser.write(chunk, cb)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = Busboy
							 | 
						||
| 
								 | 
							
								module.exports.default = Busboy
							 | 
						||
| 
								 | 
							
								module.exports.Busboy = Busboy
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports.Dicer = Dicer
							 |