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

new(*ios) click to toggle source

Create a new composite-read IO from the arguments, all of which should respond to read in a manner consistent with IO.

# File lib/multipart/post/composite_read_io.rb, line 31
def initialize(*ios)
  @ios = ios.flatten
  @index = 0
end

Public Instance Methods

close() click to toggle source

Close all the underyling IOs.

# 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
closed?() click to toggle source
# File lib/multipart/post/composite_read_io.rb, line 46
def closed?
  @ios.nil?
end
read(length = nil, outbuf = nil) click to toggle source

Read from IOs in order until ‘length` bytes have been received.

# 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
rewind() click to toggle source
# File lib/multipart/post/composite_read_io.rb, line 72
def rewind
  @ios.each { |io| io.rewind }
  @index = 0
end

Private Instance Methods

advance_io() click to toggle source
# File lib/multipart/post/composite_read_io.rb, line 83
def advance_io
  @index += 1
end
current_io() click to toggle source
# File lib/multipart/post/composite_read_io.rb, line 79
def current_io
  @ios[@index]
end