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