module Polyphony::Net

A more elegant networking API

Public Class Methods

listening_socket_from_options(host, port, opts) click to toggle source
# File lib/polyphony/net.rb, line 31
def listening_socket_from_options(host, port, opts)
  ::Socket.new(:INET, :STREAM).tap do |s|
    s.reuse_addr if opts[:reuse_addr]
    s.dont_linger if opts[:dont_linger]
    s.reuse_port if opts[:reuse_port]
    addr = ::Socket.sockaddr_in(port, host)
    s.bind(addr)
    s.listen(opts[:backlog] || Socket::SOMAXCONN)
  end
end
secure_server(socket, context, opts) click to toggle source
# File lib/polyphony/net.rb, line 62
def secure_server(socket, context, opts)
  setup_alpn(context, opts[:alpn_protocols]) if opts[:alpn_protocols]
  OpenSSL::SSL::SSLServer.new(socket, context)
end
secure_socket(socket, context, opts) click to toggle source
# File lib/polyphony/net.rb, line 42
def secure_socket(socket, context, opts)
  context ||= OpenSSL::SSL::SSLContext.new
  setup_alpn(context, opts[:alpn_protocols]) if opts[:alpn_protocols]
  socket = secure_socket_wrapper(socket, context)

  socket.tap do |s|
    s.hostname = opts[:host] if opts[:host]
    s.connect
    s.post_connection_check(opts[:host]) if opts[:host]
  end
end
secure_socket_wrapper(socket, context) click to toggle source
# File lib/polyphony/net.rb, line 54
def secure_socket_wrapper(socket, context)
  if context
    OpenSSL::SSL::SSLSocket.new(socket, context)
  else
    OpenSSL::SSL::SSLSocket.new(socket)
  end
end
setup_alpn(context, protocols) click to toggle source
# File lib/polyphony/net.rb, line 67
def setup_alpn(context, protocols)
  context.alpn_protocols = protocols
  context.alpn_select_cb = lambda do |peer_protocols|
    (protocols & peer_protocols).first
  end
end
tcp_connect(host, port, opts = {}) click to toggle source
# File lib/polyphony/net.rb, line 10
def tcp_connect(host, port, opts = {})
  socket = TCPSocket.new(host, port)
  if opts[:secure_context] || opts[:secure]
    secure_socket(socket, opts[:secure_context], opts.merge(host: host))
  else
    socket
  end
end
tcp_listen(host = nil, port = nil, opts = {}) click to toggle source
# File lib/polyphony/net.rb, line 19
def tcp_listen(host = nil, port = nil, opts = {})
  host ||= '0.0.0.0'
  raise 'Port number not specified' unless port

  socket = listening_socket_from_options(host, port, opts)
  if opts[:secure_context] || opts[:secure]
    secure_server(socket, opts[:secure_context], opts)
  else
    socket
  end
end