Sha256: 86d5a0c7c0ef3a2048656d79b8f52a53920d3db2070c8dbb72acaf9a03eda9e3

Contents?: true

Size: 1.8 KB

Versions: 14

Compression:

Stored size: 1.8 KB

Contents

# frozen_string_literal: true

export  :tcp_connect,
        :tcp_listen

import('./extensions/socket')
import('./extensions/openssl')

def tcp_connect(host, port, opts = {})
  socket = ::Socket.new(:INET, :STREAM).tap do |s|
    addr = ::Socket.sockaddr_in(port, host)
    s.connect(addr)
  end
  if opts[:secure_context] || opts[:secure]
    secure_socket(socket, opts[:secure_context], opts.merge(host: host))
  else
    socket
  end
end

def tcp_listen(host = nil, port = nil, opts = {})
  host ||= '0.0.0.0'
  raise 'Port number not specified' unless port

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

def 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]
    addr = ::Socket.sockaddr_in(port, host)
    s.bind(addr)
    s.listen(0)
  end
end

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

def secure_socket_wrapper(socket, context)
  if context
    OpenSSL::SSL::SSLSocket.new(socket, context)
  else
    OpenSSL::SSL::SSLSocket.new(socket)
  end
end

def secure_server(socket, context, opts)
  setup_alpn(context, opts[:alpn_protocols]) if opts[:alpn_protocols]
  OpenSSL::SSL::SSLServer.new(socket, context)
end

def setup_alpn(context, protocols)
  context.alpn_protocols = protocols
  context.alpn_select_cb = lambda do |peer_protocols|
    (protocols & peer_protocols).first
  end
end

Version data entries

14 entries across 14 versions & 1 rubygems

Version Path
polyphony-0.36 lib/polyphony/net.rb
polyphony-0.34 lib/polyphony/net.rb
polyphony-0.33 lib/polyphony/net.rb
polyphony-0.32 lib/polyphony/net.rb
polyphony-0.31 lib/polyphony/net.rb
polyphony-0.30 lib/polyphony/net.rb
polyphony-0.29 lib/polyphony/net.rb
polyphony-0.28 lib/polyphony/net.rb
polyphony-0.27 lib/polyphony/net.rb
polyphony-0.26 lib/polyphony/net.rb
polyphony-0.25 lib/polyphony/net.rb
polyphony-0.24 lib/polyphony/net.rb
polyphony-0.23 lib/polyphony/net.rb
polyphony-0.22 lib/polyphony/net.rb