File: h2.rb

package info (click to toggle)
ruby-httpx 1.7.2-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,816 kB
  • sloc: ruby: 12,209; makefile: 4
file content (64 lines) | stat: -rw-r--r-- 1,710 bytes parent folder | download
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