From 34fa6b5a8777eaecfe9f28c651c3c6e51830dc67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yusuf=20=C4=B0pek?= Date: Tue, 11 Nov 2025 20:26:34 +0300 Subject: [PATCH] fix: handle both gzipped and plain text package list responses - Added magic number detection (0x1f 0x8b) to identify gzipped content - Removed unnecessary gunzip options that were causing decompression issues - Added fallback to treat non-gzipped responses as plain text --- src/services/debianPackageFetcher.ts | 66 ++++++++++++++-------------- 1 file changed, 34 insertions(+), 32 deletions(-) diff --git a/src/services/debianPackageFetcher.ts b/src/services/debianPackageFetcher.ts index 532d44a..c193287 100644 --- a/src/services/debianPackageFetcher.ts +++ b/src/services/debianPackageFetcher.ts @@ -30,23 +30,24 @@ export class DebianPackageFetcher { const buffer = await response.arrayBuffer() const compressed = new Uint8Array(buffer) - // Decompress using Node.js zlib with proper error handling - const { gunzip } = await import('zlib') - const decompressed = await new Promise((resolve, reject) => { - gunzip(compressed, { - finishFlush: 1, // Z_SYNC_FLUSH - windowBits: 15 + 16 // Enable gzip header decoding - }, (err, result) => { - if (err) { - console.error('Gunzip error:', err) - reject(err) - } else { - resolve(result) - } + // Decompress if input is gzipped (magic 0x1f 0x8b); otherwise treat as plain text + let text: string + if (compressed.length >= 2 && compressed[0] === 0x1f && compressed[1] === 0x8b) { + const { gunzip } = await import('zlib') + const decompressed = await new Promise((resolve, reject) => { + gunzip(compressed, (err, result) => { + if (err) { + console.error('Gunzip error:', err) + reject(err) + } else { + resolve(result) + } + }) }) - }) - - const text = decompressed.toString('utf-8') + text = decompressed.toString('utf-8') + } else { + text = Buffer.from(compressed).toString('utf-8') + } const packages = this.parseDebianPackageList(text) console.log(`📊 Parsed ${packages.length} Debian packages`) @@ -76,23 +77,24 @@ export class DebianPackageFetcher { const buffer = await response.arrayBuffer() const compressed = new Uint8Array(buffer) - // Decompress using Node.js zlib with proper error handling - const { gunzip } = await import('zlib') - const decompressed = await new Promise((resolve, reject) => { - gunzip(compressed, { - finishFlush: 1, // Z_SYNC_FLUSH - windowBits: 15 + 16 // Enable gzip header decoding - }, (err, result) => { - if (err) { - console.error('Gunzip error:', err) - reject(err) - } else { - resolve(result) - } + // Decompress if input is gzipped (magic 0x1f 0x8b); otherwise treat as plain text + let text: string + if (compressed.length >= 2 && compressed[0] === 0x1f && compressed[1] === 0x8b) { + const { gunzip } = await import('zlib') + const decompressed = await new Promise((resolve, reject) => { + gunzip(compressed, (err, result) => { + if (err) { + console.error('Gunzip error:', err) + reject(err) + } else { + resolve(result) + } + }) }) - }) - - const text = decompressed.toString('utf-8') + text = decompressed.toString('utf-8') + } else { + text = Buffer.from(compressed).toString('utf-8') + } const packages = this.parseUbuntuPackageList(text) console.log(`📊 Parsed ${packages.length} Ubuntu packages`)