1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 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
|
# frozen_string_literal: true
module HTTPX
module Plugins
#
# This plugin adds support for upgrading an HTTP/1.1 connection to HTTP/2
# via an Upgrade: h2 response declaration
#
# https://gitlab.com/os85/httpx/wikis/Connection-Upgrade#h2
#
module H2
class << self
def extra_options(options)
options.merge(upgrade_handlers: options.upgrade_handlers.merge("h2" => self))
end
def call(connection, _request, _response)
connection.upgrade_to_h2
end
end
module ConnectionMethods
using URIExtensions
def interests
return super unless connecting? && @parser
connect
return @io.interests if connecting?
super
end
def upgrade_to_h2
prev_parser = @parser
if prev_parser
prev_parser.reset
@inflight -= prev_parser.requests.size
end
@parser = @options.http2_class.new(@write_buffer, @options)
set_parser_callbacks(@parser)
@upgrade_protocol = "h2"
# what's happening here:
# a deviation from the state machine is done to perform the actions when a
# connection is closed, without transitioning, so the connection is kept in the pool.
# the state is reset to initial, so that the socket reconnect works out of the box,
# while the parser is already here.
purge_after_closed
transition(:idle)
prev_parser.requests.each do |req|
req.transition(:idle)
send(req)
end
end
end
end
register_plugin(:"upgrade/h2", H2)
end
end
|