Async::HTTPSourceAsyncHTTPProtocolHTTP2Output

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