From edb676cd2cb2ae974b57b2dd4a5c86f39aaa270f Mon Sep 17 00:00:00 2001 From: "Stanko K.R." Date: Mon, 2 Feb 2026 13:52:14 +0100 Subject: [PATCH] Make remote IOs rewindable This is required for active storage to work --- app/models/zip_file/reader.rb | 6 ++---- app/models/zip_file/reader/extractor_io.rb | 11 +++++++++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/app/models/zip_file/reader.rb b/app/models/zip_file/reader.rb index 5cc14b006..762e248de 100644 --- a/app/models/zip_file/reader.rb +++ b/app/models/zip_file/reader.rb @@ -9,12 +9,10 @@ class ZipFile::Reader raise ArgumentError, "File not found in zip: #{file_path}" unless entry raise ArgumentError, "Cannot read directory entry: #{file_path}" if entry.filename.end_with?("/") - extractor = entry.extractor_from(@io) - if block_given? - yield ZipFile::Reader::ExtractorIO.new(extractor) + yield ZipFile::Reader::ExtractorIO.new(entry, @io) else - extractor.extract + entry.extractor_from(@io).extract end end diff --git a/app/models/zip_file/reader/extractor_io.rb b/app/models/zip_file/reader/extractor_io.rb index 22824b8cb..9183c116d 100644 --- a/app/models/zip_file/reader/extractor_io.rb +++ b/app/models/zip_file/reader/extractor_io.rb @@ -1,6 +1,8 @@ class ZipFile::Reader::ExtractorIO - def initialize(extractor) - @extractor = extractor + def initialize(entry, io) + @entry = entry + @io = io + @extractor = @entry.extractor_from(@io) end def read(length = nil, buffer = nil) @@ -20,4 +22,9 @@ class ZipFile::Reader::ExtractorIO def eof? @extractor.eof? end + + def rewind + @extractor = @entry.extractor_from(@io) + 0 + end end