class Rack::RewindableInput

def make_rewindable

def make_rewindable
  # Buffer all data into a tempfile. Since this tempfile is private to this
  # RewindableInput object, we chmod it so that nobody else can read or write
  # it. On POSIX filesystems we also unlink the file so that it doesn't
  # even have a file entry on the filesystem anymore, though we can still
  # access it because we have the file handle open.
  @rewindable_io = Tempfile.new('RackRewindableInput')
  @rewindable_io.chmod(0000)
  @rewindable_io.set_encoding(Encoding::BINARY)
  @rewindable_io.binmode
  # :nocov:
  if filesystem_has_posix_semantics?
    raise 'Unlink failed. IO closed.' if @rewindable_io.closed?
    @unlinked = true
  end
  # :nocov:
  buffer = "".dup
  while @io.read(1024 * 4, buffer)
    entire_buffer_written_out = false
    while !entire_buffer_written_out
      written = @rewindable_io.write(buffer)
      entire_buffer_written_out = written == buffer.bytesize
      if !entire_buffer_written_out
        buffer.slice!(0 .. written - 1)
      end
    end
  end
  @rewindable_io.rewind
end