From d647697c8ee2bc9d3d271ed9aa9973ab3c4fb6b7 Mon Sep 17 00:00:00 2001
From: David Bauer <david.bauer@open-xchange.com>
Date: Wed, 12 Apr 2023 14:07:50 +0200
Subject: [PATCH] Fix: Faulty routing when running on different app root

---
 spec/app_root_test.js   | 3 +--
 spec/util.js            | 7 +++++--
 src/index.js            | 4 +++-
 src/routes/autohooks.js | 3 ++-
 src/routes/redirects.js | 2 +-
 5 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/spec/app_root_test.js b/spec/app_root_test.js
index 67151e4..b6a9f74 100644
--- a/spec/app_root_test.js
+++ b/spec/app_root_test.js
@@ -39,8 +39,7 @@ describe('With different app root', function () {
         }
       }
     })
-    process.env.APP_ROOT = '/appsuite/'
-    app = await injectApp()
+    app = await injectApp('/appsuite/')
   })
 
   afterEach(async function () {
diff --git a/spec/util.js b/spec/util.js
index 04a3a34..2341975 100644
--- a/spec/util.js
+++ b/spec/util.js
@@ -65,8 +65,9 @@ export function mockRedis (data = {}, isEnabled = true) {
   return mock
 }
 
-export async function injectApp () {
+export async function injectApp (appRoot = '/') {
   register.clear()
+  process.env.APP_ROOT = appRoot
   const { configMap } = await import('../src/config_map.js')
   const { getLatestVersion } = await import('../src/version.js')
 
@@ -76,7 +77,9 @@ export async function injectApp () {
   app.register(sensible)
   app.register(urlData)
   app.register(formbody)
-  app.register(autoLoad, { dir: join(__dirname, '../src/routes'), prefix: process.env.APP_ROOT, autoHooks: true })
+  const autoLoadOptions = { dir: join(__dirname, '../src/routes'), autoHooks: true }
+  if (appRoot) autoLoadOptions.options = { prefix: String(appRoot).replace(/\/$/, '') }
+  app.register(autoLoad, autoLoadOptions)
 
   return app
 }
diff --git a/src/index.js b/src/index.js
index 5ef2eea..2980e0a 100644
--- a/src/index.js
+++ b/src/index.js
@@ -45,7 +45,9 @@ app.register(autoLoad, { dir: join(__dirname, 'plugins') })
 
 // Register routes
 // Note: routes are loaded in alphabetical order
-app.register(autoLoad, { dir: join(__dirname, 'routes'), prefix: process.env.APP_ROOT, autoHooks: true })
+const autoLoadOptions = { dir: join(__dirname, 'routes'), autoHooks: true }
+if (process.env.APP_ROOT !== '/') autoLoadOptions.options = { prefix: String(process.env.APP_ROOT).replace(/\/$/, '') }
+app.register(autoLoad, autoLoadOptions)
 
 app.addHook('onReady', () => {
   // don't block the onReady hook
diff --git a/src/routes/autohooks.js b/src/routes/autohooks.js
index 4ce8d4e..31a3fe3 100644
--- a/src/routes/autohooks.js
+++ b/src/routes/autohooks.js
@@ -18,11 +18,12 @@ export default async function (app, opts) {
     done()
   })
 
+  const slowRequestThreshold = parseInt(process.env.SLOW_REQUEST_THRESHOLD) || 4000
+
   // Logs the request with the 'debug' level and also logs headers with the 'trace' level
   app.addHook('onResponse', (req, reply, done) => {
     const responseTime = reply.getResponseTime()
     const loggingOptions = { url: req.raw.url, res: reply, method: req.method, responseTime }
-    const slowRequestThreshold = parseInt(process.env.SLOW_REQUEST_THRESHOLD) || 4000
     /* c8 ignore next */
     if (process.env.LOG_LEVEL === 'trace') loggingOptions.headers = req.headers
     reply.log.debug(loggingOptions, 'request completed')
diff --git a/src/routes/redirects.js b/src/routes/redirects.js
index e2921c8..0adb224 100644
--- a/src/routes/redirects.js
+++ b/src/routes/redirects.js
@@ -9,7 +9,7 @@ export default async function redirectsPlugin (fastify) {
   })
 
   if (process.env.APP_ROOT.length > 1) {
-    fastify.get(process.env.APP_ROOT.slice(0, -1), async (req, res) => {
+    fastify.get('', async (req, res) => {
       res.redirect(process.env.APP_ROOT)
     })
   }
-- 
GitLab