Methods
Public Class
Public Instance
Classes and Modules
Constants
MAX_CONCURRENT_REQUESTS | = | ::HTTP2::DEFAULT_MAX_CONCURRENT_STREAMS |
Public Instance Aliases
reset | -> | init_connection |
Public Class methods
new(buffer, options)
[show source]
# File lib/httpx/connection/http2.rb 33 def initialize(buffer, options) 34 @options = options 35 @settings = @options.http2_settings 36 @pending = [] 37 @streams = {} 38 @drains = {} 39 @pings = [] 40 @buffer = buffer 41 @handshake_completed = false 42 @wait_for_handshake = @settings.key?(:wait_for_handshake) ? @settings.delete(:wait_for_handshake) : true 43 @max_concurrent_requests = @options.max_concurrent_requests || MAX_CONCURRENT_REQUESTS 44 @max_requests = @options.max_requests 45 init_connection 46 end
Public Instance methods
<<(data)
[show source]
# File lib/httpx/connection/http2.rb 97 def <<(data) 98 @connection << data 99 end
can_buffer_more_requests?()
[show source]
# File lib/httpx/connection/http2.rb 101 def can_buffer_more_requests? 102 (@handshake_completed || !@wait_for_handshake) && 103 @streams.size < @max_concurrent_requests && 104 @streams.size < @max_requests 105 end
close()
[show source]
# File lib/httpx/connection/http2.rb 81 def close 82 unless @connection.state == :closed 83 @connection.goaway 84 emit(:timeout, @options.timeout[:close_handshake_timeout]) 85 end 86 emit(:close, true) 87 end
consume()
[show source]
# File lib/httpx/connection/http2.rb 125 def consume 126 @streams.each do |request, stream| 127 next if request.state == :done 128 129 handle(request, stream) 130 end 131 end
empty?()
[show source]
# File lib/httpx/connection/http2.rb 89 def empty? 90 @connection.state == :closed || @streams.empty? 91 end
exhausted?()
[show source]
# File lib/httpx/connection/http2.rb 93 def exhausted? 94 !@max_requests.positive? 95 end
handle_error(ex, request = nil)
[show source]
# File lib/httpx/connection/http2.rb 133 def handle_error(ex, request = nil) 134 if ex.is_a?(OperationTimeoutError) && !@handshake_completed && @connection.state != :closed 135 @connection.goaway(:settings_timeout, "closing due to settings timeout") 136 emit(:close_handshake) 137 settings_ex = SettingsTimeoutError.new(ex.timeout, ex.message) 138 settings_ex.set_backtrace(ex.backtrace) 139 ex = settings_ex 140 end 141 @streams.each_key do |req| 142 next if request && request == req 143 144 emit(:error, req, ex) 145 end 146 while (req = @pending.shift) 147 next if request && request == req 148 149 emit(:error, req, ex) 150 end 151 end
interests()
[show source]
# File lib/httpx/connection/http2.rb 54 def interests 55 # waiting for WINDOW_UPDATE frames 56 return :r if @buffer.full? 57 58 if @connection.state == :closed 59 return unless @handshake_completed 60 61 return :w 62 end 63 64 unless @connection.state == :connected && @handshake_completed 65 return @buffer.empty? ? :r : :rw 66 end 67 68 return :w if !@pending.empty? && can_buffer_more_requests? 69 70 return :w unless @drains.empty? 71 72 if @buffer.empty? 73 return if @streams.empty? && @pings.empty? 74 75 return :r 76 end 77 78 :rw 79 end
ping()
[show source]
# File lib/httpx/connection/http2.rb 153 def ping 154 ping = SecureRandom.gen_random(8) 155 @connection.ping(ping) 156 ensure 157 @pings << ping 158 end
send(request, head = false)
[show source]
# File lib/httpx/connection/http2.rb 107 def send(request, head = false) 108 unless can_buffer_more_requests? 109 head ? @pending.unshift(request) : @pending << request 110 return false 111 end 112 unless (stream = @streams[request]) 113 stream = @connection.new_stream 114 handle_stream(stream, request) 115 @streams[request] = stream 116 @max_requests -= 1 117 end 118 handle(request, stream) 119 true 120 rescue ::HTTP2::Error::StreamLimitExceeded 121 @pending.unshift(request) 122 false 123 end
timeout()
[show source]
# File lib/httpx/connection/http2.rb 48 def timeout 49 return @options.timeout[:operation_timeout] if @handshake_completed 50 51 @options.timeout[:settings_timeout] 52 end