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