class Protocol::HTTP::Body::File
A body which reads from a file.
def self.open(path, *arguments, **options)
Open a file at the given path.
def self.open(path, *arguments, **options) self.new(::File.open(path, MODE), *arguments, **options) end
def buffered
Returns a copy of the body, by duplicating the file descriptor, including the same range if specified.
def buffered self.class.new(@file.dup, @range, block_size: @block_size) end
def close(error = nil)
Close the file.
def close(error = nil) @file.close @remaining = 0 super end
def empty?
def empty? @remaining == 0 end
def initialize(file, range = nil, size: file.size, block_size: BLOCK_SIZE)
@parameter size [Integer] the size of the file, if known.
@parameter range [Range] the range of bytes to read from the file.
@parameter file [::File] the file to read from.
Initialize the file body with the given file.
def initialize(file, range = nil, size: file.size, block_size: BLOCK_SIZE) @file = file @range = range @block_size = block_size if range @file.seek(range.min) @offset = range.min @length = @remaining = range.size else @file.seek(0) @offset = 0 @length = @remaining = size end end
def inspect
Inspect the file body.
def inspect "\#<#{self.class} file=#{@file.inspect} offset=#{@offset} remaining=#{@remaining}>" end
def join
Read all the remaining data from the file and return it as a single string.
def join return "" if @remaining == 0 buffer = @file.read(@remaining) @remaining = 0 return buffer end
def read
Read the next chunk of data from the file.
def read if @remaining > 0 amount = [@remaining, @block_size].min if chunk = @file.read(amount) @remaining -= chunk.bytesize return chunk end end end
def ready?
def ready? true end
def rewind
def rewind @file.seek(@offset) @remaining = @length end
def rewindable?
def rewindable? true end