4 UNICORN_PEERADDR = '127.0.0.1'.freeze
18 include Socket::Constants
20 def set_server_sockopt(sock, opt)
22 if opt[:rcvbuf] || opt[:sndbuf]
23 log_buffer_sizes(sock, "before: ")
24 sock.setsockopt(SOL_SOCKET, SO_RCVBUF, opt[:rcvbuf]) if opt[:rcvbuf]
25 sock.setsockopt(SOL_SOCKET, SO_SNDBUF, opt[:sndbuf]) if opt[:sndbuf]
26 log_buffer_sizes(sock, " after: ")
28 sock.listen(opt[:backlog] || 1024)
31 def log_buffer_sizes(sock, pfx = '')
32 respond_to?(:logger) or return
33 rcvbuf = sock.getsockopt(SOL_SOCKET, SO_RCVBUF).unpack('i')
34 sndbuf = sock.getsockopt(SOL_SOCKET, SO_SNDBUF).unpack('i')
35 logger.info "#{pfx}#{sock_name(sock)} rcvbuf=#{rcvbuf} sndbuf=#{sndbuf}"
38 # creates a new server, socket. address may be a HOST:PORT or
39 # an absolute path to a UNIX socket. address can even be a Socket
40 # object in which case it is immediately returned
41 def bind_listen(address = '0.0.0.0:8080', opt = { :backlog => 1024 })
42 return address unless String === address
44 sock = if address[0..0] == "/"
45 if File.exist?(address)
46 if File.socket?(address)
47 if self.respond_to?(:logger)
48 logger.info "unlinking existing socket=#{address}"
53 "socket=#{address} specified but it is not a socket!"
56 old_umask = File.umask(0)
58 UNIXServer.new(address)
62 elsif address =~ /^(\d+\.\d+\.\d+\.\d+):(\d+)$/
63 TCPServer.new($1, $2.to_i)
65 raise ArgumentError, "Don't know how to bind: #{address}"
67 set_server_sockopt(sock, opt)
71 # Returns the configuration name of a socket as a string. sock may
72 # be a string value, in which case it is returned as-is
73 # Warning: TCP sockets may not always return the name given to it.
78 Socket.unpack_sockaddr_un(sock.getsockname)
80 Socket.unpack_sockaddr_in(sock.getsockname).reverse!.join(':')
83 Socket.unpack_sockaddr_in(sock.getsockname).reverse!.join(':')
85 Socket.unpack_sockaddr_un(sock.getsockname)
88 raise ArgumentError, "Unhandled class #{sock.class}: #{sock.inspect}"
92 # casts a given Socket to be a TCPServer or UNIXServer
95 Socket.unpack_sockaddr_in(sock.getsockname)
96 TCPServer.for_fd(sock.fileno)
98 UNIXServer.for_fd(sock.fileno)
102 end # module SocketHelper