Skip to content

Commit 8992c20

Browse files
committed
clone response on redirects
1 parent 121b258 commit 8992c20

1 file changed

Lines changed: 18 additions & 7 deletions

File tree

packages/start/src/server/handler.ts

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)