class Input < ::Protocol::HTTP::Body::Writable
- Inherits from
::Protocol::HTTP::Body::Writable
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 from 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
def close(error = nil)
Close the application-facing input body and notify the stream that incoming data is no longer being consumed. While local output is active, the HTTP/2 stream remains open. Once output also closes, the remaining wire stream is terminated without an error.
Signature
-
parameter
errorException | Nil The error that caused the input to be closed, if any.
Implementation
def close(error = nil)
super
if stream = @stream
@stream = nil
stream.finish_input(self, error)
end
end