From: Carl Worth <cworth@cworth.org>
Date: Wed, 27 May 2020 03:43:58 +0000 (-0700)
Subject: Ensure path ending with game ID always has a trailing slash
X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=c60da21a61ee8b98550618aa197aefb3cf69a725;p=lmno-server

Ensure path ending with game ID always has a trailing slash

The trailing slash is essential here so that when JavaScript code
executing in the user agent accesses a relative resource, it is a
child of the game ID rather than a peer.

That is, from https://lmno.games/empires/WLWV/ a reference to the
"players" resource is https://lmno.games/empires/WLVW/players
(But if we started with https://lmno.games/empires/WLWV we would
end up referencing https://lmno.games/empires/players which will
not work.)

Here, we were already doing a redirect in the case of needing to
canonize the game ID, so we simply need to also do that redirect even
if the game ID was already canonical but the trailing slash was
missing.
---

diff --git a/lmno.js b/lmno.js
index abb1f20..8a3210e 100644
--- a/lmno.js
+++ b/lmno.js
@@ -142,10 +142,16 @@ app.use('/:engine([^/]+)/:game_id([a-zA-Z0-9]{4})', (request, response, next) =>
   const game_id = request.params.game_id;
   const canon_id = lmno_canonize(game_id);
 
-  /* Redirect user to page with the canonical ID in it. */
-  if (game_id !== canon_id) {
-    const new_url = request.originalUrl.replace(`/${engine}/${game_id}`,
-                                                `/${engine}/${canon_id}`);
+  /* Redirect user to page with the canonical ID in it, also ensuring
+   * that the game ID is _always_ followed by a slash. */
+  const has_slash = new RegExp(`^/${engine}/${game_id}/`);
+  if (game_id !== canon_id ||
+      ! has_slash.test(request.originalUrl))
+  {
+    const old_path = new RegExp(`/${engine}/${game_id}/?`);
+    const new_path = `/${engine}/${canon_id}/`;
+    const new_url = request.originalUrl.replace(old_path, new_path);
+    console.log("Redirecting from " + request.originalUrl + " to " + new_url);
     response.redirect(301, new_url);
     return;
   }