class Falcon::Input
def close
def close @body.finish end
def each(&block)
def each(&block) return to_enum unless block_given? while chunk = read_next yield chunk end @closed = true end
def eof?
def eof? @finished and @buffer.empty? end
def fill_buffer(length)
def fill_buffer(length) while @buffer.bytesize < length and chunk = read_next @buffer << chunk end end
def gets
def gets read end
def initialize(body)
def initialize(body) @body = body @chunks = [] @index = 0 @buffer = Async::IO::BinaryString.new @finished = false end
def read(length = nil, buffer = nil)
def read(length = nil, buffer = nil) if length fill_buffer(length) if @buffer.bytesize <= length return @buffer.slice!(0, length) else buffer ||= Async::IO::BinaryString.new buffer << @buffer @buffer.clear while chunk = read_next buffer << chunk end return buffer end end
def read_next
def read_next return nil if @finished chunk = nil if @index < @chunks.count chunk = @chunks[@index] @index += 1 else if chunk = @body.read @chunks << chunk @index += 1 end end @finished = true if chunk.nil? return chunk end
def rewind
def rewind @index = 0 @finished = false @buffer.clear end