diff --git a/lib/rack/test/uploaded_file.rb b/lib/rack/test/uploaded_file.rb index 5be6dc7..3fd5972 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 1b2980e..82e3b60 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)