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

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

Constant Summary collapse

NO_RESPONSE =
[
	[STATUS, '500'],
	[REASON, "No response generated"]
]

Instance Attribute Summary collapse

Attributes inherited from Request

#protocol

Attributes inherited from Request

#authority, #body, #headers, #method, #path, #version

Instance Method Summary collapse

Methods inherited from Request

#peer, #remote_address, #remote_address=

Methods inherited from Request

[], #connect?, #head?, #idempotent?, #to_s

Methods included from Body::Reader

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

Constructor Details

#initialize(protocol, stream_id) ⇒ Request

Returns a new instance of Request.



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

def initialize(protocol, stream_id)
	@input = Body::Writable.new
	
	super(nil, nil, nil, VERSION, Headers.new, @input)
	
	@protocol = protocol
	@stream = Stream.new(self, protocol, stream_id)
end

Instance Attribute Details

#streamObject (readonly)

Returns the value of attribute stream.



38
39
40
# File 'lib/async/http/protocol/http2/request.rb', line 38

def stream
  @stream
end

Instance Method Details

#hijack?Boolean

Returns:

  • (Boolean)


40
41
42
# File 'lib/async/http/protocol/http2/request.rb', line 40

def hijack?
	false
end

#receive_data(stream, data, end_stream) ⇒ Object



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

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

#receive_headers(stream, headers, end_stream) ⇒ Object



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

def receive_headers(stream, headers, end_stream)
	headers.each do |key, value|
		if key == METHOD
			return @stream.send_failure(400, "Request method already specified") if @method
			
			@method = value
		elsif key == PATH
			return @stream.send_failure(400, "Request path already specified") if @path
			
			@path = value
		elsif key == AUTHORITY
			return @stream.send_failure(400, "Request authority already specified") if @authority
			
			@authority = value
		else
			@headers[key] = value
		end
	end
	
	# We are ready for processing:
	@protocol.requests.enqueue self
end

#receive_reset_stream(stream, error_code) ⇒ Object



77
78
# File 'lib/async/http/protocol/http2/request.rb', line 77

def receive_reset_stream(stream, error_code)
end

#send_response(response) ⇒ Object



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

def send_response(response)
	if response.nil?
		@stream.send_headers(nil, NO_RESPONSE, ::HTTP::Protocol::HTTP2::END_STREAM)
	elsif response.body?
		headers = Headers::Merged.new([
			[STATUS, response.status],
		])
		
		if length = response.body.length
			headers << [[::HTTP::Protocol::CONTENT_LENGTH, length]]
		end
		
		headers << response.headers
		
		@stream.send_headers(nil, headers)
		@stream.send_body(response.body)
	else
		headers = Headers::Merged.new([
			[STATUS, response.status],
		], response.headers)
		
		@stream.send_headers(nil, headers, ::HTTP::Protocol::HTTP2::END_STREAM)
	end
end