class Multipart::Post::CompositeReadIO
Concatenate together multiple IO objects into a single, composite IO object for purposes of reading as a single stream.
@example
crio = CompositeReadIO.new(StringIO.new('one'), StringIO.new('two'), StringIO.new('three')) puts crio.read # => "onetwothree"
Public Class Methods
Source
# File lib/multipart/post/composite_read_io.rb, line 31 def initialize(*ios) @ios = ios.flatten @index = 0 end
Create a new composite-read IO from the arguments, all of which should respond to read
in a manner consistent with IO.
Public Instance Methods
Source
# File lib/multipart/post/composite_read_io.rb, line 37 def close @ios.each do |io| io.close if io.respond_to?(:close) end @ios = nil @index = 0 end
Close all the underyling IOs.
Source
# File lib/multipart/post/composite_read_io.rb, line 51 def read(length = nil, outbuf = nil) if @ios.nil? raise IOError, "CompositeReadIO is closed!" end got_result = false outbuf = outbuf ? outbuf.replace("") : String.new while io = current_io if result = io.read(length) got_result ||= !result.nil? result.force_encoding("BINARY") if result.respond_to?(:force_encoding) outbuf << result length -= result.length if length break if length == 0 end advance_io end (!got_result && length) ? nil : outbuf end
Read from IOs in order until ‘length` bytes have been received.
Source
# File lib/multipart/post/composite_read_io.rb, line 72 def rewind @ios.each { |io| io.rewind } @index = 0 end
Private Instance Methods
Source
# File lib/multipart/post/composite_read_io.rb, line 83 def advance_io @index += 1 end
Source
# File lib/multipart/post/composite_read_io.rb, line 79 def current_io @ios[@index] end