Class: Async::HTTP::Protocol::HTTP2::Response
- Defined in:
- lib/async/http/protocol/http2/response.rb
Instance Attribute Summary
Attributes inherited from Response
Attributes inherited from Response
#body, #headers, #reason, #status, #version
Instance Method Summary collapse
-
#initialize(protocol, stream_id) ⇒ Response
constructor
A new instance of Response.
- #receive_data(stream, data, end_stream) ⇒ Object
-
#receive_headers(stream, headers, end_stream) ⇒ Object
This should be invoked from the background reader, and notifies the task waiting for the headers that we are done.
- #receive_reset_stream(stream, error_code) ⇒ Object
-
#send_request(request) ⇒ Object
Send a request and read it into this response.
-
#wait ⇒ Object
Wait for the headers to be received or for stream reset.
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, #save
Constructor Details
#initialize(protocol, stream_id) ⇒ Response
Returns a new instance of Response.
28 29 30 31 32 33 34 35 36 37 38 39 |
# File 'lib/async/http/protocol/http2/response.rb', line 28 def initialize(protocol, stream_id) @input = nil @length = 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
82 83 84 85 86 87 88 89 90 91 92 |
# File 'lib/async/http/protocol/http2/response.rb', line 82 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 |
#receive_headers(stream, headers, end_stream) ⇒ Object
This should be invoked from the background reader, and notifies the task waiting for the headers that we are done.
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
# File 'lib/async/http/protocol/http2/response.rb', line 62 def receive_headers(stream, headers, end_stream) headers.each do |key, value| if key == STATUS @status = Integer(value) elsif key == REASON @reason = value elsif key == CONTENT_LENGTH @length = Integer(value) else @headers[key] = value end end unless end_stream @body = @input = Body::Writable.new(@length) end notify! end |
#receive_reset_stream(stream, error_code) ⇒ Object
94 95 96 97 98 99 100 |
# File 'lib/async/http/protocol/http2/response.rb', line 94 def receive_reset_stream(stream, error_code) if error_code > 0 @exception = EOFError.new("Stream reset: error_code=#{error_code}") end notify! end |
#send_request(request) ⇒ Object
Send a request and read it into this response.
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
# File 'lib/async/http/protocol/http2/response.rb', line 103 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 = request. pseudo_headers << [AUTHORITY, ] end headers = Headers::Merged.new( pseudo_headers, 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 |
#wait ⇒ Object
Wait for the headers to be received or for stream reset.
50 51 52 53 54 55 56 57 58 59 |
# File 'lib/async/http/protocol/http2/response.rb', line 50 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 |