Parent

Class/Module Index [+]

Quicksearch

PhusionPassenger::Utils::TeeInput

acts like tee(1) on an input input to provide a input-like stream while providing rewindable semantics through a File/StringIO backing store. On the first pass, the input is only read on demand so your Rack application can use input notification (upload progress and like). This should fully conform to the Rack::Lint::InputWrapper specification on the public API. This class is intended to be a strict interpretation of Rack::Lint::InputWrapper functionality and will not support any deviations from it.

When processing uploads, Unicorn exposes a TeeInput object under “rack.input” of the Rack environment.

Public Class Methods

client_body_buffer_size() click to toggle source

returns the maximum size of request bodies to buffer in memory, amounts larger than this are buffered to the filesystem

# File lib/phusion_passenger/utils/tee_input.rb, line 89
def self.client_body_buffer_size
  @@client_body_buffer_size
end
client_body_buffer_size=(bytes) click to toggle source

sets the maximum size of request bodies to buffer in memory, amounts larger than this are buffered to the filesystem

# File lib/phusion_passenger/utils/tee_input.rb, line 83
def self.client_body_buffer_size=(bytes)
  @@client_body_buffer_size = bytes
end
new(socket, env) click to toggle source

Initializes a new TeeInput object. You normally do not have to call this unless you are writing an HTTP server.

# File lib/phusion_passenger/utils/tee_input.rb, line 95
def initialize(socket, env)
  if @len = env[CONTENT_LENGTH]
    @len = @len.to_i
  elsif env[HTTP_TRANSFER_ENCODING] != CHUNKED
    @len = 0
  end
  @socket = socket
  @bytes_read = 0
  if @len && @len <= @@client_body_buffer_size
    @tmp = StringIO.new("")
  else
    @tmp = TmpIO.new("PassengerTeeInput")
  end
end

Public Instance Methods

close() click to toggle source
# File lib/phusion_passenger/utils/tee_input.rb, line 110
def close
  @tmp.close
end
each() click to toggle source
# File lib/phusion_passenger/utils/tee_input.rb, line 174
def each
  while line = gets
    yield line
  end

  self # Rack does not specify what the return value is here
end
gets() click to toggle source
# File lib/phusion_passenger/utils/tee_input.rb, line 149
def gets
  if socket_drained?
    @tmp.gets
  else
    if @bytes_read == @len
      nil
    elsif line = @socket.gets
      if @len
        max_len = @len - @bytes_read
        line.slice!(max_len, line.size - max_len)
      end
      @bytes_read += line.size
      tee(line)
    else
      nil
    end
  end
end
read(len = nil, buf = "") click to toggle source
# File lib/phusion_passenger/utils/tee_input.rb, line 125
def read(len = nil, buf = "")
  buf ||= ""
  if len
    if len < 0
      raise ArgumentError, "negative length #{len} given"
    elsif len == 0
      buf.replace('')
      buf
    else
      if socket_drained?
        @tmp.read(len, buf)
      else
        tee(read_exact(len, buf))
      end
    end
  else
    if socket_drained?
      @tmp.read(nil, buf)
    else
      tee(read_all(buf))
    end
  end
end
rewind() click to toggle source
# File lib/phusion_passenger/utils/tee_input.rb, line 168
def rewind
  return 0 if 0 == @tmp.size
  consume! if !socket_drained?
  @tmp.rewind # Rack does not specify what the return value is here
end
size() click to toggle source
# File lib/phusion_passenger/utils/tee_input.rb, line 114
def size
  if @len
    @len
  else
    pos = @tmp.pos
    consume!
    @tmp.pos = pos
    @len = @tmp.size
  end
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.