diff --git a/app/routes/api.$.ts b/app/routes/api.$.ts index 80bdbb0e..f36dfa84 100644 --- a/app/routes/api.$.ts +++ b/app/routes/api.$.ts @@ -13,26 +13,35 @@ type NodeRuntimeRequest = Request & { }; }; -export const prepareApiRequest = (request: Request, timeoutMs: number) => { - const nodeRequest = request as NodeRuntimeRequest; - nodeRequest.runtime?.node?.res?.setTimeout(timeoutMs); +type RequestInitWithDuplex = RequestInit & { + duplex?: "half"; +}; + +export const prepareApiRequest = (request: NodeRuntimeRequest, timeoutMs: number) => { + request.runtime?.node?.res?.setTimeout(timeoutMs); if (config.trustProxy && request.headers.has("x-forwarded-for")) { return request.clone(); } - const remoteAddress = nodeRequest.ip; - if (remoteAddress) { - const headers = new Headers(request.headers); - headers.set("x-forwarded-for", remoteAddress); + const remoteAddress = request.ip; + const headers = new Headers(request.headers); - return new Request(request, { headers }); + if (remoteAddress) { + headers.set("x-forwarded-for", remoteAddress); + } else { + headers.delete("x-forwarded-for"); } - const headers = new Headers(request.headers); - headers.delete("x-forwarded-for"); + const init: RequestInitWithDuplex = { + method: request.method, + headers, + body: request.body, + signal: request.signal, + duplex: request.body ? "half" : undefined, + }; - return new Request(request, { headers }); + return new Request(request.url, init); }; const handle = ({ request }: { request: Request }) => diff --git a/app/server/modules/backups/__tests__/backups.execution.test.ts b/app/server/modules/backups/__tests__/backups.execution.test.ts index 8d83436e..bc984c58 100644 --- a/app/server/modules/backups/__tests__/backups.execution.test.ts +++ b/app/server/modules/backups/__tests__/backups.execution.test.ts @@ -18,7 +18,9 @@ import { fromAny } from "@total-typescript/shoehorn"; import { repositoriesService } from "~/server/modules/repositories/repositories.service"; const setup = () => { - const resticBackupMock = mock(() => Promise.resolve({ exitCode: 0, summary: generateBackupOutput(), error: "" })); + const resticBackupMock = mock((_: SafeSpawnParams) => + Promise.resolve({ exitCode: 0, summary: generateBackupOutput(), error: "" }), + ); const resticForgetMock = mock(() => Promise.resolve({ success: true, data: null })); const resticCopyMock = mock(() => Promise.resolve({ success: true, output: "" })); const refreshStatsMock = mock(() =>