class Polyphony::HTTP::Server::HTTP2Adapter

HTTP2 server adapter

Constants

UPGRADE_MESSAGE

Public Class Methods

new(conn, opts, upgrade_headers = nil) click to toggle source
# File lib/polyphony/http/server/http2.rb, line 16
def initialize(conn, opts, upgrade_headers = nil)
  @conn = conn
  @opts = opts
  @upgrade_headers = upgrade_headers

  @interface = ::HTTP2::Server.new
  @connection_fiber = Fiber.current
  @interface.on(:frame, &method(:send_frame))
  @streams = {}
end
upgrade_each(socket, opts, headers, &block) click to toggle source
# File lib/polyphony/http/server/http2.rb, line 11
def self.upgrade_each(socket, opts, headers, &block)
  adapter = new(socket, opts, headers)
  adapter.each(&block)
end

Public Instance Methods

close() click to toggle source
# File lib/polyphony/http/server/http2.rb, line 75
def close
  @conn.close
end
each(&block) click to toggle source

Iterates over incoming requests

# File lib/polyphony/http/server/http2.rb, line 50
def each(&block)
  @interface.on(:stream) { |stream| start_stream(stream, &block) }
  upgrade if @upgrade_headers

  while (data = @conn.readpartial(8192))
    @interface << data
    snooze
  end
rescue SystemCallError, IOError
  # ignore
ensure
  finalize_client_loop
end
finalize_client_loop() click to toggle source
# File lib/polyphony/http/server/http2.rb, line 69
def finalize_client_loop
  @interface = nil
  @streams.each_key(&:stop)
  @conn.close
end
send_frame(data) click to toggle source
# File lib/polyphony/http/server/http2.rb, line 27
def send_frame(data)
  @conn << data
rescue Exception => e
  @connection_fiber.transfer e
end
start_stream(stream, &block) click to toggle source
# File lib/polyphony/http/server/http2.rb, line 64
def start_stream(stream, &block)
  stream = Stream.new(stream, &block)
  @streams[stream] = true
end
upgrade() click to toggle source
# File lib/polyphony/http/server/http2.rb, line 40
def upgrade
  @conn << UPGRADE_MESSAGE
  settings = @upgrade_headers['HTTP2-Settings']
  Fiber.current.schedule(nil)
  @interface.upgrade(settings, @upgrade_headers, '')
ensure
  @upgrade_headers = nil
end