From 79dbbd4cb4854349fda605045f39f07b1cdc76b3 Mon Sep 17 00:00:00 2001 From: Shantur Rathore Date: Mon, 20 Apr 2026 14:13:05 +0100 Subject: [PATCH] fix(server): preserve streamed proxy bodies and strip hop headers --- packages/server/src/server/http-server.ts | 24 +++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/packages/server/src/server/http-server.ts b/packages/server/src/server/http-server.ts index def237a1..f7ef029b 100644 --- a/packages/server/src/server/http-server.ts +++ b/packages/server/src/server/http-server.ts @@ -869,7 +869,8 @@ function isApiRequest(rawUrl: string | null | undefined) { function buildProxyHeaders(headers: FastifyRequest["headers"]): Record { const result: Record = {} for (const [key, value] of Object.entries(headers ?? {})) { - if (!value || key.toLowerCase() === "host") continue + const lower = key.toLowerCase() + if (!value || lower === "host" || isHopByHopHeader(lower)) continue result[key] = Array.isArray(value) ? value.join(",") : value } return result @@ -879,6 +880,12 @@ function toProxyRequestBody(body: unknown): any { if (body == null) { return undefined } + if (typeof (body as { pipe?: unknown }).pipe === "function") { + return body + } + if (typeof (body as { [Symbol.asyncIterator]?: unknown })[Symbol.asyncIterator] === "function") { + return body + } if (Buffer.isBuffer(body) || typeof body === "string" || body instanceof Uint8Array) { return body } @@ -914,7 +921,7 @@ function redactProxyHeadersForLogs(headers: Record): Record { const lower = key.toLowerCase() - if (lower === "content-length" || lower === "content-encoding") { + if (isHopByHopHeader(lower) || lower === "content-length" || lower === "content-encoding") { return } @@ -933,6 +940,19 @@ function toOutgoingHeaders(headers: ReturnType): Rec return next } +function isHopByHopHeader(name: string): boolean { + return new Set([ + "connection", + "keep-alive", + "proxy-authenticate", + "proxy-authorization", + "te", + "trailer", + "transfer-encoding", + "upgrade", + ]).has(name) +} + async function proxySideCarRequest(args: { request: FastifyRequest reply: FastifyReply