Revert "Changements dans les modules (nouvelle version Express, mysql, ..)"
This reverts commit bdab795506.
This commit is contained in:
255
node_modules/finalhandler/index.js
generated
vendored
255
node_modules/finalhandler/index.js
generated
vendored
@@ -1,6 +1,6 @@
|
||||
/*!
|
||||
* finalhandler
|
||||
* Copyright(c) 2014-2015 Douglas Christopher Wilson
|
||||
* Copyright(c) 2014-2022 Douglas Christopher Wilson
|
||||
* MIT Licensed
|
||||
*/
|
||||
|
||||
@@ -12,9 +12,11 @@
|
||||
*/
|
||||
|
||||
var debug = require('debug')('finalhandler')
|
||||
var encodeUrl = require('encodeurl')
|
||||
var escapeHtml = require('escape-html')
|
||||
var http = require('http')
|
||||
var onFinished = require('on-finished')
|
||||
var parseUrl = require('parseurl')
|
||||
var statuses = require('statuses')
|
||||
var unpipe = require('unpipe')
|
||||
|
||||
/**
|
||||
@@ -22,12 +24,39 @@ var unpipe = require('unpipe')
|
||||
* @private
|
||||
*/
|
||||
|
||||
var DOUBLE_SPACE_REGEXP = /\x20{2}/g
|
||||
var NEWLINE_REGEXP = /\n/g
|
||||
|
||||
/* istanbul ignore next */
|
||||
var defer = typeof setImmediate === 'function'
|
||||
? setImmediate
|
||||
: function(fn){ process.nextTick(fn.bind.apply(fn, arguments)) }
|
||||
: function (fn) { process.nextTick(fn.bind.apply(fn, arguments)) }
|
||||
var isFinished = onFinished.isFinished
|
||||
|
||||
/**
|
||||
* Create a minimal HTML document.
|
||||
*
|
||||
* @param {string} message
|
||||
* @private
|
||||
*/
|
||||
|
||||
function createHtmlDocument (message) {
|
||||
var body = escapeHtml(message)
|
||||
.replace(NEWLINE_REGEXP, '<br>')
|
||||
.replace(DOUBLE_SPACE_REGEXP, ' ')
|
||||
|
||||
return '<!DOCTYPE html>\n' +
|
||||
'<html lang="en">\n' +
|
||||
'<head>\n' +
|
||||
'<meta charset="utf-8">\n' +
|
||||
'<title>Error</title>\n' +
|
||||
'</head>\n' +
|
||||
'<body>\n' +
|
||||
'<pre>' + body + '</pre>\n' +
|
||||
'</body>\n' +
|
||||
'</html>\n'
|
||||
}
|
||||
|
||||
/**
|
||||
* Module exports.
|
||||
* @public
|
||||
@@ -45,7 +74,7 @@ module.exports = finalhandler
|
||||
* @public
|
||||
*/
|
||||
|
||||
function finalhandler(req, res, options) {
|
||||
function finalhandler (req, res, options) {
|
||||
var opts = options || {}
|
||||
|
||||
// get environment
|
||||
@@ -55,41 +84,35 @@ function finalhandler(req, res, options) {
|
||||
var onerror = opts.onerror
|
||||
|
||||
return function (err) {
|
||||
var status = res.statusCode
|
||||
var headers
|
||||
var msg
|
||||
var status
|
||||
|
||||
// ignore 404 on in-flight response
|
||||
if (!err && res._header) {
|
||||
if (!err && headersSent(res)) {
|
||||
debug('cannot 404 after headers sent')
|
||||
return
|
||||
}
|
||||
|
||||
// unhandled error
|
||||
if (err) {
|
||||
// respect err.statusCode
|
||||
if (err.statusCode) {
|
||||
status = err.statusCode
|
||||
// respect status code from error
|
||||
status = getErrorStatusCode(err)
|
||||
|
||||
if (status === undefined) {
|
||||
// fallback to status code on response
|
||||
status = getResponseStatusCode(res)
|
||||
} else {
|
||||
// respect headers from error
|
||||
headers = getErrorHeaders(err)
|
||||
}
|
||||
|
||||
// respect err.status
|
||||
if (err.status) {
|
||||
status = err.status
|
||||
}
|
||||
|
||||
// default status code to 500
|
||||
if (!status || status < 400) {
|
||||
status = 500
|
||||
}
|
||||
|
||||
// production gets a basic error message
|
||||
var msg = env === 'production'
|
||||
? http.STATUS_CODES[status]
|
||||
: err.stack || err.toString()
|
||||
msg = escapeHtml(msg)
|
||||
.replace(/\n/g, '<br>')
|
||||
.replace(/ /g, ' ') + '\n'
|
||||
// get error message
|
||||
msg = getErrorMessage(err, status, env)
|
||||
} else {
|
||||
// not found
|
||||
status = 404
|
||||
msg = 'Cannot ' + escapeHtml(req.method) + ' ' + escapeHtml(req.originalUrl || req.url) + '\n'
|
||||
msg = 'Cannot ' + req.method + ' ' + encodeUrl(getResourceName(req))
|
||||
}
|
||||
|
||||
debug('default %s', status)
|
||||
@@ -100,29 +123,171 @@ function finalhandler(req, res, options) {
|
||||
}
|
||||
|
||||
// cannot actually respond
|
||||
if (res._header) {
|
||||
return req.socket.destroy()
|
||||
if (headersSent(res)) {
|
||||
debug('cannot %d after headers sent', status)
|
||||
req.socket.destroy()
|
||||
return
|
||||
}
|
||||
|
||||
send(req, res, status, msg)
|
||||
// send response
|
||||
send(req, res, status, headers, msg)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get headers from Error object.
|
||||
*
|
||||
* @param {Error} err
|
||||
* @return {object}
|
||||
* @private
|
||||
*/
|
||||
|
||||
function getErrorHeaders (err) {
|
||||
if (!err.headers || typeof err.headers !== 'object') {
|
||||
return undefined
|
||||
}
|
||||
|
||||
var headers = Object.create(null)
|
||||
var keys = Object.keys(err.headers)
|
||||
|
||||
for (var i = 0; i < keys.length; i++) {
|
||||
var key = keys[i]
|
||||
headers[key] = err.headers[key]
|
||||
}
|
||||
|
||||
return headers
|
||||
}
|
||||
|
||||
/**
|
||||
* Get message from Error object, fallback to status message.
|
||||
*
|
||||
* @param {Error} err
|
||||
* @param {number} status
|
||||
* @param {string} env
|
||||
* @return {string}
|
||||
* @private
|
||||
*/
|
||||
|
||||
function getErrorMessage (err, status, env) {
|
||||
var msg
|
||||
|
||||
if (env !== 'production') {
|
||||
// use err.stack, which typically includes err.message
|
||||
msg = err.stack
|
||||
|
||||
// fallback to err.toString() when possible
|
||||
if (!msg && typeof err.toString === 'function') {
|
||||
msg = err.toString()
|
||||
}
|
||||
}
|
||||
|
||||
return msg || statuses.message[status]
|
||||
}
|
||||
|
||||
/**
|
||||
* Get status code from Error object.
|
||||
*
|
||||
* @param {Error} err
|
||||
* @return {number}
|
||||
* @private
|
||||
*/
|
||||
|
||||
function getErrorStatusCode (err) {
|
||||
// check err.status
|
||||
if (typeof err.status === 'number' && err.status >= 400 && err.status < 600) {
|
||||
return err.status
|
||||
}
|
||||
|
||||
// check err.statusCode
|
||||
if (typeof err.statusCode === 'number' && err.statusCode >= 400 && err.statusCode < 600) {
|
||||
return err.statusCode
|
||||
}
|
||||
|
||||
return undefined
|
||||
}
|
||||
|
||||
/**
|
||||
* Get resource name for the request.
|
||||
*
|
||||
* This is typically just the original pathname of the request
|
||||
* but will fallback to "resource" is that cannot be determined.
|
||||
*
|
||||
* @param {IncomingMessage} req
|
||||
* @return {string}
|
||||
* @private
|
||||
*/
|
||||
|
||||
function getResourceName (req) {
|
||||
try {
|
||||
return parseUrl.original(req).pathname
|
||||
} catch (e) {
|
||||
return 'resource'
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get status code from response.
|
||||
*
|
||||
* @param {OutgoingMessage} res
|
||||
* @return {number}
|
||||
* @private
|
||||
*/
|
||||
|
||||
function getResponseStatusCode (res) {
|
||||
var status = res.statusCode
|
||||
|
||||
// default status code to 500 if outside valid range
|
||||
if (typeof status !== 'number' || status < 400 || status > 599) {
|
||||
status = 500
|
||||
}
|
||||
|
||||
return status
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if the response headers have been sent.
|
||||
*
|
||||
* @param {object} res
|
||||
* @returns {boolean}
|
||||
* @private
|
||||
*/
|
||||
|
||||
function headersSent (res) {
|
||||
return typeof res.headersSent !== 'boolean'
|
||||
? Boolean(res._header)
|
||||
: res.headersSent
|
||||
}
|
||||
|
||||
/**
|
||||
* Send response.
|
||||
*
|
||||
* @param {IncomingMessage} req
|
||||
* @param {OutgoingMessage} res
|
||||
* @param {number} status
|
||||
* @param {string} body
|
||||
* @param {object} headers
|
||||
* @param {string} message
|
||||
* @private
|
||||
*/
|
||||
|
||||
function send(req, res, status, body) {
|
||||
function write() {
|
||||
res.statusCode = status
|
||||
function send (req, res, status, headers, message) {
|
||||
function write () {
|
||||
// response body
|
||||
var body = createHtmlDocument(message)
|
||||
|
||||
// security header for content sniffing
|
||||
// response status
|
||||
res.statusCode = status
|
||||
res.statusMessage = statuses.message[status]
|
||||
|
||||
// remove any content headers
|
||||
res.removeHeader('Content-Encoding')
|
||||
res.removeHeader('Content-Language')
|
||||
res.removeHeader('Content-Range')
|
||||
|
||||
// response headers
|
||||
setHeaders(res, headers)
|
||||
|
||||
// security headers
|
||||
res.setHeader('Content-Security-Policy', "default-src 'none'")
|
||||
res.setHeader('X-Content-Type-Options', 'nosniff')
|
||||
|
||||
// standard headers
|
||||
@@ -149,3 +314,23 @@ function send(req, res, status, body) {
|
||||
onFinished(req, write)
|
||||
req.resume()
|
||||
}
|
||||
|
||||
/**
|
||||
* Set response headers from an object.
|
||||
*
|
||||
* @param {OutgoingMessage} res
|
||||
* @param {object} headers
|
||||
* @private
|
||||
*/
|
||||
|
||||
function setHeaders (res, headers) {
|
||||
if (!headers) {
|
||||
return
|
||||
}
|
||||
|
||||
var keys = Object.keys(headers)
|
||||
for (var i = 0; i < keys.length; i++) {
|
||||
var key = keys[i]
|
||||
res.setHeader(key, headers[key])
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user