lib/protocol/http/body/readable.rb in protocol-http-0.26.6 vs lib/protocol/http/body/readable.rb in protocol-http-0.26.7
- old
+ new
@@ -5,21 +5,15 @@
# Copyright, 2023, by Bruno Sutic.
module Protocol
module HTTP
module Body
- # A generic base class for wrapping body instances. Typically you'd override `#read`.
- # The implementation assumes a sequential unbuffered stream of data.
- # def each -> yield(String | nil)
- # def read -> String | nil
- # def join -> String
-
- # def finish -> buffer the stream and close it.
- # def close(error = nil) -> close the stream immediately.
- # end
+ # An interface for reading data from a body.
+ #
+ # Typically, you'd override `#read` to return chunks of data.
class Readable
- # The consumer can call stop to signal that the stream output has terminated.
+ # Close the stream immediately.
def close(error = nil)
end
# Optimistically determine whether read (may) return any data.
# If this returns true, then calling read will definitely return nil.
@@ -38,10 +32,11 @@
def length
nil
end
# Read the next available chunk.
+ # @returns [String | Nil] The chunk of data, or `nil` if the stream has finished.
def read
nil
end
# Should the internal mechanism prefer to use {call}?
@@ -58,16 +53,20 @@
ensure
stream.close
end
# Read all remaining chunks into a buffered body and close the underlying input.
+ # @returns [Buffered] The buffered body.
def finish
# Internally, this invokes `self.each` which then invokes `self.close`.
Buffered.for(self)
end
# Enumerate all chunks until finished, then invoke `#close`.
+ #
+ # @yields {|chunk| ...} The block to call with each chunk of data.
+ # @parameter chunk [String | Nil] The chunk of data, or `nil` if the stream has finished.
def each
return to_enum(:each) unless block_given?
begin
while chunk = self.read
@@ -77,9 +76,11 @@
self.close($!)
end
end
# Read all remaining chunks into a single binary string using `#each`.
+ #
+ # @returns [String | Nil] The binary string containing all chunks of data, or `nil` if the stream has finished (or did not contain any data).
def join
buffer = String.new.force_encoding(Encoding::BINARY)
self.each do |chunk|
buffer << chunk