12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- 'use strict'
- const WritableStream = require('node:stream').Writable
- const { inherits } = require('node: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?.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
|