Skip to content

Commit 2ef9b7d

Browse files
teemingcdummdidumm
andauthored
fix: correctly serialize request url when using load fetch (#8876)
fixes #8852 Slices the origin from any client fetch request URLs so that they're always similar in format to fetches done on the server, which is important to find cached responses --------- Co-authored-by: Simon H <[email protected]>
1 parent e56a13c commit 2ef9b7d

File tree

4 files changed

+18
-6
lines changed

4 files changed

+18
-6
lines changed

.changeset/silent-icons-guess.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@sveltejs/kit': patch
3+
---
4+
5+
fix: correctly serialize request url when using load `fetch`

packages/kit/src/runtime/client/client.js

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -594,12 +594,17 @@ export function create_client({ target }) {
594594
}
595595

596596
// we must fixup relative urls so they are resolved from the target page
597-
const resolved = new URL(requested, url).href;
598-
depends(resolved);
597+
const resolved = new URL(requested, url);
598+
depends(resolved.href);
599+
600+
// match ssr serialized data url, which is important to find cached responses
601+
if (resolved.origin === url.origin) {
602+
requested = resolved.href.slice(url.origin.length);
603+
}
599604

600605
// prerendered pages may be served from any origin, so `initial_fetch` urls shouldn't be resolved
601606
return started
602-
? subsequent_fetch(requested, resolved, init)
607+
? subsequent_fetch(requested, resolved.href, init)
603608
: initial_fetch(requested, init);
604609
},
605610
setHeaders: () => {}, // noop

packages/kit/test/apps/basics/src/routes/load/serialization/+page.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
/** @type {import('./$types').PageLoad} */
2-
export async function load({ fetch, data }) {
2+
export async function load({ fetch, data, url }) {
33
const { a } = data;
44

5-
const res = await fetch('/load/serialization/fetched-from-shared.json');
5+
const res = await fetch(new URL('/load/serialization/fetched-from-shared.json', url.origin));
66
const { b } = await res.json();
77

88
return { a, b, c: a + b };

packages/kit/test/apps/basics/test/test.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,9 @@ test.describe('Load', () => {
211211

212212
if (!javaScriptEnabled) {
213213
// by the time JS has run, hydration will have nuked these scripts
214-
const script_contents = await page.innerHTML('script[data-sveltekit-fetched]');
214+
const script_contents = await page.innerHTML(
215+
'script[data-sveltekit-fetched][data-url="/load/serialization/fetched-from-shared.json"]'
216+
);
215217

216218
const payload = '{"status":200,"statusText":"","headers":{},"body":"{\\"b\\":2}"}';
217219

0 commit comments

Comments
 (0)