class Input
A writable body which requests window updates when data is read from it.
Definitions
def initialize(stream, length)
Initialize the input body.
Signature
-
parameter
streamStream The HTTP/2 stream to read from.
-
parameter
lengthInteger | Nil The expected content length.
Implementation
def initialize(stream, length)
super(length)
@stream = stream
@remaining = length
end
def read
Read the next chunk of data, requesting window updates as needed.
Signature
-
returns
String | Nil The next chunk, or
nilif the body is complete.
Implementation
def read
if chunk = super
# If we read a chunk fron the stream, we want to extend the window if required so more data will be provided.
@stream.request_window_update
end
# We track the expected length and check we got what we were expecting.
if @remaining
if chunk
@remaining -= chunk.bytesize
elsif @remaining > 0
raise EOFError, "Expected #{self.length} bytes, #{@remaining} bytes short!"
elsif @remaining < 0
raise EOFError, "Expected #{self.length} bytes, #{@remaining} bytes over!"
end
end
return chunk
end