From 97c2c5aad2c6445f236fb93ec8a0923f0c2125d8 Mon Sep 17 00:00:00 2001 From: Oskar Eichler <62393985+OskarEichler@users.noreply.github.com> Date: Sat, 29 Aug 2026 21:18:34 +0200 Subject: [PATCH] Rewind uploaded files when appending raises --- lib/rack/test/uploaded_file.rb | 13 +++++++------ spec/rack/test/uploaded_file_spec.rb | 14 ++++++++++++++ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/lib/rack/test/uploaded_file.rb b/lib/rack/test/uploaded_file.rb index 5be6dc7e..3fd5972b 100644 --- a/lib/rack/test/uploaded_file.rb +++ b/lib/rack/test/uploaded_file.rb @@ -60,12 +60,13 @@ def method_missing(method_name, *args, &block) def append_to(buffer) tempfile.rewind - buf = String.new - buffer << tempfile.readpartial(65_536, buf) until tempfile.eof? - - tempfile.rewind - - nil + begin + buf = String.new + buffer << tempfile.readpartial(65_536, buf) until tempfile.eof? + nil + ensure + tempfile.rewind + end end def respond_to_missing?(method_name, include_private = false) #:nodoc: diff --git a/spec/rack/test/uploaded_file_spec.rb b/spec/rack/test/uploaded_file_spec.rb index 1b2980eb..82e3b609 100644 --- a/spec/rack/test/uploaded_file_spec.rb +++ b/spec/rack/test/uploaded_file_spec.rb @@ -7,6 +7,20 @@ def file_path File.dirname(__FILE__) + '/../../fixtures/foo.txt' end + it 'rewinds after appending raises' do + uploaded_file = Rack::Test::UploadedFile.new( + StringIO.new('content'), + original_filename: 'content.txt' + ) + buffer = Object.new + def buffer.<<(_chunk) + raise IOError, 'append failed' + end + + proc { uploaded_file.append_to(buffer) }.must_raise(IOError) + uploaded_file.pos.must_equal 0 + end + it 'returns an instance of `Rack::Test::UploadedFile`' do uploaded_file = Rack::Test::UploadedFile.new(file_path)