@@ -29,7 +29,7 @@ export async function render_endpoint(event, mod, state) {
29
29
throw new Error ( 'Cannot prerender endpoints that have mutative methods' ) ;
30
30
}
31
31
32
- if ( state . prerendering && ! prerender ) {
32
+ if ( state . prerendering && ! state . prerendering . inside_reroute && ! prerender ) {
33
33
if ( state . depth > 0 ) {
34
34
// if request came from a prerendered page, bail
35
35
throw new Error ( `${ event . route . id } is not prerenderable` ) ;
@@ -41,7 +41,7 @@ export async function render_endpoint(event, mod, state) {
41
41
}
42
42
43
43
try {
44
- let response = await with_event ( event , ( ) =>
44
+ const response = await with_event ( event , ( ) =>
45
45
handler ( /** @type {import('@sveltejs/kit').RequestEvent<Record<string, any>> } */ ( event ) )
46
46
) ;
47
47
@@ -51,15 +51,28 @@ export async function render_endpoint(event, mod, state) {
51
51
) ;
52
52
}
53
53
54
- if ( state . prerendering ) {
55
- // the returned Response might have immutable Headers
56
- // so we should clone them before trying to mutate them
57
- response = new Response ( response . body , {
54
+ if ( state . prerendering && ( ! state . prerendering . inside_reroute || prerender ) ) {
55
+ // The returned Response might have immutable Headers
56
+ // so we should clone them before trying to mutate them.
57
+ // We also need to clone the response body since it may be read twice during prerendering
58
+ const cloned = new Response ( response . clone ( ) . body , {
58
59
status : response . status ,
59
60
statusText : response . statusText ,
60
61
headers : new Headers ( response . headers )
61
62
} ) ;
62
- response . headers . set ( 'x-sveltekit-prerender' , String ( prerender ) ) ;
63
+ cloned . headers . set ( 'x-sveltekit-prerender' , String ( prerender ) ) ;
64
+
65
+ if ( state . prerendering . inside_reroute && prerender ) {
66
+ // Without this, the route wouldn't be recorded as prerendered,
67
+ // because there's nothing after reroute that would do that.
68
+ cloned . headers . set (
69
+ 'x-sveltekit-routeid' ,
70
+ encodeURI ( /** @type {string } */ ( event . route . id ) )
71
+ ) ;
72
+ state . prerendering . dependencies . set ( event . url . pathname , { response : cloned , body : null } ) ;
73
+ } else {
74
+ return cloned ;
75
+ }
63
76
}
64
77
65
78
return response ;
0 commit comments