diff --git a/packages/next/src/server/app-render/app-render.tsx b/packages/next/src/server/app-render/app-render.tsx index dbfa6ff169f4d..18f7d5c9f028e 100644 --- a/packages/next/src/server/app-render/app-render.tsx +++ b/packages/next/src/server/app-render/app-render.tsx @@ -145,6 +145,7 @@ export type AppRenderContext = AppRenderBaseContext & { flightDataRendererErrorHandler: ErrorHandler serverComponentsErrorHandler: ErrorHandler isNotFoundPath: boolean + nonce: string | undefined res: BaseNextResponse } @@ -362,6 +363,7 @@ async function generateFlight( ctx.clientReferenceManifest.clientModules, { onError: ctx.flightDataRendererErrorHandler, + nonce: ctx.nonce, } ) @@ -841,6 +843,15 @@ async function renderToHTMLOrFlightImpl( parsedFlightRouterState ) + // Get the nonce from the incoming request if it has one. + const csp = + req.headers['content-security-policy'] || + req.headers['content-security-policy-report-only'] + let nonce: string | undefined + if (csp && typeof csp === 'string') { + nonce = getScriptNonceFromHeader(csp) + } + const ctx: AppRenderContext = { ...baseCtx, getDynamicParamFromSegment, @@ -859,6 +870,7 @@ async function renderToHTMLOrFlightImpl( flightDataRendererErrorHandler, serverComponentsErrorHandler, isNotFoundPath, + nonce, res, } @@ -875,15 +887,6 @@ async function renderToHTMLOrFlightImpl( ? createFlightDataResolver(ctx) : null - // Get the nonce from the incoming request if it has one. - const csp = - req.headers['content-security-policy'] || - req.headers['content-security-policy-report-only'] - let nonce: string | undefined - if (csp && typeof csp === 'string') { - nonce = getScriptNonceFromHeader(csp) - } - const validateRootLayout = dev const { HeadManagerContext } = @@ -943,6 +946,7 @@ async function renderToHTMLOrFlightImpl( clientReferenceManifest.clientModules, { onError: serverComponentsErrorHandler, + nonce, } ) @@ -1279,6 +1283,7 @@ async function renderToHTMLOrFlightImpl( clientReferenceManifest.clientModules, { onError: serverComponentsErrorHandler, + nonce, } ) diff --git a/packages/next/src/server/app-render/get-layer-assets.tsx b/packages/next/src/server/app-render/get-layer-assets.tsx index 9c770f1baa4b2..4f580f3c07c08 100644 --- a/packages/next/src/server/app-render/get-layer-assets.tsx +++ b/packages/next/src/server/app-render/get-layer-assets.tsx @@ -43,16 +43,21 @@ export function getLayerAssets({ const ext = /\.(woff|woff2|eot|ttf|otf)$/.exec(fontFilename)![1] const type = `font/${ext}` const href = `${ctx.assetPrefix}/_next/${encodeURIPath(fontFilename)}` - ctx.componentMod.preloadFont(href, type, ctx.renderOpts.crossOrigin) + ctx.componentMod.preloadFont( + href, + type, + ctx.renderOpts.crossOrigin, + ctx.nonce + ) } } else { try { let url = new URL(ctx.assetPrefix) - ctx.componentMod.preconnect(url.origin, 'anonymous') + ctx.componentMod.preconnect(url.origin, 'anonymous', ctx.nonce) } catch (error) { // assetPrefix must not be a fully qualified domain name. We assume // we should preconnect to same origin instead - ctx.componentMod.preconnect('/', 'anonymous') + ctx.componentMod.preconnect('/', 'anonymous', ctx.nonce) } } } @@ -78,7 +83,11 @@ export function getLayerAssets({ const precedence = process.env.NODE_ENV === 'development' ? 'next_' + href : 'next' - ctx.componentMod.preloadStyle(fullHref, ctx.renderOpts.crossOrigin) + ctx.componentMod.preloadStyle( + fullHref, + ctx.renderOpts.crossOrigin, + ctx.nonce + ) return ( ) }) @@ -99,7 +109,14 @@ export function getLayerAssets({ href )}${getAssetQueryString(ctx, true)}` - return