class Output
Definitions
def close(error = nil)
This method should only be called from within the context of the output task.
Implementation
def close(error = nil)
close_write(error)
stop(error)
end
def stop(error)
This method should only be called from within the context of the HTTP/2 stream.
Implementation
def stop(error)
if task = @task
@task = nil
task.stop(error)
end
end
def passthrough(task)
Reads chunks from the given body and writes them to the stream as fast as possible.
Implementation
def passthrough(task)
task.annotate("Writing #{@body} to #{@stream}.")
while chunk = @body&.read
self.write(chunk)
# TODO this reduces memory usage?
# chunk.clear unless chunk.frozen?
# GC.start
end
rescue => error
raise
ensure
# Ensure the body we are reading from is fully closed:
if body = @body
@body = nil
body.close(error)
end
# Ensure the output of this body is closed:
self.close_write(error)
end
def send_data(chunk, maximum_size)
Send maximum_size
bytes of data using the specified stream
. If the buffer has no more chunks, END_STREAM
will be sent on the final chunk.
Implementation
def send_data(chunk, maximum_size)
if chunk.bytesize <= maximum_size
@stream.send_data(chunk, maximum_size: maximum_size)
else
@stream.send_data(chunk.byteslice(0, maximum_size), maximum_size: maximum_size)
# The window was not big enough to send all the data, so we save it for next time:
return chunk.byteslice(maximum_size, chunk.bytesize - maximum_size)
end
return nil
end