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.
-
#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
95 96 97 98 99 100 101 102 103 104 105 |
# File 'lib/async/http/protocol/http2/response.rb', line 95 def closed(error) super if @response @response = nil end @exception = error notify! end |
#notify! ⇒ Object
Notify anyone waiting on the response headers to be received (or failure).
78 79 80 81 82 83 |
# File 'lib/async/http/protocol/http2/response.rb', line 78 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 |
# File 'lib/async/http/protocol/http2/response.rb', line 40 def receive_initial_headers(headers, end_stream) headers.each do |key, value| # It's guaranteed that this should be the first header: if key == STATUS status = Integer(value) # Ignore informational headers: return if status >= 100 && status < 200 @response.status = Integer(value) elsif key == PROTOCOL @response.protocol = value elsif 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 |
#wait ⇒ Object
Wait for the headers to be received or for stream reset.
86 87 88 89 90 91 92 93 |
# File 'lib/async/http/protocol/http2/response.rb', line 86 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 |