diff --git a/pkg/handlers/defaulthandler.go b/pkg/handlers/defaulthandler.go index c6f0fea2e..dae08cafd 100644 --- a/pkg/handlers/defaulthandler.go +++ b/pkg/handlers/defaulthandler.go @@ -156,7 +156,13 @@ func (h *defaultHandler) openArchive(ctx logContext.Context, depth int, reader i h.metrics.incFilesProcessed() - return h.openArchive(ctx, depth+1, compReader, archiveChan) + reReader, err := diskbufferreader.New(compReader) + if err != nil { + return fmt.Errorf("error creating reusable reader: %w", err) + } + defer reReader.Close() + + return h.openArchive(ctx, depth+1, reReader, archiveChan) case archiver.Extractor: err := archive.Extract(logContext.WithValue(ctx, depthKey, depth+1), arReader, nil, h.extractorHandler(archiveChan)) if err != nil { diff --git a/pkg/handlers/handlers_test.go b/pkg/handlers/handlers_test.go index 192d9473b..3290bfc44 100644 --- a/pkg/handlers/handlers_test.go +++ b/pkg/handlers/handlers_test.go @@ -117,6 +117,31 @@ func TestHandleNestedArchives(t *testing.T) { assert.Equal(t, wantCount, count) } +func TestHandleCompressedZip(t *testing.T) { + file, err := os.Open("testdata/example.zip.gz") + assert.Nil(t, err) + defer file.Close() + + reader, err := diskbufferreader.New(file) + assert.NoError(t, err) + + ctx := logContext.Background() + + chunkCh := make(chan *sources.Chunk) + go func() { + defer close(chunkCh) + err := HandleFile(ctx, reader, &sources.Chunk{}, sources.ChanReporter{Ch: chunkCh}) + assert.NoError(t, err) + }() + + wantCount := 2 + count := 0 + for range chunkCh { + count++ + } + assert.Equal(t, wantCount, count) +} + func TestHandleNestedCompressedArchive(t *testing.T) { file, err := os.Open("testdata/nested-compressed-archive.tar.gz") assert.Nil(t, err) diff --git a/pkg/handlers/testdata/example.zip.gz b/pkg/handlers/testdata/example.zip.gz new file mode 100644 index 000000000..863318791 Binary files /dev/null and b/pkg/handlers/testdata/example.zip.gz differ