Bump undici from 5.28.4 to 5.28.5 (#1205)
* Bump undici from 5.28.4 to 5.28.5 Bumps [undici](https://github.com/nodejs/undici) from 5.28.4 to 5.28.5. - [Release notes](https://github.com/nodejs/undici/releases) - [Commits](https://github.com/nodejs/undici/compare/v5.28.4...v5.28.5) --- updated-dependencies: - dependency-name: undici dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> * fix for check-dist and license failures * npm run updates --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Aparna Jyothi <aparnajyothi-y@github.com>
This commit is contained in:
parent
574f09a9fa
commit
1d0ff469b7
BIN
.licenses/npm/@fastify/busboy.dep.yml
generated
BIN
.licenses/npm/@fastify/busboy.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/undici.dep.yml
generated
BIN
.licenses/npm/undici.dep.yml
generated
Binary file not shown.
3075
dist/cache-save/index.js
vendored
3075
dist/cache-save/index.js
vendored
@ -45581,1428 +45581,6 @@ exports.newPipeline = newPipeline;
|
|||||||
//# sourceMappingURL=index.js.map
|
//# sourceMappingURL=index.js.map
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
|
||||||
|
|
||||||
/***/ 2856:
|
|
||||||
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
|
|
||||||
const WritableStream = (__nccwpck_require__(4492).Writable)
|
|
||||||
const inherits = (__nccwpck_require__(7261).inherits)
|
|
||||||
|
|
||||||
const StreamSearch = __nccwpck_require__(8534)
|
|
||||||
|
|
||||||
const PartStream = __nccwpck_require__(8710)
|
|
||||||
const HeaderParser = __nccwpck_require__(333)
|
|
||||||
|
|
||||||
const DASH = 45
|
|
||||||
const B_ONEDASH = Buffer.from('-')
|
|
||||||
const B_CRLF = Buffer.from('\r\n')
|
|
||||||
const EMPTY_FN = function () {}
|
|
||||||
|
|
||||||
function Dicer (cfg) {
|
|
||||||
if (!(this instanceof Dicer)) { return new Dicer(cfg) }
|
|
||||||
WritableStream.call(this, cfg)
|
|
||||||
|
|
||||||
if (!cfg || (!cfg.headerFirst && typeof cfg.boundary !== 'string')) { throw new TypeError('Boundary required') }
|
|
||||||
|
|
||||||
if (typeof cfg.boundary === 'string') { this.setBoundary(cfg.boundary) } else { this._bparser = undefined }
|
|
||||||
|
|
||||||
this._headerFirst = cfg.headerFirst
|
|
||||||
|
|
||||||
this._dashes = 0
|
|
||||||
this._parts = 0
|
|
||||||
this._finished = false
|
|
||||||
this._realFinish = false
|
|
||||||
this._isPreamble = true
|
|
||||||
this._justMatched = false
|
|
||||||
this._firstWrite = true
|
|
||||||
this._inHeader = true
|
|
||||||
this._part = undefined
|
|
||||||
this._cb = undefined
|
|
||||||
this._ignoreData = false
|
|
||||||
this._partOpts = { highWaterMark: cfg.partHwm }
|
|
||||||
this._pause = false
|
|
||||||
|
|
||||||
const self = this
|
|
||||||
this._hparser = new HeaderParser(cfg)
|
|
||||||
this._hparser.on('header', function (header) {
|
|
||||||
self._inHeader = false
|
|
||||||
self._part.emit('header', header)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
inherits(Dicer, WritableStream)
|
|
||||||
|
|
||||||
Dicer.prototype.emit = function (ev) {
|
|
||||||
if (ev === 'finish' && !this._realFinish) {
|
|
||||||
if (!this._finished) {
|
|
||||||
const self = this
|
|
||||||
process.nextTick(function () {
|
|
||||||
self.emit('error', new Error('Unexpected end of multipart data'))
|
|
||||||
if (self._part && !self._ignoreData) {
|
|
||||||
const type = (self._isPreamble ? 'Preamble' : 'Part')
|
|
||||||
self._part.emit('error', new Error(type + ' terminated early due to unexpected end of multipart data'))
|
|
||||||
self._part.push(null)
|
|
||||||
process.nextTick(function () {
|
|
||||||
self._realFinish = true
|
|
||||||
self.emit('finish')
|
|
||||||
self._realFinish = false
|
|
||||||
})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
self._realFinish = true
|
|
||||||
self.emit('finish')
|
|
||||||
self._realFinish = false
|
|
||||||
})
|
|
||||||
}
|
|
||||||
} else { WritableStream.prototype.emit.apply(this, arguments) }
|
|
||||||
}
|
|
||||||
|
|
||||||
Dicer.prototype._write = function (data, encoding, cb) {
|
|
||||||
// ignore unexpected data (e.g. extra trailer data after finished)
|
|
||||||
if (!this._hparser && !this._bparser) { return cb() }
|
|
||||||
|
|
||||||
if (this._headerFirst && this._isPreamble) {
|
|
||||||
if (!this._part) {
|
|
||||||
this._part = new PartStream(this._partOpts)
|
|
||||||
if (this._events.preamble) { this.emit('preamble', this._part) } else { this._ignore() }
|
|
||||||
}
|
|
||||||
const r = this._hparser.push(data)
|
|
||||||
if (!this._inHeader && r !== undefined && r < data.length) { data = data.slice(r) } else { return cb() }
|
|
||||||
}
|
|
||||||
|
|
||||||
// allows for "easier" testing
|
|
||||||
if (this._firstWrite) {
|
|
||||||
this._bparser.push(B_CRLF)
|
|
||||||
this._firstWrite = false
|
|
||||||
}
|
|
||||||
|
|
||||||
this._bparser.push(data)
|
|
||||||
|
|
||||||
if (this._pause) { this._cb = cb } else { cb() }
|
|
||||||
}
|
|
||||||
|
|
||||||
Dicer.prototype.reset = function () {
|
|
||||||
this._part = undefined
|
|
||||||
this._bparser = undefined
|
|
||||||
this._hparser = undefined
|
|
||||||
}
|
|
||||||
|
|
||||||
Dicer.prototype.setBoundary = function (boundary) {
|
|
||||||
const self = this
|
|
||||||
this._bparser = new StreamSearch('\r\n--' + boundary)
|
|
||||||
this._bparser.on('info', function (isMatch, data, start, end) {
|
|
||||||
self._oninfo(isMatch, data, start, end)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
Dicer.prototype._ignore = function () {
|
|
||||||
if (this._part && !this._ignoreData) {
|
|
||||||
this._ignoreData = true
|
|
||||||
this._part.on('error', EMPTY_FN)
|
|
||||||
// we must perform some kind of read on the stream even though we are
|
|
||||||
// ignoring the data, otherwise node's Readable stream will not emit 'end'
|
|
||||||
// after pushing null to the stream
|
|
||||||
this._part.resume()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Dicer.prototype._oninfo = function (isMatch, data, start, end) {
|
|
||||||
let buf; const self = this; let i = 0; let r; let shouldWriteMore = true
|
|
||||||
|
|
||||||
if (!this._part && this._justMatched && data) {
|
|
||||||
while (this._dashes < 2 && (start + i) < end) {
|
|
||||||
if (data[start + i] === DASH) {
|
|
||||||
++i
|
|
||||||
++this._dashes
|
|
||||||
} else {
|
|
||||||
if (this._dashes) { buf = B_ONEDASH }
|
|
||||||
this._dashes = 0
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (this._dashes === 2) {
|
|
||||||
if ((start + i) < end && this._events.trailer) { this.emit('trailer', data.slice(start + i, end)) }
|
|
||||||
this.reset()
|
|
||||||
this._finished = true
|
|
||||||
// no more parts will be added
|
|
||||||
if (self._parts === 0) {
|
|
||||||
self._realFinish = true
|
|
||||||
self.emit('finish')
|
|
||||||
self._realFinish = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (this._dashes) { return }
|
|
||||||
}
|
|
||||||
if (this._justMatched) { this._justMatched = false }
|
|
||||||
if (!this._part) {
|
|
||||||
this._part = new PartStream(this._partOpts)
|
|
||||||
this._part._read = function (n) {
|
|
||||||
self._unpause()
|
|
||||||
}
|
|
||||||
if (this._isPreamble && this._events.preamble) { this.emit('preamble', this._part) } else if (this._isPreamble !== true && this._events.part) { this.emit('part', this._part) } else { this._ignore() }
|
|
||||||
if (!this._isPreamble) { this._inHeader = true }
|
|
||||||
}
|
|
||||||
if (data && start < end && !this._ignoreData) {
|
|
||||||
if (this._isPreamble || !this._inHeader) {
|
|
||||||
if (buf) { shouldWriteMore = this._part.push(buf) }
|
|
||||||
shouldWriteMore = this._part.push(data.slice(start, end))
|
|
||||||
if (!shouldWriteMore) { this._pause = true }
|
|
||||||
} else if (!this._isPreamble && this._inHeader) {
|
|
||||||
if (buf) { this._hparser.push(buf) }
|
|
||||||
r = this._hparser.push(data.slice(start, end))
|
|
||||||
if (!this._inHeader && r !== undefined && r < end) { this._oninfo(false, data, start + r, end) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (isMatch) {
|
|
||||||
this._hparser.reset()
|
|
||||||
if (this._isPreamble) { this._isPreamble = false } else {
|
|
||||||
if (start !== end) {
|
|
||||||
++this._parts
|
|
||||||
this._part.on('end', function () {
|
|
||||||
if (--self._parts === 0) {
|
|
||||||
if (self._finished) {
|
|
||||||
self._realFinish = true
|
|
||||||
self.emit('finish')
|
|
||||||
self._realFinish = false
|
|
||||||
} else {
|
|
||||||
self._unpause()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this._part.push(null)
|
|
||||||
this._part = undefined
|
|
||||||
this._ignoreData = false
|
|
||||||
this._justMatched = true
|
|
||||||
this._dashes = 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Dicer.prototype._unpause = function () {
|
|
||||||
if (!this._pause) { return }
|
|
||||||
|
|
||||||
this._pause = false
|
|
||||||
if (this._cb) {
|
|
||||||
const cb = this._cb
|
|
||||||
this._cb = undefined
|
|
||||||
cb()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = Dicer
|
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
|
||||||
|
|
||||||
/***/ 333:
|
|
||||||
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
|
|
||||||
const EventEmitter = (__nccwpck_require__(5673).EventEmitter)
|
|
||||||
const inherits = (__nccwpck_require__(7261).inherits)
|
|
||||||
const getLimit = __nccwpck_require__(9692)
|
|
||||||
|
|
||||||
const StreamSearch = __nccwpck_require__(8534)
|
|
||||||
|
|
||||||
const B_DCRLF = Buffer.from('\r\n\r\n')
|
|
||||||
const RE_CRLF = /\r\n/g
|
|
||||||
const RE_HDR = /^([^:]+):[ \t]?([\x00-\xFF]+)?$/ // eslint-disable-line no-control-regex
|
|
||||||
|
|
||||||
function HeaderParser (cfg) {
|
|
||||||
EventEmitter.call(this)
|
|
||||||
|
|
||||||
cfg = cfg || {}
|
|
||||||
const self = this
|
|
||||||
this.nread = 0
|
|
||||||
this.maxed = false
|
|
||||||
this.npairs = 0
|
|
||||||
this.maxHeaderPairs = getLimit(cfg, 'maxHeaderPairs', 2000)
|
|
||||||
this.maxHeaderSize = getLimit(cfg, 'maxHeaderSize', 80 * 1024)
|
|
||||||
this.buffer = ''
|
|
||||||
this.header = {}
|
|
||||||
this.finished = false
|
|
||||||
this.ss = new StreamSearch(B_DCRLF)
|
|
||||||
this.ss.on('info', function (isMatch, data, start, end) {
|
|
||||||
if (data && !self.maxed) {
|
|
||||||
if (self.nread + end - start >= self.maxHeaderSize) {
|
|
||||||
end = self.maxHeaderSize - self.nread + start
|
|
||||||
self.nread = self.maxHeaderSize
|
|
||||||
self.maxed = true
|
|
||||||
} else { self.nread += (end - start) }
|
|
||||||
|
|
||||||
self.buffer += data.toString('binary', start, end)
|
|
||||||
}
|
|
||||||
if (isMatch) { self._finish() }
|
|
||||||
})
|
|
||||||
}
|
|
||||||
inherits(HeaderParser, EventEmitter)
|
|
||||||
|
|
||||||
HeaderParser.prototype.push = function (data) {
|
|
||||||
const r = this.ss.push(data)
|
|
||||||
if (this.finished) { return r }
|
|
||||||
}
|
|
||||||
|
|
||||||
HeaderParser.prototype.reset = function () {
|
|
||||||
this.finished = false
|
|
||||||
this.buffer = ''
|
|
||||||
this.header = {}
|
|
||||||
this.ss.reset()
|
|
||||||
}
|
|
||||||
|
|
||||||
HeaderParser.prototype._finish = function () {
|
|
||||||
if (this.buffer) { this._parseHeader() }
|
|
||||||
this.ss.matches = this.ss.maxMatches
|
|
||||||
const header = this.header
|
|
||||||
this.header = {}
|
|
||||||
this.buffer = ''
|
|
||||||
this.finished = true
|
|
||||||
this.nread = this.npairs = 0
|
|
||||||
this.maxed = false
|
|
||||||
this.emit('header', header)
|
|
||||||
}
|
|
||||||
|
|
||||||
HeaderParser.prototype._parseHeader = function () {
|
|
||||||
if (this.npairs === this.maxHeaderPairs) { return }
|
|
||||||
|
|
||||||
const lines = this.buffer.split(RE_CRLF)
|
|
||||||
const len = lines.length
|
|
||||||
let m, h
|
|
||||||
|
|
||||||
for (var i = 0; i < len; ++i) { // eslint-disable-line no-var
|
|
||||||
if (lines[i].length === 0) { continue }
|
|
||||||
if (lines[i][0] === '\t' || lines[i][0] === ' ') {
|
|
||||||
// folded header content
|
|
||||||
// RFC2822 says to just remove the CRLF and not the whitespace following
|
|
||||||
// it, so we follow the RFC and include the leading whitespace ...
|
|
||||||
if (h) {
|
|
||||||
this.header[h][this.header[h].length - 1] += lines[i]
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const posColon = lines[i].indexOf(':')
|
|
||||||
if (
|
|
||||||
posColon === -1 ||
|
|
||||||
posColon === 0
|
|
||||||
) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
m = RE_HDR.exec(lines[i])
|
|
||||||
h = m[1].toLowerCase()
|
|
||||||
this.header[h] = this.header[h] || []
|
|
||||||
this.header[h].push((m[2] || ''))
|
|
||||||
if (++this.npairs === this.maxHeaderPairs) { break }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = HeaderParser
|
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
|
||||||
|
|
||||||
/***/ 8710:
|
|
||||||
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
|
|
||||||
const inherits = (__nccwpck_require__(7261).inherits)
|
|
||||||
const ReadableStream = (__nccwpck_require__(4492).Readable)
|
|
||||||
|
|
||||||
function PartStream (opts) {
|
|
||||||
ReadableStream.call(this, opts)
|
|
||||||
}
|
|
||||||
inherits(PartStream, ReadableStream)
|
|
||||||
|
|
||||||
PartStream.prototype._read = function (n) {}
|
|
||||||
|
|
||||||
module.exports = PartStream
|
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
|
||||||
|
|
||||||
/***/ 8534:
|
|
||||||
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Copyright Brian White. All rights reserved.
|
|
||||||
*
|
|
||||||
* @see https://github.com/mscdex/streamsearch
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to
|
|
||||||
* deal in the Software without restriction, including without limitation the
|
|
||||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
* sell copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
||||||
* IN THE SOFTWARE.
|
|
||||||
*
|
|
||||||
* Based heavily on the Streaming Boyer-Moore-Horspool C++ implementation
|
|
||||||
* by Hongli Lai at: https://github.com/FooBarWidget/boyer-moore-horspool
|
|
||||||
*/
|
|
||||||
const EventEmitter = (__nccwpck_require__(5673).EventEmitter)
|
|
||||||
const inherits = (__nccwpck_require__(7261).inherits)
|
|
||||||
|
|
||||||
function SBMH (needle) {
|
|
||||||
if (typeof needle === 'string') {
|
|
||||||
needle = Buffer.from(needle)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!Buffer.isBuffer(needle)) {
|
|
||||||
throw new TypeError('The needle has to be a String or a Buffer.')
|
|
||||||
}
|
|
||||||
|
|
||||||
const needleLength = needle.length
|
|
||||||
|
|
||||||
if (needleLength === 0) {
|
|
||||||
throw new Error('The needle cannot be an empty String/Buffer.')
|
|
||||||
}
|
|
||||||
|
|
||||||
if (needleLength > 256) {
|
|
||||||
throw new Error('The needle cannot have a length bigger than 256.')
|
|
||||||
}
|
|
||||||
|
|
||||||
this.maxMatches = Infinity
|
|
||||||
this.matches = 0
|
|
||||||
|
|
||||||
this._occ = new Array(256)
|
|
||||||
.fill(needleLength) // Initialize occurrence table.
|
|
||||||
this._lookbehind_size = 0
|
|
||||||
this._needle = needle
|
|
||||||
this._bufpos = 0
|
|
||||||
|
|
||||||
this._lookbehind = Buffer.alloc(needleLength)
|
|
||||||
|
|
||||||
// Populate occurrence table with analysis of the needle,
|
|
||||||
// ignoring last letter.
|
|
||||||
for (var i = 0; i < needleLength - 1; ++i) { // eslint-disable-line no-var
|
|
||||||
this._occ[needle[i]] = needleLength - 1 - i
|
|
||||||
}
|
|
||||||
}
|
|
||||||
inherits(SBMH, EventEmitter)
|
|
||||||
|
|
||||||
SBMH.prototype.reset = function () {
|
|
||||||
this._lookbehind_size = 0
|
|
||||||
this.matches = 0
|
|
||||||
this._bufpos = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
SBMH.prototype.push = function (chunk, pos) {
|
|
||||||
if (!Buffer.isBuffer(chunk)) {
|
|
||||||
chunk = Buffer.from(chunk, 'binary')
|
|
||||||
}
|
|
||||||
const chlen = chunk.length
|
|
||||||
this._bufpos = pos || 0
|
|
||||||
let r
|
|
||||||
while (r !== chlen && this.matches < this.maxMatches) { r = this._sbmh_feed(chunk) }
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
SBMH.prototype._sbmh_feed = function (data) {
|
|
||||||
const len = data.length
|
|
||||||
const needle = this._needle
|
|
||||||
const needleLength = needle.length
|
|
||||||
const lastNeedleChar = needle[needleLength - 1]
|
|
||||||
|
|
||||||
// Positive: points to a position in `data`
|
|
||||||
// pos == 3 points to data[3]
|
|
||||||
// Negative: points to a position in the lookbehind buffer
|
|
||||||
// pos == -2 points to lookbehind[lookbehind_size - 2]
|
|
||||||
let pos = -this._lookbehind_size
|
|
||||||
let ch
|
|
||||||
|
|
||||||
if (pos < 0) {
|
|
||||||
// Lookbehind buffer is not empty. Perform Boyer-Moore-Horspool
|
|
||||||
// search with character lookup code that considers both the
|
|
||||||
// lookbehind buffer and the current round's haystack data.
|
|
||||||
//
|
|
||||||
// Loop until
|
|
||||||
// there is a match.
|
|
||||||
// or until
|
|
||||||
// we've moved past the position that requires the
|
|
||||||
// lookbehind buffer. In this case we switch to the
|
|
||||||
// optimized loop.
|
|
||||||
// or until
|
|
||||||
// the character to look at lies outside the haystack.
|
|
||||||
while (pos < 0 && pos <= len - needleLength) {
|
|
||||||
ch = this._sbmh_lookup_char(data, pos + needleLength - 1)
|
|
||||||
|
|
||||||
if (
|
|
||||||
ch === lastNeedleChar &&
|
|
||||||
this._sbmh_memcmp(data, pos, needleLength - 1)
|
|
||||||
) {
|
|
||||||
this._lookbehind_size = 0
|
|
||||||
++this.matches
|
|
||||||
this.emit('info', true)
|
|
||||||
|
|
||||||
return (this._bufpos = pos + needleLength)
|
|
||||||
}
|
|
||||||
pos += this._occ[ch]
|
|
||||||
}
|
|
||||||
|
|
||||||
// No match.
|
|
||||||
|
|
||||||
if (pos < 0) {
|
|
||||||
// There's too few data for Boyer-Moore-Horspool to run,
|
|
||||||
// so let's use a different algorithm to skip as much as
|
|
||||||
// we can.
|
|
||||||
// Forward pos until
|
|
||||||
// the trailing part of lookbehind + data
|
|
||||||
// looks like the beginning of the needle
|
|
||||||
// or until
|
|
||||||
// pos == 0
|
|
||||||
while (pos < 0 && !this._sbmh_memcmp(data, pos, len - pos)) { ++pos }
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pos >= 0) {
|
|
||||||
// Discard lookbehind buffer.
|
|
||||||
this.emit('info', false, this._lookbehind, 0, this._lookbehind_size)
|
|
||||||
this._lookbehind_size = 0
|
|
||||||
} else {
|
|
||||||
// Cut off part of the lookbehind buffer that has
|
|
||||||
// been processed and append the entire haystack
|
|
||||||
// into it.
|
|
||||||
const bytesToCutOff = this._lookbehind_size + pos
|
|
||||||
if (bytesToCutOff > 0) {
|
|
||||||
// The cut off data is guaranteed not to contain the needle.
|
|
||||||
this.emit('info', false, this._lookbehind, 0, bytesToCutOff)
|
|
||||||
}
|
|
||||||
|
|
||||||
this._lookbehind.copy(this._lookbehind, 0, bytesToCutOff,
|
|
||||||
this._lookbehind_size - bytesToCutOff)
|
|
||||||
this._lookbehind_size -= bytesToCutOff
|
|
||||||
|
|
||||||
data.copy(this._lookbehind, this._lookbehind_size)
|
|
||||||
this._lookbehind_size += len
|
|
||||||
|
|
||||||
this._bufpos = len
|
|
||||||
return len
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pos += (pos >= 0) * this._bufpos
|
|
||||||
|
|
||||||
// Lookbehind buffer is now empty. We only need to check if the
|
|
||||||
// needle is in the haystack.
|
|
||||||
if (data.indexOf(needle, pos) !== -1) {
|
|
||||||
pos = data.indexOf(needle, pos)
|
|
||||||
++this.matches
|
|
||||||
if (pos > 0) { this.emit('info', true, data, this._bufpos, pos) } else { this.emit('info', true) }
|
|
||||||
|
|
||||||
return (this._bufpos = pos + needleLength)
|
|
||||||
} else {
|
|
||||||
pos = len - needleLength
|
|
||||||
}
|
|
||||||
|
|
||||||
// There was no match. If there's trailing haystack data that we cannot
|
|
||||||
// match yet using the Boyer-Moore-Horspool algorithm (because the trailing
|
|
||||||
// data is less than the needle size) then match using a modified
|
|
||||||
// algorithm that starts matching from the beginning instead of the end.
|
|
||||||
// Whatever trailing data is left after running this algorithm is added to
|
|
||||||
// the lookbehind buffer.
|
|
||||||
while (
|
|
||||||
pos < len &&
|
|
||||||
(
|
|
||||||
data[pos] !== needle[0] ||
|
|
||||||
(
|
|
||||||
(Buffer.compare(
|
|
||||||
data.subarray(pos, pos + len - pos),
|
|
||||||
needle.subarray(0, len - pos)
|
|
||||||
) !== 0)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
) {
|
|
||||||
++pos
|
|
||||||
}
|
|
||||||
if (pos < len) {
|
|
||||||
data.copy(this._lookbehind, 0, pos, pos + (len - pos))
|
|
||||||
this._lookbehind_size = len - pos
|
|
||||||
}
|
|
||||||
|
|
||||||
// Everything until pos is guaranteed not to contain needle data.
|
|
||||||
if (pos > 0) { this.emit('info', false, data, this._bufpos, pos < len ? pos : len) }
|
|
||||||
|
|
||||||
this._bufpos = len
|
|
||||||
return len
|
|
||||||
}
|
|
||||||
|
|
||||||
SBMH.prototype._sbmh_lookup_char = function (data, pos) {
|
|
||||||
return (pos < 0)
|
|
||||||
? this._lookbehind[this._lookbehind_size + pos]
|
|
||||||
: data[pos]
|
|
||||||
}
|
|
||||||
|
|
||||||
SBMH.prototype._sbmh_memcmp = function (data, pos, len) {
|
|
||||||
for (var i = 0; i < len; ++i) { // eslint-disable-line no-var
|
|
||||||
if (this._sbmh_lookup_char(data, pos + i) !== this._needle[i]) { return false }
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = SBMH
|
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
|
||||||
|
|
||||||
/***/ 3438:
|
|
||||||
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
|
|
||||||
const WritableStream = (__nccwpck_require__(4492).Writable)
|
|
||||||
const { inherits } = __nccwpck_require__(7261)
|
|
||||||
const Dicer = __nccwpck_require__(2856)
|
|
||||||
|
|
||||||
const MultipartParser = __nccwpck_require__(415)
|
|
||||||
const UrlencodedParser = __nccwpck_require__(6780)
|
|
||||||
const parseParams = __nccwpck_require__(4426)
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
|
||||||
|
|
||||||
/***/ 415:
|
|
||||||
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
|
|
||||||
// TODO:
|
|
||||||
// * support 1 nested multipart level
|
|
||||||
// (see second multipart example here:
|
|
||||||
// http://www.w3.org/TR/html401/interact/forms.html#didx-multipartform-data)
|
|
||||||
// * support limits.fieldNameSize
|
|
||||||
// -- this will require modifications to utils.parseParams
|
|
||||||
|
|
||||||
const { Readable } = __nccwpck_require__(4492)
|
|
||||||
const { inherits } = __nccwpck_require__(7261)
|
|
||||||
|
|
||||||
const Dicer = __nccwpck_require__(2856)
|
|
||||||
|
|
||||||
const parseParams = __nccwpck_require__(4426)
|
|
||||||
const decodeText = __nccwpck_require__(9136)
|
|
||||||
const basename = __nccwpck_require__(496)
|
|
||||||
const getLimit = __nccwpck_require__(9692)
|
|
||||||
|
|
||||||
const RE_BOUNDARY = /^boundary$/i
|
|
||||||
const RE_FIELD = /^form-data$/i
|
|
||||||
const RE_CHARSET = /^charset$/i
|
|
||||||
const RE_FILENAME = /^filename$/i
|
|
||||||
const RE_NAME = /^name$/i
|
|
||||||
|
|
||||||
Multipart.detect = /^multipart\/form-data/i
|
|
||||||
function Multipart (boy, cfg) {
|
|
||||||
let i
|
|
||||||
let len
|
|
||||||
const self = this
|
|
||||||
let boundary
|
|
||||||
const limits = cfg.limits
|
|
||||||
const isPartAFile = cfg.isPartAFile || ((fieldName, contentType, fileName) => (contentType === 'application/octet-stream' || fileName !== undefined))
|
|
||||||
const parsedConType = cfg.parsedConType || []
|
|
||||||
const defCharset = cfg.defCharset || 'utf8'
|
|
||||||
const preservePath = cfg.preservePath
|
|
||||||
const fileOpts = { highWaterMark: cfg.fileHwm }
|
|
||||||
|
|
||||||
for (i = 0, len = parsedConType.length; i < len; ++i) {
|
|
||||||
if (Array.isArray(parsedConType[i]) &&
|
|
||||||
RE_BOUNDARY.test(parsedConType[i][0])) {
|
|
||||||
boundary = parsedConType[i][1]
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function checkFinished () {
|
|
||||||
if (nends === 0 && finished && !boy._done) {
|
|
||||||
finished = false
|
|
||||||
self.end()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof boundary !== 'string') { throw new Error('Multipart: Boundary not found') }
|
|
||||||
|
|
||||||
const fieldSizeLimit = getLimit(limits, 'fieldSize', 1 * 1024 * 1024)
|
|
||||||
const fileSizeLimit = getLimit(limits, 'fileSize', Infinity)
|
|
||||||
const filesLimit = getLimit(limits, 'files', Infinity)
|
|
||||||
const fieldsLimit = getLimit(limits, 'fields', Infinity)
|
|
||||||
const partsLimit = getLimit(limits, 'parts', Infinity)
|
|
||||||
const headerPairsLimit = getLimit(limits, 'headerPairs', 2000)
|
|
||||||
const headerSizeLimit = getLimit(limits, 'headerSize', 80 * 1024)
|
|
||||||
|
|
||||||
let nfiles = 0
|
|
||||||
let nfields = 0
|
|
||||||
let nends = 0
|
|
||||||
let curFile
|
|
||||||
let curField
|
|
||||||
let finished = false
|
|
||||||
|
|
||||||
this._needDrain = false
|
|
||||||
this._pause = false
|
|
||||||
this._cb = undefined
|
|
||||||
this._nparts = 0
|
|
||||||
this._boy = boy
|
|
||||||
|
|
||||||
const parserCfg = {
|
|
||||||
boundary,
|
|
||||||
maxHeaderPairs: headerPairsLimit,
|
|
||||||
maxHeaderSize: headerSizeLimit,
|
|
||||||
partHwm: fileOpts.highWaterMark,
|
|
||||||
highWaterMark: cfg.highWaterMark
|
|
||||||
}
|
|
||||||
|
|
||||||
this.parser = new Dicer(parserCfg)
|
|
||||||
this.parser.on('drain', function () {
|
|
||||||
self._needDrain = false
|
|
||||||
if (self._cb && !self._pause) {
|
|
||||||
const cb = self._cb
|
|
||||||
self._cb = undefined
|
|
||||||
cb()
|
|
||||||
}
|
|
||||||
}).on('part', function onPart (part) {
|
|
||||||
if (++self._nparts > partsLimit) {
|
|
||||||
self.parser.removeListener('part', onPart)
|
|
||||||
self.parser.on('part', skipPart)
|
|
||||||
boy.hitPartsLimit = true
|
|
||||||
boy.emit('partsLimit')
|
|
||||||
return skipPart(part)
|
|
||||||
}
|
|
||||||
|
|
||||||
// hack because streams2 _always_ doesn't emit 'end' until nextTick, so let
|
|
||||||
// us emit 'end' early since we know the part has ended if we are already
|
|
||||||
// seeing the next part
|
|
||||||
if (curField) {
|
|
||||||
const field = curField
|
|
||||||
field.emit('end')
|
|
||||||
field.removeAllListeners('end')
|
|
||||||
}
|
|
||||||
|
|
||||||
part.on('header', function (header) {
|
|
||||||
let contype
|
|
||||||
let fieldname
|
|
||||||
let parsed
|
|
||||||
let charset
|
|
||||||
let encoding
|
|
||||||
let filename
|
|
||||||
let nsize = 0
|
|
||||||
|
|
||||||
if (header['content-type']) {
|
|
||||||
parsed = parseParams(header['content-type'][0])
|
|
||||||
if (parsed[0]) {
|
|
||||||
contype = parsed[0].toLowerCase()
|
|
||||||
for (i = 0, len = parsed.length; i < len; ++i) {
|
|
||||||
if (RE_CHARSET.test(parsed[i][0])) {
|
|
||||||
charset = parsed[i][1].toLowerCase()
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (contype === undefined) { contype = 'text/plain' }
|
|
||||||
if (charset === undefined) { charset = defCharset }
|
|
||||||
|
|
||||||
if (header['content-disposition']) {
|
|
||||||
parsed = parseParams(header['content-disposition'][0])
|
|
||||||
if (!RE_FIELD.test(parsed[0])) { return skipPart(part) }
|
|
||||||
for (i = 0, len = parsed.length; i < len; ++i) {
|
|
||||||
if (RE_NAME.test(parsed[i][0])) {
|
|
||||||
fieldname = parsed[i][1]
|
|
||||||
} else if (RE_FILENAME.test(parsed[i][0])) {
|
|
||||||
filename = parsed[i][1]
|
|
||||||
if (!preservePath) { filename = basename(filename) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else { return skipPart(part) }
|
|
||||||
|
|
||||||
if (header['content-transfer-encoding']) { encoding = header['content-transfer-encoding'][0].toLowerCase() } else { encoding = '7bit' }
|
|
||||||
|
|
||||||
let onData,
|
|
||||||
onEnd
|
|
||||||
|
|
||||||
if (isPartAFile(fieldname, contype, filename)) {
|
|
||||||
// file/binary field
|
|
||||||
if (nfiles === filesLimit) {
|
|
||||||
if (!boy.hitFilesLimit) {
|
|
||||||
boy.hitFilesLimit = true
|
|
||||||
boy.emit('filesLimit')
|
|
||||||
}
|
|
||||||
return skipPart(part)
|
|
||||||
}
|
|
||||||
|
|
||||||
++nfiles
|
|
||||||
|
|
||||||
if (!boy._events.file) {
|
|
||||||
self.parser._ignore()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
++nends
|
|
||||||
const file = new FileStream(fileOpts)
|
|
||||||
curFile = file
|
|
||||||
file.on('end', function () {
|
|
||||||
--nends
|
|
||||||
self._pause = false
|
|
||||||
checkFinished()
|
|
||||||
if (self._cb && !self._needDrain) {
|
|
||||||
const cb = self._cb
|
|
||||||
self._cb = undefined
|
|
||||||
cb()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
file._read = function (n) {
|
|
||||||
if (!self._pause) { return }
|
|
||||||
self._pause = false
|
|
||||||
if (self._cb && !self._needDrain) {
|
|
||||||
const cb = self._cb
|
|
||||||
self._cb = undefined
|
|
||||||
cb()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
boy.emit('file', fieldname, file, filename, encoding, contype)
|
|
||||||
|
|
||||||
onData = function (data) {
|
|
||||||
if ((nsize += data.length) > fileSizeLimit) {
|
|
||||||
const extralen = fileSizeLimit - nsize + data.length
|
|
||||||
if (extralen > 0) { file.push(data.slice(0, extralen)) }
|
|
||||||
file.truncated = true
|
|
||||||
file.bytesRead = fileSizeLimit
|
|
||||||
part.removeAllListeners('data')
|
|
||||||
file.emit('limit')
|
|
||||||
return
|
|
||||||
} else if (!file.push(data)) { self._pause = true }
|
|
||||||
|
|
||||||
file.bytesRead = nsize
|
|
||||||
}
|
|
||||||
|
|
||||||
onEnd = function () {
|
|
||||||
curFile = undefined
|
|
||||||
file.push(null)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// non-file field
|
|
||||||
if (nfields === fieldsLimit) {
|
|
||||||
if (!boy.hitFieldsLimit) {
|
|
||||||
boy.hitFieldsLimit = true
|
|
||||||
boy.emit('fieldsLimit')
|
|
||||||
}
|
|
||||||
return skipPart(part)
|
|
||||||
}
|
|
||||||
|
|
||||||
++nfields
|
|
||||||
++nends
|
|
||||||
let buffer = ''
|
|
||||||
let truncated = false
|
|
||||||
curField = part
|
|
||||||
|
|
||||||
onData = function (data) {
|
|
||||||
if ((nsize += data.length) > fieldSizeLimit) {
|
|
||||||
const extralen = (fieldSizeLimit - (nsize - data.length))
|
|
||||||
buffer += data.toString('binary', 0, extralen)
|
|
||||||
truncated = true
|
|
||||||
part.removeAllListeners('data')
|
|
||||||
} else { buffer += data.toString('binary') }
|
|
||||||
}
|
|
||||||
|
|
||||||
onEnd = function () {
|
|
||||||
curField = undefined
|
|
||||||
if (buffer.length) { buffer = decodeText(buffer, 'binary', charset) }
|
|
||||||
boy.emit('field', fieldname, buffer, false, truncated, encoding, contype)
|
|
||||||
--nends
|
|
||||||
checkFinished()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* As of node@2efe4ab761666 (v0.10.29+/v0.11.14+), busboy had become
|
|
||||||
broken. Streams2/streams3 is a huge black box of confusion, but
|
|
||||||
somehow overriding the sync state seems to fix things again (and still
|
|
||||||
seems to work for previous node versions).
|
|
||||||
*/
|
|
||||||
part._readableState.sync = false
|
|
||||||
|
|
||||||
part.on('data', onData)
|
|
||||||
part.on('end', onEnd)
|
|
||||||
}).on('error', function (err) {
|
|
||||||
if (curFile) { curFile.emit('error', err) }
|
|
||||||
})
|
|
||||||
}).on('error', function (err) {
|
|
||||||
boy.emit('error', err)
|
|
||||||
}).on('finish', function () {
|
|
||||||
finished = true
|
|
||||||
checkFinished()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
Multipart.prototype.write = function (chunk, cb) {
|
|
||||||
const r = this.parser.write(chunk)
|
|
||||||
if (r && !this._pause) {
|
|
||||||
cb()
|
|
||||||
} else {
|
|
||||||
this._needDrain = !r
|
|
||||||
this._cb = cb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Multipart.prototype.end = function () {
|
|
||||||
const self = this
|
|
||||||
|
|
||||||
if (self.parser.writable) {
|
|
||||||
self.parser.end()
|
|
||||||
} else if (!self._boy._done) {
|
|
||||||
process.nextTick(function () {
|
|
||||||
self._boy._done = true
|
|
||||||
self._boy.emit('finish')
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function skipPart (part) {
|
|
||||||
part.resume()
|
|
||||||
}
|
|
||||||
|
|
||||||
function FileStream (opts) {
|
|
||||||
Readable.call(this, opts)
|
|
||||||
|
|
||||||
this.bytesRead = 0
|
|
||||||
|
|
||||||
this.truncated = false
|
|
||||||
}
|
|
||||||
|
|
||||||
inherits(FileStream, Readable)
|
|
||||||
|
|
||||||
FileStream.prototype._read = function (n) {}
|
|
||||||
|
|
||||||
module.exports = Multipart
|
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
|
||||||
|
|
||||||
/***/ 6780:
|
|
||||||
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
|
|
||||||
const Decoder = __nccwpck_require__(9730)
|
|
||||||
const decodeText = __nccwpck_require__(9136)
|
|
||||||
const getLimit = __nccwpck_require__(9692)
|
|
||||||
|
|
||||||
const RE_CHARSET = /^charset$/i
|
|
||||||
|
|
||||||
UrlEncoded.detect = /^application\/x-www-form-urlencoded/i
|
|
||||||
function UrlEncoded (boy, cfg) {
|
|
||||||
const limits = cfg.limits
|
|
||||||
const parsedConType = cfg.parsedConType
|
|
||||||
this.boy = boy
|
|
||||||
|
|
||||||
this.fieldSizeLimit = getLimit(limits, 'fieldSize', 1 * 1024 * 1024)
|
|
||||||
this.fieldNameSizeLimit = getLimit(limits, 'fieldNameSize', 100)
|
|
||||||
this.fieldsLimit = getLimit(limits, 'fields', Infinity)
|
|
||||||
|
|
||||||
let charset
|
|
||||||
for (var i = 0, len = parsedConType.length; i < len; ++i) { // eslint-disable-line no-var
|
|
||||||
if (Array.isArray(parsedConType[i]) &&
|
|
||||||
RE_CHARSET.test(parsedConType[i][0])) {
|
|
||||||
charset = parsedConType[i][1].toLowerCase()
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (charset === undefined) { charset = cfg.defCharset || 'utf8' }
|
|
||||||
|
|
||||||
this.decoder = new Decoder()
|
|
||||||
this.charset = charset
|
|
||||||
this._fields = 0
|
|
||||||
this._state = 'key'
|
|
||||||
this._checkingBytes = true
|
|
||||||
this._bytesKey = 0
|
|
||||||
this._bytesVal = 0
|
|
||||||
this._key = ''
|
|
||||||
this._val = ''
|
|
||||||
this._keyTrunc = false
|
|
||||||
this._valTrunc = false
|
|
||||||
this._hitLimit = false
|
|
||||||
}
|
|
||||||
|
|
||||||
UrlEncoded.prototype.write = function (data, cb) {
|
|
||||||
if (this._fields === this.fieldsLimit) {
|
|
||||||
if (!this.boy.hitFieldsLimit) {
|
|
||||||
this.boy.hitFieldsLimit = true
|
|
||||||
this.boy.emit('fieldsLimit')
|
|
||||||
}
|
|
||||||
return cb()
|
|
||||||
}
|
|
||||||
|
|
||||||
let idxeq; let idxamp; let i; let p = 0; const len = data.length
|
|
||||||
|
|
||||||
while (p < len) {
|
|
||||||
if (this._state === 'key') {
|
|
||||||
idxeq = idxamp = undefined
|
|
||||||
for (i = p; i < len; ++i) {
|
|
||||||
if (!this._checkingBytes) { ++p }
|
|
||||||
if (data[i] === 0x3D/* = */) {
|
|
||||||
idxeq = i
|
|
||||||
break
|
|
||||||
} else if (data[i] === 0x26/* & */) {
|
|
||||||
idxamp = i
|
|
||||||
break
|
|
||||||
}
|
|
||||||
if (this._checkingBytes && this._bytesKey === this.fieldNameSizeLimit) {
|
|
||||||
this._hitLimit = true
|
|
||||||
break
|
|
||||||
} else if (this._checkingBytes) { ++this._bytesKey }
|
|
||||||
}
|
|
||||||
|
|
||||||
if (idxeq !== undefined) {
|
|
||||||
// key with assignment
|
|
||||||
if (idxeq > p) { this._key += this.decoder.write(data.toString('binary', p, idxeq)) }
|
|
||||||
this._state = 'val'
|
|
||||||
|
|
||||||
this._hitLimit = false
|
|
||||||
this._checkingBytes = true
|
|
||||||
this._val = ''
|
|
||||||
this._bytesVal = 0
|
|
||||||
this._valTrunc = false
|
|
||||||
this.decoder.reset()
|
|
||||||
|
|
||||||
p = idxeq + 1
|
|
||||||
} else if (idxamp !== undefined) {
|
|
||||||
// key with no assignment
|
|
||||||
++this._fields
|
|
||||||
let key; const keyTrunc = this._keyTrunc
|
|
||||||
if (idxamp > p) { key = (this._key += this.decoder.write(data.toString('binary', p, idxamp))) } else { key = this._key }
|
|
||||||
|
|
||||||
this._hitLimit = false
|
|
||||||
this._checkingBytes = true
|
|
||||||
this._key = ''
|
|
||||||
this._bytesKey = 0
|
|
||||||
this._keyTrunc = false
|
|
||||||
this.decoder.reset()
|
|
||||||
|
|
||||||
if (key.length) {
|
|
||||||
this.boy.emit('field', decodeText(key, 'binary', this.charset),
|
|
||||||
'',
|
|
||||||
keyTrunc,
|
|
||||||
false)
|
|
||||||
}
|
|
||||||
|
|
||||||
p = idxamp + 1
|
|
||||||
if (this._fields === this.fieldsLimit) { return cb() }
|
|
||||||
} else if (this._hitLimit) {
|
|
||||||
// we may not have hit the actual limit if there are encoded bytes...
|
|
||||||
if (i > p) { this._key += this.decoder.write(data.toString('binary', p, i)) }
|
|
||||||
p = i
|
|
||||||
if ((this._bytesKey = this._key.length) === this.fieldNameSizeLimit) {
|
|
||||||
// yep, we actually did hit the limit
|
|
||||||
this._checkingBytes = false
|
|
||||||
this._keyTrunc = true
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (p < len) { this._key += this.decoder.write(data.toString('binary', p)) }
|
|
||||||
p = len
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
idxamp = undefined
|
|
||||||
for (i = p; i < len; ++i) {
|
|
||||||
if (!this._checkingBytes) { ++p }
|
|
||||||
if (data[i] === 0x26/* & */) {
|
|
||||||
idxamp = i
|
|
||||||
break
|
|
||||||
}
|
|
||||||
if (this._checkingBytes && this._bytesVal === this.fieldSizeLimit) {
|
|
||||||
this._hitLimit = true
|
|
||||||
break
|
|
||||||
} else if (this._checkingBytes) { ++this._bytesVal }
|
|
||||||
}
|
|
||||||
|
|
||||||
if (idxamp !== undefined) {
|
|
||||||
++this._fields
|
|
||||||
if (idxamp > p) { this._val += this.decoder.write(data.toString('binary', p, idxamp)) }
|
|
||||||
this.boy.emit('field', decodeText(this._key, 'binary', this.charset),
|
|
||||||
decodeText(this._val, 'binary', this.charset),
|
|
||||||
this._keyTrunc,
|
|
||||||
this._valTrunc)
|
|
||||||
this._state = 'key'
|
|
||||||
|
|
||||||
this._hitLimit = false
|
|
||||||
this._checkingBytes = true
|
|
||||||
this._key = ''
|
|
||||||
this._bytesKey = 0
|
|
||||||
this._keyTrunc = false
|
|
||||||
this.decoder.reset()
|
|
||||||
|
|
||||||
p = idxamp + 1
|
|
||||||
if (this._fields === this.fieldsLimit) { return cb() }
|
|
||||||
} else if (this._hitLimit) {
|
|
||||||
// we may not have hit the actual limit if there are encoded bytes...
|
|
||||||
if (i > p) { this._val += this.decoder.write(data.toString('binary', p, i)) }
|
|
||||||
p = i
|
|
||||||
if ((this._val === '' && this.fieldSizeLimit === 0) ||
|
|
||||||
(this._bytesVal = this._val.length) === this.fieldSizeLimit) {
|
|
||||||
// yep, we actually did hit the limit
|
|
||||||
this._checkingBytes = false
|
|
||||||
this._valTrunc = true
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (p < len) { this._val += this.decoder.write(data.toString('binary', p)) }
|
|
||||||
p = len
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cb()
|
|
||||||
}
|
|
||||||
|
|
||||||
UrlEncoded.prototype.end = function () {
|
|
||||||
if (this.boy._done) { return }
|
|
||||||
|
|
||||||
if (this._state === 'key' && this._key.length > 0) {
|
|
||||||
this.boy.emit('field', decodeText(this._key, 'binary', this.charset),
|
|
||||||
'',
|
|
||||||
this._keyTrunc,
|
|
||||||
false)
|
|
||||||
} else if (this._state === 'val') {
|
|
||||||
this.boy.emit('field', decodeText(this._key, 'binary', this.charset),
|
|
||||||
decodeText(this._val, 'binary', this.charset),
|
|
||||||
this._keyTrunc,
|
|
||||||
this._valTrunc)
|
|
||||||
}
|
|
||||||
this.boy._done = true
|
|
||||||
this.boy.emit('finish')
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = UrlEncoded
|
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
|
||||||
|
|
||||||
/***/ 9730:
|
|
||||||
/***/ ((module) => {
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
|
|
||||||
const RE_PLUS = /\+/g
|
|
||||||
|
|
||||||
const HEX = [
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
|
||||||
]
|
|
||||||
|
|
||||||
function Decoder () {
|
|
||||||
this.buffer = undefined
|
|
||||||
}
|
|
||||||
Decoder.prototype.write = function (str) {
|
|
||||||
// Replace '+' with ' ' before decoding
|
|
||||||
str = str.replace(RE_PLUS, ' ')
|
|
||||||
let res = ''
|
|
||||||
let i = 0; let p = 0; const len = str.length
|
|
||||||
for (; i < len; ++i) {
|
|
||||||
if (this.buffer !== undefined) {
|
|
||||||
if (!HEX[str.charCodeAt(i)]) {
|
|
||||||
res += '%' + this.buffer
|
|
||||||
this.buffer = undefined
|
|
||||||
--i // retry character
|
|
||||||
} else {
|
|
||||||
this.buffer += str[i]
|
|
||||||
++p
|
|
||||||
if (this.buffer.length === 2) {
|
|
||||||
res += String.fromCharCode(parseInt(this.buffer, 16))
|
|
||||||
this.buffer = undefined
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (str[i] === '%') {
|
|
||||||
if (i > p) {
|
|
||||||
res += str.substring(p, i)
|
|
||||||
p = i
|
|
||||||
}
|
|
||||||
this.buffer = ''
|
|
||||||
++p
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (p < len && this.buffer === undefined) { res += str.substring(p) }
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
Decoder.prototype.reset = function () {
|
|
||||||
this.buffer = undefined
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = Decoder
|
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
|
||||||
|
|
||||||
/***/ 496:
|
|
||||||
/***/ ((module) => {
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
|
|
||||||
module.exports = function basename (path) {
|
|
||||||
if (typeof path !== 'string') { return '' }
|
|
||||||
for (var i = path.length - 1; i >= 0; --i) { // eslint-disable-line no-var
|
|
||||||
switch (path.charCodeAt(i)) {
|
|
||||||
case 0x2F: // '/'
|
|
||||||
case 0x5C: // '\'
|
|
||||||
path = path.slice(i + 1)
|
|
||||||
return (path === '..' || path === '.' ? '' : path)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return (path === '..' || path === '.' ? '' : path)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
|
||||||
|
|
||||||
/***/ 9136:
|
|
||||||
/***/ ((module) => {
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
|
|
||||||
// Node has always utf-8
|
|
||||||
const utf8Decoder = new TextDecoder('utf-8')
|
|
||||||
const textDecoders = new Map([
|
|
||||||
['utf-8', utf8Decoder],
|
|
||||||
['utf8', utf8Decoder]
|
|
||||||
])
|
|
||||||
|
|
||||||
function decodeText (text, textEncoding, destEncoding) {
|
|
||||||
if (text) {
|
|
||||||
if (textDecoders.has(destEncoding)) {
|
|
||||||
try {
|
|
||||||
return textDecoders.get(destEncoding).decode(Buffer.from(text, textEncoding))
|
|
||||||
} catch (e) { }
|
|
||||||
} else {
|
|
||||||
try {
|
|
||||||
textDecoders.set(destEncoding, new TextDecoder(destEncoding))
|
|
||||||
return textDecoders.get(destEncoding).decode(Buffer.from(text, textEncoding))
|
|
||||||
} catch (e) { }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return text
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = decodeText
|
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
|
||||||
|
|
||||||
/***/ 9692:
|
|
||||||
/***/ ((module) => {
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
|
|
||||||
module.exports = function getLimit (limits, name, defaultLimit) {
|
|
||||||
if (
|
|
||||||
!limits ||
|
|
||||||
limits[name] === undefined ||
|
|
||||||
limits[name] === null
|
|
||||||
) { return defaultLimit }
|
|
||||||
|
|
||||||
if (
|
|
||||||
typeof limits[name] !== 'number' ||
|
|
||||||
isNaN(limits[name])
|
|
||||||
) { throw new TypeError('Limit ' + name + ' is not a valid number') }
|
|
||||||
|
|
||||||
return limits[name]
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
|
||||||
|
|
||||||
/***/ 4426:
|
|
||||||
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
|
|
||||||
const decodeText = __nccwpck_require__(9136)
|
|
||||||
|
|
||||||
const RE_ENCODED = /%([a-fA-F0-9]{2})/g
|
|
||||||
|
|
||||||
function encodedReplacer (match, byte) {
|
|
||||||
return String.fromCharCode(parseInt(byte, 16))
|
|
||||||
}
|
|
||||||
|
|
||||||
function parseParams (str) {
|
|
||||||
const res = []
|
|
||||||
let state = 'key'
|
|
||||||
let charset = ''
|
|
||||||
let inquote = false
|
|
||||||
let escaping = false
|
|
||||||
let p = 0
|
|
||||||
let tmp = ''
|
|
||||||
|
|
||||||
for (var i = 0, len = str.length; i < len; ++i) { // eslint-disable-line no-var
|
|
||||||
const char = str[i]
|
|
||||||
if (char === '\\' && inquote) {
|
|
||||||
if (escaping) { escaping = false } else {
|
|
||||||
escaping = true
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
} else if (char === '"') {
|
|
||||||
if (!escaping) {
|
|
||||||
if (inquote) {
|
|
||||||
inquote = false
|
|
||||||
state = 'key'
|
|
||||||
} else { inquote = true }
|
|
||||||
continue
|
|
||||||
} else { escaping = false }
|
|
||||||
} else {
|
|
||||||
if (escaping && inquote) { tmp += '\\' }
|
|
||||||
escaping = false
|
|
||||||
if ((state === 'charset' || state === 'lang') && char === "'") {
|
|
||||||
if (state === 'charset') {
|
|
||||||
state = 'lang'
|
|
||||||
charset = tmp.substring(1)
|
|
||||||
} else { state = 'value' }
|
|
||||||
tmp = ''
|
|
||||||
continue
|
|
||||||
} else if (state === 'key' &&
|
|
||||||
(char === '*' || char === '=') &&
|
|
||||||
res.length) {
|
|
||||||
if (char === '*') { state = 'charset' } else { state = 'value' }
|
|
||||||
res[p] = [tmp, undefined]
|
|
||||||
tmp = ''
|
|
||||||
continue
|
|
||||||
} else if (!inquote && char === ';') {
|
|
||||||
state = 'key'
|
|
||||||
if (charset) {
|
|
||||||
if (tmp.length) {
|
|
||||||
tmp = decodeText(tmp.replace(RE_ENCODED, encodedReplacer),
|
|
||||||
'binary',
|
|
||||||
charset)
|
|
||||||
}
|
|
||||||
charset = ''
|
|
||||||
} else if (tmp.length) {
|
|
||||||
tmp = decodeText(tmp, 'binary', 'utf8')
|
|
||||||
}
|
|
||||||
if (res[p] === undefined) { res[p] = tmp } else { res[p][1] = tmp }
|
|
||||||
tmp = ''
|
|
||||||
++p
|
|
||||||
continue
|
|
||||||
} else if (!inquote && (char === ' ' || char === '\t')) { continue }
|
|
||||||
}
|
|
||||||
tmp += char
|
|
||||||
}
|
|
||||||
if (charset && tmp.length) {
|
|
||||||
tmp = decodeText(tmp.replace(RE_ENCODED, encodedReplacer),
|
|
||||||
'binary',
|
|
||||||
charset)
|
|
||||||
} else if (tmp) {
|
|
||||||
tmp = decodeText(tmp, 'binary', 'utf8')
|
|
||||||
}
|
|
||||||
|
|
||||||
if (res[p] === undefined) {
|
|
||||||
if (tmp) { res[p] = tmp }
|
|
||||||
} else { res[p][1] = tmp }
|
|
||||||
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = parseParams
|
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
|
|
||||||
/***/ 7171:
|
/***/ 7171:
|
||||||
@ -70947,7 +69525,7 @@ module.exports = Dispatcher
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
|
||||||
const Busboy = __nccwpck_require__(3438)
|
const Busboy = __nccwpck_require__(727)
|
||||||
const util = __nccwpck_require__(3983)
|
const util = __nccwpck_require__(3983)
|
||||||
const {
|
const {
|
||||||
ReadableStreamFrom,
|
ReadableStreamFrom,
|
||||||
@ -70969,6 +69547,14 @@ const { isUint8Array, isArrayBuffer } = __nccwpck_require__(9830)
|
|||||||
const { File: UndiciFile } = __nccwpck_require__(8511)
|
const { File: UndiciFile } = __nccwpck_require__(8511)
|
||||||
const { parseMIMEType, serializeAMimeType } = __nccwpck_require__(685)
|
const { parseMIMEType, serializeAMimeType } = __nccwpck_require__(685)
|
||||||
|
|
||||||
|
let random
|
||||||
|
try {
|
||||||
|
const crypto = __nccwpck_require__(6005)
|
||||||
|
random = (max) => crypto.randomInt(0, max)
|
||||||
|
} catch {
|
||||||
|
random = (max) => Math.floor(Math.random(max))
|
||||||
|
}
|
||||||
|
|
||||||
let ReadableStream = globalThis.ReadableStream
|
let ReadableStream = globalThis.ReadableStream
|
||||||
|
|
||||||
/** @type {globalThis['File']} */
|
/** @type {globalThis['File']} */
|
||||||
@ -71054,7 +69640,7 @@ function extractBody (object, keepalive = false) {
|
|||||||
// Set source to a copy of the bytes held by object.
|
// Set source to a copy of the bytes held by object.
|
||||||
source = new Uint8Array(object.buffer.slice(object.byteOffset, object.byteOffset + object.byteLength))
|
source = new Uint8Array(object.buffer.slice(object.byteOffset, object.byteOffset + object.byteLength))
|
||||||
} else if (util.isFormDataLike(object)) {
|
} else if (util.isFormDataLike(object)) {
|
||||||
const boundary = `----formdata-undici-0${`${Math.floor(Math.random() * 1e11)}`.padStart(11, '0')}`
|
const boundary = `----formdata-undici-0${`${random(1e11)}`.padStart(11, '0')}`
|
||||||
const prefix = `--${boundary}\r\nContent-Disposition: form-data`
|
const prefix = `--${boundary}\r\nContent-Disposition: form-data`
|
||||||
|
|
||||||
/*! formdata-polyfill. MIT License. Jimmy Wärting <https://jimmy.warting.se/opensource> */
|
/*! formdata-polyfill. MIT License. Jimmy Wärting <https://jimmy.warting.se/opensource> */
|
||||||
@ -88012,7 +86598,7 @@ module.exports.implForWrapper = function (wrapper) {
|
|||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
|
|
||||||
/***/ 8186:
|
/***/ 333:
|
||||||
/***/ (function(module, __unused_webpack_exports, __nccwpck_require__) {
|
/***/ (function(module, __unused_webpack_exports, __nccwpck_require__) {
|
||||||
|
|
||||||
// Generated by CoffeeScript 1.12.7
|
// Generated by CoffeeScript 1.12.7
|
||||||
@ -89130,7 +87716,7 @@ module.exports.implForWrapper = function (wrapper) {
|
|||||||
|
|
||||||
XMLElement = __nccwpck_require__(9437);
|
XMLElement = __nccwpck_require__(9437);
|
||||||
|
|
||||||
XMLCData = __nccwpck_require__(8186);
|
XMLCData = __nccwpck_require__(333);
|
||||||
|
|
||||||
XMLComment = __nccwpck_require__(4407);
|
XMLComment = __nccwpck_require__(4407);
|
||||||
|
|
||||||
@ -90105,7 +88691,7 @@ module.exports.implForWrapper = function (wrapper) {
|
|||||||
this.baseURI = null;
|
this.baseURI = null;
|
||||||
if (!XMLElement) {
|
if (!XMLElement) {
|
||||||
XMLElement = __nccwpck_require__(9437);
|
XMLElement = __nccwpck_require__(9437);
|
||||||
XMLCData = __nccwpck_require__(8186);
|
XMLCData = __nccwpck_require__(333);
|
||||||
XMLComment = __nccwpck_require__(4407);
|
XMLComment = __nccwpck_require__(4407);
|
||||||
XMLDeclaration = __nccwpck_require__(6364);
|
XMLDeclaration = __nccwpck_require__(6364);
|
||||||
XMLDocType = __nccwpck_require__(1801);
|
XMLDocType = __nccwpck_require__(1801);
|
||||||
@ -91546,7 +90132,7 @@ module.exports.implForWrapper = function (wrapper) {
|
|||||||
|
|
||||||
XMLDocType = __nccwpck_require__(1801);
|
XMLDocType = __nccwpck_require__(1801);
|
||||||
|
|
||||||
XMLCData = __nccwpck_require__(8186);
|
XMLCData = __nccwpck_require__(333);
|
||||||
|
|
||||||
XMLComment = __nccwpck_require__(4407);
|
XMLComment = __nccwpck_require__(4407);
|
||||||
|
|
||||||
@ -92685,6 +91271,14 @@ module.exports = require("net");
|
|||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ 6005:
|
||||||
|
/***/ ((module) => {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
module.exports = require("node:crypto");
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
/***/ 5673:
|
/***/ 5673:
|
||||||
/***/ ((module) => {
|
/***/ ((module) => {
|
||||||
|
|
||||||
@ -92827,6 +91421,1631 @@ module.exports = require("worker_threads");
|
|||||||
"use strict";
|
"use strict";
|
||||||
module.exports = require("zlib");
|
module.exports = require("zlib");
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ 2960:
|
||||||
|
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
|
||||||
|
const WritableStream = (__nccwpck_require__(4492).Writable)
|
||||||
|
const inherits = (__nccwpck_require__(7261).inherits)
|
||||||
|
|
||||||
|
const StreamSearch = __nccwpck_require__(1142)
|
||||||
|
|
||||||
|
const PartStream = __nccwpck_require__(1620)
|
||||||
|
const HeaderParser = __nccwpck_require__(2032)
|
||||||
|
|
||||||
|
const DASH = 45
|
||||||
|
const B_ONEDASH = Buffer.from('-')
|
||||||
|
const B_CRLF = Buffer.from('\r\n')
|
||||||
|
const EMPTY_FN = function () {}
|
||||||
|
|
||||||
|
function Dicer (cfg) {
|
||||||
|
if (!(this instanceof Dicer)) { return new Dicer(cfg) }
|
||||||
|
WritableStream.call(this, cfg)
|
||||||
|
|
||||||
|
if (!cfg || (!cfg.headerFirst && typeof cfg.boundary !== 'string')) { throw new TypeError('Boundary required') }
|
||||||
|
|
||||||
|
if (typeof cfg.boundary === 'string') { this.setBoundary(cfg.boundary) } else { this._bparser = undefined }
|
||||||
|
|
||||||
|
this._headerFirst = cfg.headerFirst
|
||||||
|
|
||||||
|
this._dashes = 0
|
||||||
|
this._parts = 0
|
||||||
|
this._finished = false
|
||||||
|
this._realFinish = false
|
||||||
|
this._isPreamble = true
|
||||||
|
this._justMatched = false
|
||||||
|
this._firstWrite = true
|
||||||
|
this._inHeader = true
|
||||||
|
this._part = undefined
|
||||||
|
this._cb = undefined
|
||||||
|
this._ignoreData = false
|
||||||
|
this._partOpts = { highWaterMark: cfg.partHwm }
|
||||||
|
this._pause = false
|
||||||
|
|
||||||
|
const self = this
|
||||||
|
this._hparser = new HeaderParser(cfg)
|
||||||
|
this._hparser.on('header', function (header) {
|
||||||
|
self._inHeader = false
|
||||||
|
self._part.emit('header', header)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
inherits(Dicer, WritableStream)
|
||||||
|
|
||||||
|
Dicer.prototype.emit = function (ev) {
|
||||||
|
if (ev === 'finish' && !this._realFinish) {
|
||||||
|
if (!this._finished) {
|
||||||
|
const self = this
|
||||||
|
process.nextTick(function () {
|
||||||
|
self.emit('error', new Error('Unexpected end of multipart data'))
|
||||||
|
if (self._part && !self._ignoreData) {
|
||||||
|
const type = (self._isPreamble ? 'Preamble' : 'Part')
|
||||||
|
self._part.emit('error', new Error(type + ' terminated early due to unexpected end of multipart data'))
|
||||||
|
self._part.push(null)
|
||||||
|
process.nextTick(function () {
|
||||||
|
self._realFinish = true
|
||||||
|
self.emit('finish')
|
||||||
|
self._realFinish = false
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
self._realFinish = true
|
||||||
|
self.emit('finish')
|
||||||
|
self._realFinish = false
|
||||||
|
})
|
||||||
|
}
|
||||||
|
} else { WritableStream.prototype.emit.apply(this, arguments) }
|
||||||
|
}
|
||||||
|
|
||||||
|
Dicer.prototype._write = function (data, encoding, cb) {
|
||||||
|
// ignore unexpected data (e.g. extra trailer data after finished)
|
||||||
|
if (!this._hparser && !this._bparser) { return cb() }
|
||||||
|
|
||||||
|
if (this._headerFirst && this._isPreamble) {
|
||||||
|
if (!this._part) {
|
||||||
|
this._part = new PartStream(this._partOpts)
|
||||||
|
if (this.listenerCount('preamble') !== 0) { this.emit('preamble', this._part) } else { this._ignore() }
|
||||||
|
}
|
||||||
|
const r = this._hparser.push(data)
|
||||||
|
if (!this._inHeader && r !== undefined && r < data.length) { data = data.slice(r) } else { return cb() }
|
||||||
|
}
|
||||||
|
|
||||||
|
// allows for "easier" testing
|
||||||
|
if (this._firstWrite) {
|
||||||
|
this._bparser.push(B_CRLF)
|
||||||
|
this._firstWrite = false
|
||||||
|
}
|
||||||
|
|
||||||
|
this._bparser.push(data)
|
||||||
|
|
||||||
|
if (this._pause) { this._cb = cb } else { cb() }
|
||||||
|
}
|
||||||
|
|
||||||
|
Dicer.prototype.reset = function () {
|
||||||
|
this._part = undefined
|
||||||
|
this._bparser = undefined
|
||||||
|
this._hparser = undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
Dicer.prototype.setBoundary = function (boundary) {
|
||||||
|
const self = this
|
||||||
|
this._bparser = new StreamSearch('\r\n--' + boundary)
|
||||||
|
this._bparser.on('info', function (isMatch, data, start, end) {
|
||||||
|
self._oninfo(isMatch, data, start, end)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
Dicer.prototype._ignore = function () {
|
||||||
|
if (this._part && !this._ignoreData) {
|
||||||
|
this._ignoreData = true
|
||||||
|
this._part.on('error', EMPTY_FN)
|
||||||
|
// we must perform some kind of read on the stream even though we are
|
||||||
|
// ignoring the data, otherwise node's Readable stream will not emit 'end'
|
||||||
|
// after pushing null to the stream
|
||||||
|
this._part.resume()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Dicer.prototype._oninfo = function (isMatch, data, start, end) {
|
||||||
|
let buf; const self = this; let i = 0; let r; let shouldWriteMore = true
|
||||||
|
|
||||||
|
if (!this._part && this._justMatched && data) {
|
||||||
|
while (this._dashes < 2 && (start + i) < end) {
|
||||||
|
if (data[start + i] === DASH) {
|
||||||
|
++i
|
||||||
|
++this._dashes
|
||||||
|
} else {
|
||||||
|
if (this._dashes) { buf = B_ONEDASH }
|
||||||
|
this._dashes = 0
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (this._dashes === 2) {
|
||||||
|
if ((start + i) < end && this.listenerCount('trailer') !== 0) { this.emit('trailer', data.slice(start + i, end)) }
|
||||||
|
this.reset()
|
||||||
|
this._finished = true
|
||||||
|
// no more parts will be added
|
||||||
|
if (self._parts === 0) {
|
||||||
|
self._realFinish = true
|
||||||
|
self.emit('finish')
|
||||||
|
self._realFinish = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (this._dashes) { return }
|
||||||
|
}
|
||||||
|
if (this._justMatched) { this._justMatched = false }
|
||||||
|
if (!this._part) {
|
||||||
|
this._part = new PartStream(this._partOpts)
|
||||||
|
this._part._read = function (n) {
|
||||||
|
self._unpause()
|
||||||
|
}
|
||||||
|
if (this._isPreamble && this.listenerCount('preamble') !== 0) {
|
||||||
|
this.emit('preamble', this._part)
|
||||||
|
} else if (this._isPreamble !== true && this.listenerCount('part') !== 0) {
|
||||||
|
this.emit('part', this._part)
|
||||||
|
} else {
|
||||||
|
this._ignore()
|
||||||
|
}
|
||||||
|
if (!this._isPreamble) { this._inHeader = true }
|
||||||
|
}
|
||||||
|
if (data && start < end && !this._ignoreData) {
|
||||||
|
if (this._isPreamble || !this._inHeader) {
|
||||||
|
if (buf) { shouldWriteMore = this._part.push(buf) }
|
||||||
|
shouldWriteMore = this._part.push(data.slice(start, end))
|
||||||
|
if (!shouldWriteMore) { this._pause = true }
|
||||||
|
} else if (!this._isPreamble && this._inHeader) {
|
||||||
|
if (buf) { this._hparser.push(buf) }
|
||||||
|
r = this._hparser.push(data.slice(start, end))
|
||||||
|
if (!this._inHeader && r !== undefined && r < end) { this._oninfo(false, data, start + r, end) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isMatch) {
|
||||||
|
this._hparser.reset()
|
||||||
|
if (this._isPreamble) { this._isPreamble = false } else {
|
||||||
|
if (start !== end) {
|
||||||
|
++this._parts
|
||||||
|
this._part.on('end', function () {
|
||||||
|
if (--self._parts === 0) {
|
||||||
|
if (self._finished) {
|
||||||
|
self._realFinish = true
|
||||||
|
self.emit('finish')
|
||||||
|
self._realFinish = false
|
||||||
|
} else {
|
||||||
|
self._unpause()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this._part.push(null)
|
||||||
|
this._part = undefined
|
||||||
|
this._ignoreData = false
|
||||||
|
this._justMatched = true
|
||||||
|
this._dashes = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Dicer.prototype._unpause = function () {
|
||||||
|
if (!this._pause) { return }
|
||||||
|
|
||||||
|
this._pause = false
|
||||||
|
if (this._cb) {
|
||||||
|
const cb = this._cb
|
||||||
|
this._cb = undefined
|
||||||
|
cb()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Dicer
|
||||||
|
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ 2032:
|
||||||
|
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
|
||||||
|
const EventEmitter = (__nccwpck_require__(5673).EventEmitter)
|
||||||
|
const inherits = (__nccwpck_require__(7261).inherits)
|
||||||
|
const getLimit = __nccwpck_require__(1467)
|
||||||
|
|
||||||
|
const StreamSearch = __nccwpck_require__(1142)
|
||||||
|
|
||||||
|
const B_DCRLF = Buffer.from('\r\n\r\n')
|
||||||
|
const RE_CRLF = /\r\n/g
|
||||||
|
const RE_HDR = /^([^:]+):[ \t]?([\x00-\xFF]+)?$/ // eslint-disable-line no-control-regex
|
||||||
|
|
||||||
|
function HeaderParser (cfg) {
|
||||||
|
EventEmitter.call(this)
|
||||||
|
|
||||||
|
cfg = cfg || {}
|
||||||
|
const self = this
|
||||||
|
this.nread = 0
|
||||||
|
this.maxed = false
|
||||||
|
this.npairs = 0
|
||||||
|
this.maxHeaderPairs = getLimit(cfg, 'maxHeaderPairs', 2000)
|
||||||
|
this.maxHeaderSize = getLimit(cfg, 'maxHeaderSize', 80 * 1024)
|
||||||
|
this.buffer = ''
|
||||||
|
this.header = {}
|
||||||
|
this.finished = false
|
||||||
|
this.ss = new StreamSearch(B_DCRLF)
|
||||||
|
this.ss.on('info', function (isMatch, data, start, end) {
|
||||||
|
if (data && !self.maxed) {
|
||||||
|
if (self.nread + end - start >= self.maxHeaderSize) {
|
||||||
|
end = self.maxHeaderSize - self.nread + start
|
||||||
|
self.nread = self.maxHeaderSize
|
||||||
|
self.maxed = true
|
||||||
|
} else { self.nread += (end - start) }
|
||||||
|
|
||||||
|
self.buffer += data.toString('binary', start, end)
|
||||||
|
}
|
||||||
|
if (isMatch) { self._finish() }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
inherits(HeaderParser, EventEmitter)
|
||||||
|
|
||||||
|
HeaderParser.prototype.push = function (data) {
|
||||||
|
const r = this.ss.push(data)
|
||||||
|
if (this.finished) { return r }
|
||||||
|
}
|
||||||
|
|
||||||
|
HeaderParser.prototype.reset = function () {
|
||||||
|
this.finished = false
|
||||||
|
this.buffer = ''
|
||||||
|
this.header = {}
|
||||||
|
this.ss.reset()
|
||||||
|
}
|
||||||
|
|
||||||
|
HeaderParser.prototype._finish = function () {
|
||||||
|
if (this.buffer) { this._parseHeader() }
|
||||||
|
this.ss.matches = this.ss.maxMatches
|
||||||
|
const header = this.header
|
||||||
|
this.header = {}
|
||||||
|
this.buffer = ''
|
||||||
|
this.finished = true
|
||||||
|
this.nread = this.npairs = 0
|
||||||
|
this.maxed = false
|
||||||
|
this.emit('header', header)
|
||||||
|
}
|
||||||
|
|
||||||
|
HeaderParser.prototype._parseHeader = function () {
|
||||||
|
if (this.npairs === this.maxHeaderPairs) { return }
|
||||||
|
|
||||||
|
const lines = this.buffer.split(RE_CRLF)
|
||||||
|
const len = lines.length
|
||||||
|
let m, h
|
||||||
|
|
||||||
|
for (var i = 0; i < len; ++i) { // eslint-disable-line no-var
|
||||||
|
if (lines[i].length === 0) { continue }
|
||||||
|
if (lines[i][0] === '\t' || lines[i][0] === ' ') {
|
||||||
|
// folded header content
|
||||||
|
// RFC2822 says to just remove the CRLF and not the whitespace following
|
||||||
|
// it, so we follow the RFC and include the leading whitespace ...
|
||||||
|
if (h) {
|
||||||
|
this.header[h][this.header[h].length - 1] += lines[i]
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const posColon = lines[i].indexOf(':')
|
||||||
|
if (
|
||||||
|
posColon === -1 ||
|
||||||
|
posColon === 0
|
||||||
|
) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
m = RE_HDR.exec(lines[i])
|
||||||
|
h = m[1].toLowerCase()
|
||||||
|
this.header[h] = this.header[h] || []
|
||||||
|
this.header[h].push((m[2] || ''))
|
||||||
|
if (++this.npairs === this.maxHeaderPairs) { break }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = HeaderParser
|
||||||
|
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ 1620:
|
||||||
|
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
|
||||||
|
const inherits = (__nccwpck_require__(7261).inherits)
|
||||||
|
const ReadableStream = (__nccwpck_require__(4492).Readable)
|
||||||
|
|
||||||
|
function PartStream (opts) {
|
||||||
|
ReadableStream.call(this, opts)
|
||||||
|
}
|
||||||
|
inherits(PartStream, ReadableStream)
|
||||||
|
|
||||||
|
PartStream.prototype._read = function (n) {}
|
||||||
|
|
||||||
|
module.exports = PartStream
|
||||||
|
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ 1142:
|
||||||
|
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copyright Brian White. All rights reserved.
|
||||||
|
*
|
||||||
|
* @see https://github.com/mscdex/streamsearch
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to
|
||||||
|
* deal in the Software without restriction, including without limitation the
|
||||||
|
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||||
|
* sell copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||||
|
* IN THE SOFTWARE.
|
||||||
|
*
|
||||||
|
* Based heavily on the Streaming Boyer-Moore-Horspool C++ implementation
|
||||||
|
* by Hongli Lai at: https://github.com/FooBarWidget/boyer-moore-horspool
|
||||||
|
*/
|
||||||
|
const EventEmitter = (__nccwpck_require__(5673).EventEmitter)
|
||||||
|
const inherits = (__nccwpck_require__(7261).inherits)
|
||||||
|
|
||||||
|
function SBMH (needle) {
|
||||||
|
if (typeof needle === 'string') {
|
||||||
|
needle = Buffer.from(needle)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Buffer.isBuffer(needle)) {
|
||||||
|
throw new TypeError('The needle has to be a String or a Buffer.')
|
||||||
|
}
|
||||||
|
|
||||||
|
const needleLength = needle.length
|
||||||
|
|
||||||
|
if (needleLength === 0) {
|
||||||
|
throw new Error('The needle cannot be an empty String/Buffer.')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (needleLength > 256) {
|
||||||
|
throw new Error('The needle cannot have a length bigger than 256.')
|
||||||
|
}
|
||||||
|
|
||||||
|
this.maxMatches = Infinity
|
||||||
|
this.matches = 0
|
||||||
|
|
||||||
|
this._occ = new Array(256)
|
||||||
|
.fill(needleLength) // Initialize occurrence table.
|
||||||
|
this._lookbehind_size = 0
|
||||||
|
this._needle = needle
|
||||||
|
this._bufpos = 0
|
||||||
|
|
||||||
|
this._lookbehind = Buffer.alloc(needleLength)
|
||||||
|
|
||||||
|
// Populate occurrence table with analysis of the needle,
|
||||||
|
// ignoring last letter.
|
||||||
|
for (var i = 0; i < needleLength - 1; ++i) { // eslint-disable-line no-var
|
||||||
|
this._occ[needle[i]] = needleLength - 1 - i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
inherits(SBMH, EventEmitter)
|
||||||
|
|
||||||
|
SBMH.prototype.reset = function () {
|
||||||
|
this._lookbehind_size = 0
|
||||||
|
this.matches = 0
|
||||||
|
this._bufpos = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
SBMH.prototype.push = function (chunk, pos) {
|
||||||
|
if (!Buffer.isBuffer(chunk)) {
|
||||||
|
chunk = Buffer.from(chunk, 'binary')
|
||||||
|
}
|
||||||
|
const chlen = chunk.length
|
||||||
|
this._bufpos = pos || 0
|
||||||
|
let r
|
||||||
|
while (r !== chlen && this.matches < this.maxMatches) { r = this._sbmh_feed(chunk) }
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
SBMH.prototype._sbmh_feed = function (data) {
|
||||||
|
const len = data.length
|
||||||
|
const needle = this._needle
|
||||||
|
const needleLength = needle.length
|
||||||
|
const lastNeedleChar = needle[needleLength - 1]
|
||||||
|
|
||||||
|
// Positive: points to a position in `data`
|
||||||
|
// pos == 3 points to data[3]
|
||||||
|
// Negative: points to a position in the lookbehind buffer
|
||||||
|
// pos == -2 points to lookbehind[lookbehind_size - 2]
|
||||||
|
let pos = -this._lookbehind_size
|
||||||
|
let ch
|
||||||
|
|
||||||
|
if (pos < 0) {
|
||||||
|
// Lookbehind buffer is not empty. Perform Boyer-Moore-Horspool
|
||||||
|
// search with character lookup code that considers both the
|
||||||
|
// lookbehind buffer and the current round's haystack data.
|
||||||
|
//
|
||||||
|
// Loop until
|
||||||
|
// there is a match.
|
||||||
|
// or until
|
||||||
|
// we've moved past the position that requires the
|
||||||
|
// lookbehind buffer. In this case we switch to the
|
||||||
|
// optimized loop.
|
||||||
|
// or until
|
||||||
|
// the character to look at lies outside the haystack.
|
||||||
|
while (pos < 0 && pos <= len - needleLength) {
|
||||||
|
ch = this._sbmh_lookup_char(data, pos + needleLength - 1)
|
||||||
|
|
||||||
|
if (
|
||||||
|
ch === lastNeedleChar &&
|
||||||
|
this._sbmh_memcmp(data, pos, needleLength - 1)
|
||||||
|
) {
|
||||||
|
this._lookbehind_size = 0
|
||||||
|
++this.matches
|
||||||
|
this.emit('info', true)
|
||||||
|
|
||||||
|
return (this._bufpos = pos + needleLength)
|
||||||
|
}
|
||||||
|
pos += this._occ[ch]
|
||||||
|
}
|
||||||
|
|
||||||
|
// No match.
|
||||||
|
|
||||||
|
if (pos < 0) {
|
||||||
|
// There's too few data for Boyer-Moore-Horspool to run,
|
||||||
|
// so let's use a different algorithm to skip as much as
|
||||||
|
// we can.
|
||||||
|
// Forward pos until
|
||||||
|
// the trailing part of lookbehind + data
|
||||||
|
// looks like the beginning of the needle
|
||||||
|
// or until
|
||||||
|
// pos == 0
|
||||||
|
while (pos < 0 && !this._sbmh_memcmp(data, pos, len - pos)) { ++pos }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pos >= 0) {
|
||||||
|
// Discard lookbehind buffer.
|
||||||
|
this.emit('info', false, this._lookbehind, 0, this._lookbehind_size)
|
||||||
|
this._lookbehind_size = 0
|
||||||
|
} else {
|
||||||
|
// Cut off part of the lookbehind buffer that has
|
||||||
|
// been processed and append the entire haystack
|
||||||
|
// into it.
|
||||||
|
const bytesToCutOff = this._lookbehind_size + pos
|
||||||
|
if (bytesToCutOff > 0) {
|
||||||
|
// The cut off data is guaranteed not to contain the needle.
|
||||||
|
this.emit('info', false, this._lookbehind, 0, bytesToCutOff)
|
||||||
|
}
|
||||||
|
|
||||||
|
this._lookbehind.copy(this._lookbehind, 0, bytesToCutOff,
|
||||||
|
this._lookbehind_size - bytesToCutOff)
|
||||||
|
this._lookbehind_size -= bytesToCutOff
|
||||||
|
|
||||||
|
data.copy(this._lookbehind, this._lookbehind_size)
|
||||||
|
this._lookbehind_size += len
|
||||||
|
|
||||||
|
this._bufpos = len
|
||||||
|
return len
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pos += (pos >= 0) * this._bufpos
|
||||||
|
|
||||||
|
// Lookbehind buffer is now empty. We only need to check if the
|
||||||
|
// needle is in the haystack.
|
||||||
|
if (data.indexOf(needle, pos) !== -1) {
|
||||||
|
pos = data.indexOf(needle, pos)
|
||||||
|
++this.matches
|
||||||
|
if (pos > 0) { this.emit('info', true, data, this._bufpos, pos) } else { this.emit('info', true) }
|
||||||
|
|
||||||
|
return (this._bufpos = pos + needleLength)
|
||||||
|
} else {
|
||||||
|
pos = len - needleLength
|
||||||
|
}
|
||||||
|
|
||||||
|
// There was no match. If there's trailing haystack data that we cannot
|
||||||
|
// match yet using the Boyer-Moore-Horspool algorithm (because the trailing
|
||||||
|
// data is less than the needle size) then match using a modified
|
||||||
|
// algorithm that starts matching from the beginning instead of the end.
|
||||||
|
// Whatever trailing data is left after running this algorithm is added to
|
||||||
|
// the lookbehind buffer.
|
||||||
|
while (
|
||||||
|
pos < len &&
|
||||||
|
(
|
||||||
|
data[pos] !== needle[0] ||
|
||||||
|
(
|
||||||
|
(Buffer.compare(
|
||||||
|
data.subarray(pos, pos + len - pos),
|
||||||
|
needle.subarray(0, len - pos)
|
||||||
|
) !== 0)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
++pos
|
||||||
|
}
|
||||||
|
if (pos < len) {
|
||||||
|
data.copy(this._lookbehind, 0, pos, pos + (len - pos))
|
||||||
|
this._lookbehind_size = len - pos
|
||||||
|
}
|
||||||
|
|
||||||
|
// Everything until pos is guaranteed not to contain needle data.
|
||||||
|
if (pos > 0) { this.emit('info', false, data, this._bufpos, pos < len ? pos : len) }
|
||||||
|
|
||||||
|
this._bufpos = len
|
||||||
|
return len
|
||||||
|
}
|
||||||
|
|
||||||
|
SBMH.prototype._sbmh_lookup_char = function (data, pos) {
|
||||||
|
return (pos < 0)
|
||||||
|
? this._lookbehind[this._lookbehind_size + pos]
|
||||||
|
: data[pos]
|
||||||
|
}
|
||||||
|
|
||||||
|
SBMH.prototype._sbmh_memcmp = function (data, pos, len) {
|
||||||
|
for (var i = 0; i < len; ++i) { // eslint-disable-line no-var
|
||||||
|
if (this._sbmh_lookup_char(data, pos + i) !== this._needle[i]) { return false }
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = SBMH
|
||||||
|
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ 727:
|
||||||
|
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
|
||||||
|
const WritableStream = (__nccwpck_require__(4492).Writable)
|
||||||
|
const { inherits } = __nccwpck_require__(7261)
|
||||||
|
const Dicer = __nccwpck_require__(2960)
|
||||||
|
|
||||||
|
const MultipartParser = __nccwpck_require__(2183)
|
||||||
|
const UrlencodedParser = __nccwpck_require__(8306)
|
||||||
|
const parseParams = __nccwpck_require__(1854)
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ 2183:
|
||||||
|
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
|
||||||
|
// TODO:
|
||||||
|
// * support 1 nested multipart level
|
||||||
|
// (see second multipart example here:
|
||||||
|
// http://www.w3.org/TR/html401/interact/forms.html#didx-multipartform-data)
|
||||||
|
// * support limits.fieldNameSize
|
||||||
|
// -- this will require modifications to utils.parseParams
|
||||||
|
|
||||||
|
const { Readable } = __nccwpck_require__(4492)
|
||||||
|
const { inherits } = __nccwpck_require__(7261)
|
||||||
|
|
||||||
|
const Dicer = __nccwpck_require__(2960)
|
||||||
|
|
||||||
|
const parseParams = __nccwpck_require__(1854)
|
||||||
|
const decodeText = __nccwpck_require__(4619)
|
||||||
|
const basename = __nccwpck_require__(8647)
|
||||||
|
const getLimit = __nccwpck_require__(1467)
|
||||||
|
|
||||||
|
const RE_BOUNDARY = /^boundary$/i
|
||||||
|
const RE_FIELD = /^form-data$/i
|
||||||
|
const RE_CHARSET = /^charset$/i
|
||||||
|
const RE_FILENAME = /^filename$/i
|
||||||
|
const RE_NAME = /^name$/i
|
||||||
|
|
||||||
|
Multipart.detect = /^multipart\/form-data/i
|
||||||
|
function Multipart (boy, cfg) {
|
||||||
|
let i
|
||||||
|
let len
|
||||||
|
const self = this
|
||||||
|
let boundary
|
||||||
|
const limits = cfg.limits
|
||||||
|
const isPartAFile = cfg.isPartAFile || ((fieldName, contentType, fileName) => (contentType === 'application/octet-stream' || fileName !== undefined))
|
||||||
|
const parsedConType = cfg.parsedConType || []
|
||||||
|
const defCharset = cfg.defCharset || 'utf8'
|
||||||
|
const preservePath = cfg.preservePath
|
||||||
|
const fileOpts = { highWaterMark: cfg.fileHwm }
|
||||||
|
|
||||||
|
for (i = 0, len = parsedConType.length; i < len; ++i) {
|
||||||
|
if (Array.isArray(parsedConType[i]) &&
|
||||||
|
RE_BOUNDARY.test(parsedConType[i][0])) {
|
||||||
|
boundary = parsedConType[i][1]
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkFinished () {
|
||||||
|
if (nends === 0 && finished && !boy._done) {
|
||||||
|
finished = false
|
||||||
|
self.end()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof boundary !== 'string') { throw new Error('Multipart: Boundary not found') }
|
||||||
|
|
||||||
|
const fieldSizeLimit = getLimit(limits, 'fieldSize', 1 * 1024 * 1024)
|
||||||
|
const fileSizeLimit = getLimit(limits, 'fileSize', Infinity)
|
||||||
|
const filesLimit = getLimit(limits, 'files', Infinity)
|
||||||
|
const fieldsLimit = getLimit(limits, 'fields', Infinity)
|
||||||
|
const partsLimit = getLimit(limits, 'parts', Infinity)
|
||||||
|
const headerPairsLimit = getLimit(limits, 'headerPairs', 2000)
|
||||||
|
const headerSizeLimit = getLimit(limits, 'headerSize', 80 * 1024)
|
||||||
|
|
||||||
|
let nfiles = 0
|
||||||
|
let nfields = 0
|
||||||
|
let nends = 0
|
||||||
|
let curFile
|
||||||
|
let curField
|
||||||
|
let finished = false
|
||||||
|
|
||||||
|
this._needDrain = false
|
||||||
|
this._pause = false
|
||||||
|
this._cb = undefined
|
||||||
|
this._nparts = 0
|
||||||
|
this._boy = boy
|
||||||
|
|
||||||
|
const parserCfg = {
|
||||||
|
boundary,
|
||||||
|
maxHeaderPairs: headerPairsLimit,
|
||||||
|
maxHeaderSize: headerSizeLimit,
|
||||||
|
partHwm: fileOpts.highWaterMark,
|
||||||
|
highWaterMark: cfg.highWaterMark
|
||||||
|
}
|
||||||
|
|
||||||
|
this.parser = new Dicer(parserCfg)
|
||||||
|
this.parser.on('drain', function () {
|
||||||
|
self._needDrain = false
|
||||||
|
if (self._cb && !self._pause) {
|
||||||
|
const cb = self._cb
|
||||||
|
self._cb = undefined
|
||||||
|
cb()
|
||||||
|
}
|
||||||
|
}).on('part', function onPart (part) {
|
||||||
|
if (++self._nparts > partsLimit) {
|
||||||
|
self.parser.removeListener('part', onPart)
|
||||||
|
self.parser.on('part', skipPart)
|
||||||
|
boy.hitPartsLimit = true
|
||||||
|
boy.emit('partsLimit')
|
||||||
|
return skipPart(part)
|
||||||
|
}
|
||||||
|
|
||||||
|
// hack because streams2 _always_ doesn't emit 'end' until nextTick, so let
|
||||||
|
// us emit 'end' early since we know the part has ended if we are already
|
||||||
|
// seeing the next part
|
||||||
|
if (curField) {
|
||||||
|
const field = curField
|
||||||
|
field.emit('end')
|
||||||
|
field.removeAllListeners('end')
|
||||||
|
}
|
||||||
|
|
||||||
|
part.on('header', function (header) {
|
||||||
|
let contype
|
||||||
|
let fieldname
|
||||||
|
let parsed
|
||||||
|
let charset
|
||||||
|
let encoding
|
||||||
|
let filename
|
||||||
|
let nsize = 0
|
||||||
|
|
||||||
|
if (header['content-type']) {
|
||||||
|
parsed = parseParams(header['content-type'][0])
|
||||||
|
if (parsed[0]) {
|
||||||
|
contype = parsed[0].toLowerCase()
|
||||||
|
for (i = 0, len = parsed.length; i < len; ++i) {
|
||||||
|
if (RE_CHARSET.test(parsed[i][0])) {
|
||||||
|
charset = parsed[i][1].toLowerCase()
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (contype === undefined) { contype = 'text/plain' }
|
||||||
|
if (charset === undefined) { charset = defCharset }
|
||||||
|
|
||||||
|
if (header['content-disposition']) {
|
||||||
|
parsed = parseParams(header['content-disposition'][0])
|
||||||
|
if (!RE_FIELD.test(parsed[0])) { return skipPart(part) }
|
||||||
|
for (i = 0, len = parsed.length; i < len; ++i) {
|
||||||
|
if (RE_NAME.test(parsed[i][0])) {
|
||||||
|
fieldname = parsed[i][1]
|
||||||
|
} else if (RE_FILENAME.test(parsed[i][0])) {
|
||||||
|
filename = parsed[i][1]
|
||||||
|
if (!preservePath) { filename = basename(filename) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else { return skipPart(part) }
|
||||||
|
|
||||||
|
if (header['content-transfer-encoding']) { encoding = header['content-transfer-encoding'][0].toLowerCase() } else { encoding = '7bit' }
|
||||||
|
|
||||||
|
let onData,
|
||||||
|
onEnd
|
||||||
|
|
||||||
|
if (isPartAFile(fieldname, contype, filename)) {
|
||||||
|
// file/binary field
|
||||||
|
if (nfiles === filesLimit) {
|
||||||
|
if (!boy.hitFilesLimit) {
|
||||||
|
boy.hitFilesLimit = true
|
||||||
|
boy.emit('filesLimit')
|
||||||
|
}
|
||||||
|
return skipPart(part)
|
||||||
|
}
|
||||||
|
|
||||||
|
++nfiles
|
||||||
|
|
||||||
|
if (boy.listenerCount('file') === 0) {
|
||||||
|
self.parser._ignore()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
++nends
|
||||||
|
const file = new FileStream(fileOpts)
|
||||||
|
curFile = file
|
||||||
|
file.on('end', function () {
|
||||||
|
--nends
|
||||||
|
self._pause = false
|
||||||
|
checkFinished()
|
||||||
|
if (self._cb && !self._needDrain) {
|
||||||
|
const cb = self._cb
|
||||||
|
self._cb = undefined
|
||||||
|
cb()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
file._read = function (n) {
|
||||||
|
if (!self._pause) { return }
|
||||||
|
self._pause = false
|
||||||
|
if (self._cb && !self._needDrain) {
|
||||||
|
const cb = self._cb
|
||||||
|
self._cb = undefined
|
||||||
|
cb()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
boy.emit('file', fieldname, file, filename, encoding, contype)
|
||||||
|
|
||||||
|
onData = function (data) {
|
||||||
|
if ((nsize += data.length) > fileSizeLimit) {
|
||||||
|
const extralen = fileSizeLimit - nsize + data.length
|
||||||
|
if (extralen > 0) { file.push(data.slice(0, extralen)) }
|
||||||
|
file.truncated = true
|
||||||
|
file.bytesRead = fileSizeLimit
|
||||||
|
part.removeAllListeners('data')
|
||||||
|
file.emit('limit')
|
||||||
|
return
|
||||||
|
} else if (!file.push(data)) { self._pause = true }
|
||||||
|
|
||||||
|
file.bytesRead = nsize
|
||||||
|
}
|
||||||
|
|
||||||
|
onEnd = function () {
|
||||||
|
curFile = undefined
|
||||||
|
file.push(null)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// non-file field
|
||||||
|
if (nfields === fieldsLimit) {
|
||||||
|
if (!boy.hitFieldsLimit) {
|
||||||
|
boy.hitFieldsLimit = true
|
||||||
|
boy.emit('fieldsLimit')
|
||||||
|
}
|
||||||
|
return skipPart(part)
|
||||||
|
}
|
||||||
|
|
||||||
|
++nfields
|
||||||
|
++nends
|
||||||
|
let buffer = ''
|
||||||
|
let truncated = false
|
||||||
|
curField = part
|
||||||
|
|
||||||
|
onData = function (data) {
|
||||||
|
if ((nsize += data.length) > fieldSizeLimit) {
|
||||||
|
const extralen = (fieldSizeLimit - (nsize - data.length))
|
||||||
|
buffer += data.toString('binary', 0, extralen)
|
||||||
|
truncated = true
|
||||||
|
part.removeAllListeners('data')
|
||||||
|
} else { buffer += data.toString('binary') }
|
||||||
|
}
|
||||||
|
|
||||||
|
onEnd = function () {
|
||||||
|
curField = undefined
|
||||||
|
if (buffer.length) { buffer = decodeText(buffer, 'binary', charset) }
|
||||||
|
boy.emit('field', fieldname, buffer, false, truncated, encoding, contype)
|
||||||
|
--nends
|
||||||
|
checkFinished()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* As of node@2efe4ab761666 (v0.10.29+/v0.11.14+), busboy had become
|
||||||
|
broken. Streams2/streams3 is a huge black box of confusion, but
|
||||||
|
somehow overriding the sync state seems to fix things again (and still
|
||||||
|
seems to work for previous node versions).
|
||||||
|
*/
|
||||||
|
part._readableState.sync = false
|
||||||
|
|
||||||
|
part.on('data', onData)
|
||||||
|
part.on('end', onEnd)
|
||||||
|
}).on('error', function (err) {
|
||||||
|
if (curFile) { curFile.emit('error', err) }
|
||||||
|
})
|
||||||
|
}).on('error', function (err) {
|
||||||
|
boy.emit('error', err)
|
||||||
|
}).on('finish', function () {
|
||||||
|
finished = true
|
||||||
|
checkFinished()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
Multipart.prototype.write = function (chunk, cb) {
|
||||||
|
const r = this.parser.write(chunk)
|
||||||
|
if (r && !this._pause) {
|
||||||
|
cb()
|
||||||
|
} else {
|
||||||
|
this._needDrain = !r
|
||||||
|
this._cb = cb
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Multipart.prototype.end = function () {
|
||||||
|
const self = this
|
||||||
|
|
||||||
|
if (self.parser.writable) {
|
||||||
|
self.parser.end()
|
||||||
|
} else if (!self._boy._done) {
|
||||||
|
process.nextTick(function () {
|
||||||
|
self._boy._done = true
|
||||||
|
self._boy.emit('finish')
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function skipPart (part) {
|
||||||
|
part.resume()
|
||||||
|
}
|
||||||
|
|
||||||
|
function FileStream (opts) {
|
||||||
|
Readable.call(this, opts)
|
||||||
|
|
||||||
|
this.bytesRead = 0
|
||||||
|
|
||||||
|
this.truncated = false
|
||||||
|
}
|
||||||
|
|
||||||
|
inherits(FileStream, Readable)
|
||||||
|
|
||||||
|
FileStream.prototype._read = function (n) {}
|
||||||
|
|
||||||
|
module.exports = Multipart
|
||||||
|
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ 8306:
|
||||||
|
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
|
||||||
|
const Decoder = __nccwpck_require__(7100)
|
||||||
|
const decodeText = __nccwpck_require__(4619)
|
||||||
|
const getLimit = __nccwpck_require__(1467)
|
||||||
|
|
||||||
|
const RE_CHARSET = /^charset$/i
|
||||||
|
|
||||||
|
UrlEncoded.detect = /^application\/x-www-form-urlencoded/i
|
||||||
|
function UrlEncoded (boy, cfg) {
|
||||||
|
const limits = cfg.limits
|
||||||
|
const parsedConType = cfg.parsedConType
|
||||||
|
this.boy = boy
|
||||||
|
|
||||||
|
this.fieldSizeLimit = getLimit(limits, 'fieldSize', 1 * 1024 * 1024)
|
||||||
|
this.fieldNameSizeLimit = getLimit(limits, 'fieldNameSize', 100)
|
||||||
|
this.fieldsLimit = getLimit(limits, 'fields', Infinity)
|
||||||
|
|
||||||
|
let charset
|
||||||
|
for (var i = 0, len = parsedConType.length; i < len; ++i) { // eslint-disable-line no-var
|
||||||
|
if (Array.isArray(parsedConType[i]) &&
|
||||||
|
RE_CHARSET.test(parsedConType[i][0])) {
|
||||||
|
charset = parsedConType[i][1].toLowerCase()
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (charset === undefined) { charset = cfg.defCharset || 'utf8' }
|
||||||
|
|
||||||
|
this.decoder = new Decoder()
|
||||||
|
this.charset = charset
|
||||||
|
this._fields = 0
|
||||||
|
this._state = 'key'
|
||||||
|
this._checkingBytes = true
|
||||||
|
this._bytesKey = 0
|
||||||
|
this._bytesVal = 0
|
||||||
|
this._key = ''
|
||||||
|
this._val = ''
|
||||||
|
this._keyTrunc = false
|
||||||
|
this._valTrunc = false
|
||||||
|
this._hitLimit = false
|
||||||
|
}
|
||||||
|
|
||||||
|
UrlEncoded.prototype.write = function (data, cb) {
|
||||||
|
if (this._fields === this.fieldsLimit) {
|
||||||
|
if (!this.boy.hitFieldsLimit) {
|
||||||
|
this.boy.hitFieldsLimit = true
|
||||||
|
this.boy.emit('fieldsLimit')
|
||||||
|
}
|
||||||
|
return cb()
|
||||||
|
}
|
||||||
|
|
||||||
|
let idxeq; let idxamp; let i; let p = 0; const len = data.length
|
||||||
|
|
||||||
|
while (p < len) {
|
||||||
|
if (this._state === 'key') {
|
||||||
|
idxeq = idxamp = undefined
|
||||||
|
for (i = p; i < len; ++i) {
|
||||||
|
if (!this._checkingBytes) { ++p }
|
||||||
|
if (data[i] === 0x3D/* = */) {
|
||||||
|
idxeq = i
|
||||||
|
break
|
||||||
|
} else if (data[i] === 0x26/* & */) {
|
||||||
|
idxamp = i
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if (this._checkingBytes && this._bytesKey === this.fieldNameSizeLimit) {
|
||||||
|
this._hitLimit = true
|
||||||
|
break
|
||||||
|
} else if (this._checkingBytes) { ++this._bytesKey }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (idxeq !== undefined) {
|
||||||
|
// key with assignment
|
||||||
|
if (idxeq > p) { this._key += this.decoder.write(data.toString('binary', p, idxeq)) }
|
||||||
|
this._state = 'val'
|
||||||
|
|
||||||
|
this._hitLimit = false
|
||||||
|
this._checkingBytes = true
|
||||||
|
this._val = ''
|
||||||
|
this._bytesVal = 0
|
||||||
|
this._valTrunc = false
|
||||||
|
this.decoder.reset()
|
||||||
|
|
||||||
|
p = idxeq + 1
|
||||||
|
} else if (idxamp !== undefined) {
|
||||||
|
// key with no assignment
|
||||||
|
++this._fields
|
||||||
|
let key; const keyTrunc = this._keyTrunc
|
||||||
|
if (idxamp > p) { key = (this._key += this.decoder.write(data.toString('binary', p, idxamp))) } else { key = this._key }
|
||||||
|
|
||||||
|
this._hitLimit = false
|
||||||
|
this._checkingBytes = true
|
||||||
|
this._key = ''
|
||||||
|
this._bytesKey = 0
|
||||||
|
this._keyTrunc = false
|
||||||
|
this.decoder.reset()
|
||||||
|
|
||||||
|
if (key.length) {
|
||||||
|
this.boy.emit('field', decodeText(key, 'binary', this.charset),
|
||||||
|
'',
|
||||||
|
keyTrunc,
|
||||||
|
false)
|
||||||
|
}
|
||||||
|
|
||||||
|
p = idxamp + 1
|
||||||
|
if (this._fields === this.fieldsLimit) { return cb() }
|
||||||
|
} else if (this._hitLimit) {
|
||||||
|
// we may not have hit the actual limit if there are encoded bytes...
|
||||||
|
if (i > p) { this._key += this.decoder.write(data.toString('binary', p, i)) }
|
||||||
|
p = i
|
||||||
|
if ((this._bytesKey = this._key.length) === this.fieldNameSizeLimit) {
|
||||||
|
// yep, we actually did hit the limit
|
||||||
|
this._checkingBytes = false
|
||||||
|
this._keyTrunc = true
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (p < len) { this._key += this.decoder.write(data.toString('binary', p)) }
|
||||||
|
p = len
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
idxamp = undefined
|
||||||
|
for (i = p; i < len; ++i) {
|
||||||
|
if (!this._checkingBytes) { ++p }
|
||||||
|
if (data[i] === 0x26/* & */) {
|
||||||
|
idxamp = i
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if (this._checkingBytes && this._bytesVal === this.fieldSizeLimit) {
|
||||||
|
this._hitLimit = true
|
||||||
|
break
|
||||||
|
} else if (this._checkingBytes) { ++this._bytesVal }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (idxamp !== undefined) {
|
||||||
|
++this._fields
|
||||||
|
if (idxamp > p) { this._val += this.decoder.write(data.toString('binary', p, idxamp)) }
|
||||||
|
this.boy.emit('field', decodeText(this._key, 'binary', this.charset),
|
||||||
|
decodeText(this._val, 'binary', this.charset),
|
||||||
|
this._keyTrunc,
|
||||||
|
this._valTrunc)
|
||||||
|
this._state = 'key'
|
||||||
|
|
||||||
|
this._hitLimit = false
|
||||||
|
this._checkingBytes = true
|
||||||
|
this._key = ''
|
||||||
|
this._bytesKey = 0
|
||||||
|
this._keyTrunc = false
|
||||||
|
this.decoder.reset()
|
||||||
|
|
||||||
|
p = idxamp + 1
|
||||||
|
if (this._fields === this.fieldsLimit) { return cb() }
|
||||||
|
} else if (this._hitLimit) {
|
||||||
|
// we may not have hit the actual limit if there are encoded bytes...
|
||||||
|
if (i > p) { this._val += this.decoder.write(data.toString('binary', p, i)) }
|
||||||
|
p = i
|
||||||
|
if ((this._val === '' && this.fieldSizeLimit === 0) ||
|
||||||
|
(this._bytesVal = this._val.length) === this.fieldSizeLimit) {
|
||||||
|
// yep, we actually did hit the limit
|
||||||
|
this._checkingBytes = false
|
||||||
|
this._valTrunc = true
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (p < len) { this._val += this.decoder.write(data.toString('binary', p)) }
|
||||||
|
p = len
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cb()
|
||||||
|
}
|
||||||
|
|
||||||
|
UrlEncoded.prototype.end = function () {
|
||||||
|
if (this.boy._done) { return }
|
||||||
|
|
||||||
|
if (this._state === 'key' && this._key.length > 0) {
|
||||||
|
this.boy.emit('field', decodeText(this._key, 'binary', this.charset),
|
||||||
|
'',
|
||||||
|
this._keyTrunc,
|
||||||
|
false)
|
||||||
|
} else if (this._state === 'val') {
|
||||||
|
this.boy.emit('field', decodeText(this._key, 'binary', this.charset),
|
||||||
|
decodeText(this._val, 'binary', this.charset),
|
||||||
|
this._keyTrunc,
|
||||||
|
this._valTrunc)
|
||||||
|
}
|
||||||
|
this.boy._done = true
|
||||||
|
this.boy.emit('finish')
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = UrlEncoded
|
||||||
|
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ 7100:
|
||||||
|
/***/ ((module) => {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
|
||||||
|
const RE_PLUS = /\+/g
|
||||||
|
|
||||||
|
const HEX = [
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||||
|
]
|
||||||
|
|
||||||
|
function Decoder () {
|
||||||
|
this.buffer = undefined
|
||||||
|
}
|
||||||
|
Decoder.prototype.write = function (str) {
|
||||||
|
// Replace '+' with ' ' before decoding
|
||||||
|
str = str.replace(RE_PLUS, ' ')
|
||||||
|
let res = ''
|
||||||
|
let i = 0; let p = 0; const len = str.length
|
||||||
|
for (; i < len; ++i) {
|
||||||
|
if (this.buffer !== undefined) {
|
||||||
|
if (!HEX[str.charCodeAt(i)]) {
|
||||||
|
res += '%' + this.buffer
|
||||||
|
this.buffer = undefined
|
||||||
|
--i // retry character
|
||||||
|
} else {
|
||||||
|
this.buffer += str[i]
|
||||||
|
++p
|
||||||
|
if (this.buffer.length === 2) {
|
||||||
|
res += String.fromCharCode(parseInt(this.buffer, 16))
|
||||||
|
this.buffer = undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (str[i] === '%') {
|
||||||
|
if (i > p) {
|
||||||
|
res += str.substring(p, i)
|
||||||
|
p = i
|
||||||
|
}
|
||||||
|
this.buffer = ''
|
||||||
|
++p
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (p < len && this.buffer === undefined) { res += str.substring(p) }
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
Decoder.prototype.reset = function () {
|
||||||
|
this.buffer = undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Decoder
|
||||||
|
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ 8647:
|
||||||
|
/***/ ((module) => {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
|
||||||
|
module.exports = function basename (path) {
|
||||||
|
if (typeof path !== 'string') { return '' }
|
||||||
|
for (var i = path.length - 1; i >= 0; --i) { // eslint-disable-line no-var
|
||||||
|
switch (path.charCodeAt(i)) {
|
||||||
|
case 0x2F: // '/'
|
||||||
|
case 0x5C: // '\'
|
||||||
|
path = path.slice(i + 1)
|
||||||
|
return (path === '..' || path === '.' ? '' : path)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (path === '..' || path === '.' ? '' : path)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ 4619:
|
||||||
|
/***/ (function(module) {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
|
||||||
|
// Node has always utf-8
|
||||||
|
const utf8Decoder = new TextDecoder('utf-8')
|
||||||
|
const textDecoders = new Map([
|
||||||
|
['utf-8', utf8Decoder],
|
||||||
|
['utf8', utf8Decoder]
|
||||||
|
])
|
||||||
|
|
||||||
|
function getDecoder (charset) {
|
||||||
|
let lc
|
||||||
|
while (true) {
|
||||||
|
switch (charset) {
|
||||||
|
case 'utf-8':
|
||||||
|
case 'utf8':
|
||||||
|
return decoders.utf8
|
||||||
|
case 'latin1':
|
||||||
|
case 'ascii': // TODO: Make these a separate, strict decoder?
|
||||||
|
case 'us-ascii':
|
||||||
|
case 'iso-8859-1':
|
||||||
|
case 'iso8859-1':
|
||||||
|
case 'iso88591':
|
||||||
|
case 'iso_8859-1':
|
||||||
|
case 'windows-1252':
|
||||||
|
case 'iso_8859-1:1987':
|
||||||
|
case 'cp1252':
|
||||||
|
case 'x-cp1252':
|
||||||
|
return decoders.latin1
|
||||||
|
case 'utf16le':
|
||||||
|
case 'utf-16le':
|
||||||
|
case 'ucs2':
|
||||||
|
case 'ucs-2':
|
||||||
|
return decoders.utf16le
|
||||||
|
case 'base64':
|
||||||
|
return decoders.base64
|
||||||
|
default:
|
||||||
|
if (lc === undefined) {
|
||||||
|
lc = true
|
||||||
|
charset = charset.toLowerCase()
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
return decoders.other.bind(charset)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const decoders = {
|
||||||
|
utf8: (data, sourceEncoding) => {
|
||||||
|
if (data.length === 0) {
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
if (typeof data === 'string') {
|
||||||
|
data = Buffer.from(data, sourceEncoding)
|
||||||
|
}
|
||||||
|
return data.utf8Slice(0, data.length)
|
||||||
|
},
|
||||||
|
|
||||||
|
latin1: (data, sourceEncoding) => {
|
||||||
|
if (data.length === 0) {
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
if (typeof data === 'string') {
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
return data.latin1Slice(0, data.length)
|
||||||
|
},
|
||||||
|
|
||||||
|
utf16le: (data, sourceEncoding) => {
|
||||||
|
if (data.length === 0) {
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
if (typeof data === 'string') {
|
||||||
|
data = Buffer.from(data, sourceEncoding)
|
||||||
|
}
|
||||||
|
return data.ucs2Slice(0, data.length)
|
||||||
|
},
|
||||||
|
|
||||||
|
base64: (data, sourceEncoding) => {
|
||||||
|
if (data.length === 0) {
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
if (typeof data === 'string') {
|
||||||
|
data = Buffer.from(data, sourceEncoding)
|
||||||
|
}
|
||||||
|
return data.base64Slice(0, data.length)
|
||||||
|
},
|
||||||
|
|
||||||
|
other: (data, sourceEncoding) => {
|
||||||
|
if (data.length === 0) {
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
if (typeof data === 'string') {
|
||||||
|
data = Buffer.from(data, sourceEncoding)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (textDecoders.has(this.toString())) {
|
||||||
|
try {
|
||||||
|
return textDecoders.get(this).decode(data)
|
||||||
|
} catch {}
|
||||||
|
}
|
||||||
|
return typeof data === 'string'
|
||||||
|
? data
|
||||||
|
: data.toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function decodeText (text, sourceEncoding, destEncoding) {
|
||||||
|
if (text) {
|
||||||
|
return getDecoder(destEncoding)(text, sourceEncoding)
|
||||||
|
}
|
||||||
|
return text
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = decodeText
|
||||||
|
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ 1467:
|
||||||
|
/***/ ((module) => {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
|
||||||
|
module.exports = function getLimit (limits, name, defaultLimit) {
|
||||||
|
if (
|
||||||
|
!limits ||
|
||||||
|
limits[name] === undefined ||
|
||||||
|
limits[name] === null
|
||||||
|
) { return defaultLimit }
|
||||||
|
|
||||||
|
if (
|
||||||
|
typeof limits[name] !== 'number' ||
|
||||||
|
isNaN(limits[name])
|
||||||
|
) { throw new TypeError('Limit ' + name + ' is not a valid number') }
|
||||||
|
|
||||||
|
return limits[name]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ 1854:
|
||||||
|
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
/* eslint-disable object-property-newline */
|
||||||
|
|
||||||
|
|
||||||
|
const decodeText = __nccwpck_require__(4619)
|
||||||
|
|
||||||
|
const RE_ENCODED = /%[a-fA-F0-9][a-fA-F0-9]/g
|
||||||
|
|
||||||
|
const EncodedLookup = {
|
||||||
|
'%00': '\x00', '%01': '\x01', '%02': '\x02', '%03': '\x03', '%04': '\x04',
|
||||||
|
'%05': '\x05', '%06': '\x06', '%07': '\x07', '%08': '\x08', '%09': '\x09',
|
||||||
|
'%0a': '\x0a', '%0A': '\x0a', '%0b': '\x0b', '%0B': '\x0b', '%0c': '\x0c',
|
||||||
|
'%0C': '\x0c', '%0d': '\x0d', '%0D': '\x0d', '%0e': '\x0e', '%0E': '\x0e',
|
||||||
|
'%0f': '\x0f', '%0F': '\x0f', '%10': '\x10', '%11': '\x11', '%12': '\x12',
|
||||||
|
'%13': '\x13', '%14': '\x14', '%15': '\x15', '%16': '\x16', '%17': '\x17',
|
||||||
|
'%18': '\x18', '%19': '\x19', '%1a': '\x1a', '%1A': '\x1a', '%1b': '\x1b',
|
||||||
|
'%1B': '\x1b', '%1c': '\x1c', '%1C': '\x1c', '%1d': '\x1d', '%1D': '\x1d',
|
||||||
|
'%1e': '\x1e', '%1E': '\x1e', '%1f': '\x1f', '%1F': '\x1f', '%20': '\x20',
|
||||||
|
'%21': '\x21', '%22': '\x22', '%23': '\x23', '%24': '\x24', '%25': '\x25',
|
||||||
|
'%26': '\x26', '%27': '\x27', '%28': '\x28', '%29': '\x29', '%2a': '\x2a',
|
||||||
|
'%2A': '\x2a', '%2b': '\x2b', '%2B': '\x2b', '%2c': '\x2c', '%2C': '\x2c',
|
||||||
|
'%2d': '\x2d', '%2D': '\x2d', '%2e': '\x2e', '%2E': '\x2e', '%2f': '\x2f',
|
||||||
|
'%2F': '\x2f', '%30': '\x30', '%31': '\x31', '%32': '\x32', '%33': '\x33',
|
||||||
|
'%34': '\x34', '%35': '\x35', '%36': '\x36', '%37': '\x37', '%38': '\x38',
|
||||||
|
'%39': '\x39', '%3a': '\x3a', '%3A': '\x3a', '%3b': '\x3b', '%3B': '\x3b',
|
||||||
|
'%3c': '\x3c', '%3C': '\x3c', '%3d': '\x3d', '%3D': '\x3d', '%3e': '\x3e',
|
||||||
|
'%3E': '\x3e', '%3f': '\x3f', '%3F': '\x3f', '%40': '\x40', '%41': '\x41',
|
||||||
|
'%42': '\x42', '%43': '\x43', '%44': '\x44', '%45': '\x45', '%46': '\x46',
|
||||||
|
'%47': '\x47', '%48': '\x48', '%49': '\x49', '%4a': '\x4a', '%4A': '\x4a',
|
||||||
|
'%4b': '\x4b', '%4B': '\x4b', '%4c': '\x4c', '%4C': '\x4c', '%4d': '\x4d',
|
||||||
|
'%4D': '\x4d', '%4e': '\x4e', '%4E': '\x4e', '%4f': '\x4f', '%4F': '\x4f',
|
||||||
|
'%50': '\x50', '%51': '\x51', '%52': '\x52', '%53': '\x53', '%54': '\x54',
|
||||||
|
'%55': '\x55', '%56': '\x56', '%57': '\x57', '%58': '\x58', '%59': '\x59',
|
||||||
|
'%5a': '\x5a', '%5A': '\x5a', '%5b': '\x5b', '%5B': '\x5b', '%5c': '\x5c',
|
||||||
|
'%5C': '\x5c', '%5d': '\x5d', '%5D': '\x5d', '%5e': '\x5e', '%5E': '\x5e',
|
||||||
|
'%5f': '\x5f', '%5F': '\x5f', '%60': '\x60', '%61': '\x61', '%62': '\x62',
|
||||||
|
'%63': '\x63', '%64': '\x64', '%65': '\x65', '%66': '\x66', '%67': '\x67',
|
||||||
|
'%68': '\x68', '%69': '\x69', '%6a': '\x6a', '%6A': '\x6a', '%6b': '\x6b',
|
||||||
|
'%6B': '\x6b', '%6c': '\x6c', '%6C': '\x6c', '%6d': '\x6d', '%6D': '\x6d',
|
||||||
|
'%6e': '\x6e', '%6E': '\x6e', '%6f': '\x6f', '%6F': '\x6f', '%70': '\x70',
|
||||||
|
'%71': '\x71', '%72': '\x72', '%73': '\x73', '%74': '\x74', '%75': '\x75',
|
||||||
|
'%76': '\x76', '%77': '\x77', '%78': '\x78', '%79': '\x79', '%7a': '\x7a',
|
||||||
|
'%7A': '\x7a', '%7b': '\x7b', '%7B': '\x7b', '%7c': '\x7c', '%7C': '\x7c',
|
||||||
|
'%7d': '\x7d', '%7D': '\x7d', '%7e': '\x7e', '%7E': '\x7e', '%7f': '\x7f',
|
||||||
|
'%7F': '\x7f', '%80': '\x80', '%81': '\x81', '%82': '\x82', '%83': '\x83',
|
||||||
|
'%84': '\x84', '%85': '\x85', '%86': '\x86', '%87': '\x87', '%88': '\x88',
|
||||||
|
'%89': '\x89', '%8a': '\x8a', '%8A': '\x8a', '%8b': '\x8b', '%8B': '\x8b',
|
||||||
|
'%8c': '\x8c', '%8C': '\x8c', '%8d': '\x8d', '%8D': '\x8d', '%8e': '\x8e',
|
||||||
|
'%8E': '\x8e', '%8f': '\x8f', '%8F': '\x8f', '%90': '\x90', '%91': '\x91',
|
||||||
|
'%92': '\x92', '%93': '\x93', '%94': '\x94', '%95': '\x95', '%96': '\x96',
|
||||||
|
'%97': '\x97', '%98': '\x98', '%99': '\x99', '%9a': '\x9a', '%9A': '\x9a',
|
||||||
|
'%9b': '\x9b', '%9B': '\x9b', '%9c': '\x9c', '%9C': '\x9c', '%9d': '\x9d',
|
||||||
|
'%9D': '\x9d', '%9e': '\x9e', '%9E': '\x9e', '%9f': '\x9f', '%9F': '\x9f',
|
||||||
|
'%a0': '\xa0', '%A0': '\xa0', '%a1': '\xa1', '%A1': '\xa1', '%a2': '\xa2',
|
||||||
|
'%A2': '\xa2', '%a3': '\xa3', '%A3': '\xa3', '%a4': '\xa4', '%A4': '\xa4',
|
||||||
|
'%a5': '\xa5', '%A5': '\xa5', '%a6': '\xa6', '%A6': '\xa6', '%a7': '\xa7',
|
||||||
|
'%A7': '\xa7', '%a8': '\xa8', '%A8': '\xa8', '%a9': '\xa9', '%A9': '\xa9',
|
||||||
|
'%aa': '\xaa', '%Aa': '\xaa', '%aA': '\xaa', '%AA': '\xaa', '%ab': '\xab',
|
||||||
|
'%Ab': '\xab', '%aB': '\xab', '%AB': '\xab', '%ac': '\xac', '%Ac': '\xac',
|
||||||
|
'%aC': '\xac', '%AC': '\xac', '%ad': '\xad', '%Ad': '\xad', '%aD': '\xad',
|
||||||
|
'%AD': '\xad', '%ae': '\xae', '%Ae': '\xae', '%aE': '\xae', '%AE': '\xae',
|
||||||
|
'%af': '\xaf', '%Af': '\xaf', '%aF': '\xaf', '%AF': '\xaf', '%b0': '\xb0',
|
||||||
|
'%B0': '\xb0', '%b1': '\xb1', '%B1': '\xb1', '%b2': '\xb2', '%B2': '\xb2',
|
||||||
|
'%b3': '\xb3', '%B3': '\xb3', '%b4': '\xb4', '%B4': '\xb4', '%b5': '\xb5',
|
||||||
|
'%B5': '\xb5', '%b6': '\xb6', '%B6': '\xb6', '%b7': '\xb7', '%B7': '\xb7',
|
||||||
|
'%b8': '\xb8', '%B8': '\xb8', '%b9': '\xb9', '%B9': '\xb9', '%ba': '\xba',
|
||||||
|
'%Ba': '\xba', '%bA': '\xba', '%BA': '\xba', '%bb': '\xbb', '%Bb': '\xbb',
|
||||||
|
'%bB': '\xbb', '%BB': '\xbb', '%bc': '\xbc', '%Bc': '\xbc', '%bC': '\xbc',
|
||||||
|
'%BC': '\xbc', '%bd': '\xbd', '%Bd': '\xbd', '%bD': '\xbd', '%BD': '\xbd',
|
||||||
|
'%be': '\xbe', '%Be': '\xbe', '%bE': '\xbe', '%BE': '\xbe', '%bf': '\xbf',
|
||||||
|
'%Bf': '\xbf', '%bF': '\xbf', '%BF': '\xbf', '%c0': '\xc0', '%C0': '\xc0',
|
||||||
|
'%c1': '\xc1', '%C1': '\xc1', '%c2': '\xc2', '%C2': '\xc2', '%c3': '\xc3',
|
||||||
|
'%C3': '\xc3', '%c4': '\xc4', '%C4': '\xc4', '%c5': '\xc5', '%C5': '\xc5',
|
||||||
|
'%c6': '\xc6', '%C6': '\xc6', '%c7': '\xc7', '%C7': '\xc7', '%c8': '\xc8',
|
||||||
|
'%C8': '\xc8', '%c9': '\xc9', '%C9': '\xc9', '%ca': '\xca', '%Ca': '\xca',
|
||||||
|
'%cA': '\xca', '%CA': '\xca', '%cb': '\xcb', '%Cb': '\xcb', '%cB': '\xcb',
|
||||||
|
'%CB': '\xcb', '%cc': '\xcc', '%Cc': '\xcc', '%cC': '\xcc', '%CC': '\xcc',
|
||||||
|
'%cd': '\xcd', '%Cd': '\xcd', '%cD': '\xcd', '%CD': '\xcd', '%ce': '\xce',
|
||||||
|
'%Ce': '\xce', '%cE': '\xce', '%CE': '\xce', '%cf': '\xcf', '%Cf': '\xcf',
|
||||||
|
'%cF': '\xcf', '%CF': '\xcf', '%d0': '\xd0', '%D0': '\xd0', '%d1': '\xd1',
|
||||||
|
'%D1': '\xd1', '%d2': '\xd2', '%D2': '\xd2', '%d3': '\xd3', '%D3': '\xd3',
|
||||||
|
'%d4': '\xd4', '%D4': '\xd4', '%d5': '\xd5', '%D5': '\xd5', '%d6': '\xd6',
|
||||||
|
'%D6': '\xd6', '%d7': '\xd7', '%D7': '\xd7', '%d8': '\xd8', '%D8': '\xd8',
|
||||||
|
'%d9': '\xd9', '%D9': '\xd9', '%da': '\xda', '%Da': '\xda', '%dA': '\xda',
|
||||||
|
'%DA': '\xda', '%db': '\xdb', '%Db': '\xdb', '%dB': '\xdb', '%DB': '\xdb',
|
||||||
|
'%dc': '\xdc', '%Dc': '\xdc', '%dC': '\xdc', '%DC': '\xdc', '%dd': '\xdd',
|
||||||
|
'%Dd': '\xdd', '%dD': '\xdd', '%DD': '\xdd', '%de': '\xde', '%De': '\xde',
|
||||||
|
'%dE': '\xde', '%DE': '\xde', '%df': '\xdf', '%Df': '\xdf', '%dF': '\xdf',
|
||||||
|
'%DF': '\xdf', '%e0': '\xe0', '%E0': '\xe0', '%e1': '\xe1', '%E1': '\xe1',
|
||||||
|
'%e2': '\xe2', '%E2': '\xe2', '%e3': '\xe3', '%E3': '\xe3', '%e4': '\xe4',
|
||||||
|
'%E4': '\xe4', '%e5': '\xe5', '%E5': '\xe5', '%e6': '\xe6', '%E6': '\xe6',
|
||||||
|
'%e7': '\xe7', '%E7': '\xe7', '%e8': '\xe8', '%E8': '\xe8', '%e9': '\xe9',
|
||||||
|
'%E9': '\xe9', '%ea': '\xea', '%Ea': '\xea', '%eA': '\xea', '%EA': '\xea',
|
||||||
|
'%eb': '\xeb', '%Eb': '\xeb', '%eB': '\xeb', '%EB': '\xeb', '%ec': '\xec',
|
||||||
|
'%Ec': '\xec', '%eC': '\xec', '%EC': '\xec', '%ed': '\xed', '%Ed': '\xed',
|
||||||
|
'%eD': '\xed', '%ED': '\xed', '%ee': '\xee', '%Ee': '\xee', '%eE': '\xee',
|
||||||
|
'%EE': '\xee', '%ef': '\xef', '%Ef': '\xef', '%eF': '\xef', '%EF': '\xef',
|
||||||
|
'%f0': '\xf0', '%F0': '\xf0', '%f1': '\xf1', '%F1': '\xf1', '%f2': '\xf2',
|
||||||
|
'%F2': '\xf2', '%f3': '\xf3', '%F3': '\xf3', '%f4': '\xf4', '%F4': '\xf4',
|
||||||
|
'%f5': '\xf5', '%F5': '\xf5', '%f6': '\xf6', '%F6': '\xf6', '%f7': '\xf7',
|
||||||
|
'%F7': '\xf7', '%f8': '\xf8', '%F8': '\xf8', '%f9': '\xf9', '%F9': '\xf9',
|
||||||
|
'%fa': '\xfa', '%Fa': '\xfa', '%fA': '\xfa', '%FA': '\xfa', '%fb': '\xfb',
|
||||||
|
'%Fb': '\xfb', '%fB': '\xfb', '%FB': '\xfb', '%fc': '\xfc', '%Fc': '\xfc',
|
||||||
|
'%fC': '\xfc', '%FC': '\xfc', '%fd': '\xfd', '%Fd': '\xfd', '%fD': '\xfd',
|
||||||
|
'%FD': '\xfd', '%fe': '\xfe', '%Fe': '\xfe', '%fE': '\xfe', '%FE': '\xfe',
|
||||||
|
'%ff': '\xff', '%Ff': '\xff', '%fF': '\xff', '%FF': '\xff'
|
||||||
|
}
|
||||||
|
|
||||||
|
function encodedReplacer (match) {
|
||||||
|
return EncodedLookup[match]
|
||||||
|
}
|
||||||
|
|
||||||
|
const STATE_KEY = 0
|
||||||
|
const STATE_VALUE = 1
|
||||||
|
const STATE_CHARSET = 2
|
||||||
|
const STATE_LANG = 3
|
||||||
|
|
||||||
|
function parseParams (str) {
|
||||||
|
const res = []
|
||||||
|
let state = STATE_KEY
|
||||||
|
let charset = ''
|
||||||
|
let inquote = false
|
||||||
|
let escaping = false
|
||||||
|
let p = 0
|
||||||
|
let tmp = ''
|
||||||
|
const len = str.length
|
||||||
|
|
||||||
|
for (var i = 0; i < len; ++i) { // eslint-disable-line no-var
|
||||||
|
const char = str[i]
|
||||||
|
if (char === '\\' && inquote) {
|
||||||
|
if (escaping) { escaping = false } else {
|
||||||
|
escaping = true
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
} else if (char === '"') {
|
||||||
|
if (!escaping) {
|
||||||
|
if (inquote) {
|
||||||
|
inquote = false
|
||||||
|
state = STATE_KEY
|
||||||
|
} else { inquote = true }
|
||||||
|
continue
|
||||||
|
} else { escaping = false }
|
||||||
|
} else {
|
||||||
|
if (escaping && inquote) { tmp += '\\' }
|
||||||
|
escaping = false
|
||||||
|
if ((state === STATE_CHARSET || state === STATE_LANG) && char === "'") {
|
||||||
|
if (state === STATE_CHARSET) {
|
||||||
|
state = STATE_LANG
|
||||||
|
charset = tmp.substring(1)
|
||||||
|
} else { state = STATE_VALUE }
|
||||||
|
tmp = ''
|
||||||
|
continue
|
||||||
|
} else if (state === STATE_KEY &&
|
||||||
|
(char === '*' || char === '=') &&
|
||||||
|
res.length) {
|
||||||
|
state = char === '*'
|
||||||
|
? STATE_CHARSET
|
||||||
|
: STATE_VALUE
|
||||||
|
res[p] = [tmp, undefined]
|
||||||
|
tmp = ''
|
||||||
|
continue
|
||||||
|
} else if (!inquote && char === ';') {
|
||||||
|
state = STATE_KEY
|
||||||
|
if (charset) {
|
||||||
|
if (tmp.length) {
|
||||||
|
tmp = decodeText(tmp.replace(RE_ENCODED, encodedReplacer),
|
||||||
|
'binary',
|
||||||
|
charset)
|
||||||
|
}
|
||||||
|
charset = ''
|
||||||
|
} else if (tmp.length) {
|
||||||
|
tmp = decodeText(tmp, 'binary', 'utf8')
|
||||||
|
}
|
||||||
|
if (res[p] === undefined) { res[p] = tmp } else { res[p][1] = tmp }
|
||||||
|
tmp = ''
|
||||||
|
++p
|
||||||
|
continue
|
||||||
|
} else if (!inquote && (char === ' ' || char === '\t')) { continue }
|
||||||
|
}
|
||||||
|
tmp += char
|
||||||
|
}
|
||||||
|
if (charset && tmp.length) {
|
||||||
|
tmp = decodeText(tmp.replace(RE_ENCODED, encodedReplacer),
|
||||||
|
'binary',
|
||||||
|
charset)
|
||||||
|
} else if (tmp) {
|
||||||
|
tmp = decodeText(tmp, 'binary', 'utf8')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (res[p] === undefined) {
|
||||||
|
if (tmp) { res[p] = tmp }
|
||||||
|
} else { res[p][1] = tmp }
|
||||||
|
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = parseParams
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
|
|
||||||
/***/ 9167:
|
/***/ 9167:
|
||||||
|
|||||||
3075
dist/setup/index.js
vendored
3075
dist/setup/index.js
vendored
@ -48428,1428 +48428,6 @@ exports.newPipeline = newPipeline;
|
|||||||
//# sourceMappingURL=index.js.map
|
//# sourceMappingURL=index.js.map
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
|
||||||
|
|
||||||
/***/ 2856:
|
|
||||||
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
|
|
||||||
const WritableStream = (__nccwpck_require__(4492).Writable)
|
|
||||||
const inherits = (__nccwpck_require__(7261).inherits)
|
|
||||||
|
|
||||||
const StreamSearch = __nccwpck_require__(8534)
|
|
||||||
|
|
||||||
const PartStream = __nccwpck_require__(8710)
|
|
||||||
const HeaderParser = __nccwpck_require__(333)
|
|
||||||
|
|
||||||
const DASH = 45
|
|
||||||
const B_ONEDASH = Buffer.from('-')
|
|
||||||
const B_CRLF = Buffer.from('\r\n')
|
|
||||||
const EMPTY_FN = function () {}
|
|
||||||
|
|
||||||
function Dicer (cfg) {
|
|
||||||
if (!(this instanceof Dicer)) { return new Dicer(cfg) }
|
|
||||||
WritableStream.call(this, cfg)
|
|
||||||
|
|
||||||
if (!cfg || (!cfg.headerFirst && typeof cfg.boundary !== 'string')) { throw new TypeError('Boundary required') }
|
|
||||||
|
|
||||||
if (typeof cfg.boundary === 'string') { this.setBoundary(cfg.boundary) } else { this._bparser = undefined }
|
|
||||||
|
|
||||||
this._headerFirst = cfg.headerFirst
|
|
||||||
|
|
||||||
this._dashes = 0
|
|
||||||
this._parts = 0
|
|
||||||
this._finished = false
|
|
||||||
this._realFinish = false
|
|
||||||
this._isPreamble = true
|
|
||||||
this._justMatched = false
|
|
||||||
this._firstWrite = true
|
|
||||||
this._inHeader = true
|
|
||||||
this._part = undefined
|
|
||||||
this._cb = undefined
|
|
||||||
this._ignoreData = false
|
|
||||||
this._partOpts = { highWaterMark: cfg.partHwm }
|
|
||||||
this._pause = false
|
|
||||||
|
|
||||||
const self = this
|
|
||||||
this._hparser = new HeaderParser(cfg)
|
|
||||||
this._hparser.on('header', function (header) {
|
|
||||||
self._inHeader = false
|
|
||||||
self._part.emit('header', header)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
inherits(Dicer, WritableStream)
|
|
||||||
|
|
||||||
Dicer.prototype.emit = function (ev) {
|
|
||||||
if (ev === 'finish' && !this._realFinish) {
|
|
||||||
if (!this._finished) {
|
|
||||||
const self = this
|
|
||||||
process.nextTick(function () {
|
|
||||||
self.emit('error', new Error('Unexpected end of multipart data'))
|
|
||||||
if (self._part && !self._ignoreData) {
|
|
||||||
const type = (self._isPreamble ? 'Preamble' : 'Part')
|
|
||||||
self._part.emit('error', new Error(type + ' terminated early due to unexpected end of multipart data'))
|
|
||||||
self._part.push(null)
|
|
||||||
process.nextTick(function () {
|
|
||||||
self._realFinish = true
|
|
||||||
self.emit('finish')
|
|
||||||
self._realFinish = false
|
|
||||||
})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
self._realFinish = true
|
|
||||||
self.emit('finish')
|
|
||||||
self._realFinish = false
|
|
||||||
})
|
|
||||||
}
|
|
||||||
} else { WritableStream.prototype.emit.apply(this, arguments) }
|
|
||||||
}
|
|
||||||
|
|
||||||
Dicer.prototype._write = function (data, encoding, cb) {
|
|
||||||
// ignore unexpected data (e.g. extra trailer data after finished)
|
|
||||||
if (!this._hparser && !this._bparser) { return cb() }
|
|
||||||
|
|
||||||
if (this._headerFirst && this._isPreamble) {
|
|
||||||
if (!this._part) {
|
|
||||||
this._part = new PartStream(this._partOpts)
|
|
||||||
if (this._events.preamble) { this.emit('preamble', this._part) } else { this._ignore() }
|
|
||||||
}
|
|
||||||
const r = this._hparser.push(data)
|
|
||||||
if (!this._inHeader && r !== undefined && r < data.length) { data = data.slice(r) } else { return cb() }
|
|
||||||
}
|
|
||||||
|
|
||||||
// allows for "easier" testing
|
|
||||||
if (this._firstWrite) {
|
|
||||||
this._bparser.push(B_CRLF)
|
|
||||||
this._firstWrite = false
|
|
||||||
}
|
|
||||||
|
|
||||||
this._bparser.push(data)
|
|
||||||
|
|
||||||
if (this._pause) { this._cb = cb } else { cb() }
|
|
||||||
}
|
|
||||||
|
|
||||||
Dicer.prototype.reset = function () {
|
|
||||||
this._part = undefined
|
|
||||||
this._bparser = undefined
|
|
||||||
this._hparser = undefined
|
|
||||||
}
|
|
||||||
|
|
||||||
Dicer.prototype.setBoundary = function (boundary) {
|
|
||||||
const self = this
|
|
||||||
this._bparser = new StreamSearch('\r\n--' + boundary)
|
|
||||||
this._bparser.on('info', function (isMatch, data, start, end) {
|
|
||||||
self._oninfo(isMatch, data, start, end)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
Dicer.prototype._ignore = function () {
|
|
||||||
if (this._part && !this._ignoreData) {
|
|
||||||
this._ignoreData = true
|
|
||||||
this._part.on('error', EMPTY_FN)
|
|
||||||
// we must perform some kind of read on the stream even though we are
|
|
||||||
// ignoring the data, otherwise node's Readable stream will not emit 'end'
|
|
||||||
// after pushing null to the stream
|
|
||||||
this._part.resume()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Dicer.prototype._oninfo = function (isMatch, data, start, end) {
|
|
||||||
let buf; const self = this; let i = 0; let r; let shouldWriteMore = true
|
|
||||||
|
|
||||||
if (!this._part && this._justMatched && data) {
|
|
||||||
while (this._dashes < 2 && (start + i) < end) {
|
|
||||||
if (data[start + i] === DASH) {
|
|
||||||
++i
|
|
||||||
++this._dashes
|
|
||||||
} else {
|
|
||||||
if (this._dashes) { buf = B_ONEDASH }
|
|
||||||
this._dashes = 0
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (this._dashes === 2) {
|
|
||||||
if ((start + i) < end && this._events.trailer) { this.emit('trailer', data.slice(start + i, end)) }
|
|
||||||
this.reset()
|
|
||||||
this._finished = true
|
|
||||||
// no more parts will be added
|
|
||||||
if (self._parts === 0) {
|
|
||||||
self._realFinish = true
|
|
||||||
self.emit('finish')
|
|
||||||
self._realFinish = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (this._dashes) { return }
|
|
||||||
}
|
|
||||||
if (this._justMatched) { this._justMatched = false }
|
|
||||||
if (!this._part) {
|
|
||||||
this._part = new PartStream(this._partOpts)
|
|
||||||
this._part._read = function (n) {
|
|
||||||
self._unpause()
|
|
||||||
}
|
|
||||||
if (this._isPreamble && this._events.preamble) { this.emit('preamble', this._part) } else if (this._isPreamble !== true && this._events.part) { this.emit('part', this._part) } else { this._ignore() }
|
|
||||||
if (!this._isPreamble) { this._inHeader = true }
|
|
||||||
}
|
|
||||||
if (data && start < end && !this._ignoreData) {
|
|
||||||
if (this._isPreamble || !this._inHeader) {
|
|
||||||
if (buf) { shouldWriteMore = this._part.push(buf) }
|
|
||||||
shouldWriteMore = this._part.push(data.slice(start, end))
|
|
||||||
if (!shouldWriteMore) { this._pause = true }
|
|
||||||
} else if (!this._isPreamble && this._inHeader) {
|
|
||||||
if (buf) { this._hparser.push(buf) }
|
|
||||||
r = this._hparser.push(data.slice(start, end))
|
|
||||||
if (!this._inHeader && r !== undefined && r < end) { this._oninfo(false, data, start + r, end) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (isMatch) {
|
|
||||||
this._hparser.reset()
|
|
||||||
if (this._isPreamble) { this._isPreamble = false } else {
|
|
||||||
if (start !== end) {
|
|
||||||
++this._parts
|
|
||||||
this._part.on('end', function () {
|
|
||||||
if (--self._parts === 0) {
|
|
||||||
if (self._finished) {
|
|
||||||
self._realFinish = true
|
|
||||||
self.emit('finish')
|
|
||||||
self._realFinish = false
|
|
||||||
} else {
|
|
||||||
self._unpause()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this._part.push(null)
|
|
||||||
this._part = undefined
|
|
||||||
this._ignoreData = false
|
|
||||||
this._justMatched = true
|
|
||||||
this._dashes = 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Dicer.prototype._unpause = function () {
|
|
||||||
if (!this._pause) { return }
|
|
||||||
|
|
||||||
this._pause = false
|
|
||||||
if (this._cb) {
|
|
||||||
const cb = this._cb
|
|
||||||
this._cb = undefined
|
|
||||||
cb()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = Dicer
|
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
|
||||||
|
|
||||||
/***/ 333:
|
|
||||||
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
|
|
||||||
const EventEmitter = (__nccwpck_require__(5673).EventEmitter)
|
|
||||||
const inherits = (__nccwpck_require__(7261).inherits)
|
|
||||||
const getLimit = __nccwpck_require__(9692)
|
|
||||||
|
|
||||||
const StreamSearch = __nccwpck_require__(8534)
|
|
||||||
|
|
||||||
const B_DCRLF = Buffer.from('\r\n\r\n')
|
|
||||||
const RE_CRLF = /\r\n/g
|
|
||||||
const RE_HDR = /^([^:]+):[ \t]?([\x00-\xFF]+)?$/ // eslint-disable-line no-control-regex
|
|
||||||
|
|
||||||
function HeaderParser (cfg) {
|
|
||||||
EventEmitter.call(this)
|
|
||||||
|
|
||||||
cfg = cfg || {}
|
|
||||||
const self = this
|
|
||||||
this.nread = 0
|
|
||||||
this.maxed = false
|
|
||||||
this.npairs = 0
|
|
||||||
this.maxHeaderPairs = getLimit(cfg, 'maxHeaderPairs', 2000)
|
|
||||||
this.maxHeaderSize = getLimit(cfg, 'maxHeaderSize', 80 * 1024)
|
|
||||||
this.buffer = ''
|
|
||||||
this.header = {}
|
|
||||||
this.finished = false
|
|
||||||
this.ss = new StreamSearch(B_DCRLF)
|
|
||||||
this.ss.on('info', function (isMatch, data, start, end) {
|
|
||||||
if (data && !self.maxed) {
|
|
||||||
if (self.nread + end - start >= self.maxHeaderSize) {
|
|
||||||
end = self.maxHeaderSize - self.nread + start
|
|
||||||
self.nread = self.maxHeaderSize
|
|
||||||
self.maxed = true
|
|
||||||
} else { self.nread += (end - start) }
|
|
||||||
|
|
||||||
self.buffer += data.toString('binary', start, end)
|
|
||||||
}
|
|
||||||
if (isMatch) { self._finish() }
|
|
||||||
})
|
|
||||||
}
|
|
||||||
inherits(HeaderParser, EventEmitter)
|
|
||||||
|
|
||||||
HeaderParser.prototype.push = function (data) {
|
|
||||||
const r = this.ss.push(data)
|
|
||||||
if (this.finished) { return r }
|
|
||||||
}
|
|
||||||
|
|
||||||
HeaderParser.prototype.reset = function () {
|
|
||||||
this.finished = false
|
|
||||||
this.buffer = ''
|
|
||||||
this.header = {}
|
|
||||||
this.ss.reset()
|
|
||||||
}
|
|
||||||
|
|
||||||
HeaderParser.prototype._finish = function () {
|
|
||||||
if (this.buffer) { this._parseHeader() }
|
|
||||||
this.ss.matches = this.ss.maxMatches
|
|
||||||
const header = this.header
|
|
||||||
this.header = {}
|
|
||||||
this.buffer = ''
|
|
||||||
this.finished = true
|
|
||||||
this.nread = this.npairs = 0
|
|
||||||
this.maxed = false
|
|
||||||
this.emit('header', header)
|
|
||||||
}
|
|
||||||
|
|
||||||
HeaderParser.prototype._parseHeader = function () {
|
|
||||||
if (this.npairs === this.maxHeaderPairs) { return }
|
|
||||||
|
|
||||||
const lines = this.buffer.split(RE_CRLF)
|
|
||||||
const len = lines.length
|
|
||||||
let m, h
|
|
||||||
|
|
||||||
for (var i = 0; i < len; ++i) { // eslint-disable-line no-var
|
|
||||||
if (lines[i].length === 0) { continue }
|
|
||||||
if (lines[i][0] === '\t' || lines[i][0] === ' ') {
|
|
||||||
// folded header content
|
|
||||||
// RFC2822 says to just remove the CRLF and not the whitespace following
|
|
||||||
// it, so we follow the RFC and include the leading whitespace ...
|
|
||||||
if (h) {
|
|
||||||
this.header[h][this.header[h].length - 1] += lines[i]
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const posColon = lines[i].indexOf(':')
|
|
||||||
if (
|
|
||||||
posColon === -1 ||
|
|
||||||
posColon === 0
|
|
||||||
) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
m = RE_HDR.exec(lines[i])
|
|
||||||
h = m[1].toLowerCase()
|
|
||||||
this.header[h] = this.header[h] || []
|
|
||||||
this.header[h].push((m[2] || ''))
|
|
||||||
if (++this.npairs === this.maxHeaderPairs) { break }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = HeaderParser
|
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
|
||||||
|
|
||||||
/***/ 8710:
|
|
||||||
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
|
|
||||||
const inherits = (__nccwpck_require__(7261).inherits)
|
|
||||||
const ReadableStream = (__nccwpck_require__(4492).Readable)
|
|
||||||
|
|
||||||
function PartStream (opts) {
|
|
||||||
ReadableStream.call(this, opts)
|
|
||||||
}
|
|
||||||
inherits(PartStream, ReadableStream)
|
|
||||||
|
|
||||||
PartStream.prototype._read = function (n) {}
|
|
||||||
|
|
||||||
module.exports = PartStream
|
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
|
||||||
|
|
||||||
/***/ 8534:
|
|
||||||
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Copyright Brian White. All rights reserved.
|
|
||||||
*
|
|
||||||
* @see https://github.com/mscdex/streamsearch
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to
|
|
||||||
* deal in the Software without restriction, including without limitation the
|
|
||||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
* sell copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
||||||
* IN THE SOFTWARE.
|
|
||||||
*
|
|
||||||
* Based heavily on the Streaming Boyer-Moore-Horspool C++ implementation
|
|
||||||
* by Hongli Lai at: https://github.com/FooBarWidget/boyer-moore-horspool
|
|
||||||
*/
|
|
||||||
const EventEmitter = (__nccwpck_require__(5673).EventEmitter)
|
|
||||||
const inherits = (__nccwpck_require__(7261).inherits)
|
|
||||||
|
|
||||||
function SBMH (needle) {
|
|
||||||
if (typeof needle === 'string') {
|
|
||||||
needle = Buffer.from(needle)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!Buffer.isBuffer(needle)) {
|
|
||||||
throw new TypeError('The needle has to be a String or a Buffer.')
|
|
||||||
}
|
|
||||||
|
|
||||||
const needleLength = needle.length
|
|
||||||
|
|
||||||
if (needleLength === 0) {
|
|
||||||
throw new Error('The needle cannot be an empty String/Buffer.')
|
|
||||||
}
|
|
||||||
|
|
||||||
if (needleLength > 256) {
|
|
||||||
throw new Error('The needle cannot have a length bigger than 256.')
|
|
||||||
}
|
|
||||||
|
|
||||||
this.maxMatches = Infinity
|
|
||||||
this.matches = 0
|
|
||||||
|
|
||||||
this._occ = new Array(256)
|
|
||||||
.fill(needleLength) // Initialize occurrence table.
|
|
||||||
this._lookbehind_size = 0
|
|
||||||
this._needle = needle
|
|
||||||
this._bufpos = 0
|
|
||||||
|
|
||||||
this._lookbehind = Buffer.alloc(needleLength)
|
|
||||||
|
|
||||||
// Populate occurrence table with analysis of the needle,
|
|
||||||
// ignoring last letter.
|
|
||||||
for (var i = 0; i < needleLength - 1; ++i) { // eslint-disable-line no-var
|
|
||||||
this._occ[needle[i]] = needleLength - 1 - i
|
|
||||||
}
|
|
||||||
}
|
|
||||||
inherits(SBMH, EventEmitter)
|
|
||||||
|
|
||||||
SBMH.prototype.reset = function () {
|
|
||||||
this._lookbehind_size = 0
|
|
||||||
this.matches = 0
|
|
||||||
this._bufpos = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
SBMH.prototype.push = function (chunk, pos) {
|
|
||||||
if (!Buffer.isBuffer(chunk)) {
|
|
||||||
chunk = Buffer.from(chunk, 'binary')
|
|
||||||
}
|
|
||||||
const chlen = chunk.length
|
|
||||||
this._bufpos = pos || 0
|
|
||||||
let r
|
|
||||||
while (r !== chlen && this.matches < this.maxMatches) { r = this._sbmh_feed(chunk) }
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
SBMH.prototype._sbmh_feed = function (data) {
|
|
||||||
const len = data.length
|
|
||||||
const needle = this._needle
|
|
||||||
const needleLength = needle.length
|
|
||||||
const lastNeedleChar = needle[needleLength - 1]
|
|
||||||
|
|
||||||
// Positive: points to a position in `data`
|
|
||||||
// pos == 3 points to data[3]
|
|
||||||
// Negative: points to a position in the lookbehind buffer
|
|
||||||
// pos == -2 points to lookbehind[lookbehind_size - 2]
|
|
||||||
let pos = -this._lookbehind_size
|
|
||||||
let ch
|
|
||||||
|
|
||||||
if (pos < 0) {
|
|
||||||
// Lookbehind buffer is not empty. Perform Boyer-Moore-Horspool
|
|
||||||
// search with character lookup code that considers both the
|
|
||||||
// lookbehind buffer and the current round's haystack data.
|
|
||||||
//
|
|
||||||
// Loop until
|
|
||||||
// there is a match.
|
|
||||||
// or until
|
|
||||||
// we've moved past the position that requires the
|
|
||||||
// lookbehind buffer. In this case we switch to the
|
|
||||||
// optimized loop.
|
|
||||||
// or until
|
|
||||||
// the character to look at lies outside the haystack.
|
|
||||||
while (pos < 0 && pos <= len - needleLength) {
|
|
||||||
ch = this._sbmh_lookup_char(data, pos + needleLength - 1)
|
|
||||||
|
|
||||||
if (
|
|
||||||
ch === lastNeedleChar &&
|
|
||||||
this._sbmh_memcmp(data, pos, needleLength - 1)
|
|
||||||
) {
|
|
||||||
this._lookbehind_size = 0
|
|
||||||
++this.matches
|
|
||||||
this.emit('info', true)
|
|
||||||
|
|
||||||
return (this._bufpos = pos + needleLength)
|
|
||||||
}
|
|
||||||
pos += this._occ[ch]
|
|
||||||
}
|
|
||||||
|
|
||||||
// No match.
|
|
||||||
|
|
||||||
if (pos < 0) {
|
|
||||||
// There's too few data for Boyer-Moore-Horspool to run,
|
|
||||||
// so let's use a different algorithm to skip as much as
|
|
||||||
// we can.
|
|
||||||
// Forward pos until
|
|
||||||
// the trailing part of lookbehind + data
|
|
||||||
// looks like the beginning of the needle
|
|
||||||
// or until
|
|
||||||
// pos == 0
|
|
||||||
while (pos < 0 && !this._sbmh_memcmp(data, pos, len - pos)) { ++pos }
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pos >= 0) {
|
|
||||||
// Discard lookbehind buffer.
|
|
||||||
this.emit('info', false, this._lookbehind, 0, this._lookbehind_size)
|
|
||||||
this._lookbehind_size = 0
|
|
||||||
} else {
|
|
||||||
// Cut off part of the lookbehind buffer that has
|
|
||||||
// been processed and append the entire haystack
|
|
||||||
// into it.
|
|
||||||
const bytesToCutOff = this._lookbehind_size + pos
|
|
||||||
if (bytesToCutOff > 0) {
|
|
||||||
// The cut off data is guaranteed not to contain the needle.
|
|
||||||
this.emit('info', false, this._lookbehind, 0, bytesToCutOff)
|
|
||||||
}
|
|
||||||
|
|
||||||
this._lookbehind.copy(this._lookbehind, 0, bytesToCutOff,
|
|
||||||
this._lookbehind_size - bytesToCutOff)
|
|
||||||
this._lookbehind_size -= bytesToCutOff
|
|
||||||
|
|
||||||
data.copy(this._lookbehind, this._lookbehind_size)
|
|
||||||
this._lookbehind_size += len
|
|
||||||
|
|
||||||
this._bufpos = len
|
|
||||||
return len
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pos += (pos >= 0) * this._bufpos
|
|
||||||
|
|
||||||
// Lookbehind buffer is now empty. We only need to check if the
|
|
||||||
// needle is in the haystack.
|
|
||||||
if (data.indexOf(needle, pos) !== -1) {
|
|
||||||
pos = data.indexOf(needle, pos)
|
|
||||||
++this.matches
|
|
||||||
if (pos > 0) { this.emit('info', true, data, this._bufpos, pos) } else { this.emit('info', true) }
|
|
||||||
|
|
||||||
return (this._bufpos = pos + needleLength)
|
|
||||||
} else {
|
|
||||||
pos = len - needleLength
|
|
||||||
}
|
|
||||||
|
|
||||||
// There was no match. If there's trailing haystack data that we cannot
|
|
||||||
// match yet using the Boyer-Moore-Horspool algorithm (because the trailing
|
|
||||||
// data is less than the needle size) then match using a modified
|
|
||||||
// algorithm that starts matching from the beginning instead of the end.
|
|
||||||
// Whatever trailing data is left after running this algorithm is added to
|
|
||||||
// the lookbehind buffer.
|
|
||||||
while (
|
|
||||||
pos < len &&
|
|
||||||
(
|
|
||||||
data[pos] !== needle[0] ||
|
|
||||||
(
|
|
||||||
(Buffer.compare(
|
|
||||||
data.subarray(pos, pos + len - pos),
|
|
||||||
needle.subarray(0, len - pos)
|
|
||||||
) !== 0)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
) {
|
|
||||||
++pos
|
|
||||||
}
|
|
||||||
if (pos < len) {
|
|
||||||
data.copy(this._lookbehind, 0, pos, pos + (len - pos))
|
|
||||||
this._lookbehind_size = len - pos
|
|
||||||
}
|
|
||||||
|
|
||||||
// Everything until pos is guaranteed not to contain needle data.
|
|
||||||
if (pos > 0) { this.emit('info', false, data, this._bufpos, pos < len ? pos : len) }
|
|
||||||
|
|
||||||
this._bufpos = len
|
|
||||||
return len
|
|
||||||
}
|
|
||||||
|
|
||||||
SBMH.prototype._sbmh_lookup_char = function (data, pos) {
|
|
||||||
return (pos < 0)
|
|
||||||
? this._lookbehind[this._lookbehind_size + pos]
|
|
||||||
: data[pos]
|
|
||||||
}
|
|
||||||
|
|
||||||
SBMH.prototype._sbmh_memcmp = function (data, pos, len) {
|
|
||||||
for (var i = 0; i < len; ++i) { // eslint-disable-line no-var
|
|
||||||
if (this._sbmh_lookup_char(data, pos + i) !== this._needle[i]) { return false }
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = SBMH
|
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
|
||||||
|
|
||||||
/***/ 3438:
|
|
||||||
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
|
|
||||||
const WritableStream = (__nccwpck_require__(4492).Writable)
|
|
||||||
const { inherits } = __nccwpck_require__(7261)
|
|
||||||
const Dicer = __nccwpck_require__(2856)
|
|
||||||
|
|
||||||
const MultipartParser = __nccwpck_require__(415)
|
|
||||||
const UrlencodedParser = __nccwpck_require__(6780)
|
|
||||||
const parseParams = __nccwpck_require__(4426)
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
|
||||||
|
|
||||||
/***/ 415:
|
|
||||||
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
|
|
||||||
// TODO:
|
|
||||||
// * support 1 nested multipart level
|
|
||||||
// (see second multipart example here:
|
|
||||||
// http://www.w3.org/TR/html401/interact/forms.html#didx-multipartform-data)
|
|
||||||
// * support limits.fieldNameSize
|
|
||||||
// -- this will require modifications to utils.parseParams
|
|
||||||
|
|
||||||
const { Readable } = __nccwpck_require__(4492)
|
|
||||||
const { inherits } = __nccwpck_require__(7261)
|
|
||||||
|
|
||||||
const Dicer = __nccwpck_require__(2856)
|
|
||||||
|
|
||||||
const parseParams = __nccwpck_require__(4426)
|
|
||||||
const decodeText = __nccwpck_require__(9136)
|
|
||||||
const basename = __nccwpck_require__(496)
|
|
||||||
const getLimit = __nccwpck_require__(9692)
|
|
||||||
|
|
||||||
const RE_BOUNDARY = /^boundary$/i
|
|
||||||
const RE_FIELD = /^form-data$/i
|
|
||||||
const RE_CHARSET = /^charset$/i
|
|
||||||
const RE_FILENAME = /^filename$/i
|
|
||||||
const RE_NAME = /^name$/i
|
|
||||||
|
|
||||||
Multipart.detect = /^multipart\/form-data/i
|
|
||||||
function Multipart (boy, cfg) {
|
|
||||||
let i
|
|
||||||
let len
|
|
||||||
const self = this
|
|
||||||
let boundary
|
|
||||||
const limits = cfg.limits
|
|
||||||
const isPartAFile = cfg.isPartAFile || ((fieldName, contentType, fileName) => (contentType === 'application/octet-stream' || fileName !== undefined))
|
|
||||||
const parsedConType = cfg.parsedConType || []
|
|
||||||
const defCharset = cfg.defCharset || 'utf8'
|
|
||||||
const preservePath = cfg.preservePath
|
|
||||||
const fileOpts = { highWaterMark: cfg.fileHwm }
|
|
||||||
|
|
||||||
for (i = 0, len = parsedConType.length; i < len; ++i) {
|
|
||||||
if (Array.isArray(parsedConType[i]) &&
|
|
||||||
RE_BOUNDARY.test(parsedConType[i][0])) {
|
|
||||||
boundary = parsedConType[i][1]
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function checkFinished () {
|
|
||||||
if (nends === 0 && finished && !boy._done) {
|
|
||||||
finished = false
|
|
||||||
self.end()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof boundary !== 'string') { throw new Error('Multipart: Boundary not found') }
|
|
||||||
|
|
||||||
const fieldSizeLimit = getLimit(limits, 'fieldSize', 1 * 1024 * 1024)
|
|
||||||
const fileSizeLimit = getLimit(limits, 'fileSize', Infinity)
|
|
||||||
const filesLimit = getLimit(limits, 'files', Infinity)
|
|
||||||
const fieldsLimit = getLimit(limits, 'fields', Infinity)
|
|
||||||
const partsLimit = getLimit(limits, 'parts', Infinity)
|
|
||||||
const headerPairsLimit = getLimit(limits, 'headerPairs', 2000)
|
|
||||||
const headerSizeLimit = getLimit(limits, 'headerSize', 80 * 1024)
|
|
||||||
|
|
||||||
let nfiles = 0
|
|
||||||
let nfields = 0
|
|
||||||
let nends = 0
|
|
||||||
let curFile
|
|
||||||
let curField
|
|
||||||
let finished = false
|
|
||||||
|
|
||||||
this._needDrain = false
|
|
||||||
this._pause = false
|
|
||||||
this._cb = undefined
|
|
||||||
this._nparts = 0
|
|
||||||
this._boy = boy
|
|
||||||
|
|
||||||
const parserCfg = {
|
|
||||||
boundary,
|
|
||||||
maxHeaderPairs: headerPairsLimit,
|
|
||||||
maxHeaderSize: headerSizeLimit,
|
|
||||||
partHwm: fileOpts.highWaterMark,
|
|
||||||
highWaterMark: cfg.highWaterMark
|
|
||||||
}
|
|
||||||
|
|
||||||
this.parser = new Dicer(parserCfg)
|
|
||||||
this.parser.on('drain', function () {
|
|
||||||
self._needDrain = false
|
|
||||||
if (self._cb && !self._pause) {
|
|
||||||
const cb = self._cb
|
|
||||||
self._cb = undefined
|
|
||||||
cb()
|
|
||||||
}
|
|
||||||
}).on('part', function onPart (part) {
|
|
||||||
if (++self._nparts > partsLimit) {
|
|
||||||
self.parser.removeListener('part', onPart)
|
|
||||||
self.parser.on('part', skipPart)
|
|
||||||
boy.hitPartsLimit = true
|
|
||||||
boy.emit('partsLimit')
|
|
||||||
return skipPart(part)
|
|
||||||
}
|
|
||||||
|
|
||||||
// hack because streams2 _always_ doesn't emit 'end' until nextTick, so let
|
|
||||||
// us emit 'end' early since we know the part has ended if we are already
|
|
||||||
// seeing the next part
|
|
||||||
if (curField) {
|
|
||||||
const field = curField
|
|
||||||
field.emit('end')
|
|
||||||
field.removeAllListeners('end')
|
|
||||||
}
|
|
||||||
|
|
||||||
part.on('header', function (header) {
|
|
||||||
let contype
|
|
||||||
let fieldname
|
|
||||||
let parsed
|
|
||||||
let charset
|
|
||||||
let encoding
|
|
||||||
let filename
|
|
||||||
let nsize = 0
|
|
||||||
|
|
||||||
if (header['content-type']) {
|
|
||||||
parsed = parseParams(header['content-type'][0])
|
|
||||||
if (parsed[0]) {
|
|
||||||
contype = parsed[0].toLowerCase()
|
|
||||||
for (i = 0, len = parsed.length; i < len; ++i) {
|
|
||||||
if (RE_CHARSET.test(parsed[i][0])) {
|
|
||||||
charset = parsed[i][1].toLowerCase()
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (contype === undefined) { contype = 'text/plain' }
|
|
||||||
if (charset === undefined) { charset = defCharset }
|
|
||||||
|
|
||||||
if (header['content-disposition']) {
|
|
||||||
parsed = parseParams(header['content-disposition'][0])
|
|
||||||
if (!RE_FIELD.test(parsed[0])) { return skipPart(part) }
|
|
||||||
for (i = 0, len = parsed.length; i < len; ++i) {
|
|
||||||
if (RE_NAME.test(parsed[i][0])) {
|
|
||||||
fieldname = parsed[i][1]
|
|
||||||
} else if (RE_FILENAME.test(parsed[i][0])) {
|
|
||||||
filename = parsed[i][1]
|
|
||||||
if (!preservePath) { filename = basename(filename) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else { return skipPart(part) }
|
|
||||||
|
|
||||||
if (header['content-transfer-encoding']) { encoding = header['content-transfer-encoding'][0].toLowerCase() } else { encoding = '7bit' }
|
|
||||||
|
|
||||||
let onData,
|
|
||||||
onEnd
|
|
||||||
|
|
||||||
if (isPartAFile(fieldname, contype, filename)) {
|
|
||||||
// file/binary field
|
|
||||||
if (nfiles === filesLimit) {
|
|
||||||
if (!boy.hitFilesLimit) {
|
|
||||||
boy.hitFilesLimit = true
|
|
||||||
boy.emit('filesLimit')
|
|
||||||
}
|
|
||||||
return skipPart(part)
|
|
||||||
}
|
|
||||||
|
|
||||||
++nfiles
|
|
||||||
|
|
||||||
if (!boy._events.file) {
|
|
||||||
self.parser._ignore()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
++nends
|
|
||||||
const file = new FileStream(fileOpts)
|
|
||||||
curFile = file
|
|
||||||
file.on('end', function () {
|
|
||||||
--nends
|
|
||||||
self._pause = false
|
|
||||||
checkFinished()
|
|
||||||
if (self._cb && !self._needDrain) {
|
|
||||||
const cb = self._cb
|
|
||||||
self._cb = undefined
|
|
||||||
cb()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
file._read = function (n) {
|
|
||||||
if (!self._pause) { return }
|
|
||||||
self._pause = false
|
|
||||||
if (self._cb && !self._needDrain) {
|
|
||||||
const cb = self._cb
|
|
||||||
self._cb = undefined
|
|
||||||
cb()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
boy.emit('file', fieldname, file, filename, encoding, contype)
|
|
||||||
|
|
||||||
onData = function (data) {
|
|
||||||
if ((nsize += data.length) > fileSizeLimit) {
|
|
||||||
const extralen = fileSizeLimit - nsize + data.length
|
|
||||||
if (extralen > 0) { file.push(data.slice(0, extralen)) }
|
|
||||||
file.truncated = true
|
|
||||||
file.bytesRead = fileSizeLimit
|
|
||||||
part.removeAllListeners('data')
|
|
||||||
file.emit('limit')
|
|
||||||
return
|
|
||||||
} else if (!file.push(data)) { self._pause = true }
|
|
||||||
|
|
||||||
file.bytesRead = nsize
|
|
||||||
}
|
|
||||||
|
|
||||||
onEnd = function () {
|
|
||||||
curFile = undefined
|
|
||||||
file.push(null)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// non-file field
|
|
||||||
if (nfields === fieldsLimit) {
|
|
||||||
if (!boy.hitFieldsLimit) {
|
|
||||||
boy.hitFieldsLimit = true
|
|
||||||
boy.emit('fieldsLimit')
|
|
||||||
}
|
|
||||||
return skipPart(part)
|
|
||||||
}
|
|
||||||
|
|
||||||
++nfields
|
|
||||||
++nends
|
|
||||||
let buffer = ''
|
|
||||||
let truncated = false
|
|
||||||
curField = part
|
|
||||||
|
|
||||||
onData = function (data) {
|
|
||||||
if ((nsize += data.length) > fieldSizeLimit) {
|
|
||||||
const extralen = (fieldSizeLimit - (nsize - data.length))
|
|
||||||
buffer += data.toString('binary', 0, extralen)
|
|
||||||
truncated = true
|
|
||||||
part.removeAllListeners('data')
|
|
||||||
} else { buffer += data.toString('binary') }
|
|
||||||
}
|
|
||||||
|
|
||||||
onEnd = function () {
|
|
||||||
curField = undefined
|
|
||||||
if (buffer.length) { buffer = decodeText(buffer, 'binary', charset) }
|
|
||||||
boy.emit('field', fieldname, buffer, false, truncated, encoding, contype)
|
|
||||||
--nends
|
|
||||||
checkFinished()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* As of node@2efe4ab761666 (v0.10.29+/v0.11.14+), busboy had become
|
|
||||||
broken. Streams2/streams3 is a huge black box of confusion, but
|
|
||||||
somehow overriding the sync state seems to fix things again (and still
|
|
||||||
seems to work for previous node versions).
|
|
||||||
*/
|
|
||||||
part._readableState.sync = false
|
|
||||||
|
|
||||||
part.on('data', onData)
|
|
||||||
part.on('end', onEnd)
|
|
||||||
}).on('error', function (err) {
|
|
||||||
if (curFile) { curFile.emit('error', err) }
|
|
||||||
})
|
|
||||||
}).on('error', function (err) {
|
|
||||||
boy.emit('error', err)
|
|
||||||
}).on('finish', function () {
|
|
||||||
finished = true
|
|
||||||
checkFinished()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
Multipart.prototype.write = function (chunk, cb) {
|
|
||||||
const r = this.parser.write(chunk)
|
|
||||||
if (r && !this._pause) {
|
|
||||||
cb()
|
|
||||||
} else {
|
|
||||||
this._needDrain = !r
|
|
||||||
this._cb = cb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Multipart.prototype.end = function () {
|
|
||||||
const self = this
|
|
||||||
|
|
||||||
if (self.parser.writable) {
|
|
||||||
self.parser.end()
|
|
||||||
} else if (!self._boy._done) {
|
|
||||||
process.nextTick(function () {
|
|
||||||
self._boy._done = true
|
|
||||||
self._boy.emit('finish')
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function skipPart (part) {
|
|
||||||
part.resume()
|
|
||||||
}
|
|
||||||
|
|
||||||
function FileStream (opts) {
|
|
||||||
Readable.call(this, opts)
|
|
||||||
|
|
||||||
this.bytesRead = 0
|
|
||||||
|
|
||||||
this.truncated = false
|
|
||||||
}
|
|
||||||
|
|
||||||
inherits(FileStream, Readable)
|
|
||||||
|
|
||||||
FileStream.prototype._read = function (n) {}
|
|
||||||
|
|
||||||
module.exports = Multipart
|
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
|
||||||
|
|
||||||
/***/ 6780:
|
|
||||||
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
|
|
||||||
const Decoder = __nccwpck_require__(9730)
|
|
||||||
const decodeText = __nccwpck_require__(9136)
|
|
||||||
const getLimit = __nccwpck_require__(9692)
|
|
||||||
|
|
||||||
const RE_CHARSET = /^charset$/i
|
|
||||||
|
|
||||||
UrlEncoded.detect = /^application\/x-www-form-urlencoded/i
|
|
||||||
function UrlEncoded (boy, cfg) {
|
|
||||||
const limits = cfg.limits
|
|
||||||
const parsedConType = cfg.parsedConType
|
|
||||||
this.boy = boy
|
|
||||||
|
|
||||||
this.fieldSizeLimit = getLimit(limits, 'fieldSize', 1 * 1024 * 1024)
|
|
||||||
this.fieldNameSizeLimit = getLimit(limits, 'fieldNameSize', 100)
|
|
||||||
this.fieldsLimit = getLimit(limits, 'fields', Infinity)
|
|
||||||
|
|
||||||
let charset
|
|
||||||
for (var i = 0, len = parsedConType.length; i < len; ++i) { // eslint-disable-line no-var
|
|
||||||
if (Array.isArray(parsedConType[i]) &&
|
|
||||||
RE_CHARSET.test(parsedConType[i][0])) {
|
|
||||||
charset = parsedConType[i][1].toLowerCase()
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (charset === undefined) { charset = cfg.defCharset || 'utf8' }
|
|
||||||
|
|
||||||
this.decoder = new Decoder()
|
|
||||||
this.charset = charset
|
|
||||||
this._fields = 0
|
|
||||||
this._state = 'key'
|
|
||||||
this._checkingBytes = true
|
|
||||||
this._bytesKey = 0
|
|
||||||
this._bytesVal = 0
|
|
||||||
this._key = ''
|
|
||||||
this._val = ''
|
|
||||||
this._keyTrunc = false
|
|
||||||
this._valTrunc = false
|
|
||||||
this._hitLimit = false
|
|
||||||
}
|
|
||||||
|
|
||||||
UrlEncoded.prototype.write = function (data, cb) {
|
|
||||||
if (this._fields === this.fieldsLimit) {
|
|
||||||
if (!this.boy.hitFieldsLimit) {
|
|
||||||
this.boy.hitFieldsLimit = true
|
|
||||||
this.boy.emit('fieldsLimit')
|
|
||||||
}
|
|
||||||
return cb()
|
|
||||||
}
|
|
||||||
|
|
||||||
let idxeq; let idxamp; let i; let p = 0; const len = data.length
|
|
||||||
|
|
||||||
while (p < len) {
|
|
||||||
if (this._state === 'key') {
|
|
||||||
idxeq = idxamp = undefined
|
|
||||||
for (i = p; i < len; ++i) {
|
|
||||||
if (!this._checkingBytes) { ++p }
|
|
||||||
if (data[i] === 0x3D/* = */) {
|
|
||||||
idxeq = i
|
|
||||||
break
|
|
||||||
} else if (data[i] === 0x26/* & */) {
|
|
||||||
idxamp = i
|
|
||||||
break
|
|
||||||
}
|
|
||||||
if (this._checkingBytes && this._bytesKey === this.fieldNameSizeLimit) {
|
|
||||||
this._hitLimit = true
|
|
||||||
break
|
|
||||||
} else if (this._checkingBytes) { ++this._bytesKey }
|
|
||||||
}
|
|
||||||
|
|
||||||
if (idxeq !== undefined) {
|
|
||||||
// key with assignment
|
|
||||||
if (idxeq > p) { this._key += this.decoder.write(data.toString('binary', p, idxeq)) }
|
|
||||||
this._state = 'val'
|
|
||||||
|
|
||||||
this._hitLimit = false
|
|
||||||
this._checkingBytes = true
|
|
||||||
this._val = ''
|
|
||||||
this._bytesVal = 0
|
|
||||||
this._valTrunc = false
|
|
||||||
this.decoder.reset()
|
|
||||||
|
|
||||||
p = idxeq + 1
|
|
||||||
} else if (idxamp !== undefined) {
|
|
||||||
// key with no assignment
|
|
||||||
++this._fields
|
|
||||||
let key; const keyTrunc = this._keyTrunc
|
|
||||||
if (idxamp > p) { key = (this._key += this.decoder.write(data.toString('binary', p, idxamp))) } else { key = this._key }
|
|
||||||
|
|
||||||
this._hitLimit = false
|
|
||||||
this._checkingBytes = true
|
|
||||||
this._key = ''
|
|
||||||
this._bytesKey = 0
|
|
||||||
this._keyTrunc = false
|
|
||||||
this.decoder.reset()
|
|
||||||
|
|
||||||
if (key.length) {
|
|
||||||
this.boy.emit('field', decodeText(key, 'binary', this.charset),
|
|
||||||
'',
|
|
||||||
keyTrunc,
|
|
||||||
false)
|
|
||||||
}
|
|
||||||
|
|
||||||
p = idxamp + 1
|
|
||||||
if (this._fields === this.fieldsLimit) { return cb() }
|
|
||||||
} else if (this._hitLimit) {
|
|
||||||
// we may not have hit the actual limit if there are encoded bytes...
|
|
||||||
if (i > p) { this._key += this.decoder.write(data.toString('binary', p, i)) }
|
|
||||||
p = i
|
|
||||||
if ((this._bytesKey = this._key.length) === this.fieldNameSizeLimit) {
|
|
||||||
// yep, we actually did hit the limit
|
|
||||||
this._checkingBytes = false
|
|
||||||
this._keyTrunc = true
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (p < len) { this._key += this.decoder.write(data.toString('binary', p)) }
|
|
||||||
p = len
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
idxamp = undefined
|
|
||||||
for (i = p; i < len; ++i) {
|
|
||||||
if (!this._checkingBytes) { ++p }
|
|
||||||
if (data[i] === 0x26/* & */) {
|
|
||||||
idxamp = i
|
|
||||||
break
|
|
||||||
}
|
|
||||||
if (this._checkingBytes && this._bytesVal === this.fieldSizeLimit) {
|
|
||||||
this._hitLimit = true
|
|
||||||
break
|
|
||||||
} else if (this._checkingBytes) { ++this._bytesVal }
|
|
||||||
}
|
|
||||||
|
|
||||||
if (idxamp !== undefined) {
|
|
||||||
++this._fields
|
|
||||||
if (idxamp > p) { this._val += this.decoder.write(data.toString('binary', p, idxamp)) }
|
|
||||||
this.boy.emit('field', decodeText(this._key, 'binary', this.charset),
|
|
||||||
decodeText(this._val, 'binary', this.charset),
|
|
||||||
this._keyTrunc,
|
|
||||||
this._valTrunc)
|
|
||||||
this._state = 'key'
|
|
||||||
|
|
||||||
this._hitLimit = false
|
|
||||||
this._checkingBytes = true
|
|
||||||
this._key = ''
|
|
||||||
this._bytesKey = 0
|
|
||||||
this._keyTrunc = false
|
|
||||||
this.decoder.reset()
|
|
||||||
|
|
||||||
p = idxamp + 1
|
|
||||||
if (this._fields === this.fieldsLimit) { return cb() }
|
|
||||||
} else if (this._hitLimit) {
|
|
||||||
// we may not have hit the actual limit if there are encoded bytes...
|
|
||||||
if (i > p) { this._val += this.decoder.write(data.toString('binary', p, i)) }
|
|
||||||
p = i
|
|
||||||
if ((this._val === '' && this.fieldSizeLimit === 0) ||
|
|
||||||
(this._bytesVal = this._val.length) === this.fieldSizeLimit) {
|
|
||||||
// yep, we actually did hit the limit
|
|
||||||
this._checkingBytes = false
|
|
||||||
this._valTrunc = true
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (p < len) { this._val += this.decoder.write(data.toString('binary', p)) }
|
|
||||||
p = len
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cb()
|
|
||||||
}
|
|
||||||
|
|
||||||
UrlEncoded.prototype.end = function () {
|
|
||||||
if (this.boy._done) { return }
|
|
||||||
|
|
||||||
if (this._state === 'key' && this._key.length > 0) {
|
|
||||||
this.boy.emit('field', decodeText(this._key, 'binary', this.charset),
|
|
||||||
'',
|
|
||||||
this._keyTrunc,
|
|
||||||
false)
|
|
||||||
} else if (this._state === 'val') {
|
|
||||||
this.boy.emit('field', decodeText(this._key, 'binary', this.charset),
|
|
||||||
decodeText(this._val, 'binary', this.charset),
|
|
||||||
this._keyTrunc,
|
|
||||||
this._valTrunc)
|
|
||||||
}
|
|
||||||
this.boy._done = true
|
|
||||||
this.boy.emit('finish')
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = UrlEncoded
|
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
|
||||||
|
|
||||||
/***/ 9730:
|
|
||||||
/***/ ((module) => {
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
|
|
||||||
const RE_PLUS = /\+/g
|
|
||||||
|
|
||||||
const HEX = [
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
|
||||||
]
|
|
||||||
|
|
||||||
function Decoder () {
|
|
||||||
this.buffer = undefined
|
|
||||||
}
|
|
||||||
Decoder.prototype.write = function (str) {
|
|
||||||
// Replace '+' with ' ' before decoding
|
|
||||||
str = str.replace(RE_PLUS, ' ')
|
|
||||||
let res = ''
|
|
||||||
let i = 0; let p = 0; const len = str.length
|
|
||||||
for (; i < len; ++i) {
|
|
||||||
if (this.buffer !== undefined) {
|
|
||||||
if (!HEX[str.charCodeAt(i)]) {
|
|
||||||
res += '%' + this.buffer
|
|
||||||
this.buffer = undefined
|
|
||||||
--i // retry character
|
|
||||||
} else {
|
|
||||||
this.buffer += str[i]
|
|
||||||
++p
|
|
||||||
if (this.buffer.length === 2) {
|
|
||||||
res += String.fromCharCode(parseInt(this.buffer, 16))
|
|
||||||
this.buffer = undefined
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (str[i] === '%') {
|
|
||||||
if (i > p) {
|
|
||||||
res += str.substring(p, i)
|
|
||||||
p = i
|
|
||||||
}
|
|
||||||
this.buffer = ''
|
|
||||||
++p
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (p < len && this.buffer === undefined) { res += str.substring(p) }
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
Decoder.prototype.reset = function () {
|
|
||||||
this.buffer = undefined
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = Decoder
|
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
|
||||||
|
|
||||||
/***/ 496:
|
|
||||||
/***/ ((module) => {
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
|
|
||||||
module.exports = function basename (path) {
|
|
||||||
if (typeof path !== 'string') { return '' }
|
|
||||||
for (var i = path.length - 1; i >= 0; --i) { // eslint-disable-line no-var
|
|
||||||
switch (path.charCodeAt(i)) {
|
|
||||||
case 0x2F: // '/'
|
|
||||||
case 0x5C: // '\'
|
|
||||||
path = path.slice(i + 1)
|
|
||||||
return (path === '..' || path === '.' ? '' : path)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return (path === '..' || path === '.' ? '' : path)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
|
||||||
|
|
||||||
/***/ 9136:
|
|
||||||
/***/ ((module) => {
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
|
|
||||||
// Node has always utf-8
|
|
||||||
const utf8Decoder = new TextDecoder('utf-8')
|
|
||||||
const textDecoders = new Map([
|
|
||||||
['utf-8', utf8Decoder],
|
|
||||||
['utf8', utf8Decoder]
|
|
||||||
])
|
|
||||||
|
|
||||||
function decodeText (text, textEncoding, destEncoding) {
|
|
||||||
if (text) {
|
|
||||||
if (textDecoders.has(destEncoding)) {
|
|
||||||
try {
|
|
||||||
return textDecoders.get(destEncoding).decode(Buffer.from(text, textEncoding))
|
|
||||||
} catch (e) { }
|
|
||||||
} else {
|
|
||||||
try {
|
|
||||||
textDecoders.set(destEncoding, new TextDecoder(destEncoding))
|
|
||||||
return textDecoders.get(destEncoding).decode(Buffer.from(text, textEncoding))
|
|
||||||
} catch (e) { }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return text
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = decodeText
|
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
|
||||||
|
|
||||||
/***/ 9692:
|
|
||||||
/***/ ((module) => {
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
|
|
||||||
module.exports = function getLimit (limits, name, defaultLimit) {
|
|
||||||
if (
|
|
||||||
!limits ||
|
|
||||||
limits[name] === undefined ||
|
|
||||||
limits[name] === null
|
|
||||||
) { return defaultLimit }
|
|
||||||
|
|
||||||
if (
|
|
||||||
typeof limits[name] !== 'number' ||
|
|
||||||
isNaN(limits[name])
|
|
||||||
) { throw new TypeError('Limit ' + name + ' is not a valid number') }
|
|
||||||
|
|
||||||
return limits[name]
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
|
||||||
|
|
||||||
/***/ 4426:
|
|
||||||
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
|
|
||||||
const decodeText = __nccwpck_require__(9136)
|
|
||||||
|
|
||||||
const RE_ENCODED = /%([a-fA-F0-9]{2})/g
|
|
||||||
|
|
||||||
function encodedReplacer (match, byte) {
|
|
||||||
return String.fromCharCode(parseInt(byte, 16))
|
|
||||||
}
|
|
||||||
|
|
||||||
function parseParams (str) {
|
|
||||||
const res = []
|
|
||||||
let state = 'key'
|
|
||||||
let charset = ''
|
|
||||||
let inquote = false
|
|
||||||
let escaping = false
|
|
||||||
let p = 0
|
|
||||||
let tmp = ''
|
|
||||||
|
|
||||||
for (var i = 0, len = str.length; i < len; ++i) { // eslint-disable-line no-var
|
|
||||||
const char = str[i]
|
|
||||||
if (char === '\\' && inquote) {
|
|
||||||
if (escaping) { escaping = false } else {
|
|
||||||
escaping = true
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
} else if (char === '"') {
|
|
||||||
if (!escaping) {
|
|
||||||
if (inquote) {
|
|
||||||
inquote = false
|
|
||||||
state = 'key'
|
|
||||||
} else { inquote = true }
|
|
||||||
continue
|
|
||||||
} else { escaping = false }
|
|
||||||
} else {
|
|
||||||
if (escaping && inquote) { tmp += '\\' }
|
|
||||||
escaping = false
|
|
||||||
if ((state === 'charset' || state === 'lang') && char === "'") {
|
|
||||||
if (state === 'charset') {
|
|
||||||
state = 'lang'
|
|
||||||
charset = tmp.substring(1)
|
|
||||||
} else { state = 'value' }
|
|
||||||
tmp = ''
|
|
||||||
continue
|
|
||||||
} else if (state === 'key' &&
|
|
||||||
(char === '*' || char === '=') &&
|
|
||||||
res.length) {
|
|
||||||
if (char === '*') { state = 'charset' } else { state = 'value' }
|
|
||||||
res[p] = [tmp, undefined]
|
|
||||||
tmp = ''
|
|
||||||
continue
|
|
||||||
} else if (!inquote && char === ';') {
|
|
||||||
state = 'key'
|
|
||||||
if (charset) {
|
|
||||||
if (tmp.length) {
|
|
||||||
tmp = decodeText(tmp.replace(RE_ENCODED, encodedReplacer),
|
|
||||||
'binary',
|
|
||||||
charset)
|
|
||||||
}
|
|
||||||
charset = ''
|
|
||||||
} else if (tmp.length) {
|
|
||||||
tmp = decodeText(tmp, 'binary', 'utf8')
|
|
||||||
}
|
|
||||||
if (res[p] === undefined) { res[p] = tmp } else { res[p][1] = tmp }
|
|
||||||
tmp = ''
|
|
||||||
++p
|
|
||||||
continue
|
|
||||||
} else if (!inquote && (char === ' ' || char === '\t')) { continue }
|
|
||||||
}
|
|
||||||
tmp += char
|
|
||||||
}
|
|
||||||
if (charset && tmp.length) {
|
|
||||||
tmp = decodeText(tmp.replace(RE_ENCODED, encodedReplacer),
|
|
||||||
'binary',
|
|
||||||
charset)
|
|
||||||
} else if (tmp) {
|
|
||||||
tmp = decodeText(tmp, 'binary', 'utf8')
|
|
||||||
}
|
|
||||||
|
|
||||||
if (res[p] === undefined) {
|
|
||||||
if (tmp) { res[p] = tmp }
|
|
||||||
} else { res[p][1] = tmp }
|
|
||||||
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = parseParams
|
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
|
|
||||||
/***/ 334:
|
/***/ 334:
|
||||||
@ -79013,7 +77591,7 @@ module.exports = Dispatcher
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
|
||||||
const Busboy = __nccwpck_require__(3438)
|
const Busboy = __nccwpck_require__(727)
|
||||||
const util = __nccwpck_require__(3983)
|
const util = __nccwpck_require__(3983)
|
||||||
const {
|
const {
|
||||||
ReadableStreamFrom,
|
ReadableStreamFrom,
|
||||||
@ -79035,6 +77613,14 @@ const { isUint8Array, isArrayBuffer } = __nccwpck_require__(9830)
|
|||||||
const { File: UndiciFile } = __nccwpck_require__(8511)
|
const { File: UndiciFile } = __nccwpck_require__(8511)
|
||||||
const { parseMIMEType, serializeAMimeType } = __nccwpck_require__(685)
|
const { parseMIMEType, serializeAMimeType } = __nccwpck_require__(685)
|
||||||
|
|
||||||
|
let random
|
||||||
|
try {
|
||||||
|
const crypto = __nccwpck_require__(6005)
|
||||||
|
random = (max) => crypto.randomInt(0, max)
|
||||||
|
} catch {
|
||||||
|
random = (max) => Math.floor(Math.random(max))
|
||||||
|
}
|
||||||
|
|
||||||
let ReadableStream = globalThis.ReadableStream
|
let ReadableStream = globalThis.ReadableStream
|
||||||
|
|
||||||
/** @type {globalThis['File']} */
|
/** @type {globalThis['File']} */
|
||||||
@ -79120,7 +77706,7 @@ function extractBody (object, keepalive = false) {
|
|||||||
// Set source to a copy of the bytes held by object.
|
// Set source to a copy of the bytes held by object.
|
||||||
source = new Uint8Array(object.buffer.slice(object.byteOffset, object.byteOffset + object.byteLength))
|
source = new Uint8Array(object.buffer.slice(object.byteOffset, object.byteOffset + object.byteLength))
|
||||||
} else if (util.isFormDataLike(object)) {
|
} else if (util.isFormDataLike(object)) {
|
||||||
const boundary = `----formdata-undici-0${`${Math.floor(Math.random() * 1e11)}`.padStart(11, '0')}`
|
const boundary = `----formdata-undici-0${`${random(1e11)}`.padStart(11, '0')}`
|
||||||
const prefix = `--${boundary}\r\nContent-Disposition: form-data`
|
const prefix = `--${boundary}\r\nContent-Disposition: form-data`
|
||||||
|
|
||||||
/*! formdata-polyfill. MIT License. Jimmy Wärting <https://jimmy.warting.se/opensource> */
|
/*! formdata-polyfill. MIT License. Jimmy Wärting <https://jimmy.warting.se/opensource> */
|
||||||
@ -96825,7 +95411,7 @@ function wrappy (fn, cb) {
|
|||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
|
|
||||||
/***/ 8186:
|
/***/ 333:
|
||||||
/***/ (function(module, __unused_webpack_exports, __nccwpck_require__) {
|
/***/ (function(module, __unused_webpack_exports, __nccwpck_require__) {
|
||||||
|
|
||||||
// Generated by CoffeeScript 1.12.7
|
// Generated by CoffeeScript 1.12.7
|
||||||
@ -97943,7 +96529,7 @@ function wrappy (fn, cb) {
|
|||||||
|
|
||||||
XMLElement = __nccwpck_require__(9437);
|
XMLElement = __nccwpck_require__(9437);
|
||||||
|
|
||||||
XMLCData = __nccwpck_require__(8186);
|
XMLCData = __nccwpck_require__(333);
|
||||||
|
|
||||||
XMLComment = __nccwpck_require__(4407);
|
XMLComment = __nccwpck_require__(4407);
|
||||||
|
|
||||||
@ -98918,7 +97504,7 @@ function wrappy (fn, cb) {
|
|||||||
this.baseURI = null;
|
this.baseURI = null;
|
||||||
if (!XMLElement) {
|
if (!XMLElement) {
|
||||||
XMLElement = __nccwpck_require__(9437);
|
XMLElement = __nccwpck_require__(9437);
|
||||||
XMLCData = __nccwpck_require__(8186);
|
XMLCData = __nccwpck_require__(333);
|
||||||
XMLComment = __nccwpck_require__(4407);
|
XMLComment = __nccwpck_require__(4407);
|
||||||
XMLDeclaration = __nccwpck_require__(6364);
|
XMLDeclaration = __nccwpck_require__(6364);
|
||||||
XMLDocType = __nccwpck_require__(1801);
|
XMLDocType = __nccwpck_require__(1801);
|
||||||
@ -100359,7 +98945,7 @@ function wrappy (fn, cb) {
|
|||||||
|
|
||||||
XMLDocType = __nccwpck_require__(1801);
|
XMLDocType = __nccwpck_require__(1801);
|
||||||
|
|
||||||
XMLCData = __nccwpck_require__(8186);
|
XMLCData = __nccwpck_require__(333);
|
||||||
|
|
||||||
XMLComment = __nccwpck_require__(4407);
|
XMLComment = __nccwpck_require__(4407);
|
||||||
|
|
||||||
@ -102439,6 +101025,14 @@ module.exports = require("net");
|
|||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ 6005:
|
||||||
|
/***/ ((module) => {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
module.exports = require("node:crypto");
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
/***/ 5673:
|
/***/ 5673:
|
||||||
/***/ ((module) => {
|
/***/ ((module) => {
|
||||||
|
|
||||||
@ -102581,6 +101175,1631 @@ module.exports = require("worker_threads");
|
|||||||
"use strict";
|
"use strict";
|
||||||
module.exports = require("zlib");
|
module.exports = require("zlib");
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ 2960:
|
||||||
|
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
|
||||||
|
const WritableStream = (__nccwpck_require__(4492).Writable)
|
||||||
|
const inherits = (__nccwpck_require__(7261).inherits)
|
||||||
|
|
||||||
|
const StreamSearch = __nccwpck_require__(1142)
|
||||||
|
|
||||||
|
const PartStream = __nccwpck_require__(1620)
|
||||||
|
const HeaderParser = __nccwpck_require__(2032)
|
||||||
|
|
||||||
|
const DASH = 45
|
||||||
|
const B_ONEDASH = Buffer.from('-')
|
||||||
|
const B_CRLF = Buffer.from('\r\n')
|
||||||
|
const EMPTY_FN = function () {}
|
||||||
|
|
||||||
|
function Dicer (cfg) {
|
||||||
|
if (!(this instanceof Dicer)) { return new Dicer(cfg) }
|
||||||
|
WritableStream.call(this, cfg)
|
||||||
|
|
||||||
|
if (!cfg || (!cfg.headerFirst && typeof cfg.boundary !== 'string')) { throw new TypeError('Boundary required') }
|
||||||
|
|
||||||
|
if (typeof cfg.boundary === 'string') { this.setBoundary(cfg.boundary) } else { this._bparser = undefined }
|
||||||
|
|
||||||
|
this._headerFirst = cfg.headerFirst
|
||||||
|
|
||||||
|
this._dashes = 0
|
||||||
|
this._parts = 0
|
||||||
|
this._finished = false
|
||||||
|
this._realFinish = false
|
||||||
|
this._isPreamble = true
|
||||||
|
this._justMatched = false
|
||||||
|
this._firstWrite = true
|
||||||
|
this._inHeader = true
|
||||||
|
this._part = undefined
|
||||||
|
this._cb = undefined
|
||||||
|
this._ignoreData = false
|
||||||
|
this._partOpts = { highWaterMark: cfg.partHwm }
|
||||||
|
this._pause = false
|
||||||
|
|
||||||
|
const self = this
|
||||||
|
this._hparser = new HeaderParser(cfg)
|
||||||
|
this._hparser.on('header', function (header) {
|
||||||
|
self._inHeader = false
|
||||||
|
self._part.emit('header', header)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
inherits(Dicer, WritableStream)
|
||||||
|
|
||||||
|
Dicer.prototype.emit = function (ev) {
|
||||||
|
if (ev === 'finish' && !this._realFinish) {
|
||||||
|
if (!this._finished) {
|
||||||
|
const self = this
|
||||||
|
process.nextTick(function () {
|
||||||
|
self.emit('error', new Error('Unexpected end of multipart data'))
|
||||||
|
if (self._part && !self._ignoreData) {
|
||||||
|
const type = (self._isPreamble ? 'Preamble' : 'Part')
|
||||||
|
self._part.emit('error', new Error(type + ' terminated early due to unexpected end of multipart data'))
|
||||||
|
self._part.push(null)
|
||||||
|
process.nextTick(function () {
|
||||||
|
self._realFinish = true
|
||||||
|
self.emit('finish')
|
||||||
|
self._realFinish = false
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
self._realFinish = true
|
||||||
|
self.emit('finish')
|
||||||
|
self._realFinish = false
|
||||||
|
})
|
||||||
|
}
|
||||||
|
} else { WritableStream.prototype.emit.apply(this, arguments) }
|
||||||
|
}
|
||||||
|
|
||||||
|
Dicer.prototype._write = function (data, encoding, cb) {
|
||||||
|
// ignore unexpected data (e.g. extra trailer data after finished)
|
||||||
|
if (!this._hparser && !this._bparser) { return cb() }
|
||||||
|
|
||||||
|
if (this._headerFirst && this._isPreamble) {
|
||||||
|
if (!this._part) {
|
||||||
|
this._part = new PartStream(this._partOpts)
|
||||||
|
if (this.listenerCount('preamble') !== 0) { this.emit('preamble', this._part) } else { this._ignore() }
|
||||||
|
}
|
||||||
|
const r = this._hparser.push(data)
|
||||||
|
if (!this._inHeader && r !== undefined && r < data.length) { data = data.slice(r) } else { return cb() }
|
||||||
|
}
|
||||||
|
|
||||||
|
// allows for "easier" testing
|
||||||
|
if (this._firstWrite) {
|
||||||
|
this._bparser.push(B_CRLF)
|
||||||
|
this._firstWrite = false
|
||||||
|
}
|
||||||
|
|
||||||
|
this._bparser.push(data)
|
||||||
|
|
||||||
|
if (this._pause) { this._cb = cb } else { cb() }
|
||||||
|
}
|
||||||
|
|
||||||
|
Dicer.prototype.reset = function () {
|
||||||
|
this._part = undefined
|
||||||
|
this._bparser = undefined
|
||||||
|
this._hparser = undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
Dicer.prototype.setBoundary = function (boundary) {
|
||||||
|
const self = this
|
||||||
|
this._bparser = new StreamSearch('\r\n--' + boundary)
|
||||||
|
this._bparser.on('info', function (isMatch, data, start, end) {
|
||||||
|
self._oninfo(isMatch, data, start, end)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
Dicer.prototype._ignore = function () {
|
||||||
|
if (this._part && !this._ignoreData) {
|
||||||
|
this._ignoreData = true
|
||||||
|
this._part.on('error', EMPTY_FN)
|
||||||
|
// we must perform some kind of read on the stream even though we are
|
||||||
|
// ignoring the data, otherwise node's Readable stream will not emit 'end'
|
||||||
|
// after pushing null to the stream
|
||||||
|
this._part.resume()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Dicer.prototype._oninfo = function (isMatch, data, start, end) {
|
||||||
|
let buf; const self = this; let i = 0; let r; let shouldWriteMore = true
|
||||||
|
|
||||||
|
if (!this._part && this._justMatched && data) {
|
||||||
|
while (this._dashes < 2 && (start + i) < end) {
|
||||||
|
if (data[start + i] === DASH) {
|
||||||
|
++i
|
||||||
|
++this._dashes
|
||||||
|
} else {
|
||||||
|
if (this._dashes) { buf = B_ONEDASH }
|
||||||
|
this._dashes = 0
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (this._dashes === 2) {
|
||||||
|
if ((start + i) < end && this.listenerCount('trailer') !== 0) { this.emit('trailer', data.slice(start + i, end)) }
|
||||||
|
this.reset()
|
||||||
|
this._finished = true
|
||||||
|
// no more parts will be added
|
||||||
|
if (self._parts === 0) {
|
||||||
|
self._realFinish = true
|
||||||
|
self.emit('finish')
|
||||||
|
self._realFinish = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (this._dashes) { return }
|
||||||
|
}
|
||||||
|
if (this._justMatched) { this._justMatched = false }
|
||||||
|
if (!this._part) {
|
||||||
|
this._part = new PartStream(this._partOpts)
|
||||||
|
this._part._read = function (n) {
|
||||||
|
self._unpause()
|
||||||
|
}
|
||||||
|
if (this._isPreamble && this.listenerCount('preamble') !== 0) {
|
||||||
|
this.emit('preamble', this._part)
|
||||||
|
} else if (this._isPreamble !== true && this.listenerCount('part') !== 0) {
|
||||||
|
this.emit('part', this._part)
|
||||||
|
} else {
|
||||||
|
this._ignore()
|
||||||
|
}
|
||||||
|
if (!this._isPreamble) { this._inHeader = true }
|
||||||
|
}
|
||||||
|
if (data && start < end && !this._ignoreData) {
|
||||||
|
if (this._isPreamble || !this._inHeader) {
|
||||||
|
if (buf) { shouldWriteMore = this._part.push(buf) }
|
||||||
|
shouldWriteMore = this._part.push(data.slice(start, end))
|
||||||
|
if (!shouldWriteMore) { this._pause = true }
|
||||||
|
} else if (!this._isPreamble && this._inHeader) {
|
||||||
|
if (buf) { this._hparser.push(buf) }
|
||||||
|
r = this._hparser.push(data.slice(start, end))
|
||||||
|
if (!this._inHeader && r !== undefined && r < end) { this._oninfo(false, data, start + r, end) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isMatch) {
|
||||||
|
this._hparser.reset()
|
||||||
|
if (this._isPreamble) { this._isPreamble = false } else {
|
||||||
|
if (start !== end) {
|
||||||
|
++this._parts
|
||||||
|
this._part.on('end', function () {
|
||||||
|
if (--self._parts === 0) {
|
||||||
|
if (self._finished) {
|
||||||
|
self._realFinish = true
|
||||||
|
self.emit('finish')
|
||||||
|
self._realFinish = false
|
||||||
|
} else {
|
||||||
|
self._unpause()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this._part.push(null)
|
||||||
|
this._part = undefined
|
||||||
|
this._ignoreData = false
|
||||||
|
this._justMatched = true
|
||||||
|
this._dashes = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Dicer.prototype._unpause = function () {
|
||||||
|
if (!this._pause) { return }
|
||||||
|
|
||||||
|
this._pause = false
|
||||||
|
if (this._cb) {
|
||||||
|
const cb = this._cb
|
||||||
|
this._cb = undefined
|
||||||
|
cb()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Dicer
|
||||||
|
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ 2032:
|
||||||
|
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
|
||||||
|
const EventEmitter = (__nccwpck_require__(5673).EventEmitter)
|
||||||
|
const inherits = (__nccwpck_require__(7261).inherits)
|
||||||
|
const getLimit = __nccwpck_require__(1467)
|
||||||
|
|
||||||
|
const StreamSearch = __nccwpck_require__(1142)
|
||||||
|
|
||||||
|
const B_DCRLF = Buffer.from('\r\n\r\n')
|
||||||
|
const RE_CRLF = /\r\n/g
|
||||||
|
const RE_HDR = /^([^:]+):[ \t]?([\x00-\xFF]+)?$/ // eslint-disable-line no-control-regex
|
||||||
|
|
||||||
|
function HeaderParser (cfg) {
|
||||||
|
EventEmitter.call(this)
|
||||||
|
|
||||||
|
cfg = cfg || {}
|
||||||
|
const self = this
|
||||||
|
this.nread = 0
|
||||||
|
this.maxed = false
|
||||||
|
this.npairs = 0
|
||||||
|
this.maxHeaderPairs = getLimit(cfg, 'maxHeaderPairs', 2000)
|
||||||
|
this.maxHeaderSize = getLimit(cfg, 'maxHeaderSize', 80 * 1024)
|
||||||
|
this.buffer = ''
|
||||||
|
this.header = {}
|
||||||
|
this.finished = false
|
||||||
|
this.ss = new StreamSearch(B_DCRLF)
|
||||||
|
this.ss.on('info', function (isMatch, data, start, end) {
|
||||||
|
if (data && !self.maxed) {
|
||||||
|
if (self.nread + end - start >= self.maxHeaderSize) {
|
||||||
|
end = self.maxHeaderSize - self.nread + start
|
||||||
|
self.nread = self.maxHeaderSize
|
||||||
|
self.maxed = true
|
||||||
|
} else { self.nread += (end - start) }
|
||||||
|
|
||||||
|
self.buffer += data.toString('binary', start, end)
|
||||||
|
}
|
||||||
|
if (isMatch) { self._finish() }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
inherits(HeaderParser, EventEmitter)
|
||||||
|
|
||||||
|
HeaderParser.prototype.push = function (data) {
|
||||||
|
const r = this.ss.push(data)
|
||||||
|
if (this.finished) { return r }
|
||||||
|
}
|
||||||
|
|
||||||
|
HeaderParser.prototype.reset = function () {
|
||||||
|
this.finished = false
|
||||||
|
this.buffer = ''
|
||||||
|
this.header = {}
|
||||||
|
this.ss.reset()
|
||||||
|
}
|
||||||
|
|
||||||
|
HeaderParser.prototype._finish = function () {
|
||||||
|
if (this.buffer) { this._parseHeader() }
|
||||||
|
this.ss.matches = this.ss.maxMatches
|
||||||
|
const header = this.header
|
||||||
|
this.header = {}
|
||||||
|
this.buffer = ''
|
||||||
|
this.finished = true
|
||||||
|
this.nread = this.npairs = 0
|
||||||
|
this.maxed = false
|
||||||
|
this.emit('header', header)
|
||||||
|
}
|
||||||
|
|
||||||
|
HeaderParser.prototype._parseHeader = function () {
|
||||||
|
if (this.npairs === this.maxHeaderPairs) { return }
|
||||||
|
|
||||||
|
const lines = this.buffer.split(RE_CRLF)
|
||||||
|
const len = lines.length
|
||||||
|
let m, h
|
||||||
|
|
||||||
|
for (var i = 0; i < len; ++i) { // eslint-disable-line no-var
|
||||||
|
if (lines[i].length === 0) { continue }
|
||||||
|
if (lines[i][0] === '\t' || lines[i][0] === ' ') {
|
||||||
|
// folded header content
|
||||||
|
// RFC2822 says to just remove the CRLF and not the whitespace following
|
||||||
|
// it, so we follow the RFC and include the leading whitespace ...
|
||||||
|
if (h) {
|
||||||
|
this.header[h][this.header[h].length - 1] += lines[i]
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const posColon = lines[i].indexOf(':')
|
||||||
|
if (
|
||||||
|
posColon === -1 ||
|
||||||
|
posColon === 0
|
||||||
|
) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
m = RE_HDR.exec(lines[i])
|
||||||
|
h = m[1].toLowerCase()
|
||||||
|
this.header[h] = this.header[h] || []
|
||||||
|
this.header[h].push((m[2] || ''))
|
||||||
|
if (++this.npairs === this.maxHeaderPairs) { break }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = HeaderParser
|
||||||
|
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ 1620:
|
||||||
|
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
|
||||||
|
const inherits = (__nccwpck_require__(7261).inherits)
|
||||||
|
const ReadableStream = (__nccwpck_require__(4492).Readable)
|
||||||
|
|
||||||
|
function PartStream (opts) {
|
||||||
|
ReadableStream.call(this, opts)
|
||||||
|
}
|
||||||
|
inherits(PartStream, ReadableStream)
|
||||||
|
|
||||||
|
PartStream.prototype._read = function (n) {}
|
||||||
|
|
||||||
|
module.exports = PartStream
|
||||||
|
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ 1142:
|
||||||
|
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copyright Brian White. All rights reserved.
|
||||||
|
*
|
||||||
|
* @see https://github.com/mscdex/streamsearch
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to
|
||||||
|
* deal in the Software without restriction, including without limitation the
|
||||||
|
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||||
|
* sell copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||||
|
* IN THE SOFTWARE.
|
||||||
|
*
|
||||||
|
* Based heavily on the Streaming Boyer-Moore-Horspool C++ implementation
|
||||||
|
* by Hongli Lai at: https://github.com/FooBarWidget/boyer-moore-horspool
|
||||||
|
*/
|
||||||
|
const EventEmitter = (__nccwpck_require__(5673).EventEmitter)
|
||||||
|
const inherits = (__nccwpck_require__(7261).inherits)
|
||||||
|
|
||||||
|
function SBMH (needle) {
|
||||||
|
if (typeof needle === 'string') {
|
||||||
|
needle = Buffer.from(needle)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Buffer.isBuffer(needle)) {
|
||||||
|
throw new TypeError('The needle has to be a String or a Buffer.')
|
||||||
|
}
|
||||||
|
|
||||||
|
const needleLength = needle.length
|
||||||
|
|
||||||
|
if (needleLength === 0) {
|
||||||
|
throw new Error('The needle cannot be an empty String/Buffer.')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (needleLength > 256) {
|
||||||
|
throw new Error('The needle cannot have a length bigger than 256.')
|
||||||
|
}
|
||||||
|
|
||||||
|
this.maxMatches = Infinity
|
||||||
|
this.matches = 0
|
||||||
|
|
||||||
|
this._occ = new Array(256)
|
||||||
|
.fill(needleLength) // Initialize occurrence table.
|
||||||
|
this._lookbehind_size = 0
|
||||||
|
this._needle = needle
|
||||||
|
this._bufpos = 0
|
||||||
|
|
||||||
|
this._lookbehind = Buffer.alloc(needleLength)
|
||||||
|
|
||||||
|
// Populate occurrence table with analysis of the needle,
|
||||||
|
// ignoring last letter.
|
||||||
|
for (var i = 0; i < needleLength - 1; ++i) { // eslint-disable-line no-var
|
||||||
|
this._occ[needle[i]] = needleLength - 1 - i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
inherits(SBMH, EventEmitter)
|
||||||
|
|
||||||
|
SBMH.prototype.reset = function () {
|
||||||
|
this._lookbehind_size = 0
|
||||||
|
this.matches = 0
|
||||||
|
this._bufpos = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
SBMH.prototype.push = function (chunk, pos) {
|
||||||
|
if (!Buffer.isBuffer(chunk)) {
|
||||||
|
chunk = Buffer.from(chunk, 'binary')
|
||||||
|
}
|
||||||
|
const chlen = chunk.length
|
||||||
|
this._bufpos = pos || 0
|
||||||
|
let r
|
||||||
|
while (r !== chlen && this.matches < this.maxMatches) { r = this._sbmh_feed(chunk) }
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
SBMH.prototype._sbmh_feed = function (data) {
|
||||||
|
const len = data.length
|
||||||
|
const needle = this._needle
|
||||||
|
const needleLength = needle.length
|
||||||
|
const lastNeedleChar = needle[needleLength - 1]
|
||||||
|
|
||||||
|
// Positive: points to a position in `data`
|
||||||
|
// pos == 3 points to data[3]
|
||||||
|
// Negative: points to a position in the lookbehind buffer
|
||||||
|
// pos == -2 points to lookbehind[lookbehind_size - 2]
|
||||||
|
let pos = -this._lookbehind_size
|
||||||
|
let ch
|
||||||
|
|
||||||
|
if (pos < 0) {
|
||||||
|
// Lookbehind buffer is not empty. Perform Boyer-Moore-Horspool
|
||||||
|
// search with character lookup code that considers both the
|
||||||
|
// lookbehind buffer and the current round's haystack data.
|
||||||
|
//
|
||||||
|
// Loop until
|
||||||
|
// there is a match.
|
||||||
|
// or until
|
||||||
|
// we've moved past the position that requires the
|
||||||
|
// lookbehind buffer. In this case we switch to the
|
||||||
|
// optimized loop.
|
||||||
|
// or until
|
||||||
|
// the character to look at lies outside the haystack.
|
||||||
|
while (pos < 0 && pos <= len - needleLength) {
|
||||||
|
ch = this._sbmh_lookup_char(data, pos + needleLength - 1)
|
||||||
|
|
||||||
|
if (
|
||||||
|
ch === lastNeedleChar &&
|
||||||
|
this._sbmh_memcmp(data, pos, needleLength - 1)
|
||||||
|
) {
|
||||||
|
this._lookbehind_size = 0
|
||||||
|
++this.matches
|
||||||
|
this.emit('info', true)
|
||||||
|
|
||||||
|
return (this._bufpos = pos + needleLength)
|
||||||
|
}
|
||||||
|
pos += this._occ[ch]
|
||||||
|
}
|
||||||
|
|
||||||
|
// No match.
|
||||||
|
|
||||||
|
if (pos < 0) {
|
||||||
|
// There's too few data for Boyer-Moore-Horspool to run,
|
||||||
|
// so let's use a different algorithm to skip as much as
|
||||||
|
// we can.
|
||||||
|
// Forward pos until
|
||||||
|
// the trailing part of lookbehind + data
|
||||||
|
// looks like the beginning of the needle
|
||||||
|
// or until
|
||||||
|
// pos == 0
|
||||||
|
while (pos < 0 && !this._sbmh_memcmp(data, pos, len - pos)) { ++pos }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pos >= 0) {
|
||||||
|
// Discard lookbehind buffer.
|
||||||
|
this.emit('info', false, this._lookbehind, 0, this._lookbehind_size)
|
||||||
|
this._lookbehind_size = 0
|
||||||
|
} else {
|
||||||
|
// Cut off part of the lookbehind buffer that has
|
||||||
|
// been processed and append the entire haystack
|
||||||
|
// into it.
|
||||||
|
const bytesToCutOff = this._lookbehind_size + pos
|
||||||
|
if (bytesToCutOff > 0) {
|
||||||
|
// The cut off data is guaranteed not to contain the needle.
|
||||||
|
this.emit('info', false, this._lookbehind, 0, bytesToCutOff)
|
||||||
|
}
|
||||||
|
|
||||||
|
this._lookbehind.copy(this._lookbehind, 0, bytesToCutOff,
|
||||||
|
this._lookbehind_size - bytesToCutOff)
|
||||||
|
this._lookbehind_size -= bytesToCutOff
|
||||||
|
|
||||||
|
data.copy(this._lookbehind, this._lookbehind_size)
|
||||||
|
this._lookbehind_size += len
|
||||||
|
|
||||||
|
this._bufpos = len
|
||||||
|
return len
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pos += (pos >= 0) * this._bufpos
|
||||||
|
|
||||||
|
// Lookbehind buffer is now empty. We only need to check if the
|
||||||
|
// needle is in the haystack.
|
||||||
|
if (data.indexOf(needle, pos) !== -1) {
|
||||||
|
pos = data.indexOf(needle, pos)
|
||||||
|
++this.matches
|
||||||
|
if (pos > 0) { this.emit('info', true, data, this._bufpos, pos) } else { this.emit('info', true) }
|
||||||
|
|
||||||
|
return (this._bufpos = pos + needleLength)
|
||||||
|
} else {
|
||||||
|
pos = len - needleLength
|
||||||
|
}
|
||||||
|
|
||||||
|
// There was no match. If there's trailing haystack data that we cannot
|
||||||
|
// match yet using the Boyer-Moore-Horspool algorithm (because the trailing
|
||||||
|
// data is less than the needle size) then match using a modified
|
||||||
|
// algorithm that starts matching from the beginning instead of the end.
|
||||||
|
// Whatever trailing data is left after running this algorithm is added to
|
||||||
|
// the lookbehind buffer.
|
||||||
|
while (
|
||||||
|
pos < len &&
|
||||||
|
(
|
||||||
|
data[pos] !== needle[0] ||
|
||||||
|
(
|
||||||
|
(Buffer.compare(
|
||||||
|
data.subarray(pos, pos + len - pos),
|
||||||
|
needle.subarray(0, len - pos)
|
||||||
|
) !== 0)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
++pos
|
||||||
|
}
|
||||||
|
if (pos < len) {
|
||||||
|
data.copy(this._lookbehind, 0, pos, pos + (len - pos))
|
||||||
|
this._lookbehind_size = len - pos
|
||||||
|
}
|
||||||
|
|
||||||
|
// Everything until pos is guaranteed not to contain needle data.
|
||||||
|
if (pos > 0) { this.emit('info', false, data, this._bufpos, pos < len ? pos : len) }
|
||||||
|
|
||||||
|
this._bufpos = len
|
||||||
|
return len
|
||||||
|
}
|
||||||
|
|
||||||
|
SBMH.prototype._sbmh_lookup_char = function (data, pos) {
|
||||||
|
return (pos < 0)
|
||||||
|
? this._lookbehind[this._lookbehind_size + pos]
|
||||||
|
: data[pos]
|
||||||
|
}
|
||||||
|
|
||||||
|
SBMH.prototype._sbmh_memcmp = function (data, pos, len) {
|
||||||
|
for (var i = 0; i < len; ++i) { // eslint-disable-line no-var
|
||||||
|
if (this._sbmh_lookup_char(data, pos + i) !== this._needle[i]) { return false }
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = SBMH
|
||||||
|
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ 727:
|
||||||
|
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
|
||||||
|
const WritableStream = (__nccwpck_require__(4492).Writable)
|
||||||
|
const { inherits } = __nccwpck_require__(7261)
|
||||||
|
const Dicer = __nccwpck_require__(2960)
|
||||||
|
|
||||||
|
const MultipartParser = __nccwpck_require__(2183)
|
||||||
|
const UrlencodedParser = __nccwpck_require__(8306)
|
||||||
|
const parseParams = __nccwpck_require__(1854)
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ 2183:
|
||||||
|
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
|
||||||
|
// TODO:
|
||||||
|
// * support 1 nested multipart level
|
||||||
|
// (see second multipart example here:
|
||||||
|
// http://www.w3.org/TR/html401/interact/forms.html#didx-multipartform-data)
|
||||||
|
// * support limits.fieldNameSize
|
||||||
|
// -- this will require modifications to utils.parseParams
|
||||||
|
|
||||||
|
const { Readable } = __nccwpck_require__(4492)
|
||||||
|
const { inherits } = __nccwpck_require__(7261)
|
||||||
|
|
||||||
|
const Dicer = __nccwpck_require__(2960)
|
||||||
|
|
||||||
|
const parseParams = __nccwpck_require__(1854)
|
||||||
|
const decodeText = __nccwpck_require__(4619)
|
||||||
|
const basename = __nccwpck_require__(8647)
|
||||||
|
const getLimit = __nccwpck_require__(1467)
|
||||||
|
|
||||||
|
const RE_BOUNDARY = /^boundary$/i
|
||||||
|
const RE_FIELD = /^form-data$/i
|
||||||
|
const RE_CHARSET = /^charset$/i
|
||||||
|
const RE_FILENAME = /^filename$/i
|
||||||
|
const RE_NAME = /^name$/i
|
||||||
|
|
||||||
|
Multipart.detect = /^multipart\/form-data/i
|
||||||
|
function Multipart (boy, cfg) {
|
||||||
|
let i
|
||||||
|
let len
|
||||||
|
const self = this
|
||||||
|
let boundary
|
||||||
|
const limits = cfg.limits
|
||||||
|
const isPartAFile = cfg.isPartAFile || ((fieldName, contentType, fileName) => (contentType === 'application/octet-stream' || fileName !== undefined))
|
||||||
|
const parsedConType = cfg.parsedConType || []
|
||||||
|
const defCharset = cfg.defCharset || 'utf8'
|
||||||
|
const preservePath = cfg.preservePath
|
||||||
|
const fileOpts = { highWaterMark: cfg.fileHwm }
|
||||||
|
|
||||||
|
for (i = 0, len = parsedConType.length; i < len; ++i) {
|
||||||
|
if (Array.isArray(parsedConType[i]) &&
|
||||||
|
RE_BOUNDARY.test(parsedConType[i][0])) {
|
||||||
|
boundary = parsedConType[i][1]
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkFinished () {
|
||||||
|
if (nends === 0 && finished && !boy._done) {
|
||||||
|
finished = false
|
||||||
|
self.end()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof boundary !== 'string') { throw new Error('Multipart: Boundary not found') }
|
||||||
|
|
||||||
|
const fieldSizeLimit = getLimit(limits, 'fieldSize', 1 * 1024 * 1024)
|
||||||
|
const fileSizeLimit = getLimit(limits, 'fileSize', Infinity)
|
||||||
|
const filesLimit = getLimit(limits, 'files', Infinity)
|
||||||
|
const fieldsLimit = getLimit(limits, 'fields', Infinity)
|
||||||
|
const partsLimit = getLimit(limits, 'parts', Infinity)
|
||||||
|
const headerPairsLimit = getLimit(limits, 'headerPairs', 2000)
|
||||||
|
const headerSizeLimit = getLimit(limits, 'headerSize', 80 * 1024)
|
||||||
|
|
||||||
|
let nfiles = 0
|
||||||
|
let nfields = 0
|
||||||
|
let nends = 0
|
||||||
|
let curFile
|
||||||
|
let curField
|
||||||
|
let finished = false
|
||||||
|
|
||||||
|
this._needDrain = false
|
||||||
|
this._pause = false
|
||||||
|
this._cb = undefined
|
||||||
|
this._nparts = 0
|
||||||
|
this._boy = boy
|
||||||
|
|
||||||
|
const parserCfg = {
|
||||||
|
boundary,
|
||||||
|
maxHeaderPairs: headerPairsLimit,
|
||||||
|
maxHeaderSize: headerSizeLimit,
|
||||||
|
partHwm: fileOpts.highWaterMark,
|
||||||
|
highWaterMark: cfg.highWaterMark
|
||||||
|
}
|
||||||
|
|
||||||
|
this.parser = new Dicer(parserCfg)
|
||||||
|
this.parser.on('drain', function () {
|
||||||
|
self._needDrain = false
|
||||||
|
if (self._cb && !self._pause) {
|
||||||
|
const cb = self._cb
|
||||||
|
self._cb = undefined
|
||||||
|
cb()
|
||||||
|
}
|
||||||
|
}).on('part', function onPart (part) {
|
||||||
|
if (++self._nparts > partsLimit) {
|
||||||
|
self.parser.removeListener('part', onPart)
|
||||||
|
self.parser.on('part', skipPart)
|
||||||
|
boy.hitPartsLimit = true
|
||||||
|
boy.emit('partsLimit')
|
||||||
|
return skipPart(part)
|
||||||
|
}
|
||||||
|
|
||||||
|
// hack because streams2 _always_ doesn't emit 'end' until nextTick, so let
|
||||||
|
// us emit 'end' early since we know the part has ended if we are already
|
||||||
|
// seeing the next part
|
||||||
|
if (curField) {
|
||||||
|
const field = curField
|
||||||
|
field.emit('end')
|
||||||
|
field.removeAllListeners('end')
|
||||||
|
}
|
||||||
|
|
||||||
|
part.on('header', function (header) {
|
||||||
|
let contype
|
||||||
|
let fieldname
|
||||||
|
let parsed
|
||||||
|
let charset
|
||||||
|
let encoding
|
||||||
|
let filename
|
||||||
|
let nsize = 0
|
||||||
|
|
||||||
|
if (header['content-type']) {
|
||||||
|
parsed = parseParams(header['content-type'][0])
|
||||||
|
if (parsed[0]) {
|
||||||
|
contype = parsed[0].toLowerCase()
|
||||||
|
for (i = 0, len = parsed.length; i < len; ++i) {
|
||||||
|
if (RE_CHARSET.test(parsed[i][0])) {
|
||||||
|
charset = parsed[i][1].toLowerCase()
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (contype === undefined) { contype = 'text/plain' }
|
||||||
|
if (charset === undefined) { charset = defCharset }
|
||||||
|
|
||||||
|
if (header['content-disposition']) {
|
||||||
|
parsed = parseParams(header['content-disposition'][0])
|
||||||
|
if (!RE_FIELD.test(parsed[0])) { return skipPart(part) }
|
||||||
|
for (i = 0, len = parsed.length; i < len; ++i) {
|
||||||
|
if (RE_NAME.test(parsed[i][0])) {
|
||||||
|
fieldname = parsed[i][1]
|
||||||
|
} else if (RE_FILENAME.test(parsed[i][0])) {
|
||||||
|
filename = parsed[i][1]
|
||||||
|
if (!preservePath) { filename = basename(filename) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else { return skipPart(part) }
|
||||||
|
|
||||||
|
if (header['content-transfer-encoding']) { encoding = header['content-transfer-encoding'][0].toLowerCase() } else { encoding = '7bit' }
|
||||||
|
|
||||||
|
let onData,
|
||||||
|
onEnd
|
||||||
|
|
||||||
|
if (isPartAFile(fieldname, contype, filename)) {
|
||||||
|
// file/binary field
|
||||||
|
if (nfiles === filesLimit) {
|
||||||
|
if (!boy.hitFilesLimit) {
|
||||||
|
boy.hitFilesLimit = true
|
||||||
|
boy.emit('filesLimit')
|
||||||
|
}
|
||||||
|
return skipPart(part)
|
||||||
|
}
|
||||||
|
|
||||||
|
++nfiles
|
||||||
|
|
||||||
|
if (boy.listenerCount('file') === 0) {
|
||||||
|
self.parser._ignore()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
++nends
|
||||||
|
const file = new FileStream(fileOpts)
|
||||||
|
curFile = file
|
||||||
|
file.on('end', function () {
|
||||||
|
--nends
|
||||||
|
self._pause = false
|
||||||
|
checkFinished()
|
||||||
|
if (self._cb && !self._needDrain) {
|
||||||
|
const cb = self._cb
|
||||||
|
self._cb = undefined
|
||||||
|
cb()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
file._read = function (n) {
|
||||||
|
if (!self._pause) { return }
|
||||||
|
self._pause = false
|
||||||
|
if (self._cb && !self._needDrain) {
|
||||||
|
const cb = self._cb
|
||||||
|
self._cb = undefined
|
||||||
|
cb()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
boy.emit('file', fieldname, file, filename, encoding, contype)
|
||||||
|
|
||||||
|
onData = function (data) {
|
||||||
|
if ((nsize += data.length) > fileSizeLimit) {
|
||||||
|
const extralen = fileSizeLimit - nsize + data.length
|
||||||
|
if (extralen > 0) { file.push(data.slice(0, extralen)) }
|
||||||
|
file.truncated = true
|
||||||
|
file.bytesRead = fileSizeLimit
|
||||||
|
part.removeAllListeners('data')
|
||||||
|
file.emit('limit')
|
||||||
|
return
|
||||||
|
} else if (!file.push(data)) { self._pause = true }
|
||||||
|
|
||||||
|
file.bytesRead = nsize
|
||||||
|
}
|
||||||
|
|
||||||
|
onEnd = function () {
|
||||||
|
curFile = undefined
|
||||||
|
file.push(null)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// non-file field
|
||||||
|
if (nfields === fieldsLimit) {
|
||||||
|
if (!boy.hitFieldsLimit) {
|
||||||
|
boy.hitFieldsLimit = true
|
||||||
|
boy.emit('fieldsLimit')
|
||||||
|
}
|
||||||
|
return skipPart(part)
|
||||||
|
}
|
||||||
|
|
||||||
|
++nfields
|
||||||
|
++nends
|
||||||
|
let buffer = ''
|
||||||
|
let truncated = false
|
||||||
|
curField = part
|
||||||
|
|
||||||
|
onData = function (data) {
|
||||||
|
if ((nsize += data.length) > fieldSizeLimit) {
|
||||||
|
const extralen = (fieldSizeLimit - (nsize - data.length))
|
||||||
|
buffer += data.toString('binary', 0, extralen)
|
||||||
|
truncated = true
|
||||||
|
part.removeAllListeners('data')
|
||||||
|
} else { buffer += data.toString('binary') }
|
||||||
|
}
|
||||||
|
|
||||||
|
onEnd = function () {
|
||||||
|
curField = undefined
|
||||||
|
if (buffer.length) { buffer = decodeText(buffer, 'binary', charset) }
|
||||||
|
boy.emit('field', fieldname, buffer, false, truncated, encoding, contype)
|
||||||
|
--nends
|
||||||
|
checkFinished()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* As of node@2efe4ab761666 (v0.10.29+/v0.11.14+), busboy had become
|
||||||
|
broken. Streams2/streams3 is a huge black box of confusion, but
|
||||||
|
somehow overriding the sync state seems to fix things again (and still
|
||||||
|
seems to work for previous node versions).
|
||||||
|
*/
|
||||||
|
part._readableState.sync = false
|
||||||
|
|
||||||
|
part.on('data', onData)
|
||||||
|
part.on('end', onEnd)
|
||||||
|
}).on('error', function (err) {
|
||||||
|
if (curFile) { curFile.emit('error', err) }
|
||||||
|
})
|
||||||
|
}).on('error', function (err) {
|
||||||
|
boy.emit('error', err)
|
||||||
|
}).on('finish', function () {
|
||||||
|
finished = true
|
||||||
|
checkFinished()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
Multipart.prototype.write = function (chunk, cb) {
|
||||||
|
const r = this.parser.write(chunk)
|
||||||
|
if (r && !this._pause) {
|
||||||
|
cb()
|
||||||
|
} else {
|
||||||
|
this._needDrain = !r
|
||||||
|
this._cb = cb
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Multipart.prototype.end = function () {
|
||||||
|
const self = this
|
||||||
|
|
||||||
|
if (self.parser.writable) {
|
||||||
|
self.parser.end()
|
||||||
|
} else if (!self._boy._done) {
|
||||||
|
process.nextTick(function () {
|
||||||
|
self._boy._done = true
|
||||||
|
self._boy.emit('finish')
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function skipPart (part) {
|
||||||
|
part.resume()
|
||||||
|
}
|
||||||
|
|
||||||
|
function FileStream (opts) {
|
||||||
|
Readable.call(this, opts)
|
||||||
|
|
||||||
|
this.bytesRead = 0
|
||||||
|
|
||||||
|
this.truncated = false
|
||||||
|
}
|
||||||
|
|
||||||
|
inherits(FileStream, Readable)
|
||||||
|
|
||||||
|
FileStream.prototype._read = function (n) {}
|
||||||
|
|
||||||
|
module.exports = Multipart
|
||||||
|
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ 8306:
|
||||||
|
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
|
||||||
|
const Decoder = __nccwpck_require__(7100)
|
||||||
|
const decodeText = __nccwpck_require__(4619)
|
||||||
|
const getLimit = __nccwpck_require__(1467)
|
||||||
|
|
||||||
|
const RE_CHARSET = /^charset$/i
|
||||||
|
|
||||||
|
UrlEncoded.detect = /^application\/x-www-form-urlencoded/i
|
||||||
|
function UrlEncoded (boy, cfg) {
|
||||||
|
const limits = cfg.limits
|
||||||
|
const parsedConType = cfg.parsedConType
|
||||||
|
this.boy = boy
|
||||||
|
|
||||||
|
this.fieldSizeLimit = getLimit(limits, 'fieldSize', 1 * 1024 * 1024)
|
||||||
|
this.fieldNameSizeLimit = getLimit(limits, 'fieldNameSize', 100)
|
||||||
|
this.fieldsLimit = getLimit(limits, 'fields', Infinity)
|
||||||
|
|
||||||
|
let charset
|
||||||
|
for (var i = 0, len = parsedConType.length; i < len; ++i) { // eslint-disable-line no-var
|
||||||
|
if (Array.isArray(parsedConType[i]) &&
|
||||||
|
RE_CHARSET.test(parsedConType[i][0])) {
|
||||||
|
charset = parsedConType[i][1].toLowerCase()
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (charset === undefined) { charset = cfg.defCharset || 'utf8' }
|
||||||
|
|
||||||
|
this.decoder = new Decoder()
|
||||||
|
this.charset = charset
|
||||||
|
this._fields = 0
|
||||||
|
this._state = 'key'
|
||||||
|
this._checkingBytes = true
|
||||||
|
this._bytesKey = 0
|
||||||
|
this._bytesVal = 0
|
||||||
|
this._key = ''
|
||||||
|
this._val = ''
|
||||||
|
this._keyTrunc = false
|
||||||
|
this._valTrunc = false
|
||||||
|
this._hitLimit = false
|
||||||
|
}
|
||||||
|
|
||||||
|
UrlEncoded.prototype.write = function (data, cb) {
|
||||||
|
if (this._fields === this.fieldsLimit) {
|
||||||
|
if (!this.boy.hitFieldsLimit) {
|
||||||
|
this.boy.hitFieldsLimit = true
|
||||||
|
this.boy.emit('fieldsLimit')
|
||||||
|
}
|
||||||
|
return cb()
|
||||||
|
}
|
||||||
|
|
||||||
|
let idxeq; let idxamp; let i; let p = 0; const len = data.length
|
||||||
|
|
||||||
|
while (p < len) {
|
||||||
|
if (this._state === 'key') {
|
||||||
|
idxeq = idxamp = undefined
|
||||||
|
for (i = p; i < len; ++i) {
|
||||||
|
if (!this._checkingBytes) { ++p }
|
||||||
|
if (data[i] === 0x3D/* = */) {
|
||||||
|
idxeq = i
|
||||||
|
break
|
||||||
|
} else if (data[i] === 0x26/* & */) {
|
||||||
|
idxamp = i
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if (this._checkingBytes && this._bytesKey === this.fieldNameSizeLimit) {
|
||||||
|
this._hitLimit = true
|
||||||
|
break
|
||||||
|
} else if (this._checkingBytes) { ++this._bytesKey }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (idxeq !== undefined) {
|
||||||
|
// key with assignment
|
||||||
|
if (idxeq > p) { this._key += this.decoder.write(data.toString('binary', p, idxeq)) }
|
||||||
|
this._state = 'val'
|
||||||
|
|
||||||
|
this._hitLimit = false
|
||||||
|
this._checkingBytes = true
|
||||||
|
this._val = ''
|
||||||
|
this._bytesVal = 0
|
||||||
|
this._valTrunc = false
|
||||||
|
this.decoder.reset()
|
||||||
|
|
||||||
|
p = idxeq + 1
|
||||||
|
} else if (idxamp !== undefined) {
|
||||||
|
// key with no assignment
|
||||||
|
++this._fields
|
||||||
|
let key; const keyTrunc = this._keyTrunc
|
||||||
|
if (idxamp > p) { key = (this._key += this.decoder.write(data.toString('binary', p, idxamp))) } else { key = this._key }
|
||||||
|
|
||||||
|
this._hitLimit = false
|
||||||
|
this._checkingBytes = true
|
||||||
|
this._key = ''
|
||||||
|
this._bytesKey = 0
|
||||||
|
this._keyTrunc = false
|
||||||
|
this.decoder.reset()
|
||||||
|
|
||||||
|
if (key.length) {
|
||||||
|
this.boy.emit('field', decodeText(key, 'binary', this.charset),
|
||||||
|
'',
|
||||||
|
keyTrunc,
|
||||||
|
false)
|
||||||
|
}
|
||||||
|
|
||||||
|
p = idxamp + 1
|
||||||
|
if (this._fields === this.fieldsLimit) { return cb() }
|
||||||
|
} else if (this._hitLimit) {
|
||||||
|
// we may not have hit the actual limit if there are encoded bytes...
|
||||||
|
if (i > p) { this._key += this.decoder.write(data.toString('binary', p, i)) }
|
||||||
|
p = i
|
||||||
|
if ((this._bytesKey = this._key.length) === this.fieldNameSizeLimit) {
|
||||||
|
// yep, we actually did hit the limit
|
||||||
|
this._checkingBytes = false
|
||||||
|
this._keyTrunc = true
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (p < len) { this._key += this.decoder.write(data.toString('binary', p)) }
|
||||||
|
p = len
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
idxamp = undefined
|
||||||
|
for (i = p; i < len; ++i) {
|
||||||
|
if (!this._checkingBytes) { ++p }
|
||||||
|
if (data[i] === 0x26/* & */) {
|
||||||
|
idxamp = i
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if (this._checkingBytes && this._bytesVal === this.fieldSizeLimit) {
|
||||||
|
this._hitLimit = true
|
||||||
|
break
|
||||||
|
} else if (this._checkingBytes) { ++this._bytesVal }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (idxamp !== undefined) {
|
||||||
|
++this._fields
|
||||||
|
if (idxamp > p) { this._val += this.decoder.write(data.toString('binary', p, idxamp)) }
|
||||||
|
this.boy.emit('field', decodeText(this._key, 'binary', this.charset),
|
||||||
|
decodeText(this._val, 'binary', this.charset),
|
||||||
|
this._keyTrunc,
|
||||||
|
this._valTrunc)
|
||||||
|
this._state = 'key'
|
||||||
|
|
||||||
|
this._hitLimit = false
|
||||||
|
this._checkingBytes = true
|
||||||
|
this._key = ''
|
||||||
|
this._bytesKey = 0
|
||||||
|
this._keyTrunc = false
|
||||||
|
this.decoder.reset()
|
||||||
|
|
||||||
|
p = idxamp + 1
|
||||||
|
if (this._fields === this.fieldsLimit) { return cb() }
|
||||||
|
} else if (this._hitLimit) {
|
||||||
|
// we may not have hit the actual limit if there are encoded bytes...
|
||||||
|
if (i > p) { this._val += this.decoder.write(data.toString('binary', p, i)) }
|
||||||
|
p = i
|
||||||
|
if ((this._val === '' && this.fieldSizeLimit === 0) ||
|
||||||
|
(this._bytesVal = this._val.length) === this.fieldSizeLimit) {
|
||||||
|
// yep, we actually did hit the limit
|
||||||
|
this._checkingBytes = false
|
||||||
|
this._valTrunc = true
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (p < len) { this._val += this.decoder.write(data.toString('binary', p)) }
|
||||||
|
p = len
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cb()
|
||||||
|
}
|
||||||
|
|
||||||
|
UrlEncoded.prototype.end = function () {
|
||||||
|
if (this.boy._done) { return }
|
||||||
|
|
||||||
|
if (this._state === 'key' && this._key.length > 0) {
|
||||||
|
this.boy.emit('field', decodeText(this._key, 'binary', this.charset),
|
||||||
|
'',
|
||||||
|
this._keyTrunc,
|
||||||
|
false)
|
||||||
|
} else if (this._state === 'val') {
|
||||||
|
this.boy.emit('field', decodeText(this._key, 'binary', this.charset),
|
||||||
|
decodeText(this._val, 'binary', this.charset),
|
||||||
|
this._keyTrunc,
|
||||||
|
this._valTrunc)
|
||||||
|
}
|
||||||
|
this.boy._done = true
|
||||||
|
this.boy.emit('finish')
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = UrlEncoded
|
||||||
|
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ 7100:
|
||||||
|
/***/ ((module) => {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
|
||||||
|
const RE_PLUS = /\+/g
|
||||||
|
|
||||||
|
const HEX = [
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||||
|
]
|
||||||
|
|
||||||
|
function Decoder () {
|
||||||
|
this.buffer = undefined
|
||||||
|
}
|
||||||
|
Decoder.prototype.write = function (str) {
|
||||||
|
// Replace '+' with ' ' before decoding
|
||||||
|
str = str.replace(RE_PLUS, ' ')
|
||||||
|
let res = ''
|
||||||
|
let i = 0; let p = 0; const len = str.length
|
||||||
|
for (; i < len; ++i) {
|
||||||
|
if (this.buffer !== undefined) {
|
||||||
|
if (!HEX[str.charCodeAt(i)]) {
|
||||||
|
res += '%' + this.buffer
|
||||||
|
this.buffer = undefined
|
||||||
|
--i // retry character
|
||||||
|
} else {
|
||||||
|
this.buffer += str[i]
|
||||||
|
++p
|
||||||
|
if (this.buffer.length === 2) {
|
||||||
|
res += String.fromCharCode(parseInt(this.buffer, 16))
|
||||||
|
this.buffer = undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (str[i] === '%') {
|
||||||
|
if (i > p) {
|
||||||
|
res += str.substring(p, i)
|
||||||
|
p = i
|
||||||
|
}
|
||||||
|
this.buffer = ''
|
||||||
|
++p
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (p < len && this.buffer === undefined) { res += str.substring(p) }
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
Decoder.prototype.reset = function () {
|
||||||
|
this.buffer = undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Decoder
|
||||||
|
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ 8647:
|
||||||
|
/***/ ((module) => {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
|
||||||
|
module.exports = function basename (path) {
|
||||||
|
if (typeof path !== 'string') { return '' }
|
||||||
|
for (var i = path.length - 1; i >= 0; --i) { // eslint-disable-line no-var
|
||||||
|
switch (path.charCodeAt(i)) {
|
||||||
|
case 0x2F: // '/'
|
||||||
|
case 0x5C: // '\'
|
||||||
|
path = path.slice(i + 1)
|
||||||
|
return (path === '..' || path === '.' ? '' : path)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (path === '..' || path === '.' ? '' : path)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ 4619:
|
||||||
|
/***/ (function(module) {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
|
||||||
|
// Node has always utf-8
|
||||||
|
const utf8Decoder = new TextDecoder('utf-8')
|
||||||
|
const textDecoders = new Map([
|
||||||
|
['utf-8', utf8Decoder],
|
||||||
|
['utf8', utf8Decoder]
|
||||||
|
])
|
||||||
|
|
||||||
|
function getDecoder (charset) {
|
||||||
|
let lc
|
||||||
|
while (true) {
|
||||||
|
switch (charset) {
|
||||||
|
case 'utf-8':
|
||||||
|
case 'utf8':
|
||||||
|
return decoders.utf8
|
||||||
|
case 'latin1':
|
||||||
|
case 'ascii': // TODO: Make these a separate, strict decoder?
|
||||||
|
case 'us-ascii':
|
||||||
|
case 'iso-8859-1':
|
||||||
|
case 'iso8859-1':
|
||||||
|
case 'iso88591':
|
||||||
|
case 'iso_8859-1':
|
||||||
|
case 'windows-1252':
|
||||||
|
case 'iso_8859-1:1987':
|
||||||
|
case 'cp1252':
|
||||||
|
case 'x-cp1252':
|
||||||
|
return decoders.latin1
|
||||||
|
case 'utf16le':
|
||||||
|
case 'utf-16le':
|
||||||
|
case 'ucs2':
|
||||||
|
case 'ucs-2':
|
||||||
|
return decoders.utf16le
|
||||||
|
case 'base64':
|
||||||
|
return decoders.base64
|
||||||
|
default:
|
||||||
|
if (lc === undefined) {
|
||||||
|
lc = true
|
||||||
|
charset = charset.toLowerCase()
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
return decoders.other.bind(charset)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const decoders = {
|
||||||
|
utf8: (data, sourceEncoding) => {
|
||||||
|
if (data.length === 0) {
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
if (typeof data === 'string') {
|
||||||
|
data = Buffer.from(data, sourceEncoding)
|
||||||
|
}
|
||||||
|
return data.utf8Slice(0, data.length)
|
||||||
|
},
|
||||||
|
|
||||||
|
latin1: (data, sourceEncoding) => {
|
||||||
|
if (data.length === 0) {
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
if (typeof data === 'string') {
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
return data.latin1Slice(0, data.length)
|
||||||
|
},
|
||||||
|
|
||||||
|
utf16le: (data, sourceEncoding) => {
|
||||||
|
if (data.length === 0) {
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
if (typeof data === 'string') {
|
||||||
|
data = Buffer.from(data, sourceEncoding)
|
||||||
|
}
|
||||||
|
return data.ucs2Slice(0, data.length)
|
||||||
|
},
|
||||||
|
|
||||||
|
base64: (data, sourceEncoding) => {
|
||||||
|
if (data.length === 0) {
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
if (typeof data === 'string') {
|
||||||
|
data = Buffer.from(data, sourceEncoding)
|
||||||
|
}
|
||||||
|
return data.base64Slice(0, data.length)
|
||||||
|
},
|
||||||
|
|
||||||
|
other: (data, sourceEncoding) => {
|
||||||
|
if (data.length === 0) {
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
if (typeof data === 'string') {
|
||||||
|
data = Buffer.from(data, sourceEncoding)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (textDecoders.has(this.toString())) {
|
||||||
|
try {
|
||||||
|
return textDecoders.get(this).decode(data)
|
||||||
|
} catch {}
|
||||||
|
}
|
||||||
|
return typeof data === 'string'
|
||||||
|
? data
|
||||||
|
: data.toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function decodeText (text, sourceEncoding, destEncoding) {
|
||||||
|
if (text) {
|
||||||
|
return getDecoder(destEncoding)(text, sourceEncoding)
|
||||||
|
}
|
||||||
|
return text
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = decodeText
|
||||||
|
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ 1467:
|
||||||
|
/***/ ((module) => {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
|
||||||
|
module.exports = function getLimit (limits, name, defaultLimit) {
|
||||||
|
if (
|
||||||
|
!limits ||
|
||||||
|
limits[name] === undefined ||
|
||||||
|
limits[name] === null
|
||||||
|
) { return defaultLimit }
|
||||||
|
|
||||||
|
if (
|
||||||
|
typeof limits[name] !== 'number' ||
|
||||||
|
isNaN(limits[name])
|
||||||
|
) { throw new TypeError('Limit ' + name + ' is not a valid number') }
|
||||||
|
|
||||||
|
return limits[name]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ 1854:
|
||||||
|
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
/* eslint-disable object-property-newline */
|
||||||
|
|
||||||
|
|
||||||
|
const decodeText = __nccwpck_require__(4619)
|
||||||
|
|
||||||
|
const RE_ENCODED = /%[a-fA-F0-9][a-fA-F0-9]/g
|
||||||
|
|
||||||
|
const EncodedLookup = {
|
||||||
|
'%00': '\x00', '%01': '\x01', '%02': '\x02', '%03': '\x03', '%04': '\x04',
|
||||||
|
'%05': '\x05', '%06': '\x06', '%07': '\x07', '%08': '\x08', '%09': '\x09',
|
||||||
|
'%0a': '\x0a', '%0A': '\x0a', '%0b': '\x0b', '%0B': '\x0b', '%0c': '\x0c',
|
||||||
|
'%0C': '\x0c', '%0d': '\x0d', '%0D': '\x0d', '%0e': '\x0e', '%0E': '\x0e',
|
||||||
|
'%0f': '\x0f', '%0F': '\x0f', '%10': '\x10', '%11': '\x11', '%12': '\x12',
|
||||||
|
'%13': '\x13', '%14': '\x14', '%15': '\x15', '%16': '\x16', '%17': '\x17',
|
||||||
|
'%18': '\x18', '%19': '\x19', '%1a': '\x1a', '%1A': '\x1a', '%1b': '\x1b',
|
||||||
|
'%1B': '\x1b', '%1c': '\x1c', '%1C': '\x1c', '%1d': '\x1d', '%1D': '\x1d',
|
||||||
|
'%1e': '\x1e', '%1E': '\x1e', '%1f': '\x1f', '%1F': '\x1f', '%20': '\x20',
|
||||||
|
'%21': '\x21', '%22': '\x22', '%23': '\x23', '%24': '\x24', '%25': '\x25',
|
||||||
|
'%26': '\x26', '%27': '\x27', '%28': '\x28', '%29': '\x29', '%2a': '\x2a',
|
||||||
|
'%2A': '\x2a', '%2b': '\x2b', '%2B': '\x2b', '%2c': '\x2c', '%2C': '\x2c',
|
||||||
|
'%2d': '\x2d', '%2D': '\x2d', '%2e': '\x2e', '%2E': '\x2e', '%2f': '\x2f',
|
||||||
|
'%2F': '\x2f', '%30': '\x30', '%31': '\x31', '%32': '\x32', '%33': '\x33',
|
||||||
|
'%34': '\x34', '%35': '\x35', '%36': '\x36', '%37': '\x37', '%38': '\x38',
|
||||||
|
'%39': '\x39', '%3a': '\x3a', '%3A': '\x3a', '%3b': '\x3b', '%3B': '\x3b',
|
||||||
|
'%3c': '\x3c', '%3C': '\x3c', '%3d': '\x3d', '%3D': '\x3d', '%3e': '\x3e',
|
||||||
|
'%3E': '\x3e', '%3f': '\x3f', '%3F': '\x3f', '%40': '\x40', '%41': '\x41',
|
||||||
|
'%42': '\x42', '%43': '\x43', '%44': '\x44', '%45': '\x45', '%46': '\x46',
|
||||||
|
'%47': '\x47', '%48': '\x48', '%49': '\x49', '%4a': '\x4a', '%4A': '\x4a',
|
||||||
|
'%4b': '\x4b', '%4B': '\x4b', '%4c': '\x4c', '%4C': '\x4c', '%4d': '\x4d',
|
||||||
|
'%4D': '\x4d', '%4e': '\x4e', '%4E': '\x4e', '%4f': '\x4f', '%4F': '\x4f',
|
||||||
|
'%50': '\x50', '%51': '\x51', '%52': '\x52', '%53': '\x53', '%54': '\x54',
|
||||||
|
'%55': '\x55', '%56': '\x56', '%57': '\x57', '%58': '\x58', '%59': '\x59',
|
||||||
|
'%5a': '\x5a', '%5A': '\x5a', '%5b': '\x5b', '%5B': '\x5b', '%5c': '\x5c',
|
||||||
|
'%5C': '\x5c', '%5d': '\x5d', '%5D': '\x5d', '%5e': '\x5e', '%5E': '\x5e',
|
||||||
|
'%5f': '\x5f', '%5F': '\x5f', '%60': '\x60', '%61': '\x61', '%62': '\x62',
|
||||||
|
'%63': '\x63', '%64': '\x64', '%65': '\x65', '%66': '\x66', '%67': '\x67',
|
||||||
|
'%68': '\x68', '%69': '\x69', '%6a': '\x6a', '%6A': '\x6a', '%6b': '\x6b',
|
||||||
|
'%6B': '\x6b', '%6c': '\x6c', '%6C': '\x6c', '%6d': '\x6d', '%6D': '\x6d',
|
||||||
|
'%6e': '\x6e', '%6E': '\x6e', '%6f': '\x6f', '%6F': '\x6f', '%70': '\x70',
|
||||||
|
'%71': '\x71', '%72': '\x72', '%73': '\x73', '%74': '\x74', '%75': '\x75',
|
||||||
|
'%76': '\x76', '%77': '\x77', '%78': '\x78', '%79': '\x79', '%7a': '\x7a',
|
||||||
|
'%7A': '\x7a', '%7b': '\x7b', '%7B': '\x7b', '%7c': '\x7c', '%7C': '\x7c',
|
||||||
|
'%7d': '\x7d', '%7D': '\x7d', '%7e': '\x7e', '%7E': '\x7e', '%7f': '\x7f',
|
||||||
|
'%7F': '\x7f', '%80': '\x80', '%81': '\x81', '%82': '\x82', '%83': '\x83',
|
||||||
|
'%84': '\x84', '%85': '\x85', '%86': '\x86', '%87': '\x87', '%88': '\x88',
|
||||||
|
'%89': '\x89', '%8a': '\x8a', '%8A': '\x8a', '%8b': '\x8b', '%8B': '\x8b',
|
||||||
|
'%8c': '\x8c', '%8C': '\x8c', '%8d': '\x8d', '%8D': '\x8d', '%8e': '\x8e',
|
||||||
|
'%8E': '\x8e', '%8f': '\x8f', '%8F': '\x8f', '%90': '\x90', '%91': '\x91',
|
||||||
|
'%92': '\x92', '%93': '\x93', '%94': '\x94', '%95': '\x95', '%96': '\x96',
|
||||||
|
'%97': '\x97', '%98': '\x98', '%99': '\x99', '%9a': '\x9a', '%9A': '\x9a',
|
||||||
|
'%9b': '\x9b', '%9B': '\x9b', '%9c': '\x9c', '%9C': '\x9c', '%9d': '\x9d',
|
||||||
|
'%9D': '\x9d', '%9e': '\x9e', '%9E': '\x9e', '%9f': '\x9f', '%9F': '\x9f',
|
||||||
|
'%a0': '\xa0', '%A0': '\xa0', '%a1': '\xa1', '%A1': '\xa1', '%a2': '\xa2',
|
||||||
|
'%A2': '\xa2', '%a3': '\xa3', '%A3': '\xa3', '%a4': '\xa4', '%A4': '\xa4',
|
||||||
|
'%a5': '\xa5', '%A5': '\xa5', '%a6': '\xa6', '%A6': '\xa6', '%a7': '\xa7',
|
||||||
|
'%A7': '\xa7', '%a8': '\xa8', '%A8': '\xa8', '%a9': '\xa9', '%A9': '\xa9',
|
||||||
|
'%aa': '\xaa', '%Aa': '\xaa', '%aA': '\xaa', '%AA': '\xaa', '%ab': '\xab',
|
||||||
|
'%Ab': '\xab', '%aB': '\xab', '%AB': '\xab', '%ac': '\xac', '%Ac': '\xac',
|
||||||
|
'%aC': '\xac', '%AC': '\xac', '%ad': '\xad', '%Ad': '\xad', '%aD': '\xad',
|
||||||
|
'%AD': '\xad', '%ae': '\xae', '%Ae': '\xae', '%aE': '\xae', '%AE': '\xae',
|
||||||
|
'%af': '\xaf', '%Af': '\xaf', '%aF': '\xaf', '%AF': '\xaf', '%b0': '\xb0',
|
||||||
|
'%B0': '\xb0', '%b1': '\xb1', '%B1': '\xb1', '%b2': '\xb2', '%B2': '\xb2',
|
||||||
|
'%b3': '\xb3', '%B3': '\xb3', '%b4': '\xb4', '%B4': '\xb4', '%b5': '\xb5',
|
||||||
|
'%B5': '\xb5', '%b6': '\xb6', '%B6': '\xb6', '%b7': '\xb7', '%B7': '\xb7',
|
||||||
|
'%b8': '\xb8', '%B8': '\xb8', '%b9': '\xb9', '%B9': '\xb9', '%ba': '\xba',
|
||||||
|
'%Ba': '\xba', '%bA': '\xba', '%BA': '\xba', '%bb': '\xbb', '%Bb': '\xbb',
|
||||||
|
'%bB': '\xbb', '%BB': '\xbb', '%bc': '\xbc', '%Bc': '\xbc', '%bC': '\xbc',
|
||||||
|
'%BC': '\xbc', '%bd': '\xbd', '%Bd': '\xbd', '%bD': '\xbd', '%BD': '\xbd',
|
||||||
|
'%be': '\xbe', '%Be': '\xbe', '%bE': '\xbe', '%BE': '\xbe', '%bf': '\xbf',
|
||||||
|
'%Bf': '\xbf', '%bF': '\xbf', '%BF': '\xbf', '%c0': '\xc0', '%C0': '\xc0',
|
||||||
|
'%c1': '\xc1', '%C1': '\xc1', '%c2': '\xc2', '%C2': '\xc2', '%c3': '\xc3',
|
||||||
|
'%C3': '\xc3', '%c4': '\xc4', '%C4': '\xc4', '%c5': '\xc5', '%C5': '\xc5',
|
||||||
|
'%c6': '\xc6', '%C6': '\xc6', '%c7': '\xc7', '%C7': '\xc7', '%c8': '\xc8',
|
||||||
|
'%C8': '\xc8', '%c9': '\xc9', '%C9': '\xc9', '%ca': '\xca', '%Ca': '\xca',
|
||||||
|
'%cA': '\xca', '%CA': '\xca', '%cb': '\xcb', '%Cb': '\xcb', '%cB': '\xcb',
|
||||||
|
'%CB': '\xcb', '%cc': '\xcc', '%Cc': '\xcc', '%cC': '\xcc', '%CC': '\xcc',
|
||||||
|
'%cd': '\xcd', '%Cd': '\xcd', '%cD': '\xcd', '%CD': '\xcd', '%ce': '\xce',
|
||||||
|
'%Ce': '\xce', '%cE': '\xce', '%CE': '\xce', '%cf': '\xcf', '%Cf': '\xcf',
|
||||||
|
'%cF': '\xcf', '%CF': '\xcf', '%d0': '\xd0', '%D0': '\xd0', '%d1': '\xd1',
|
||||||
|
'%D1': '\xd1', '%d2': '\xd2', '%D2': '\xd2', '%d3': '\xd3', '%D3': '\xd3',
|
||||||
|
'%d4': '\xd4', '%D4': '\xd4', '%d5': '\xd5', '%D5': '\xd5', '%d6': '\xd6',
|
||||||
|
'%D6': '\xd6', '%d7': '\xd7', '%D7': '\xd7', '%d8': '\xd8', '%D8': '\xd8',
|
||||||
|
'%d9': '\xd9', '%D9': '\xd9', '%da': '\xda', '%Da': '\xda', '%dA': '\xda',
|
||||||
|
'%DA': '\xda', '%db': '\xdb', '%Db': '\xdb', '%dB': '\xdb', '%DB': '\xdb',
|
||||||
|
'%dc': '\xdc', '%Dc': '\xdc', '%dC': '\xdc', '%DC': '\xdc', '%dd': '\xdd',
|
||||||
|
'%Dd': '\xdd', '%dD': '\xdd', '%DD': '\xdd', '%de': '\xde', '%De': '\xde',
|
||||||
|
'%dE': '\xde', '%DE': '\xde', '%df': '\xdf', '%Df': '\xdf', '%dF': '\xdf',
|
||||||
|
'%DF': '\xdf', '%e0': '\xe0', '%E0': '\xe0', '%e1': '\xe1', '%E1': '\xe1',
|
||||||
|
'%e2': '\xe2', '%E2': '\xe2', '%e3': '\xe3', '%E3': '\xe3', '%e4': '\xe4',
|
||||||
|
'%E4': '\xe4', '%e5': '\xe5', '%E5': '\xe5', '%e6': '\xe6', '%E6': '\xe6',
|
||||||
|
'%e7': '\xe7', '%E7': '\xe7', '%e8': '\xe8', '%E8': '\xe8', '%e9': '\xe9',
|
||||||
|
'%E9': '\xe9', '%ea': '\xea', '%Ea': '\xea', '%eA': '\xea', '%EA': '\xea',
|
||||||
|
'%eb': '\xeb', '%Eb': '\xeb', '%eB': '\xeb', '%EB': '\xeb', '%ec': '\xec',
|
||||||
|
'%Ec': '\xec', '%eC': '\xec', '%EC': '\xec', '%ed': '\xed', '%Ed': '\xed',
|
||||||
|
'%eD': '\xed', '%ED': '\xed', '%ee': '\xee', '%Ee': '\xee', '%eE': '\xee',
|
||||||
|
'%EE': '\xee', '%ef': '\xef', '%Ef': '\xef', '%eF': '\xef', '%EF': '\xef',
|
||||||
|
'%f0': '\xf0', '%F0': '\xf0', '%f1': '\xf1', '%F1': '\xf1', '%f2': '\xf2',
|
||||||
|
'%F2': '\xf2', '%f3': '\xf3', '%F3': '\xf3', '%f4': '\xf4', '%F4': '\xf4',
|
||||||
|
'%f5': '\xf5', '%F5': '\xf5', '%f6': '\xf6', '%F6': '\xf6', '%f7': '\xf7',
|
||||||
|
'%F7': '\xf7', '%f8': '\xf8', '%F8': '\xf8', '%f9': '\xf9', '%F9': '\xf9',
|
||||||
|
'%fa': '\xfa', '%Fa': '\xfa', '%fA': '\xfa', '%FA': '\xfa', '%fb': '\xfb',
|
||||||
|
'%Fb': '\xfb', '%fB': '\xfb', '%FB': '\xfb', '%fc': '\xfc', '%Fc': '\xfc',
|
||||||
|
'%fC': '\xfc', '%FC': '\xfc', '%fd': '\xfd', '%Fd': '\xfd', '%fD': '\xfd',
|
||||||
|
'%FD': '\xfd', '%fe': '\xfe', '%Fe': '\xfe', '%fE': '\xfe', '%FE': '\xfe',
|
||||||
|
'%ff': '\xff', '%Ff': '\xff', '%fF': '\xff', '%FF': '\xff'
|
||||||
|
}
|
||||||
|
|
||||||
|
function encodedReplacer (match) {
|
||||||
|
return EncodedLookup[match]
|
||||||
|
}
|
||||||
|
|
||||||
|
const STATE_KEY = 0
|
||||||
|
const STATE_VALUE = 1
|
||||||
|
const STATE_CHARSET = 2
|
||||||
|
const STATE_LANG = 3
|
||||||
|
|
||||||
|
function parseParams (str) {
|
||||||
|
const res = []
|
||||||
|
let state = STATE_KEY
|
||||||
|
let charset = ''
|
||||||
|
let inquote = false
|
||||||
|
let escaping = false
|
||||||
|
let p = 0
|
||||||
|
let tmp = ''
|
||||||
|
const len = str.length
|
||||||
|
|
||||||
|
for (var i = 0; i < len; ++i) { // eslint-disable-line no-var
|
||||||
|
const char = str[i]
|
||||||
|
if (char === '\\' && inquote) {
|
||||||
|
if (escaping) { escaping = false } else {
|
||||||
|
escaping = true
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
} else if (char === '"') {
|
||||||
|
if (!escaping) {
|
||||||
|
if (inquote) {
|
||||||
|
inquote = false
|
||||||
|
state = STATE_KEY
|
||||||
|
} else { inquote = true }
|
||||||
|
continue
|
||||||
|
} else { escaping = false }
|
||||||
|
} else {
|
||||||
|
if (escaping && inquote) { tmp += '\\' }
|
||||||
|
escaping = false
|
||||||
|
if ((state === STATE_CHARSET || state === STATE_LANG) && char === "'") {
|
||||||
|
if (state === STATE_CHARSET) {
|
||||||
|
state = STATE_LANG
|
||||||
|
charset = tmp.substring(1)
|
||||||
|
} else { state = STATE_VALUE }
|
||||||
|
tmp = ''
|
||||||
|
continue
|
||||||
|
} else if (state === STATE_KEY &&
|
||||||
|
(char === '*' || char === '=') &&
|
||||||
|
res.length) {
|
||||||
|
state = char === '*'
|
||||||
|
? STATE_CHARSET
|
||||||
|
: STATE_VALUE
|
||||||
|
res[p] = [tmp, undefined]
|
||||||
|
tmp = ''
|
||||||
|
continue
|
||||||
|
} else if (!inquote && char === ';') {
|
||||||
|
state = STATE_KEY
|
||||||
|
if (charset) {
|
||||||
|
if (tmp.length) {
|
||||||
|
tmp = decodeText(tmp.replace(RE_ENCODED, encodedReplacer),
|
||||||
|
'binary',
|
||||||
|
charset)
|
||||||
|
}
|
||||||
|
charset = ''
|
||||||
|
} else if (tmp.length) {
|
||||||
|
tmp = decodeText(tmp, 'binary', 'utf8')
|
||||||
|
}
|
||||||
|
if (res[p] === undefined) { res[p] = tmp } else { res[p][1] = tmp }
|
||||||
|
tmp = ''
|
||||||
|
++p
|
||||||
|
continue
|
||||||
|
} else if (!inquote && (char === ' ' || char === '\t')) { continue }
|
||||||
|
}
|
||||||
|
tmp += char
|
||||||
|
}
|
||||||
|
if (charset && tmp.length) {
|
||||||
|
tmp = decodeText(tmp.replace(RE_ENCODED, encodedReplacer),
|
||||||
|
'binary',
|
||||||
|
charset)
|
||||||
|
} else if (tmp) {
|
||||||
|
tmp = decodeText(tmp, 'binary', 'utf8')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (res[p] === undefined) {
|
||||||
|
if (tmp) { res[p] = tmp }
|
||||||
|
} else { res[p][1] = tmp }
|
||||||
|
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = parseParams
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
|
|
||||||
/***/ 9167:
|
/***/ 9167:
|
||||||
|
|||||||
14
package-lock.json
generated
14
package-lock.json
generated
@ -1061,9 +1061,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@fastify/busboy": {
|
"node_modules/@fastify/busboy": {
|
||||||
"version": "2.0.0",
|
"version": "2.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz",
|
||||||
"integrity": "sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==",
|
"integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==",
|
||||||
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=14"
|
"node": ">=14"
|
||||||
}
|
}
|
||||||
@ -5584,9 +5585,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/undici": {
|
"node_modules/undici": {
|
||||||
"version": "5.28.4",
|
"version": "5.28.5",
|
||||||
"resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz",
|
"resolved": "https://registry.npmjs.org/undici/-/undici-5.28.5.tgz",
|
||||||
"integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==",
|
"integrity": "sha512-zICwjrDrcrUE0pyyJc1I2QzBkLM8FINsgOrt6WjA+BgajVq9Nxu2PbFFXUrAggLfDXlZGZBVZYw7WNV5KiBiBA==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fastify/busboy": "^2.0.0"
|
"@fastify/busboy": "^2.0.0"
|
||||||
},
|
},
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user