Sha256: f52a5d54104ef6fef24410ddc62abfbc81b5395b744820d3a6932d61f58c9dad
Contents?: true
Size: 1.95 KB
Versions: 5
Compression:
Stored size: 1.95 KB
Contents
# frozen_string_literal: true # Released under the MIT License. # Copyright, 2019-2024, by Samuel Williams. # Copyright, 2020, by Bryan Powell. require_relative 'readable' module Protocol module HTTP module Body # A body which buffers all it's contents. class Buffered < Readable # Tries to wrap an object in a {Buffered} instance. # # For compatibility, also accepts anything that behaves like an `Array(String)`. # # @parameter body [String | Array(String) | Readable | nil] the body to wrap. # @returns [Readable | nil] the wrapped body or nil if nil was given. def self.wrap(object) if object.is_a?(Readable) return object elsif object.is_a?(Array) return self.new(object) elsif object.is_a?(String) return self.new([object]) elsif object return self.read(object) end end # Read the entire body into a buffered representation. # # @parameter body [Readable] the body to read. # @returns [Buffered] the buffered body. def self.read(body) chunks = [] body.each do |chunk| chunks << chunk end self.new(chunks) end def initialize(chunks = [], length = nil) @chunks = chunks @length = length @index = 0 end attr :chunks def finish self end def length @length ||= @chunks.inject(0) {|sum, chunk| sum + chunk.bytesize} end def empty? @index >= @chunks.length end # A buffered response is always ready. def ready? true end def read if chunk = @chunks[@index] @index += 1 return chunk.dup end end def write(chunk) @chunks << chunk end def rewindable? true end def rewind @index = 0 return true end def inspect "\#<#{self.class} #{@chunks.size} chunks, #{self.length} bytes>" end end end end end
Version data entries
5 entries across 5 versions & 1 rubygems