Sha256: 22ab26f40342a854f377b611f1958c171e4c773b91fcef67e306e3b07b485601

Contents?: true

Size: 1.2 KB

Versions: 4

Compression:

Stored size: 1.2 KB

Contents

# frozen_string_literal: true

export :serve, :listen, :accept_loop, :client_loop

Net   = import('../net')
HTTP1 = import('./server/http1')
HTTP2 = import('./server/http2')

ALPN_PROTOCOLS = %w[h2 http/1.1].freeze
H2_PROTOCOL = 'h2'

def serve(host, port, opts = {}, &handler)
  opts[:alpn_protocols] = ALPN_PROTOCOLS
  server = Net.tcp_listen(host, port, opts)
  accept_loop(server, opts, &handler)
end

def listen(host, port, opts = {})
  opts[:alpn_protocols] = ALPN_PROTOCOLS
  Net.tcp_listen(host, port, opts).tap do |socket|
    socket.define_singleton_method(:each) do |&block|
      MODULE.accept_loop(socket, opts, &block)
    end
  end
end

def accept_loop(server, opts, &handler)
  loop do
    client = server.accept
    spin { client_loop(client, opts, &handler) }
  rescue OpenSSL::SSL::SSLError
    # disregard
  end
end

def client_loop(client, opts, &handler)
  client.no_delay if client.respond_to?(:no_delay)
  adapter = protocol_adapter(client, opts)
  adapter.each(&handler)
ensure
  client.close
end

def protocol_adapter(socket, opts)
  use_http2 = socket.respond_to?(:alpn_protocol) &&
              socket.alpn_protocol == H2_PROTOCOL
  klass = use_http2 ? HTTP2 : HTTP1
  klass.new(socket, opts)
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
polyphony-0.23 lib/polyphony/http/server.rb
polyphony-0.22 lib/polyphony/http/server.rb
polyphony-0.21 lib/polyphony/http/server.rb
polyphony-0.20 lib/polyphony/http/server.rb