@@ -38,7 +38,8 @@ export function createBaseHandler(
3838 if ( pathname . startsWith ( serverFunctionTest ) ) {
3939 const serverFnResponse = await handleServerFunction ( e ) ;
4040
41- if ( serverFnResponse instanceof Response ) return serverFnResponse ;
41+ if ( serverFnResponse instanceof Response )
42+ return produceResponseWithEventHeaders ( serverFnResponse ) ;
4243
4344 return new Response ( serverFnResponse as any , {
4445 headers : e . res . headers ,
@@ -56,7 +57,11 @@ export function createBaseHandler(
5657 // @ts -expect-error
5758 sharedConfig . context = { event } ;
5859 const res = await fn ! ( event ) ;
59- if ( res !== undefined ) return res ;
60+ if ( res !== undefined ) {
61+ if ( res instanceof Response ) return produceResponseWithEventHeaders ( res )
62+
63+ return res ;
64+ }
6065 if ( event . request . method !== "GET" ) {
6166 throw new Error (
6267 `API handler for ${ event . request . method } "${ event . request . url } " did not return a response.` ,
@@ -130,7 +135,7 @@ export function createBaseHandler(
130135
131136 const app = new H3 ( ) ;
132137
133- app . use ( handler ) ;
138+ app . use ( handler ) ;
134139
135140 return app ;
136141}
@@ -222,3 +227,24 @@ function handleStreamCompleteRedirect(context: PageEvent) {
222227 to && write ( `<script>window.location="${ to } "</script>` ) ;
223228 } ;
224229}
230+
231+ function produceResponseWithEventHeaders ( res : Response ) {
232+ const event = getRequestEvent ( ) ! ;
233+
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+
245+ for ( const [ name , value ] of event . response . headers ) {
246+ ret . headers . set ( name , value ) ;
247+ }
248+
249+ return ret
250+ }
0 commit comments