summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.changeset/lazy-falcons-divide.md5
-rw-r--r--packages/astro/src/core/render/context.ts2
-rw-r--r--packages/astro/src/core/render/core.ts1
-rw-r--r--packages/astro/src/core/render/result.ts3
-rw-r--r--packages/astro/test/fixtures/middleware-dev/src/middleware.js4
-rw-r--r--packages/astro/test/middleware.test.js5
6 files changed, 19 insertions, 1 deletions
diff --git a/.changeset/lazy-falcons-divide.md b/.changeset/lazy-falcons-divide.md
new file mode 100644
index 000000000..a705a78d4
--- /dev/null
+++ b/.changeset/lazy-falcons-divide.md
@@ -0,0 +1,5 @@
+---
+'astro': patch
+---
+
+Fix cookies not being set by middleware
diff --git a/packages/astro/src/core/render/context.ts b/packages/astro/src/core/render/context.ts
index d4efe35df..90aaae0d2 100644
--- a/packages/astro/src/core/render/context.ts
+++ b/packages/astro/src/core/render/context.ts
@@ -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;
}
diff --git a/packages/astro/src/core/render/core.ts b/packages/astro/src/core/render/core.ts
index 1973a84c3..e82c97e0b 100644
--- a/packages/astro/src/core/render/core.ts
+++ b/packages/astro/src/core/render/core.ts
@@ -145,6 +145,7 @@ export async function renderPage({
scripts: renderContext.scripts,
ssr: env.ssr,
status: renderContext.status ?? 200,
+ cookies: apiContext?.cookies,
locals,
});
diff --git a/packages/astro/src/core/render/result.ts b/packages/astro/src/core/render/result.ts
index ede30256e..41a2fb9a4 100644
--- a/packages/astro/src/core/render/result.ts
+++ b/packages/astro/src/core/render/result.ts
@@ -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.
diff --git a/packages/astro/test/fixtures/middleware-dev/src/middleware.js b/packages/astro/test/fixtures/middleware-dev/src/middleware.js
index c8b440239..2cc7cf2ca 100644
--- a/packages/astro/test/fixtures/middleware-dev/src/middleware.js
+++ b/packages/astro/test/fixtures/middleware-dev/src/middleware.js
@@ -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();
diff --git a/packages/astro/test/middleware.test.js b/packages/astro/test/middleware.test.js
index 270666678..432e6b983 100644
--- a/packages/astro/test/middleware.test.js
+++ b/packages/astro/test/middleware.test.js
@@ -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', () => {