From 9430899f3f219fcdd6c39f75b1e9733a2c7e4f0e Mon Sep 17 00:00:00 2001 From: unnoq Date: Mon, 25 Aug 2025 15:34:23 +0700 Subject: [PATCH] fix(server): Compression Plugin (fetch) response invalid status --- .../adapters/fetch/compression-plugin.test.ts | 28 +++++++++++++++++++ .../src/adapters/fetch/compression-plugin.ts | 3 +- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/packages/server/src/adapters/fetch/compression-plugin.test.ts b/packages/server/src/adapters/fetch/compression-plugin.test.ts index 5c3130788..74aba3419 100644 --- a/packages/server/src/adapters/fetch/compression-plugin.test.ts +++ b/packages/server/src/adapters/fetch/compression-plugin.test.ts @@ -1,3 +1,4 @@ +import { ORPCError } from '@orpc/client' import { os } from '../../builder' import { CompressionPlugin } from './compression-plugin' import { RPCHandler } from './rpc-handler' @@ -617,4 +618,31 @@ describe('compressionPlugin', () => { expect(text).toContain('event1') expect(text).toContain('event2') }) + + it('can compress error response', async () => { + const error = new ORPCError('UNAUTHORIZED') + + const handler = new RPCHandler(os.handler(() => { + throw error + }), { + plugins: [ + new CompressionPlugin(), + ], + }) + + const { response } = await handler.handle(new Request('https://example.com/', { + method: 'POST', + headers: { + 'content-type': 'application/json', + 'accept-encoding': 'gzip', + }, + body: JSON.stringify({}), + })) + + const decompressed = response?.body?.pipeThrough(new DecompressionStream('gzip')) + const text = await new Response(decompressed).text() + expect(text).toContain(error.code) + expect(response?.headers.get('content-encoding')).toBe('gzip') + expect(response?.status).toBe(error.status) + }) }) diff --git a/packages/server/src/adapters/fetch/compression-plugin.ts b/packages/server/src/adapters/fetch/compression-plugin.ts index 0072b72ab..48043060b 100644 --- a/packages/server/src/adapters/fetch/compression-plugin.ts +++ b/packages/server/src/adapters/fetch/compression-plugin.ts @@ -119,7 +119,8 @@ export class CompressionPlugin implements FetchHandlerPlugin< return { ...result, response: new Response(compressedBody, { - ...response, + status: response.status, + statusText: response.statusText, headers: compressedHeaders, }), }