diff --git a/packages/next/server/app-render.tsx b/packages/next/server/app-render.tsx index 4092ef78603a2..089f7d6549b2a 100644 --- a/packages/next/server/app-render.tsx +++ b/packages/next/server/app-render.tsx @@ -83,6 +83,7 @@ const INTERNAL_COOKIES_INSTANCE = Symbol('internal for cookies readonly') function readonlyCookiesError() { return new Error('ReadonlyCookies cannot be modified') } + class ReadonlyNextCookies { [INTERNAL_COOKIES_INSTANCE]: NextCookies @@ -1602,18 +1603,33 @@ export async function renderToHTMLOrFlight( (renderOpts as any).previewProps ) + let cachedHeadersInstance: ReadonlyHeaders | undefined + let cachedCookiesInstance: ReadonlyNextCookies | undefined + const requestStore = { - headers: new ReadonlyHeaders(headersWithoutFlight(req.headers)), - cookies: new ReadonlyNextCookies({ - headers: { - get: (key) => { - if (key !== 'cookie') { - throw new Error('Only cookie header is supported') - } - return req.headers.cookie - }, - }, - }), + get headers() { + if (!cachedHeadersInstance) { + cachedHeadersInstance = new ReadonlyHeaders( + headersWithoutFlight(req.headers) + ) + } + return cachedHeadersInstance + }, + get cookies() { + if (!cachedCookiesInstance) { + cachedCookiesInstance = new ReadonlyNextCookies({ + headers: { + get: (key) => { + if (key !== 'cookie') { + throw new Error('Only cookie header is supported') + } + return req.headers.cookie + }, + }, + }) + } + return cachedCookiesInstance + }, previewData, }