UNPKG

@aikidosec/firewall

Version:

Zen by Aikido is an embedded Application Firewall that autonomously protects Node.js apps against common and critical attacks, provides rate limiting, detects malicious traffic (including bots), and more.

73 lines (72 loc) 2.42 kB
"use strict"; const WritableStream = require("node:stream").Writable; const { inherits } = require("node:util"); const Dicer = require("./deps/dicer/lib/Dicer"); const MultipartParser = require("./lib/types/multipart"); const UrlencodedParser = require("./lib/types/urlencoded"); const parseParams = require("./lib/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) { var _a; if (ev === "finish") { if (!this._done) { (_a = this._parser) === null || _a === void 0 ? void 0 : _a.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;