Class: Async::HTTP::Protocol::HTTP2::Request

Inherits:
Request
  • Object
show all
Defined in:
lib/async/http/protocol/http2/request.rb

Overview

Typically used on the server side to represent an incoming request, and write the response.

Defined Under Namespace

Classes: Stream

Constant Summary collapse

NO_RESPONSE =
[
	[STATUS, '500'],
]

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from Request

#peer, #remote_address, #remote_address=

Constructor Details

#initialize(stream) ⇒ Request

Returns a new instance of Request.



116
117
118
119
120
# File 'lib/async/http/protocol/http2/request.rb', line 116

def initialize(stream)
	super(nil, nil, nil, nil, VERSION, nil)
	
	@stream = stream
end

Instance Attribute Details

#streamObject (readonly)

Returns the value of attribute stream.



122
123
124
# File 'lib/async/http/protocol/http2/request.rb', line 122

def stream
  @stream
end

Instance Method Details

#connectionObject



124
125
126
# File 'lib/async/http/protocol/http2/request.rb', line 124

def connection
	@stream.connection
end

#hijack?Boolean

Returns:

  • (Boolean)


132
133
134
# File 'lib/async/http/protocol/http2/request.rb', line 132

def hijack?
	false
end

#push(path, headers = nil, scheme = @scheme, authority = @authority) ⇒ Stream

Returns the promised stream, on which to send data.

Returns:

  • (Stream)

    the promised stream, on which to send data.

Raises:

  • (ArgumentError)


141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
# File 'lib/async/http/protocol/http2/request.rb', line 141

def push(path, headers = nil, scheme = @scheme, authority = @authority)
	raise ArgumentError, "Missing scheme!" unless scheme
	raise ArgumentError, "Missing authority!" unless authority
	
	push_headers = [
		[SCHEME, scheme],
		[METHOD, ::Protocol::HTTP::Methods::GET],
		[PATH, path],
		[AUTHORITY, authority]
	]
	
	if headers
		push_headers = Headers::Merged.new(
			push_headers,
			headers
		)
	end
	
	@stream.send_push_promise(push_headers)
end

#push?Boolean

Returns:

  • (Boolean)


136
137
138
# File 'lib/async/http/protocol/http2/request.rb', line 136

def push?
	@stream.connection.enable_push?
end

#send_response(response) ⇒ Object



166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
# File 'lib/async/http/protocol/http2/request.rb', line 166

def send_response(response)
	if response.nil?
		return @stream.send_headers(nil, NO_RESPONSE, ::Protocol::HTTP2::END_STREAM)
	end
	
	protocol_headers = [
		[STATUS, response.status],
	]
	
	if protocol = response.protocol
		protocol_headers << [PROTOCOL, protocol]
	end
	
	if length = response.body&.length
		protocol_headers << [CONTENT_LENGTH, length]
	end
	
	headers = ::Protocol::HTTP::Headers::Merged.new(protocol_headers, response.headers)
	
	if body = response.body and !self.head?
		# This function informs the headers object that any subsequent headers are going to be trailers. Therefore, it must be called *before* sending the headers, to avoid any race conditions.
		trailers = response.headers.trailers!
		
		@stream.send_headers(nil, headers)
		
		@stream.send_body(body, trailers)
	else
		# Ensure the response body is closed if we are ending the stream:
		response.close
		
		@stream.send_headers(nil, headers, ::Protocol::HTTP2::END_STREAM)
	end
end

#valid?Boolean

Returns:

  • (Boolean)


128
129
130
# File 'lib/async/http/protocol/http2/request.rb', line 128

def valid?
	@scheme and @method and @path
end