@@ -38,10 +38,8 @@ export function createBaseHandler(
3838 if ( pathname . startsWith ( serverFunctionTest ) ) {
3939 const serverFnResponse = await handleServerFunction ( e ) ;
4040
41- if ( serverFnResponse instanceof Response ) {
42- writeEventResponseHeaders ( serverFnResponse . headers )
43- return serverFnResponse ;
44- }
41+ if ( serverFnResponse instanceof Response )
42+ return produceResponseWithEventHeaders ( serverFnResponse ) ;
4543
4644 return new Response ( serverFnResponse as any , {
4745 headers : e . res . headers ,
@@ -60,7 +58,7 @@ export function createBaseHandler(
6058 sharedConfig . context = { event } ;
6159 const res = await fn ! ( event ) ;
6260 if ( res !== undefined ) {
63- if ( res instanceof Response ) writeEventResponseHeaders ( res . headers )
61+ if ( res instanceof Response ) return produceResponseWithEventHeaders ( res )
6462
6563 return res ;
6664 }
@@ -230,10 +228,23 @@ function handleStreamCompleteRedirect(context: PageEvent) {
230228 } ;
231229}
232230
233- function writeEventResponseHeaders ( target : Headers ) {
231+ function produceResponseWithEventHeaders ( res : Response ) {
234232 const event = getRequestEvent ( ) ! ;
235233
234+ let ret = res ;
235+
236+ // Response.redirect returns an immutable value, so we clone on any redirect just in case
237+ if ( 300 <= res . status && res . status < 400 ) {
238+ ret = new Response ( res . body , {
239+ status : res . status ,
240+ statusText : res . statusText ,
241+ headers : Object . fromEntries ( res . headers . entries ( ) )
242+ } ) ;
243+ }
244+
236245 for ( const [ name , value ] of event . response . headers ) {
237- if ( ! target . has ( name ) ) target . set ( name , value ) ;
246+ if ( ! ret . headers . has ( name ) ) ret . headers . set ( name , value ) ;
238247 }
248+
249+ return ret
239250}
0 commit comments