@@ -10,7 +10,10 @@ import { shouldHydrateRouteLoader } from "../dom/ssr/routes";
1010import type { RSCPayload } from "./server.rsc" ;
1111import { createRSCRouteModules } from "./route-modules" ;
1212import { isRouteErrorResponse } from "../router/utils" ;
13- import { decodeRedirectErrorDigest } from "../errors" ;
13+ import {
14+ decodeRedirectErrorDigest ,
15+ decodeRouteErrorResponseDigest ,
16+ } from "../errors" ;
1417import { escapeHtml } from "../dom/ssr/markup" ;
1518
1619type DecodedPayload = Promise < RSCPayload > & {
@@ -184,6 +187,8 @@ export async function routeRSCServerRequest({
184187 } ;
185188
186189 let renderRedirect : { status : number ; location : string } | undefined ;
190+ let renderError : unknown ;
191+
187192 try {
188193 if ( ! detectRedirectResponse . body ) {
189194 throw new Error ( "Failed to clone server response" ) ;
@@ -210,6 +215,9 @@ export async function routeRSCServerRequest({
210215 }
211216
212217 let reactHeaders = new Headers ( ) ;
218+ let status = serverResponse . status ;
219+ let statusText = serverResponse . statusText ;
220+
213221 let html = await renderHTML ( getPayload , {
214222 onError ( error : unknown ) {
215223 if (
@@ -222,6 +230,13 @@ export async function routeRSCServerRequest({
222230 if ( renderRedirect ) {
223231 return error . digest ;
224232 }
233+ let routeErrorResponse = decodeRouteErrorResponseDigest ( error . digest ) ;
234+ if ( routeErrorResponse ) {
235+ renderError = routeErrorResponse ;
236+ status = routeErrorResponse . status ;
237+ statusText = routeErrorResponse . statusText ;
238+ return error . digest ;
239+ }
225240 }
226241 } ,
227242 onHeaders ( headers ) {
@@ -259,7 +274,8 @@ export async function routeRSCServerRequest({
259274
260275 if ( ! hydrate ) {
261276 return new Response ( html . pipeThrough ( redirectTransform ) , {
262- status : serverResponse . status ,
277+ status,
278+ statusText,
263279 headers,
264280 } ) ;
265281 }
@@ -272,7 +288,8 @@ export async function routeRSCServerRequest({
272288 . pipeThrough ( injectRSCPayload ( serverResponseB . body ) )
273289 . pipeThrough ( redirectTransform ) ;
274290 return new Response ( body , {
275- status : serverResponse . status ,
291+ status,
292+ statusText,
276293 headers,
277294 } ) ;
278295 } catch ( reason ) {
@@ -290,7 +307,10 @@ export async function routeRSCServerRequest({
290307 }
291308
292309 try {
293- const status = isRouteErrorResponse ( reason ) ? reason . status : 500 ;
310+ reason = renderError ?? reason ;
311+ let [ status , statusText ] = isRouteErrorResponse ( reason )
312+ ? [ reason . status , reason . statusText ]
313+ : [ 500 , "" ] ;
294314
295315 let retryRedirect : { status : number ; location : string } | undefined ;
296316 let reactHeaders = new Headers ( ) ;
@@ -341,6 +361,14 @@ export async function routeRSCServerRequest({
341361 if ( retryRedirect ) {
342362 return error . digest ;
343363 }
364+ let routeErrorResponse = decodeRouteErrorResponseDigest (
365+ error . digest ,
366+ ) ;
367+ if ( routeErrorResponse ) {
368+ status = routeErrorResponse . status ;
369+ statusText = routeErrorResponse . statusText ;
370+ return error . digest ;
371+ }
344372 }
345373 } ,
346374 onHeaders ( headers ) {
@@ -379,7 +407,8 @@ export async function routeRSCServerRequest({
379407
380408 if ( ! hydrate ) {
381409 return new Response ( html . pipeThrough ( retryRedirectTransform ) , {
382- status : status ,
410+ status,
411+ statusText,
383412 headers,
384413 } ) ;
385414 }
@@ -393,6 +422,7 @@ export async function routeRSCServerRequest({
393422 . pipeThrough ( retryRedirectTransform ) ;
394423 return new Response ( body , {
395424 status,
425+ statusText,
396426 headers,
397427 } ) ;
398428 } catch {
0 commit comments