From d31615b858aa8abe605924b735c32d80c244aaa9 Mon Sep 17 00:00:00 2001 From: Steven Date: Mon, 25 Oct 2021 22:37:47 -0400 Subject: [PATCH] Special case `Set-Cookie` --- packages/next/server/next-server.ts | 6 +++++- packages/next/server/web/utils.ts | 4 ++++ .../middleware-core/pages/responses/_middleware.js | 5 +++++ .../middleware-core/pages/responses/deep/_middleware.js | 3 +++ test/integration/middleware-core/test/index.test.js | 3 ++- 5 files changed, 19 insertions(+), 2 deletions(-) diff --git a/packages/next/server/next-server.ts b/packages/next/server/next-server.ts index cfe3191d4f50601..d9b6b7fb48b049e 100644 --- a/packages/next/server/next-server.ts +++ b/packages/next/server/next-server.ts @@ -1164,7 +1164,11 @@ export default class Server { for (const [key, value] of result.response.headers.entries()) { if (key !== 'content-encoding') { - res.setHeader(key, value) + if (key.toLowerCase() === 'set-cookie') { + res.setHeader(key, value.split(', ')) + } else { + res.setHeader(key, value) + } } } diff --git a/packages/next/server/web/utils.ts b/packages/next/server/web/utils.ts index 57521b9236a97d4..130ad3bc7e21a86 100644 --- a/packages/next/server/web/utils.ts +++ b/packages/next/server/web/utils.ts @@ -38,6 +38,10 @@ export function toNodeHeaders(headers?: Headers): NodeHeaders { if (headers) { for (const [key, value] of headers.entries()) { result[key] = value + if (key.toLowerCase() === 'set-cookie') { + console.log('the value of the cookie header is' + value) + result[key] = value.split(', ') + } } } return result diff --git a/test/integration/middleware-core/pages/responses/_middleware.js b/test/integration/middleware-core/pages/responses/_middleware.js index 03f31e1c251cc81..6329017ec0d6e59 100644 --- a/test/integration/middleware-core/pages/responses/_middleware.js +++ b/test/integration/middleware-core/pages/responses/_middleware.js @@ -20,6 +20,11 @@ export async function middleware(request, ev) { next.headers.append('x-append-me', 'top') } + // Ensure deep can append to this value + if (url.searchParams.get('cookie-me') === 'true') { + next.headers.append('set-cookie', 'chocochip') + } + // Sends a header if (url.pathname === '/responses/header') { next.headers.set('x-first-header', 'valid') diff --git a/test/integration/middleware-core/pages/responses/deep/_middleware.js b/test/integration/middleware-core/pages/responses/deep/_middleware.js index 296476e9035a392..4d7262838413b75 100644 --- a/test/integration/middleware-core/pages/responses/deep/_middleware.js +++ b/test/integration/middleware-core/pages/responses/deep/_middleware.js @@ -6,5 +6,8 @@ export async function middleware(request, _event) { if (request.nextUrl.searchParams.get('append-me') === 'true') { next.headers.append('x-append-me', 'deep') } + if (request.nextUrl.searchParams.get('cookie-me') === 'true') { + next.headers.append('set-cookie', 'oatmeal') + } return next } diff --git a/test/integration/middleware-core/test/index.test.js b/test/integration/middleware-core/test/index.test.js index 480f3f94854e4dd..75ce6db001e67da 100644 --- a/test/integration/middleware-core/test/index.test.js +++ b/test/integration/middleware-core/test/index.test.js @@ -329,11 +329,12 @@ function responseTests(locale = '') { it(`${locale} should respond with top level headers and override with deep headers`, async () => { const res = await fetchViaHTTP( context.appPort, - `${locale}/responses/deep?nested-header=true&append-me=true` + `${locale}/responses/deep?nested-header=true&append-me=true&cookie-me=true` ) expect(res.headers.get('x-nested-header')).toBe('valid') expect(res.headers.get('x-deep-header')).toBe('valid') expect(res.headers.get('x-append-me')).toBe('top, deep') + expect(res.headers.raw()['set-cookie']).toEqual(['chocochip', 'oatmeal']) }) }