From a3d620620b97a02111f89268b63f5084494a0e21 Mon Sep 17 00:00:00 2001 From: Conduitry Date: Fri, 16 Jun 2023 07:30:37 -0400 Subject: [PATCH 01/14] set isSyntheticRequest when creating RequestEvent object --- packages/kit/src/runtime/server/respond.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/kit/src/runtime/server/respond.js b/packages/kit/src/runtime/server/respond.js index 1cd9d058ad6b..bacf300a4d23 100644 --- a/packages/kit/src/runtime/server/respond.js +++ b/packages/kit/src/runtime/server/respond.js @@ -169,7 +169,8 @@ export async function respond(request, options, manifest, state) { } }, url, - isDataRequest: is_data_request + isDataRequest: is_data_request, + isSyntheticRequest: state.depth > 0 }; /** @type {import('types').RequiredResolveOptions} */ From 44eb2a8ebdbfe3c1082157322448e5a5268fd57d Mon Sep 17 00:00:00 2001 From: Conduitry Date: Fri, 16 Jun 2023 07:30:51 -0400 Subject: [PATCH 02/14] update types --- packages/kit/src/exports/public.d.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index 35c9235b0c94..c20ad6780cd4 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -1012,6 +1012,10 @@ export interface RequestEvent< * related to the data request in this case. Use this property instead if the distinction is important to you. */ isDataRequest: boolean; + /** + * `true` if the request comes from a call to one of our own API endpoints made during SSR (or prerendering). This is handled by directly calling `+server.js` without the overhead of actually making an HTTP request. Use this property if you want to treat these synthetic requests different in some way. + */ + isSyntheticRequest: boolean; } /** From 9b156061468cd12db0f5e084986e4f112e1a3002 Mon Sep 17 00:00:00 2001 From: Conduitry Date: Fri, 16 Jun 2023 07:32:21 -0400 Subject: [PATCH 03/14] add changeset --- .changeset/small-ears-heal.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/small-ears-heal.md diff --git a/.changeset/small-ears-heal.md b/.changeset/small-ears-heal.md new file mode 100644 index 000000000000..cd602ec70f40 --- /dev/null +++ b/.changeset/small-ears-heal.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': minor +--- + +feat: add `event.isSyntheticRequest` boolean indicating whether this is a call to one of the app's own APIs during SSR From 9065c8d936a8e248f9889aff2bb921d266b7f383 Mon Sep 17 00:00:00 2001 From: Conduitry Date: Fri, 16 Jun 2023 07:43:28 -0400 Subject: [PATCH 04/14] grammar --- packages/kit/src/exports/public.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index c20ad6780cd4..f76eb81dd4cb 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -1013,7 +1013,7 @@ export interface RequestEvent< */ isDataRequest: boolean; /** - * `true` if the request comes from a call to one of our own API endpoints made during SSR (or prerendering). This is handled by directly calling `+server.js` without the overhead of actually making an HTTP request. Use this property if you want to treat these synthetic requests different in some way. + * `true` if the request comes from a call to one of our own API endpoints made during SSR (or prerendering). This is handled by directly calling `+server.js` without the overhead of actually making an HTTP request. Use this property if you want to treat these synthetic requests differently in some way. */ isSyntheticRequest: boolean; } From 3f3db087fb3df8ea988b12541cb29061e03d71c8 Mon Sep 17 00:00:00 2001 From: Conduitry Date: Fri, 16 Jun 2023 08:23:45 -0400 Subject: [PATCH 05/14] add test --- packages/kit/test/apps/basics/src/hooks.server.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/kit/test/apps/basics/src/hooks.server.js b/packages/kit/test/apps/basics/src/hooks.server.js index 41c77c6f000e..d85938387e4c 100644 --- a/packages/kit/test/apps/basics/src/hooks.server.js +++ b/packages/kit/test/apps/basics/src/hooks.server.js @@ -56,6 +56,12 @@ export const handle = sequence( } return resolve(event); }, + ({ event, resolve }) => { + if (!(event.request.headers.has('user-agent') ^ event.isSyntheticRequest)) { + throw new Error('Synthetic requests should have isSyntheticRequest set to true'); + } + return resolve(event); + }, ({ event, resolve }) => { if (event.url.pathname.includes('fetch-credentialed')) { // Only get the cookie at the test where we know it's set to avoid polluting our logs with (correct) warnings From 95f7de52313f96dfe7565b5eb0af30dd2fde6200 Mon Sep 17 00:00:00 2001 From: Conduitry Date: Fri, 16 Jun 2023 08:36:59 -0400 Subject: [PATCH 06/14] appease lint --- packages/kit/test/apps/basics/src/hooks.server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kit/test/apps/basics/src/hooks.server.js b/packages/kit/test/apps/basics/src/hooks.server.js index d85938387e4c..975f5f06d440 100644 --- a/packages/kit/test/apps/basics/src/hooks.server.js +++ b/packages/kit/test/apps/basics/src/hooks.server.js @@ -57,7 +57,7 @@ export const handle = sequence( return resolve(event); }, ({ event, resolve }) => { - if (!(event.request.headers.has('user-agent') ^ event.isSyntheticRequest)) { + if (event.request.headers.has('user-agent') === !!event.isSyntheticRequest) { throw new Error('Synthetic requests should have isSyntheticRequest set to true'); } return resolve(event); From 777d0cb89c04e517ff5b8182fb18b13310a7a14c Mon Sep 17 00:00:00 2001 From: Conduitry Date: Fri, 16 Jun 2023 09:59:03 -0400 Subject: [PATCH 07/14] hopefully fix tests --- packages/kit/test/apps/basics/src/hooks.server.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/kit/test/apps/basics/src/hooks.server.js b/packages/kit/test/apps/basics/src/hooks.server.js index 975f5f06d440..bb63d627464e 100644 --- a/packages/kit/test/apps/basics/src/hooks.server.js +++ b/packages/kit/test/apps/basics/src/hooks.server.js @@ -57,7 +57,7 @@ export const handle = sequence( return resolve(event); }, ({ event, resolve }) => { - if (event.request.headers.has('user-agent') === !!event.isSyntheticRequest) { + if (!!event.request.headers.get('x-this-is-a-synthetic-request') !== event.isSyntheticRequest) { throw new Error('Synthetic requests should have isSyntheticRequest set to true'); } return resolve(event); @@ -138,5 +138,7 @@ export async function handleFetch({ request, fetch }) { ); } + request.headers.set('x-this-is-a-synthetic-request', 'true'); + return fetch(request); } From cfd10b1c52927ae9382213fa798dab366cb49e13 Mon Sep 17 00:00:00 2001 From: Conduitry Date: Fri, 16 Jun 2023 11:29:04 -0400 Subject: [PATCH 08/14] Revert "hopefully fix tests" This reverts commit 777d0cb89c04e517ff5b8182fb18b13310a7a14c. --- packages/kit/test/apps/basics/src/hooks.server.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/kit/test/apps/basics/src/hooks.server.js b/packages/kit/test/apps/basics/src/hooks.server.js index bb63d627464e..975f5f06d440 100644 --- a/packages/kit/test/apps/basics/src/hooks.server.js +++ b/packages/kit/test/apps/basics/src/hooks.server.js @@ -57,7 +57,7 @@ export const handle = sequence( return resolve(event); }, ({ event, resolve }) => { - if (!!event.request.headers.get('x-this-is-a-synthetic-request') !== event.isSyntheticRequest) { + if (event.request.headers.has('user-agent') === !!event.isSyntheticRequest) { throw new Error('Synthetic requests should have isSyntheticRequest set to true'); } return resolve(event); @@ -138,7 +138,5 @@ export async function handleFetch({ request, fetch }) { ); } - request.headers.set('x-this-is-a-synthetic-request', 'true'); - return fetch(request); } From 8dbf3fd94ec8f8372963df58b1a3b7d6d0fd6f0d Mon Sep 17 00:00:00 2001 From: Conduitry Date: Fri, 16 Jun 2023 11:37:21 -0400 Subject: [PATCH 09/14] skip testing calls with a Host header these are probably from prerendering, and it is difficult to determine whether they are synthetic --- packages/kit/test/apps/basics/src/hooks.server.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/kit/test/apps/basics/src/hooks.server.js b/packages/kit/test/apps/basics/src/hooks.server.js index 975f5f06d440..550d06ba5473 100644 --- a/packages/kit/test/apps/basics/src/hooks.server.js +++ b/packages/kit/test/apps/basics/src/hooks.server.js @@ -57,7 +57,10 @@ export const handle = sequence( return resolve(event); }, ({ event, resolve }) => { - if (event.request.headers.has('user-agent') === !!event.isSyntheticRequest) { + if ( + event.request.headers.has('host') && + !event.request.headers.has('user-agent') !== event.isSyntheticRequest + ) { throw new Error('Synthetic requests should have isSyntheticRequest set to true'); } return resolve(event); From fdc1af24c6b65afc10c3f52e927e69cbbc5fdd89 Mon Sep 17 00:00:00 2001 From: Conduitry Date: Fri, 16 Jun 2023 12:22:47 -0400 Subject: [PATCH 10/14] rename isSyntheticRequest -> isSubRequest --- .changeset/small-ears-heal.md | 2 +- packages/kit/src/exports/public.d.ts | 2 +- packages/kit/src/runtime/server/respond.js | 2 +- packages/kit/test/apps/basics/src/hooks.server.js | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.changeset/small-ears-heal.md b/.changeset/small-ears-heal.md index cd602ec70f40..6eb34b8a3cc1 100644 --- a/.changeset/small-ears-heal.md +++ b/.changeset/small-ears-heal.md @@ -2,4 +2,4 @@ '@sveltejs/kit': minor --- -feat: add `event.isSyntheticRequest` boolean indicating whether this is a call to one of the app's own APIs during SSR +feat: add `event.isSubRequest` boolean indicating whether this is a call to one of the app's own APIs during SSR (or prerendering) diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index f76eb81dd4cb..e2c75a144db3 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -1015,7 +1015,7 @@ export interface RequestEvent< /** * `true` if the request comes from a call to one of our own API endpoints made during SSR (or prerendering). This is handled by directly calling `+server.js` without the overhead of actually making an HTTP request. Use this property if you want to treat these synthetic requests differently in some way. */ - isSyntheticRequest: boolean; + isSubRequest: boolean; } /** diff --git a/packages/kit/src/runtime/server/respond.js b/packages/kit/src/runtime/server/respond.js index bacf300a4d23..47b8d5c56b26 100644 --- a/packages/kit/src/runtime/server/respond.js +++ b/packages/kit/src/runtime/server/respond.js @@ -170,7 +170,7 @@ export async function respond(request, options, manifest, state) { }, url, isDataRequest: is_data_request, - isSyntheticRequest: state.depth > 0 + isSubRequest: state.depth > 0 }; /** @type {import('types').RequiredResolveOptions} */ diff --git a/packages/kit/test/apps/basics/src/hooks.server.js b/packages/kit/test/apps/basics/src/hooks.server.js index 550d06ba5473..3b4b841e5667 100644 --- a/packages/kit/test/apps/basics/src/hooks.server.js +++ b/packages/kit/test/apps/basics/src/hooks.server.js @@ -59,9 +59,9 @@ export const handle = sequence( ({ event, resolve }) => { if ( event.request.headers.has('host') && - !event.request.headers.has('user-agent') !== event.isSyntheticRequest + !event.request.headers.has('user-agent') !== event.isSubRequest ) { - throw new Error('Synthetic requests should have isSyntheticRequest set to true'); + throw new Error('Synthetic requests should have isSubRequest set to true'); } return resolve(event); }, From 4124d78648b29b770c92a5ecf12457ea8aa88960 Mon Sep 17 00:00:00 2001 From: Conduitry Date: Fri, 16 Jun 2023 12:24:42 -0400 Subject: [PATCH 11/14] suggested docs update --- packages/kit/src/exports/public.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index e2c75a144db3..38848c796ede 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -1013,7 +1013,7 @@ export interface RequestEvent< */ isDataRequest: boolean; /** - * `true` if the request comes from a call to one of our own API endpoints made during SSR (or prerendering). This is handled by directly calling `+server.js` without the overhead of actually making an HTTP request. Use this property if you want to treat these synthetic requests differently in some way. + * `true` if the request comes from a call to one of our own API endpoints made during SSR (or prerendering). SvelteKit in this case directly calls `+server.js` without the overhead of actually making an HTTP request. */ isSubRequest: boolean; } From caff3df28331fb198134dc7c071c6c1ae504ce51 Mon Sep 17 00:00:00 2001 From: Conduitry Date: Fri, 16 Jun 2023 14:33:39 -0400 Subject: [PATCH 12/14] one final instance of 'synthetic' --- packages/kit/test/apps/basics/src/hooks.server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kit/test/apps/basics/src/hooks.server.js b/packages/kit/test/apps/basics/src/hooks.server.js index 3b4b841e5667..c684719ed476 100644 --- a/packages/kit/test/apps/basics/src/hooks.server.js +++ b/packages/kit/test/apps/basics/src/hooks.server.js @@ -61,7 +61,7 @@ export const handle = sequence( event.request.headers.has('host') && !event.request.headers.has('user-agent') !== event.isSubRequest ) { - throw new Error('Synthetic requests should have isSubRequest set to true'); + throw new Error('SSR API sub-requests should have isSubRequest set to true'); } return resolve(event); }, From 49a58a7e2e1963c23aa8a3ec487384c02b47eb4c Mon Sep 17 00:00:00 2001 From: Conduitry Date: Wed, 28 Jun 2023 09:45:56 -0400 Subject: [PATCH 13/14] tweak description Co-authored-by: Simon H <5968653+dummdidumm@users.noreply.github.com> --- packages/kit/src/exports/public.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index 38848c796ede..5fbb2ba1ce54 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -1013,7 +1013,7 @@ export interface RequestEvent< */ isDataRequest: boolean; /** - * `true` if the request comes from a call to one of our own API endpoints made during SSR (or prerendering). SvelteKit in this case directly calls `+server.js` without the overhead of actually making an HTTP request. + * `true` for `+server.js` calls coming from SvelteKit without the overhead of actually making an HTTP request. This happens when you make relative `fetch` requests on the server. */ isSubRequest: boolean; } From 5ce9606dd1a0eca231e016f2be4856252286031d Mon Sep 17 00:00:00 2001 From: Conduitry Date: Wed, 28 Jun 2023 12:30:07 -0400 Subject: [PATCH 14/14] tweak description again Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> --- packages/kit/src/exports/public.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index 5fbb2ba1ce54..a0ad68a40c2b 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -1013,7 +1013,7 @@ export interface RequestEvent< */ isDataRequest: boolean; /** - * `true` for `+server.js` calls coming from SvelteKit without the overhead of actually making an HTTP request. This happens when you make relative `fetch` requests on the server. + * `true` for `+server.js` calls coming from SvelteKit without the overhead of actually making an HTTP request. This happens when you make same-origin `fetch` requests on the server. */ isSubRequest: boolean; }