From 95ff9778dfb73c310c504fb7f804b1cdcc2c4ec0 Mon Sep 17 00:00:00 2001 From: Nalin Date: Sat, 11 Oct 2025 15:00:56 +0530 Subject: [PATCH] 405 methods updated, issue 2414 --- lib/express.js | 41 +++++++++++++++++++--------------- lib/methodNotAllowedCatcher.js | 15 +++++++++++++ 2 files changed, 38 insertions(+), 18 deletions(-) create mode 100644 lib/methodNotAllowedCatcher.js diff --git a/lib/express.js b/lib/express.js index 2d502eb54e4..46395dc528d 100644 --- a/lib/express.js +++ b/lib/express.js @@ -6,19 +6,19 @@ * MIT Licensed */ -'use strict'; +"use strict"; /** * Module dependencies. */ -var bodyParser = require('body-parser') -var EventEmitter = require('node:events').EventEmitter; -var mixin = require('merge-descriptors'); -var proto = require('./application'); -var Router = require('router'); -var req = require('./request'); -var res = require('./response'); +var bodyParser = require("body-parser"); +var EventEmitter = require("node:events").EventEmitter; +var mixin = require("merge-descriptors"); +var proto = require("./application"); +var Router = require("router"); +var req = require("./request"); +var res = require("./response"); /** * Expose `createApplication()`. @@ -33,8 +33,13 @@ exports = module.exports = createApplication; * @api public */ +/** + * Expose methodNotAllowedCatcher middleware + */ +exports.methodNotAllowedCatcher = require("./methodNotAllowedCatcher"); + function createApplication() { - var app = function(req, res, next) { + var app = function (req, res, next) { app.handle(req, res, next); }; @@ -43,13 +48,13 @@ function createApplication() { // expose the prototype that will get set on requests app.request = Object.create(req, { - app: { configurable: true, enumerable: true, writable: true, value: app } - }) + app: { configurable: true, enumerable: true, writable: true, value: app }, + }); // expose the prototype that will get set on responses app.response = Object.create(res, { - app: { configurable: true, enumerable: true, writable: true, value: app } - }) + app: { configurable: true, enumerable: true, writable: true, value: app }, + }); app.init(); return app; @@ -74,8 +79,8 @@ exports.Router = Router; * Expose middleware */ -exports.json = bodyParser.json -exports.raw = bodyParser.raw -exports.static = require('serve-static'); -exports.text = bodyParser.text -exports.urlencoded = bodyParser.urlencoded +exports.json = bodyParser.json; +exports.raw = bodyParser.raw; +exports.static = require("serve-static"); +exports.text = bodyParser.text; +exports.urlencoded = bodyParser.urlencoded; diff --git a/lib/methodNotAllowedCatcher.js b/lib/methodNotAllowedCatcher.js new file mode 100644 index 00000000000..4ef8180cd65 --- /dev/null +++ b/lib/methodNotAllowedCatcher.js @@ -0,0 +1,15 @@ +// Helper middleware to send 405 Method Not Allowed and set Allow header +function methodNotAllowedCatcher(req, res) { + if (req.route && req.route.stack) { + // Collect allowed methods from the route stack + const allowed = req.route.stack + .map((layer) => layer.method && layer.method.toUpperCase()) + .filter(Boolean); + if (allowed.length > 0) { + res.set("Allow", allowed.join(", ")); + } + } + res.sendStatus(405); +} + +module.exports = methodNotAllowedCatcher;