From 4b87972743b36eeed42e355e1228aaaced34026a Mon Sep 17 00:00:00 2001 From: Robb Traister Date: Tue, 2 Sep 2025 11:26:21 -0400 Subject: [PATCH 1/2] fix(fixRequestBody): support content-encoding on request body --- src/handlers/fix-request-body.ts | 23 +++++++++++++++++++++-- test/unit/fix-request-body.spec.ts | 17 +++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/handlers/fix-request-body.ts b/src/handlers/fix-request-body.ts index cc47e68f..a92b5d31 100644 --- a/src/handlers/fix-request-body.ts +++ b/src/handlers/fix-request-body.ts @@ -1,5 +1,6 @@ import type * as http from 'node:http'; import * as querystring from 'node:querystring'; +import * as zlib from 'node:zlib'; export type BodyParserLikeRequest = http.IncomingMessage & { body?: any }; @@ -28,8 +29,26 @@ export function fixRequestBody { - proxyReq.setHeader('Content-Length', Buffer.byteLength(bodyData)); - proxyReq.write(bodyData); + let proxyData: string | Buffer = bodyData; + + const contentEncoding = String(proxyReq.getHeader('Content-Encoding')).toLowerCase(); + switch (contentEncoding) { + case 'br': + proxyData = zlib.brotliCompressSync(proxyData); + break; + case 'deflate': + proxyData = zlib.deflateSync(proxyData); + break; + case 'gzip': + proxyData = zlib.gzipSync(proxyData); + break; + case 'zstd': + proxyData = zlib.zstdCompressSync(proxyData); + break; + } + + proxyReq.setHeader('Content-Length', Buffer.byteLength(proxyData)); + proxyReq.write(proxyData); }; // Use if-elseif to prevent multiple writeBody/setHeader calls: diff --git a/test/unit/fix-request-body.spec.ts b/test/unit/fix-request-body.spec.ts index 4615c67c..254aa839 100644 --- a/test/unit/fix-request-body.spec.ts +++ b/test/unit/fix-request-body.spec.ts @@ -1,6 +1,7 @@ import { ClientRequest, IncomingMessage, ServerResponse } from 'node:http'; import { Socket } from 'node:net'; import * as querystring from 'node:querystring'; +import * as zlib from 'node:zlib'; import { BodyParserLikeRequest, fixRequestBody } from '../../src/handlers/fix-request-body'; @@ -213,4 +214,20 @@ describe('fixRequestBody', () => { expect(proxyRequest.write).toHaveBeenCalledTimes(0); expect(proxyRequest.destroy).toHaveBeenCalledTimes(0); }); + + it('should re-encode body when the source was encoded', () => { + const proxyRequest = fakeProxyRequest(); + proxyRequest.setHeader('content-type', 'application/json; charset=utf-8'); + proxyRequest.setHeader('content-encoding', 'gzip'); + + jest.spyOn(proxyRequest, 'setHeader'); + jest.spyOn(proxyRequest, 'write'); + + const data = { someField: 'some value' }; + fixRequestBody(proxyRequest, createRequestWithBody(data)); + + const expectedBody = zlib.gzipSync(JSON.stringify(data)); + expect(proxyRequest.setHeader).toHaveBeenCalledWith('Content-Length', expectedBody.length); + expect(proxyRequest.write).toHaveBeenCalledWith(expectedBody); + }); }); From b8e7462b243bb1a11d25d7dadf05f0a1671f46a6 Mon Sep 17 00:00:00 2001 From: Robb Traister Date: Mon, 8 Sep 2025 08:40:07 -0400 Subject: [PATCH 2/2] remove experimental zstd codec --- src/handlers/fix-request-body.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/handlers/fix-request-body.ts b/src/handlers/fix-request-body.ts index a92b5d31..fc9019c7 100644 --- a/src/handlers/fix-request-body.ts +++ b/src/handlers/fix-request-body.ts @@ -42,9 +42,6 @@ export function fixRequestBody