Fixes cookies being set by middleware (#7294)

* Fixes cookies being set by middleware

* Adding a changeset
This commit is contained in:
Matthew Phillips 2023-06-05 08:28:29 -04:00 committed by GitHub
parent af9ac3360b
commit dd1a6b6c94
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 19 additions and 1 deletions

View file

@ -0,0 +1,5 @@
---
'astro': patch
---
Fix cookies not being set by middleware

View file

@ -1,4 +1,5 @@
import type {
AstroCookies,
ComponentInstance,
Params,
Props,
@ -23,6 +24,7 @@ export interface RenderContext {
componentMetadata?: SSRResult['componentMetadata'];
route?: RouteData;
status?: number;
cookies?: AstroCookies;
params: Params;
props: Props;
}

View file

@ -145,6 +145,7 @@ export async function renderPage({
scripts: renderContext.scripts,
ssr: env.ssr,
status: renderContext.status ?? 200,
cookies: apiContext?.cookies,
locals,
});

View file

@ -53,6 +53,7 @@ export interface CreateResultArgs {
request: Request;
status: number;
locals: App.Locals;
cookies?: AstroCookies;
}
function getFunctionExpression(slot: any) {
@ -155,7 +156,7 @@ export function createResult(args: CreateResultArgs): SSRResult {
});
// Astro.cookies is defined lazily to avoid the cost on pages that do not use it.
let cookies: AstroCookies | undefined = undefined;
let cookies: AstroCookies | undefined = args.cookies;
let componentMetadata = args.componentMetadata ?? new Map();
// Create the result object that will be passed into the render function.

View file

@ -19,6 +19,10 @@ const first = defineMiddleware(async (context, next) => {
headers: response.headers,
});
} else {
if(context.url.pathname === '/') {
context.cookies.set('foo', 'bar');
}
context.locals.name = 'bar';
}
return await next();

View file

@ -66,6 +66,11 @@ describe('Middleware in DEV mode', () => {
let $ = cheerio.load(html);
expect($('title').html()).to.equal('MiddlewareNoDataOrNextCalled');
});
it('should allow setting cookies', async () => {
let res = await fixture.fetch('/');
expect(res.headers.get('set-cookie')).to.equal('foo=bar');
});
});
describe('Middleware in PROD mode, SSG', () => {