Class: Async::HTTP::Protocol::HTTP2::Response

Inherits:
Response show all
Defined in:
lib/async/http/protocol/http2/response.rb

Instance Attribute Summary

Attributes inherited from Response

#protocol

Attributes inherited from Response

#body, #headers, #reason, #status, #version

Instance Method Summary collapse

Methods inherited from Response

#hijack?, #peer, #remote_address, #remote_address=

Methods inherited from Response

[], #bad_request?, #continue?, #failure?, for_exception, #partial?, #preserve_method?, #redirection?, #server_failure?, #success?, #to_s

Methods included from Body::Reader

#body?, #close, #each, #finish, #read, #stop

Constructor Details

#initialize(protocol, stream_id) ⇒ Response

Returns a new instance of Response.



28
29
30
31
32
33
34
35
36
37
38
# File 'lib/async/http/protocol/http2/response.rb', line 28

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

Instance Method Details

#receive_data(stream, data, end_stream) ⇒ Object



67
68
69
70
71
72
73
74
75
76
77
# File 'lib/async/http/protocol/http2/response.rb', line 67

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

#receive_headers(stream, headers, end_stream) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/async/http/protocol/http2/response.rb', line 48

def receive_headers(stream, headers, end_stream)
	headers.each do |key, value|
		if key == STATUS
			@status = value.to_i
		elsif key == REASON
			@reason = value
		else
			@headers[key] = value
		end
	end
	
	unless end_stream
		@body = @input = Body::Writable.new
	end
	
	# We are ready for processing:
	@notification.signal
end

#receive_reset_stream(stream, error_code) ⇒ Object



79
80
81
82
83
84
85
# File 'lib/async/http/protocol/http2/response.rb', line 79

def receive_reset_stream(stream, error_code)
	if error_code > 0
		@exception = EOFError.new(error_code)
	end
	
	@notification.signal
end

#send_request(request) ⇒ Object



87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/async/http/protocol/http2/response.rb', line 87

def send_request(request)
	headers = Headers::Merged.new({
		SCHEME => HTTPS,
		METHOD => request.method,
		PATH => request.path,
		AUTHORITY => request.authority,
	}, request.headers)
	
	if request.body.nil?
		@stream.send_headers(nil, headers, ::HTTP::Protocol::HTTP2::END_STREAM)
	else
		begin
			@stream.send_headers(nil, headers)
		rescue
			raise RequestFailed
		end
		
		@stream.send_body(request.body)
	end
end

#waitObject



40
41
42
43
44
45
46
# File 'lib/async/http/protocol/http2/response.rb', line 40

def wait
	@notification.wait
	
	if @exception
		raise @exception
	end
end