--- /dev/null
+begin
+ require 'composite_io'
+ require 'parts'
+ require 'stringio'
+rescue LoadError
+ $stderr.puts "Install the multipart-post gem."
+ raise
+end
+
+module Faraday
+ # Similar but not compatible with ::CompositeReadIO provided by multipart-post.
+ class CompositeReadIO
+ def initialize(*parts)
+ @parts = parts.flatten
+ @ios = @parts.map { |part| part.to_io }
+ @index = 0
+ end
+
+ def length
+ @parts.inject(0) { |sum, part| sum + part.length }
+ end
+
+ def rewind
+ @ios.each { |io| io.rewind }
+ @index = 0
+ end
+
+ # Read from IOs in order until `length` bytes have been received.
+ def read(length = nil, outbuf = nil)
+ got_result = false
+ outbuf = outbuf ? outbuf.replace("") : ""
+
+ 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
+
+ def close
+ @ios.each { |io| io.close }
+ end
+
+ def ensure_open_and_readable
+ # Rubinius compatibility
+ end
+
+ private
+
+ def current_io
+ @ios[@index]
+ end
+
+ def advance_io
+ @index += 1
+ end
+ end
+
+ UploadIO = ::UploadIO
+ Parts = ::Parts
+end