diff --git a/packages/astro/src/core/endpoint/index.ts b/packages/astro/src/core/endpoint/index.ts index 9c3b57133..0fc387df7 100644 --- a/packages/astro/src/core/endpoint/index.ts +++ b/packages/astro/src/core/endpoint/index.ts @@ -48,12 +48,14 @@ export function createAPIContext({ generator: `Astro v${ASTRO_VERSION}`, props, redirect(path, status) { - return new Response(null, { + const response = new Response(null, { status: status || 302, headers: { Location: path, }, }); + attachCookiesToResponse(response, context.cookies); + return response; }, ResponseWithEncoding, url: new URL(request.url), diff --git a/packages/astro/src/core/render/core.ts b/packages/astro/src/core/render/core.ts index fb10ccc80..498105f8b 100644 --- a/packages/astro/src/core/render/core.ts +++ b/packages/astro/src/core/render/core.ts @@ -24,12 +24,14 @@ export type RenderPage = { export async function renderPage({ mod, renderContext, env, cookies }: RenderPage) { if (routeIsRedirect(renderContext.route)) { - return new Response(null, { + const response = new Response(null, { status: redirectRouteStatus(renderContext.route, renderContext.request.method), headers: { location: redirectRouteGenerate(renderContext.route, renderContext.params), }, }); + attachToResponse(response, cookies); + return response; } // Validate the page component before rendering the page diff --git a/packages/astro/test/fixtures/middleware-dev/src/middleware.js b/packages/astro/test/fixtures/middleware-dev/src/middleware.js index 854c997c1..02f8fb965 100644 --- a/packages/astro/test/fixtures/middleware-dev/src/middleware.js +++ b/packages/astro/test/fixtures/middleware-dev/src/middleware.js @@ -18,14 +18,14 @@ const first = defineMiddleware(async (context, next) => { return new Response(JSON.stringify(object), { headers: response.headers, }); - } else if(context.url.pathname === '/clone') { + } else if (context.url.pathname === '/clone') { const response = await next(); const newResponse = response.clone(); const /** @type {string} */ html = await newResponse.text(); const newhtml = html.replace('

testing

', '

it works

'); return new Response(newhtml, { status: 200, headers: response.headers }); } else { - if(context.url.pathname === '/') { + if (context.url.pathname === '/') { context.cookies.set('foo', 'bar'); } @@ -38,6 +38,7 @@ const second = defineMiddleware(async (context, next) => { if (context.request.url.includes('/second')) { context.locals.name = 'second'; } else if (context.request.url.includes('/redirect')) { + context.cookies.set('redirect', 'cookie redirect set'); return context.redirect('/', 302); } return await next(); diff --git a/packages/astro/test/fixtures/middleware-dev/src/pages/index.astro b/packages/astro/test/fixtures/middleware-dev/src/pages/index.astro index 395a4d695..2abc4da3e 100644 --- a/packages/astro/test/fixtures/middleware-dev/src/pages/index.astro +++ b/packages/astro/test/fixtures/middleware-dev/src/pages/index.astro @@ -1,5 +1,7 @@ --- const data = Astro.locals; +const redirect = Astro.cookies.get("redirect"); +console.log(redirect); --- @@ -10,5 +12,6 @@ const data = Astro.locals; Index

{data?.name}

+

{redirect.value}

diff --git a/packages/astro/test/middleware.test.js b/packages/astro/test/middleware.test.js index 3796a341f..b0c722b5e 100644 --- a/packages/astro/test/middleware.test.js +++ b/packages/astro/test/middleware.test.js @@ -79,6 +79,13 @@ describe('Middleware in DEV mode', () => { let html = await res.text(); expect(html).to.contain('

it works

'); }); + + it('cookies should be preserved when calling a redirect', async () => { + let res = await fixture.fetch('/redirect'); + let html = await res.text(); + console.log(res.headers.get('set-cookie')); + expect(html).to.contain('

cookie redirect set

'); + }); }); describe('Middleware in PROD mode, SSG', () => {