# File lib/unicorn/stream_input.rb, line 42
  def read(length = nil, rv = '')
    if length
      if length <= @rbuf.size
        length < 0 and raise ArgumentError, "negative length #{length} given"
        rv.replace(@rbuf.slice!(0, length))
      else
        to_read = length - @rbuf.size
        rv.replace(@rbuf.slice!(0, @rbuf.size))
        until to_read == 0 || eof? || (rv.size > 0 && @chunked)
          @socket.kgio_read(to_read, @buf) or eof!
          filter_body(@rbuf, @buf)
          rv << @rbuf
          to_read -= @rbuf.size
        end
        @rbuf.replace('')
      end
      rv = nil if rv.empty? && length != 0
    else
      read_all(rv)
    end
    rv
  end