Sha256: 3d8992c743174ee9f0d9ac9b4a0a11ff12acb9ccf82c0f60c474afdacfe82b78

Contents?: true

Size: 1.57 KB

Versions: 1

Compression:

Stored size: 1.57 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 { |s|
    addr = ::Socket.sockaddr_in(port, host)
    s.connect(addr)
  }
  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.new(:INET, :STREAM).tap { |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)
  }
  if opts[:secure_context] || opts[:secure]
    secure_server(socket, opts[:secure_context], opts)
  else
    socket
  end
end

def secure_socket(socket, context, opts)
  setup_alpn(context, opts[:alpn_protocols]) if context && opts[:alpn_protocols]
  socket = context ?
    OpenSSL::SSL::SSLSocket.new(socket, context) :
    OpenSSL::SSL::SSLSocket.new(socket)
  
  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_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 = ->(peer_protocols) {
    (protocols & peer_protocols).first
  }
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
polyphony-0.19 lib/polyphony/net.rb