class Rackup::Stream

The input stream is an IO-like object which contains the raw HTTP POST data. When applicable, its external encoding must be “ASCII-8BIT” and it must be opened in binary mode, for Ruby 1.9 compatibility. The input stream must respond to gets, each, read and rewind.

Attributes

input[R]
output[R]

Public Class Methods

new(input = nil, output = Buffered.new) click to toggle source
# File lib/rackup/stream.rb, line 9
def initialize(input = nil, output = Buffered.new)
  @input = input
  @output = output

  raise ArgumentError, "Non-writable output!" unless output.respond_to?(:write)

  # Will hold remaining data in `#read`.
  @buffer = nil
  @closed = false
end

Public Instance Methods

<<(buffer) click to toggle source
# File lib/rackup/stream.rb, line 147
def <<(buffer)
  write(buffer)
end
close(error = nil) click to toggle source

Close the input and output bodies.

# File lib/rackup/stream.rb, line 169
def close(error = nil)
  self.close_read
  self.close_write

  return nil
ensure
  @closed = true
end
close_read() click to toggle source
# File lib/rackup/stream.rb, line 154
def close_read
  @input&.close
  @input = nil
end
close_write() click to toggle source

close must never be called on the input stream. huh?

# File lib/rackup/stream.rb, line 160
def close_write
  if @output.respond_to?(:close)
    @output&.close
  end

  @output = nil
end
closed?() click to toggle source

Whether the stream has been closed.

# File lib/rackup/stream.rb, line 179
def closed?
  @closed
end
empty?() click to toggle source

Whether there are any output chunks remaining?

# File lib/rackup/stream.rb, line 184
def empty?
  @output.empty?
end
flush() click to toggle source
# File lib/rackup/stream.rb, line 151
def flush
end
write(buffer) click to toggle source
# File lib/rackup/stream.rb, line 134
def write(buffer)
  if @output
    @output.write(buffer)
    return buffer.bytesize
  else
    raise IOError, "Stream is not writable, output has been closed!"
  end
end
write_nonblock(buffer) click to toggle source
# File lib/rackup/stream.rb, line 143
def write_nonblock(buffer)
  write(buffer)
end

Private Instance Methods

read_next() click to toggle source
# File lib/rackup/stream.rb, line 190
def read_next
  if @input
    return @input.read
  else
    @input = nil
    raise IOError, "Stream is not readable, input has been closed!"
  end
end