Class: Async::HTTP::Protocol::HTTP2::Response::Stream
- Inherits:
-
Stream
- Object
- Protocol::HTTP2::Stream
- Stream
- Async::HTTP::Protocol::HTTP2::Response::Stream
- Defined in:
- lib/async/http/protocol/http2/response.rb
Instance Attribute Summary collapse
-
#response ⇒ Object
readonly
Returns the value of attribute response.
Attributes inherited from Stream
Instance Method Summary collapse
- #accept_push_promise_stream(promised_stream_id, headers) ⇒ Object
- #closed(error) ⇒ Object
-
#initialize ⇒ Stream
constructor
A new instance of Stream.
-
#notify! ⇒ Object
Notify anyone waiting on the response headers to be received (or failure).
-
#receive_initial_headers(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_interim_headers(status, headers) ⇒ Object
-
#wait ⇒ Object
Wait for the headers to be received or for stream reset.
- #wait_for_input ⇒ Object
Methods inherited from Stream
#add_header, #finish_output, #prepare_input, #process_data, #process_headers, #receive_trailing_headers, #send_body, #update_local_window, #window_updated
Constructor Details
Instance Attribute Details
#response ⇒ Object (readonly)
Returns the value of attribute response.
25 26 27 |
# File 'lib/async/http/protocol/http2/response.rb', line 25 def response @response end |
Instance Method Details
#accept_push_promise_stream(promised_stream_id, headers) ⇒ Object
35 36 37 |
# File 'lib/async/http/protocol/http2/response.rb', line 35 def accept_push_promise_stream(promised_stream_id, headers) raise ProtocolError, "Cannot accept push promise stream!" end |
#closed(error) ⇒ Object
117 118 119 120 121 122 123 124 125 126 127 |
# File 'lib/async/http/protocol/http2/response.rb', line 117 def closed(error) super if @response @response = nil end @exception = error self.notify! end |
#notify! ⇒ Object
Notify anyone waiting on the response headers to be received (or failure).
100 101 102 103 104 105 |
# File 'lib/async/http/protocol/http2/response.rb', line 100 def notify! if notification = @notification @notification = nil notification.signal end end |
#receive_initial_headers(headers, end_stream) ⇒ Object
This should be invoked from the background reader, and notifies the task waiting for the headers that we are done.
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
# File 'lib/async/http/protocol/http2/response.rb', line 40 def receive_initial_headers(headers, end_stream) # While in theory, the response pseudo-headers may be extended in the future, currently they only response pseudo-header is :status, so we can assume it is always the first header. status_header = headers.shift if status_header.first != ":status" raise ProtocolError, "Invalid response headers: #{headers.inspect}" end status = Integer(status_header.last) if status >= 100 && status < 200 return receive_interim_headers(status, headers) end @response.status = status @headers = ::Protocol::HTTP::Headers.new # If the protocol request was successful, ensure the response protocol matches: if status == 200 and protocol = @response.request.protocol @response.protocol = Array(protocol).first end headers.each do |key, value| # It's guaranteed that this should be the first header: if key == CONTENT_LENGTH @length = Integer(value) else add_header(key, value) end end @response.headers = @headers if @response.valid? if !end_stream # We only construct the input/body if data is coming. @response.body = prepare_input(@length) elsif @response.head? @response.body = ::Protocol::HTTP::Body::Head.new(@length) end else send_reset_stream(::Protocol::HTTP2::Error::PROTOCOL_ERROR) end self.notify! return headers end |
#receive_interim_headers(status, headers) ⇒ Object
89 90 91 92 93 94 95 96 97 |
# File 'lib/async/http/protocol/http2/response.rb', line 89 def receive_interim_headers(status, headers) if headers.any? headers = ::Protocol::HTTP::Headers[headers] else headers = nil end @response.request.send_interim_response(status, headers) end |
#wait ⇒ Object
Wait for the headers to be received or for stream reset.
108 109 110 111 112 113 114 115 |
# File 'lib/async/http/protocol/http2/response.rb', line 108 def wait # If you call wait after the headers were already received, it should return immediately: @notification&.wait if @exception raise @exception end end |
#wait_for_input ⇒ Object
27 28 29 30 31 32 33 |
# File 'lib/async/http/protocol/http2/response.rb', line 27 def wait_for_input # The input isn't ready until the response headers have been received: @response.wait # There is a possible race condition if you try to access @input - it might already be closed and nil. return @response.body end |