From 88760d7946adea408b0f3e06bb68875c14f500a7 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Thu, 26 Jan 2023 10:15:44 +0800 Subject: [PATCH 01/10] add trailing slash check for prerendered files --- .changeset/chilly-bears-change.md | 5 +++++ packages/adapter-cloudflare/src/worker.js | 9 +++++---- 2 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 .changeset/chilly-bears-change.md diff --git a/.changeset/chilly-bears-change.md b/.changeset/chilly-bears-change.md new file mode 100644 index 000000000000..bad50ae2ae47 --- /dev/null +++ b/.changeset/chilly-bears-change.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-cloudflare': patch +--- + +fix: check prerendered pages for trailing slash diff --git a/packages/adapter-cloudflare/src/worker.js b/packages/adapter-cloudflare/src/worker.js index 7f57140c1005..d22dccf48e61 100644 --- a/packages/adapter-cloudflare/src/worker.js +++ b/packages/adapter-cloudflare/src/worker.js @@ -36,11 +36,11 @@ const worker = { } }); } else { - // prerendered pages and index.html files - pathname = pathname.replace(/\/$/, '') || '/'; + // prerendered pages and assets - let file = pathname.substring(1); + const stripped_pathname = pathname.replace(/\/$/, '') || '/'; + let file = stripped_pathname.substring(1); try { file = decodeURIComponent(file); } catch (err) { @@ -50,7 +50,8 @@ const worker = { if ( manifest.assets.has(file) || manifest.assets.has(file + '/index.html') || - prerendered.has(pathname) + prerendered.has(pathname) || + prerendered.has(stripped_pathname) ) { res = await env.ASSETS.fetch(req); } else { From 12cbb55fd227539d199d4cf5a5a941da0d4d9698 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Fri, 27 Jan 2023 00:20:08 +0800 Subject: [PATCH 02/10] check URI decoded prerendered pathname --- packages/adapter-cloudflare/src/worker.js | 31 +++++++++++++---------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/packages/adapter-cloudflare/src/worker.js b/packages/adapter-cloudflare/src/worker.js index d22dccf48e61..dfbe030cd071 100644 --- a/packages/adapter-cloudflare/src/worker.js +++ b/packages/adapter-cloudflare/src/worker.js @@ -17,7 +17,7 @@ const worker = { let { pathname } = new URL(req.url); - // static assets + // immutable app assets if (pathname.startsWith(app_path)) { res = await env.ASSETS.fetch(req); if (!res.ok) return res; @@ -36,23 +36,26 @@ const worker = { } }); } else { - // prerendered pages and assets + // prerendered pages and /static files - const stripped_pathname = pathname.replace(/\/$/, '') || '/'; - - let file = stripped_pathname.substring(1); + /** @type {string | undefined} */ try { - file = decodeURIComponent(file); - } catch (err) { - // ignore + pathname = decodeURIComponent(pathname); + } catch { + // ignore invalid URI } - if ( - manifest.assets.has(file) || - manifest.assets.has(file + '/index.html') || - prerendered.has(pathname) || - prerendered.has(stripped_pathname) - ) { + const stripped_pathname = pathname.replace(/\/$/, '') || ''; + + const filename = stripped_pathname.substring(1); + let is_asset = false; + if (filename) { + is_asset = manifest.assets.has(filename) || manifest.assets.has(filename + '/index.html'); + } + + const is_prerendered = prerendered.has(pathname) || prerendered.has(stripped_pathname); + + if (is_asset || is_prerendered) { res = await env.ASSETS.fetch(req); } else { // dynamically-generated pages From 030e05a4208c57f38d2b61807c8ac4eeff6c8ba5 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Fri, 27 Jan 2023 00:22:20 +0800 Subject: [PATCH 03/10] correctly add placeholders.ts to tsconfig.json --- packages/adapter-cloudflare/src/worker.js | 2 ++ packages/adapter-cloudflare/tsconfig.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/adapter-cloudflare/src/worker.js b/packages/adapter-cloudflare/src/worker.js index dfbe030cd071..a0bf8667af0b 100644 --- a/packages/adapter-cloudflare/src/worker.js +++ b/packages/adapter-cloudflare/src/worker.js @@ -9,6 +9,7 @@ const app_path = `/${manifest.appPath}/`; /** @type {import('worktop/cfw').Module.Worker<{ ASSETS: import('worktop/cfw.durable').Durable.Object }>} */ const worker = { async fetch(req, env, context) { + // @ts-ignore await server.init({ env }); // skip cache if "cache-control: no-cache" in request let pragma = req.headers.get('cache-control') || ''; @@ -60,6 +61,7 @@ const worker = { } else { // dynamically-generated pages res = await server.respond(req, { + // @ts-ignore platform: { env, context, caches }, getClientAddress() { return req.headers.get('cf-connecting-ip'); diff --git a/packages/adapter-cloudflare/tsconfig.json b/packages/adapter-cloudflare/tsconfig.json index b5a3f7c9ffb7..4a37ad69ac8c 100644 --- a/packages/adapter-cloudflare/tsconfig.json +++ b/packages/adapter-cloudflare/tsconfig.json @@ -11,5 +11,5 @@ "@sveltejs/kit": ["../kit/types/index"] } }, - "include": ["index.js", "placeholders.ts", "src/worker.ts"] + "include": ["index.js", "placeholders.ts", "src/worker.js"] } From 3b26db3b2d4ed9d6011a435b945138d7f6979147 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Fri, 27 Jan 2023 00:43:56 +0800 Subject: [PATCH 04/10] correct changeset --- .changeset/chilly-bears-change.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/chilly-bears-change.md b/.changeset/chilly-bears-change.md index bad50ae2ae47..f24efd6c6dd3 100644 --- a/.changeset/chilly-bears-change.md +++ b/.changeset/chilly-bears-change.md @@ -2,4 +2,4 @@ '@sveltejs/adapter-cloudflare': patch --- -fix: check prerendered pages for trailing slash +fix: correctly check prerendered page pathname for Cloudflare adapter From f7ee69efcd8c4eb0620d8e3a1e24825203d0ecb8 Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Fri, 27 Jan 2023 10:27:56 +0100 Subject: [PATCH 05/10] cleanup --- packages/adapter-cloudflare/src/worker.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/adapter-cloudflare/src/worker.js b/packages/adapter-cloudflare/src/worker.js index a0bf8667af0b..6866cdd899c3 100644 --- a/packages/adapter-cloudflare/src/worker.js +++ b/packages/adapter-cloudflare/src/worker.js @@ -39,7 +39,6 @@ const worker = { } else { // prerendered pages and /static files - /** @type {string | undefined} */ try { pathname = decodeURIComponent(pathname); } catch { @@ -48,8 +47,8 @@ const worker = { const stripped_pathname = pathname.replace(/\/$/, '') || ''; - const filename = stripped_pathname.substring(1); let is_asset = false; + const filename = stripped_pathname.substring(1); if (filename) { is_asset = manifest.assets.has(filename) || manifest.assets.has(filename + '/index.html'); } From a18fecd28e8db6fccedab8e02dda224c40610de4 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Sat, 28 Jan 2023 22:28:12 +0800 Subject: [PATCH 06/10] rename generated files comment Co-authored-by: Rich Harris --- packages/adapter-cloudflare/src/worker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/adapter-cloudflare/src/worker.js b/packages/adapter-cloudflare/src/worker.js index 6866cdd899c3..8da9cbd43246 100644 --- a/packages/adapter-cloudflare/src/worker.js +++ b/packages/adapter-cloudflare/src/worker.js @@ -18,7 +18,7 @@ const worker = { let { pathname } = new URL(req.url); - // immutable app assets + // generated files if (pathname.startsWith(app_path)) { res = await env.ASSETS.fetch(req); if (!res.ok) return res; From cb13ec356527cf00740f5b012d6064120ad4d59e Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Sat, 28 Jan 2023 22:41:51 +0800 Subject: [PATCH 07/10] rewrite changeset --- .changeset/chilly-bears-change.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/chilly-bears-change.md b/.changeset/chilly-bears-change.md index f24efd6c6dd3..3265bc09efa7 100644 --- a/.changeset/chilly-bears-change.md +++ b/.changeset/chilly-bears-change.md @@ -2,4 +2,4 @@ '@sveltejs/adapter-cloudflare': patch --- -fix: correctly check prerendered page pathname for Cloudflare adapter +fix: correctly check URL pathname with Cloudflare adapter From 8501617cc0af87db21c50be58d51570969e2b125 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Sun, 29 Jan 2023 01:14:52 +0800 Subject: [PATCH 08/10] add redirect to counterpart route --- packages/adapter-cloudflare/src/worker.js | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/packages/adapter-cloudflare/src/worker.js b/packages/adapter-cloudflare/src/worker.js index 8da9cbd43246..aa10efeef98b 100644 --- a/packages/adapter-cloudflare/src/worker.js +++ b/packages/adapter-cloudflare/src/worker.js @@ -45,18 +45,26 @@ const worker = { // ignore invalid URI } - const stripped_pathname = pathname.replace(/\/$/, '') || ''; + const stripped_pathname = pathname.replace(/\/$/, ''); - let is_asset = false; + let is_static_asset = false; const filename = stripped_pathname.substring(1); if (filename) { - is_asset = manifest.assets.has(filename) || manifest.assets.has(filename + '/index.html'); + is_static_asset = + manifest.assets.has(filename) || manifest.assets.has(filename + '/index.html'); } - const is_prerendered = prerendered.has(pathname) || prerendered.has(stripped_pathname); + const counterpart_route = pathname.at(-1) === '/' ? stripped_pathname : pathname + '/'; - if (is_asset || is_prerendered) { + if (is_static_asset || prerendered.has(pathname)) { res = await env.ASSETS.fetch(req); + } else if (prerendered.has(counterpart_route)) { + res = new Response('', { + status: 301, + headers: { + location: counterpart_route + } + }); } else { // dynamically-generated pages res = await server.respond(req, { From 0972ad08eb2a04b0f1d6222756a59b6e05e2778d Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Sun, 29 Jan 2023 01:18:05 +0800 Subject: [PATCH 09/10] add check for empty counterpart route string --- packages/adapter-cloudflare/src/worker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/adapter-cloudflare/src/worker.js b/packages/adapter-cloudflare/src/worker.js index aa10efeef98b..1bd5fb2b31c3 100644 --- a/packages/adapter-cloudflare/src/worker.js +++ b/packages/adapter-cloudflare/src/worker.js @@ -58,7 +58,7 @@ const worker = { if (is_static_asset || prerendered.has(pathname)) { res = await env.ASSETS.fetch(req); - } else if (prerendered.has(counterpart_route)) { + } else if (counterpart_route && prerendered.has(counterpart_route)) { res = new Response('', { status: 301, headers: { From 84de0dde6b55653399b98d536769b49cfaca7673 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Sun, 29 Jan 2023 01:39:27 +0800 Subject: [PATCH 10/10] change redirect status to 308 to match adapter-vercel --- packages/adapter-cloudflare/src/worker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/adapter-cloudflare/src/worker.js b/packages/adapter-cloudflare/src/worker.js index 1bd5fb2b31c3..9c643e547f9a 100644 --- a/packages/adapter-cloudflare/src/worker.js +++ b/packages/adapter-cloudflare/src/worker.js @@ -60,7 +60,7 @@ const worker = { res = await env.ASSETS.fetch(req); } else if (counterpart_route && prerendered.has(counterpart_route)) { res = new Response('', { - status: 301, + status: 308, headers: { location: counterpart_route }