From 9d21063e8c051d0568f044676a8c7afe54095c34 Mon Sep 17 00:00:00 2001 From: George Crawford Date: Sat, 12 Feb 2022 19:00:59 +0000 Subject: [PATCH 1/5] Ensure cookies are returned for 3xx redirects as well (#3808) * Ensure cookies are returned for 3xx redirects as well * linting * Update packages/kit/test/apps/basics/test/test.js * preserve headers with synthetic redirect Co-authored-by: Rich Harris --- packages/kit/src/runtime/server/index.js | 6 ++-- .../kit/src/runtime/server/page/load_node.js | 30 ++++++++----------- .../basics/src/routes/shadowed/index.svelte | 5 ++++ .../shadowed/redirect-get-with-cookie.js | 9 ++++++ .../shadowed/redirect-get-with-cookie.svelte | 1 + .../shadowed/redirect-post-with-cookie.js | 9 ++++++ .../shadowed/redirect-post-with-cookie.svelte | 1 + packages/kit/test/apps/basics/test/test.js | 22 ++++++++++++++ 8 files changed, 63 insertions(+), 20 deletions(-) create mode 100644 packages/kit/test/apps/basics/src/routes/shadowed/redirect-get-with-cookie.js create mode 100644 packages/kit/test/apps/basics/src/routes/shadowed/redirect-get-with-cookie.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/shadowed/redirect-post-with-cookie.js create mode 100644 packages/kit/test/apps/basics/src/routes/shadowed/redirect-post-with-cookie.svelte diff --git a/packages/kit/src/runtime/server/index.js b/packages/kit/src/runtime/server/index.js index 634ad06df0cf..9e52cde695d3 100644 --- a/packages/kit/src/runtime/server/index.js +++ b/packages/kit/src/runtime/server/index.js @@ -149,11 +149,11 @@ export async function respond(request, options, state = {}) { const location = response.headers.get('location'); if (location) { + const headers = new Headers(response.headers); + headers.set('x-sveltekit-location', location); response = new Response(undefined, { status: 204, - headers: { - 'x-sveltekit-location': location - } + headers }); } } diff --git a/packages/kit/src/runtime/server/page/load_node.js b/packages/kit/src/runtime/server/page/load_node.js index 0fb94b7da89e..994dac98cdfa 100644 --- a/packages/kit/src/runtime/server/page/load_node.js +++ b/packages/kit/src/runtime/server/page/load_node.js @@ -396,22 +396,21 @@ async function load_shadow_data(route, event, prerender) { if (result.fallthrough) return result; const { status, headers, body } = validate_shadow_output(result); + data.status = status; + add_cookies(/** @type {string[]} */ (data.cookies), headers); // Redirects are respected... if (status >= 300 && status < 400) { - return { - status, - redirect: /** @type {string} */ ( - headers instanceof Headers ? headers.get('location') : headers.location - ) - }; + data.redirect = /** @type {string} */ ( + headers instanceof Headers ? headers.get('location') : headers.location + ); + return data; } // ...but 4xx and 5xx status codes _don't_ result in the error page // rendering for non-GET requests — instead, we allow the page // to render with any validation errors etc that were returned - data.status = status; data.body = body; } @@ -422,21 +421,18 @@ async function load_shadow_data(route, event, prerender) { const { status, headers, body } = validate_shadow_output(result); add_cookies(/** @type {string[]} */ (data.cookies), headers); + data.status = status; if (status >= 400) { - return { - status, - error: new Error('Failed to load data') - }; + data.error = new Error('Failed to load data'); + return data; } if (status >= 300) { - return { - status, - redirect: /** @type {string} */ ( - headers instanceof Headers ? headers.get('location') : headers.location - ) - }; + data.redirect = /** @type {string} */ ( + headers instanceof Headers ? headers.get('location') : headers.location + ); + return data; } data.body = { ...body, ...data.body }; diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/index.svelte b/packages/kit/test/apps/basics/src/routes/shadowed/index.svelte index 7943e4b81a59..3cb53095aea4 100644 --- a/packages/kit/test/apps/basics/src/routes/shadowed/index.svelte +++ b/packages/kit/test/apps/basics/src/routes/shadowed/index.svelte @@ -1,11 +1,16 @@ simple redirect-get +redirect-get-with-cookie error-get
+
+ +
+
diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/redirect-get-with-cookie.js b/packages/kit/test/apps/basics/src/routes/shadowed/redirect-get-with-cookie.js new file mode 100644 index 000000000000..c2e4a2053ac2 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/shadowed/redirect-get-with-cookie.js @@ -0,0 +1,9 @@ +export function get() { + return { + status: 302, + headers: { + location: '/shadowed/redirected', + 'set-cookie': 'shadow-redirect=happy' + } + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/redirect-get-with-cookie.svelte b/packages/kit/test/apps/basics/src/routes/shadowed/redirect-get-with-cookie.svelte new file mode 100644 index 000000000000..3c3d6df7a541 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/shadowed/redirect-get-with-cookie.svelte @@ -0,0 +1 @@ +

This should not be visible

diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/redirect-post-with-cookie.js b/packages/kit/test/apps/basics/src/routes/shadowed/redirect-post-with-cookie.js new file mode 100644 index 000000000000..de4595fe2015 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/shadowed/redirect-post-with-cookie.js @@ -0,0 +1,9 @@ +export function post() { + return { + status: 302, + headers: { + location: '/shadowed/redirected', + 'set-cookie': 'shadow-redirect=happy' + } + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/redirect-post-with-cookie.svelte b/packages/kit/test/apps/basics/src/routes/shadowed/redirect-post-with-cookie.svelte new file mode 100644 index 000000000000..3c3d6df7a541 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/shadowed/redirect-post-with-cookie.svelte @@ -0,0 +1 @@ +

This should not be visible

diff --git a/packages/kit/test/apps/basics/test/test.js b/packages/kit/test/apps/basics/test/test.js index d3df15630a69..2e5cdb63b1fc 100644 --- a/packages/kit/test/apps/basics/test/test.js +++ b/packages/kit/test/apps/basics/test/test.js @@ -359,12 +359,34 @@ test.describe.parallel('Shadowed pages', () => { expect(await page.textContent('h1')).toBe('Redirection was successful'); }); + test('Handles GET redirects with cookies', async ({ page, context, clicknav }) => { + await page.goto('/shadowed'); + await clicknav('[href="/shadowed/redirect-get-with-cookie"]'); + expect(await page.textContent('h1')).toBe('Redirection was successful'); + + const cookies = await context.cookies(); + expect(cookies).toEqual( + expect.arrayContaining([expect.objectContaining({ name: 'shadow-redirect', value: 'happy' })]) + ); + }); + test('Handles POST redirects', async ({ page }) => { await page.goto('/shadowed'); await Promise.all([page.waitForNavigation(), page.click('#redirect-post')]); expect(await page.textContent('h1')).toBe('Redirection was successful'); }); + test('Handles POST redirects with cookies', async ({ page, context }) => { + await page.goto('/shadowed'); + await Promise.all([page.waitForNavigation(), page.click('#redirect-post-with-cookie')]); + expect(await page.textContent('h1')).toBe('Redirection was successful'); + + const cookies = await context.cookies(); + expect(cookies).toEqual( + expect.arrayContaining([expect.objectContaining({ name: 'shadow-redirect', value: 'happy' })]) + ); + }); + test('Renders error page for 4xx and 5xx responses from GET', async ({ page, clicknav }) => { await page.goto('/shadowed'); await clicknav('[href="/shadowed/error-get"]'); From 67e087fab9b07221dcb988db64e5b9b8a229b7f7 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sat, 12 Feb 2022 15:45:20 -0500 Subject: [PATCH 2/5] changeset (#3874) --- .changeset/clever-geckos-confess.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/clever-geckos-confess.md diff --git a/.changeset/clever-geckos-confess.md b/.changeset/clever-geckos-confess.md new file mode 100644 index 000000000000..498d12fe7995 --- /dev/null +++ b/.changeset/clever-geckos-confess.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +Set cookies when redirecting from shadow endpoint From 381821a30160f6c7f33d5cf6d763d894c120c341 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 12 Feb 2022 15:52:07 -0500 Subject: [PATCH 3/5] Version Packages (next) (#3875) Co-authored-by: github-actions[bot] --- .changeset/pre.json | 1 + packages/kit/CHANGELOG.md | 6 ++++++ packages/kit/package.json | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.changeset/pre.json b/.changeset/pre.json index daf1802f679f..210575ee4cf7 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -87,6 +87,7 @@ "clever-dolls-poke", "clever-donuts-smile", "clever-eagles-live", + "clever-geckos-confess", "clever-lizards-grab", "clever-pillows-sing", "clever-readers-turn", diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index def71a06ea67..cc1f7bad208a 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/kit +## 1.0.0-next.267 + +### Patch Changes + +- Set cookies when redirecting from shadow endpoint ([#3874](https://github.com/sveltejs/kit/pull/3874)) + ## 1.0.0-next.266 ### Patch Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index 817c6918e29a..a202b9176ce0 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "1.0.0-next.266", + "version": "1.0.0-next.267", "repository": { "type": "git", "url": "https://github.com/sveltejs/kit", From 2f4c4f2dd70c630105342cbf2c757d72ec4da6f8 Mon Sep 17 00:00:00 2001 From: Esteban Ramos Date: Sat, 12 Feb 2022 22:01:45 +0100 Subject: [PATCH 4/5] Fix: Adding compatibility shortcut to other keyboard layouts (#3876) Co-authored-by: Esteban Ramos Coronado --- sites/kit.svelte.dev/src/lib/search/SearchBox.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sites/kit.svelte.dev/src/lib/search/SearchBox.svelte b/sites/kit.svelte.dev/src/lib/search/SearchBox.svelte index 3a114fcd95b1..5161adb6330c 100644 --- a/sites/kit.svelte.dev/src/lib/search/SearchBox.svelte +++ b/sites/kit.svelte.dev/src/lib/search/SearchBox.svelte @@ -106,7 +106,7 @@ { - if (e.code === 'KeyK' && (navigator.platform === 'MacIntel' ? e.metaKey : e.ctrlKey)) { + if (e.key === 'k' && (navigator.platform === 'MacIntel' ? e.metaKey : e.ctrlKey)) { e.preventDefault(); $query = ''; $searching = !$searching; From dfae153f954e1f3a6584cc2238d4c885d7ba7c65 Mon Sep 17 00:00:00 2001 From: Janosh Riebesell Date: Sat, 12 Feb 2022 21:23:23 +0000 Subject: [PATCH 5/5] Contents.svelte calls update(), highlight() twice on mount (#3877) --- sites/kit.svelte.dev/src/lib/docs/Contents.svelte | 3 --- 1 file changed, 3 deletions(-) diff --git a/sites/kit.svelte.dev/src/lib/docs/Contents.svelte b/sites/kit.svelte.dev/src/lib/docs/Contents.svelte index de15d840ca27..2f4045c7833a 100644 --- a/sites/kit.svelte.dev/src/lib/docs/Contents.svelte +++ b/sites/kit.svelte.dev/src/lib/docs/Contents.svelte @@ -20,9 +20,6 @@ // wait for fonts to load... const timeouts = [setTimeout(onresize, 1000), setTimeout(onscroll, 5000)]; - update(); - highlight(); - return () => { window.removeEventListener('scroll', onscroll, true); window.removeEventListener('resize', onresize, true);