class Async::HTTP::Protocol::HTTP2::Response

def close!(state)

def close!(state)
	self.promises.enqueue(nil)
end

def create_promise_stream(headers, stream_id)

def create_promise_stream(headers, stream_id)
	promise = Promise.new(@connection, headers, stream_id)
	
	self.promises.enqueue(promise)
	
	return promise.stream
end

def initialize(connection, stream_id)

def initialize(connection, stream_id)
	@input = nil
	@length = nil
	
	super(connection.version, nil, ::Protocol::HTTP::Headers.new)
	
	@connection = connection
	@stream = Stream.new(self, connection, stream_id)
	
	@notification = Async::Notification.new
	@exception = nil
	
	@promises = nil
end

def notify!

Notify anyone waiting on the response headers to be received (or failure).
def notify!
ication
ation.signal
ation = nil
ut
.close(@exception)

def promises

def promises
	@promises ||= Async::Queue.new
end

def receive_data(stream, data, end_stream)

def receive_data(stream, data, end_stream)
	unless data.empty?
		@input.write(data)
	end
	
	if end_stream
		@input.close
	end
rescue
	@stream.send_reset_stream(0)
end

def receive_headers(stream, headers, end_stream)

This should be invoked from the background reader, and notifies the task waiting for the headers that we are done.
def receive_headers(stream, headers, end_stream)
	headers.each do |key, value|
		if key == STATUS
			@status = Integer(value)
		elsif key == CONTENT_LENGTH
			@length = Integer(value)
		elsif key == PROTOCOL
			@protocol = value
		else
			@headers[key] = value
		end
	end
	
	unless end_stream
		@body = @input = Body::Writable.new(@length)
	end
	
	notify!
end

def receive_reset_stream(stream, error_code)

def receive_reset_stream(stream, error_code)
	if error_code > 0
		@exception = EOFError.new("Stream reset: error_code=#{error_code}")
	end
	
	notify!
end

def send_request(request)

Send a request and read it into this response.
def send_request(request)
	# https://http2.github.io/http2-spec/#rfc.section.8.1.2.3
	# All HTTP/2 requests MUST include exactly one valid value for the :method, :scheme, and :path pseudo-header fields, unless it is a CONNECT request (Section 8.3). An HTTP request that omits mandatory pseudo-header fields is malformed (Section 8.1.2.6).
	pseudo_headers = [
		[SCHEME, request.scheme],
		[METHOD, request.method],
		[PATH, request.path],
	]
	
	# To ensure that the HTTP/1.1 request line can be reproduced accurately, this pseudo-header field MUST be omitted when translating from an HTTP/1.1 request that has a request target in origin or asterisk form (see [RFC7230], Section 5.3). Clients that generate HTTP/2 requests directly SHOULD use the :authority pseudo-header field instead of the Host header field.
	if authority = request.authority
		pseudo_headers << [AUTHORITY, authority]
	end
	
	if protocol = request.protocol
		pseudo_headers << [PROTOCOL, protocol]
	end
	
	headers = ::Protocol::HTTP::Headers::Merged.new(
		pseudo_headers,
		request.headers
	)
	
	if request.body.nil?
		@stream.send_headers(nil, headers, ::Protocol::HTTP2::END_STREAM)
	else
		begin
			@stream.send_headers(nil, headers)
		rescue
			raise RequestFailed
		end
		
		@stream.send_body(request.body)
	end
end

def stop_connection(error)

def stop_connection(error)
	@exception = error
	
	notify!
end

def wait

Wait for the headers to be received or for stream reset.
def wait
	# If you call wait after the headers were already received, it should return immediately.
	if @notification
		@notification.wait
	end
	
	if @exception
		raise @exception
	end
end