class Protocol::HTTP::Body::Rewindable
As the body is buffered in memory, you may want to ensure your server has sufficient (virtual) memory available to buffer the entire body.
A body which buffers all its contents as it is read.
def self.wrap(message)
Wrap the given message body in a rewindable body, if it is not already rewindable.
def self.wrap(message) if body = message.body if body.rewindable? body else message.body = self.new(body) end end end
def buffered
A rewindable body wraps some other body. Convert it to a buffered body. The buffered body will share the same chunks as the rewindable body.
def buffered Buffered.new(@chunks) end
def empty?
def empty? (@index >= @chunks.size) && super end
def initialize(body)
Initialize the body with the given body.
def initialize(body) super(body) @chunks = [] @index = 0 end
def inspect
Inspect the rewindable body.
def inspect "\#<#{self.class} #{@index}/#{@chunks.size} chunks read>" end
def read
Read the next available chunk. This may return a buffered chunk if the stream has been rewound, or a chunk from the underlying stream, if available.
def read if @index < @chunks.size chunk = @chunks[@index] @index += 1 else if chunk = super @chunks << -chunk @index += 1 end end # We dup them on the way out, so that if someone modifies the string, it won't modify the rewindability. return chunk end
def ready?
def ready? (@index < @chunks.size) || super end
def rewind
def rewind @index = 0 end
def rewindable?
def rewindable? true end