Skip to content

Commit 5f33ac4

Browse files
authored
[SDK-4318] Enable responses from custom middleware (auth0#1265)
2 parents 616f6f9 + c3ec92a commit 5f33ac4

File tree

2 files changed

+44
-7
lines changed

2 files changed

+44
-7
lines changed

src/helpers/with-middleware-auth-required.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,13 +82,13 @@ export default function withMiddlewareAuthRequiredFactory(
8282
const res = await (middleware && middleware(...args));
8383

8484
if (res) {
85-
const headers = new Headers(res.headers);
86-
const cookies = headers.get('set-cookie')?.split(', ') || [];
87-
const authCookies = authRes.headers.get('set-cookie')?.split(', ') || [];
88-
if (cookies.length || authCookies.length) {
89-
headers.set('set-cookie', [...authCookies, ...cookies].join(', '));
85+
const nextRes = new NextResponse(res.body, res);
86+
for (const cookie of authRes.cookies.getAll()) {
87+
if (!nextRes.cookies.get(cookie.name)) {
88+
nextRes.cookies.set(cookie);
89+
}
9090
}
91-
return NextResponse.next({ ...res, status: res.status, headers });
91+
return nextRes;
9292
} else {
9393
return authRes;
9494
}

tests/helpers/with-middleware-auth-required.test.ts

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,44 @@ describe('with-middleware-auth-required', () => {
178178
};
179179
const res = await setup({ user: { name: 'dave' }, middleware });
180180
expect(res.status).toEqual(200);
181-
expect(res.headers.get('set-cookie')).toMatch(/^appSession=.+, foo=bar;/);
181+
// @ts-expect-errors ts dom doesn't have getAll
182+
expect(res.headers.getAll('set-cookie')).toHaveLength(2);
183+
expect(res.headers.get('set-cookie')).toMatch(/appSession=/);
184+
expect(res.headers.get('set-cookie')).toMatch(/foo=bar;/);
185+
});
186+
187+
test('should allow responses from custom middleware', async () => {
188+
const middleware = () => {
189+
return NextResponse.json({ foo: 'bar' });
190+
};
191+
const res = await setup({ user: { name: 'dave' }, middleware });
192+
expect(res.status).toEqual(200);
193+
await expect(res.json()).resolves.toEqual({ foo: 'bar' });
194+
});
195+
196+
test('should allow ReadableStream responses from custom middleware', async () => {
197+
const middleware = () => {
198+
// @ts-expect-errors ts dom doesn't have json
199+
return new Response(Response.json({ foo: 'bar' }).body);
200+
};
201+
const res = await setup({ user: { name: 'dave' }, middleware });
202+
expect(res.status).toEqual(200);
203+
await expect(res.json()).resolves.toEqual({ foo: 'bar' });
204+
});
205+
206+
test('should allow responses and cookies from custom middleware', async () => {
207+
const middleware = () => {
208+
const res = NextResponse.json({ foo: 'bar' });
209+
res.cookies.set('foo', 'bar');
210+
return res;
211+
};
212+
const res = await setup({ user: { name: 'dave' }, middleware });
213+
expect(res.status).toEqual(200);
214+
await expect(res.json()).resolves.toEqual({ foo: 'bar' });
215+
// @ts-expect-errors ts dom doesn't have getAll
216+
expect(res.headers.getAll('set-cookie')).toHaveLength(2);
217+
expect(res.headers.get('set-cookie')).toMatch(/appSession=/);
218+
expect(res.headers.get('set-cookie')).toMatch(/foo=bar;/);
182219
});
183220

184221
test('should set just a custom cookie when session is not rolling', async () => {

0 commit comments

Comments
 (0)