Module: Async::HTTP::Protocol::HTTP2::Connection
Instance Attribute Summary collapse
-
#count ⇒ Object
readonly
Returns the value of attribute count.
-
#promises ⇒ Object
readonly
Returns the value of attribute promises.
-
#stream ⇒ Object
readonly
Returns the value of attribute stream.
Instance Method Summary collapse
- #close(error = nil) ⇒ Object
- #concurrency ⇒ Object
- #http1? ⇒ Boolean
- #http2? ⇒ Boolean
- #initialize ⇒ Object
- #peer ⇒ Object
- #read_in_background(parent: Task.current) ⇒ Object
- #reusable? ⇒ Boolean
- #start_connection ⇒ Object
- #to_s ⇒ Object
- #version ⇒ Object
-
#viable? ⇒ Boolean
Can we use this connection to make requests?.
- #write_frame(frame) ⇒ Object
- #write_frames(&block) ⇒ Object
Instance Attribute Details
#count ⇒ Object (readonly)
Returns the value of attribute count.
137 138 139 |
# File 'lib/async/http/protocol/http2/connection.rb', line 137 def count @count end |
#promises ⇒ Object (readonly)
Returns the value of attribute promises.
131 132 133 |
# File 'lib/async/http/protocol/http2/connection.rb', line 131 def promises @promises end |
#stream ⇒ Object (readonly)
Returns the value of attribute stream.
58 59 60 |
# File 'lib/async/http/protocol/http2/connection.rb', line 58 def stream @stream end |
Instance Method Details
#close(error = nil) ⇒ Object
72 73 74 75 76 77 78 79 80 81 |
# File 'lib/async/http/protocol/http2/connection.rb', line 72 def close(error = nil) super # Ensure the reader task is stopped. if @reader reader = @reader @reader = nil reader.stop end end |
#concurrency ⇒ Object
139 140 141 |
# File 'lib/async/http/protocol/http2/connection.rb', line 139 def concurrency self.maximum_concurrent_streams end |
#http1? ⇒ Boolean
60 61 62 |
# File 'lib/async/http/protocol/http2/connection.rb', line 60 def http1? false end |
#http2? ⇒ Boolean
64 65 66 |
# File 'lib/async/http/protocol/http2/connection.rb', line 64 def http2? true end |
#initialize ⇒ Object
44 45 46 47 48 49 50 51 52 |
# File 'lib/async/http/protocol/http2/connection.rb', line 44 def initialize(*) super @count = 0 @reader = nil # Writing multiple frames at the same time can cause odd problems if frames are only partially written. So we use a semaphore to ensure frames are written in their entirety. @write_frame_guard = Async::Semaphore.new(1) end |
#peer ⇒ Object
133 134 135 |
# File 'lib/async/http/protocol/http2/connection.rb', line 133 def peer @stream.io end |
#read_in_background(parent: Task.current) ⇒ Object
100 101 102 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 |
# File 'lib/async/http/protocol/http2/connection.rb', line 100 def read_in_background(parent: Task.current) raise RuntimeError, "Connection is closed!" if closed? parent.async(transient: true) do |task| @reader = task task.annotate("#{version} reading data for #{self.class}.") begin while !self.closed? self.consume_window self.read_frame end rescue SocketError, IOError, EOFError, Errno::ECONNRESET, Errno::EPIPE, Async::Wrapper::Cancelled # Ignore. rescue ::Protocol::HTTP2::GoawayError => error # Error is raised if a response is actively reading from the # connection. The connection is silently closed if GOAWAY is # received outside the request/response cycle. if @reader self.close(error) end ensure # Don't call #close twice. if @reader self.close($!) end end end end |
#reusable? ⇒ Boolean
148 149 150 |
# File 'lib/async/http/protocol/http2/connection.rb', line 148 def reusable? !self.closed? end |
#start_connection ⇒ Object
68 69 70 |
# File 'lib/async/http/protocol/http2/connection.rb', line 68 def start_connection @reader || read_in_background end |
#to_s ⇒ Object
54 55 56 |
# File 'lib/async/http/protocol/http2/connection.rb', line 54 def to_s "\#<#{self.class} #{@streams.count} active streams>" end |
#version ⇒ Object
152 153 154 |
# File 'lib/async/http/protocol/http2/connection.rb', line 152 def version VERSION end |
#viable? ⇒ Boolean
Can we use this connection to make requests?
144 145 146 |
# File 'lib/async/http/protocol/http2/connection.rb', line 144 def viable? @stream.connected? end |
#write_frame(frame) ⇒ Object
83 84 85 86 87 88 89 90 |
# File 'lib/async/http/protocol/http2/connection.rb', line 83 def write_frame(frame) # We don't want to write multiple frames at the same time. @write_frame_guard.acquire do super end @stream.flush end |
#write_frames(&block) ⇒ Object
92 93 94 95 96 97 98 |
# File 'lib/async/http/protocol/http2/connection.rb', line 92 def write_frames(&block) @write_frame_guard.acquire do super end @stream.flush end |