From 82c3004b3b051afb4ee8ec653594afcd43259a3c Mon Sep 17 00:00:00 2001 From: 4gray Date: Thu, 16 Apr 2026 22:43:17 +0200 Subject: [PATCH] fix(electron-backend): avoid double-gunzipping EPG responses Stop treating content-encoding as a manual gunzip signal, because fetch already returns decoded bodies for transfer-compressed XMLTV responses. Keep redirect and payload-based gzip detection in place, and add regression coverage for redirected .gz feeds, gzip MIME types, content-disposition filenames, and plain content-encoding responses. Entire-Checkpoint: c6e522b4276c --- .../app/workers/epg-response-utils.spec.ts | 22 ++++++++++++++++++- .../src/app/workers/epg-response-utils.ts | 5 ----- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/apps/electron-backend/src/app/workers/epg-response-utils.spec.ts b/apps/electron-backend/src/app/workers/epg-response-utils.spec.ts index 191b2227b..99962c77a 100644 --- a/apps/electron-backend/src/app/workers/epg-response-utils.spec.ts +++ b/apps/electron-backend/src/app/workers/epg-response-utils.spec.ts @@ -19,12 +19,32 @@ describe('shouldGunzipEpgResponse', () => { ).toBe(true); }); - it('returns true for gzip content-encoding even without a .gz path', () => { + it('returns false for gzip content-encoding without a gzip payload', () => { expect( shouldGunzipEpgResponse('https://example.com/guide', { headers: new Headers([['content-encoding', 'gzip']]), url: 'https://example.com/guide', }) + ).toBe(false); + }); + + it('returns true for gzip mime types', () => { + expect( + shouldGunzipEpgResponse('https://example.com/guide', { + headers: new Headers([['content-type', 'application/gzip']]), + url: 'https://example.com/guide', + }) + ).toBe(true); + }); + + it('returns true when content-disposition advertises a .gz filename', () => { + expect( + shouldGunzipEpgResponse('https://example.com/guide', { + headers: new Headers([ + ['content-disposition', 'attachment; filename="guide.xml.gz"'], + ]), + url: 'https://example.com/guide', + }) ).toBe(true); }); diff --git a/apps/electron-backend/src/app/workers/epg-response-utils.ts b/apps/electron-backend/src/app/workers/epg-response-utils.ts index 82faf8ebb..55db43d99 100644 --- a/apps/electron-backend/src/app/workers/epg-response-utils.ts +++ b/apps/electron-backend/src/app/workers/epg-response-utils.ts @@ -22,11 +22,6 @@ export function shouldGunzipEpgResponse( return true; } - const contentEncoding = response.headers.get('content-encoding'); - if (contentEncoding?.toLowerCase().includes('gzip')) { - return true; - } - const contentType = response.headers.get('content-type'); if ( contentType &&