101 lines
2.2 KiB
JavaScript
101 lines
2.2 KiB
JavaScript
'use strict'
|
|
|
|
/**
|
|
* Module dependencies.
|
|
*/
|
|
|
|
const bytes = require('bytes')
|
|
const contentType = require('content-type')
|
|
const typeis = require('type-is')
|
|
|
|
/**
|
|
* Module exports.
|
|
*/
|
|
module.exports = {
|
|
getCharset,
|
|
normalizeOptions,
|
|
passthrough
|
|
}
|
|
|
|
/**
|
|
* Get the charset of a request.
|
|
*
|
|
* @param {Object} req
|
|
* @returns {string | undefined}
|
|
* @private
|
|
*/
|
|
function getCharset (req) {
|
|
const header = req.headers['content-type']
|
|
if (!header) return undefined
|
|
return contentType.parse(header).parameters.charset?.toLowerCase()
|
|
}
|
|
|
|
/**
|
|
* Get the simple type checker.
|
|
*
|
|
* @param {string | string[]} type
|
|
* @returns {Function}
|
|
* @private
|
|
*/
|
|
function typeChecker (type) {
|
|
return function checkType (req) {
|
|
return Boolean(typeis(req, type))
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Normalizes the common options for all parsers.
|
|
*
|
|
* @param {Object} options options to normalize
|
|
* @param {string | string[] | Function} defaultType default content type(s) or a function to determine it
|
|
* @returns {Object}
|
|
* @private
|
|
*/
|
|
function normalizeOptions (options, defaultType) {
|
|
if (!defaultType) {
|
|
// Parsers must define a default content type
|
|
throw new TypeError('defaultType must be provided')
|
|
}
|
|
|
|
const inflate = options?.inflate !== false
|
|
const limit = typeof options?.limit === 'undefined' || options?.limit === null
|
|
? 102400 // 100kb default
|
|
: bytes.parse(options.limit)
|
|
const type = options?.type || defaultType
|
|
const verify = options?.verify || false
|
|
const defaultCharset = options?.defaultCharset || 'utf-8'
|
|
|
|
if (limit === null) {
|
|
throw new TypeError(`option limit "${String(options.limit)}" is invalid`)
|
|
}
|
|
|
|
if (verify !== false && typeof verify !== 'function') {
|
|
throw new TypeError('option verify must be function')
|
|
}
|
|
|
|
// create the appropriate type checking function
|
|
const shouldParse = typeof type !== 'function'
|
|
? typeChecker(type)
|
|
: type
|
|
|
|
return {
|
|
inflate,
|
|
limit,
|
|
verify,
|
|
defaultCharset,
|
|
shouldParse
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Passthrough function that returns input unchanged.
|
|
* Used by parsers that don't need to transform the data.
|
|
*
|
|
* @param {*} value
|
|
* @returns {*}
|
|
* @private
|
|
*/
|
|
function passthrough (value) {
|
|
return value
|
|
}
|