From d095b7a9bc006372586bfeffca414533f9fcc40d Mon Sep 17 00:00:00 2001 From: prajwal Date: Wed, 1 Apr 2026 17:36:06 +0530 Subject: [PATCH 1/4] invalid url fail response handeled --- src/app.js | 15 +++++++++++++++ src/middlewares/routeConfigInjector.js | 9 +++++++++ src/middlewares/targetPackagesInjector.js | 8 ++++++++ 3 files changed, 32 insertions(+) diff --git a/src/app.js b/src/app.js index 92ed138..4d086b6 100644 --- a/src/app.js +++ b/src/app.js @@ -56,6 +56,21 @@ const executeScripts = require('./scripts'); res.sendFile(path.join(__dirname, './api-doc/index.html')); }); + /** + * GLOBAL ERROR HANDLER + * Must be registered AFTER all routes + */ + app.use((err, req, res, next) => { + console.error('Global Error Handler:', err); + + const status = err.status || err.statusCode || 500; + + res.status(status).json({ + success: false, + message: err.message || 'Internal Server Error' + }); + }); + // Start the server app.listen(process.env.APPLICATION_PORT, (err) => { if (err) { diff --git a/src/middlewares/routeConfigInjector.js b/src/middlewares/routeConfigInjector.js index 11f4b21..82acafb 100644 --- a/src/middlewares/routeConfigInjector.js +++ b/src/middlewares/routeConfigInjector.js @@ -9,6 +9,15 @@ exports.routeConfigInjector = (req, res, next) => { const routeConfig = routesConfigs.routes.find((route) => matchPathsAndExtractParams(route.sourceRoute, urlWithoutQuery) ) + + if (!routeConfig) { + const error = new Error('Invalid URL') + error.status = 400 + error.code = 'INVALID_URL' + + return next(error) + } + if(routeConfig.targetPackages[0] && routeConfig.targetPackages[0].service){ req['baseUrl'] = process.env[`${routeConfig.targetPackages[0].service.toUpperCase()}_SERVICE_BASE_URL`] diff --git a/src/middlewares/targetPackagesInjector.js b/src/middlewares/targetPackagesInjector.js index 71eea42..ea51d49 100644 --- a/src/middlewares/targetPackagesInjector.js +++ b/src/middlewares/targetPackagesInjector.js @@ -11,6 +11,14 @@ exports.targetPackagesInjector = (req, res, next) => { matchPathsAndExtractParams(route.sourceRoute, urlWithoutQuery) ) + if (!routeConfig) { + const error = new Error('Invalid URL') + error.status = 400 + error.code = 'INVALID_URL' + + return next(error) + } + // const routeConfig = routesConfigs.routes.find((route) => route.sourceRoute === req.originalUrl) req['targetPackages'] = routeConfig.targetPackages From be5b4389f2b1ad98cd14cc8831bcb6bc6e885aa1 Mon Sep 17 00:00:00 2001 From: prajwal Date: Thu, 2 Apr 2026 17:57:34 +0530 Subject: [PATCH 2/4] error message for invalid url updated --- src/middlewares/routeConfigInjector.js | 2 +- src/middlewares/targetPackagesInjector.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/middlewares/routeConfigInjector.js b/src/middlewares/routeConfigInjector.js index 82acafb..c5a9ffa 100644 --- a/src/middlewares/routeConfigInjector.js +++ b/src/middlewares/routeConfigInjector.js @@ -11,7 +11,7 @@ exports.routeConfigInjector = (req, res, next) => { ) if (!routeConfig) { - const error = new Error('Invalid URL') + const error = new Error('Invalid URL or malformed request path.') error.status = 400 error.code = 'INVALID_URL' diff --git a/src/middlewares/targetPackagesInjector.js b/src/middlewares/targetPackagesInjector.js index ea51d49..c880ca0 100644 --- a/src/middlewares/targetPackagesInjector.js +++ b/src/middlewares/targetPackagesInjector.js @@ -12,7 +12,7 @@ exports.targetPackagesInjector = (req, res, next) => { ) if (!routeConfig) { - const error = new Error('Invalid URL') + const error = new Error('Invalid URL or malformed request path.') error.status = 400 error.code = 'INVALID_URL' From a731df3e2994214b43154b9423917919623fbc86 Mon Sep 17 00:00:00 2001 From: prajwal Date: Tue, 28 Apr 2026 15:23:03 +0530 Subject: [PATCH 3/4] removal of trailing '/' in the url handled --- src/app.js | 15 --------------- src/middlewares/routeConfigInjector.js | 8 -------- src/middlewares/targetPackagesInjector.js | 8 -------- src/utils/patternMatcher.js | 10 +++++++++- 4 files changed, 9 insertions(+), 32 deletions(-) diff --git a/src/app.js b/src/app.js index 4d086b6..92ed138 100644 --- a/src/app.js +++ b/src/app.js @@ -56,21 +56,6 @@ const executeScripts = require('./scripts'); res.sendFile(path.join(__dirname, './api-doc/index.html')); }); - /** - * GLOBAL ERROR HANDLER - * Must be registered AFTER all routes - */ - app.use((err, req, res, next) => { - console.error('Global Error Handler:', err); - - const status = err.status || err.statusCode || 500; - - res.status(status).json({ - success: false, - message: err.message || 'Internal Server Error' - }); - }); - // Start the server app.listen(process.env.APPLICATION_PORT, (err) => { if (err) { diff --git a/src/middlewares/routeConfigInjector.js b/src/middlewares/routeConfigInjector.js index c5a9ffa..7520bac 100644 --- a/src/middlewares/routeConfigInjector.js +++ b/src/middlewares/routeConfigInjector.js @@ -10,14 +10,6 @@ exports.routeConfigInjector = (req, res, next) => { matchPathsAndExtractParams(route.sourceRoute, urlWithoutQuery) ) - if (!routeConfig) { - const error = new Error('Invalid URL or malformed request path.') - error.status = 400 - error.code = 'INVALID_URL' - - return next(error) - } - if(routeConfig.targetPackages[0] && routeConfig.targetPackages[0].service){ req['baseUrl'] = process.env[`${routeConfig.targetPackages[0].service.toUpperCase()}_SERVICE_BASE_URL`] diff --git a/src/middlewares/targetPackagesInjector.js b/src/middlewares/targetPackagesInjector.js index c880ca0..71eea42 100644 --- a/src/middlewares/targetPackagesInjector.js +++ b/src/middlewares/targetPackagesInjector.js @@ -11,14 +11,6 @@ exports.targetPackagesInjector = (req, res, next) => { matchPathsAndExtractParams(route.sourceRoute, urlWithoutQuery) ) - if (!routeConfig) { - const error = new Error('Invalid URL or malformed request path.') - error.status = 400 - error.code = 'INVALID_URL' - - return next(error) - } - // const routeConfig = routesConfigs.routes.find((route) => route.sourceRoute === req.originalUrl) req['targetPackages'] = routeConfig.targetPackages diff --git a/src/utils/patternMatcher.js b/src/utils/patternMatcher.js index 74c79cc..b1f1f08 100644 --- a/src/utils/patternMatcher.js +++ b/src/utils/patternMatcher.js @@ -1,5 +1,13 @@ 'use strict' + +const removeTrailingSlash = (value) => { + if (typeof value !== 'string') return value + const normalizedValue = value.replace(/[^A-Za-z0-9._~-]+$/g, '') + return normalizedValue || '/' +} + exports.matchPathsAndExtractParams = (pattern, url) => { + const normalizedUrl = removeTrailingSlash(url) const paramNames = [] const regexPattern = new RegExp( pattern.replace(/\/:(\w+)/g, (_, paramName) => { @@ -7,7 +15,7 @@ exports.matchPathsAndExtractParams = (pattern, url) => { return '/([^/]+)' }) + '$' ) - const matchResult = url.match(regexPattern) + const matchResult = normalizedUrl.match(regexPattern) if (!matchResult) return false const params = {} for (let i = 0; i < paramNames.length; i++) { From e42540398ded4d7380cc86d7b123e67353945894 Mon Sep 17 00:00:00 2001 From: prajwal Date: Tue, 28 Apr 2026 15:30:30 +0530 Subject: [PATCH 4/4] unwanted code removed --- src/middlewares/routeConfigInjector.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/middlewares/routeConfigInjector.js b/src/middlewares/routeConfigInjector.js index 7520bac..11f4b21 100644 --- a/src/middlewares/routeConfigInjector.js +++ b/src/middlewares/routeConfigInjector.js @@ -9,7 +9,6 @@ exports.routeConfigInjector = (req, res, next) => { const routeConfig = routesConfigs.routes.find((route) => matchPathsAndExtractParams(route.sourceRoute, urlWithoutQuery) ) - if(routeConfig.targetPackages[0] && routeConfig.targetPackages[0].service){ req['baseUrl'] = process.env[`${routeConfig.targetPackages[0].service.toUpperCase()}_SERVICE_BASE_URL`]