Included Modules

Unicorn::SocketHelper

Constants

TCP_DEFER_ACCEPT

from /usr/include/linux/tcp.h

TCP_CORK

do not send out partial frames (Linux)

TCP_NOPUSH

do not send out partial frames (FreeBSD)

FILTER_ARG

set set the “httpready” accept filter in FreeBSD if available if other protocols are to be supported, this may be String#replace-d with “dataready” arguments instead

Public Instance Methods

bind_listen(address = '0.0.0.0:8080', opt = {}) click to toggle source

creates a new server, socket. address may be a HOST:PORT or an absolute path to a UNIX socket. address can even be a Socket object in which case it is immediately returned

     # File lib/unicorn/socket_helper.rb, line 88
 88:     def bind_listen(address = '0.0.0.0:8080', opt = {})
 89:       return address unless String === address
 90: 
 91:       sock = if address[0] == ?/
 92:         if File.exist?(address)
 93:           if File.socket?(address)
 94:             if self.respond_to?(:logger)
 95:               logger.info "unlinking existing socket=#{address}"
 96:             end
 97:             File.unlink(address)
 98:           else
 99:             raise ArgumentError,
100:                   "socket=#{address} specified but it is not a socket!"
101:           end
102:         end
103:         old_umask = File.umask(opt[:umask] || 0)
104:         begin
105:           UNIXServer.new(address)
106:         ensure
107:           File.umask(old_umask)
108:         end
109:       elsif address =~ /^(\d+\.\d+\.\d+\.\d+):(\d+)$/
110:         TCPServer.new($1, $2.to_i)
111:       else
112:         raise ArgumentError, "Don't know how to bind: #{address}"
113:       end
114:       set_server_sockopt(sock, opt)
115:       sock
116:     end
log_buffer_sizes(sock, pfx = '') click to toggle source

(Not documented)

    # File lib/unicorn/socket_helper.rb, line 78
78:     def log_buffer_sizes(sock, pfx = '')
79:       respond_to?(:logger) or return
80:       rcvbuf = sock.getsockopt(SOL_SOCKET, SO_RCVBUF).unpack('i')
81:       sndbuf = sock.getsockopt(SOL_SOCKET, SO_SNDBUF).unpack('i')
82:       logger.info "#{pfx}#{sock_name(sock)} rcvbuf=#{rcvbuf} sndbuf=#{sndbuf}"
83:     end
server_cast(sock) click to toggle source

casts a given Socket to be a TCPServer or UNIXServer

     # File lib/unicorn/socket_helper.rb, line 140
140:     def server_cast(sock)
141:       begin
142:         Socket.unpack_sockaddr_in(sock.getsockname)
143:         TCPServer.for_fd(sock.fileno)
144:       rescue ArgumentError
145:         UNIXServer.for_fd(sock.fileno)
146:       end
147:     end
set_server_sockopt(sock, opt) click to toggle source

(Not documented)

    # File lib/unicorn/socket_helper.rb, line 59
59:     def set_server_sockopt(sock, opt)
60:       opt ||= {}
61: 
62:       TCPSocket === sock and set_tcp_sockopt(sock, opt)
63: 
64:       if opt[:rcvbuf] || opt[:sndbuf]
65:         log_buffer_sizes(sock, "before: ")
66:         sock.setsockopt(SOL_SOCKET, SO_RCVBUF, opt[:rcvbuf]) if opt[:rcvbuf]
67:         sock.setsockopt(SOL_SOCKET, SO_SNDBUF, opt[:sndbuf]) if opt[:sndbuf]
68:         log_buffer_sizes(sock, " after: ")
69:       end
70:       sock.listen(opt[:backlog] || 1024)
71:       rescue => e
72:         if respond_to?(:logger)
73:           logger.error "error setting socket options: #{e.inspect}"
74:           logger.error e.backtrace.join("\n")
75:         end
76:     end
set_tcp_sockopt(sock, opt) click to toggle source

(Not documented)

    # File lib/unicorn/socket_helper.rb, line 35
35:     def set_tcp_sockopt(sock, opt)
36: 
37:       # highly portable, but off by default because we don't do keepalive
38:       if defined?(TCP_NODELAY) && ! (val = opt[:tcp_nodelay]).nil?
39:         sock.setsockopt(IPPROTO_TCP, TCP_NODELAY, val ? 1 : 0)
40:       end
41: 
42:       unless (val = opt[:tcp_nopush]).nil?
43:         val = val ? 1 : 0
44:         if defined?(TCP_CORK) # Linux
45:           sock.setsockopt(IPPROTO_TCP, TCP_CORK, val)
46:         elsif defined?(TCP_NOPUSH) # TCP_NOPUSH is untested (FreeBSD)
47:           sock.setsockopt(IPPROTO_TCP, TCP_NOPUSH, val)
48:         end
49:       end
50: 
51:       # No good reason to ever have deferred accepts off
52:       if defined?(TCP_DEFER_ACCEPT)
53:         sock.setsockopt(SOL_TCP, TCP_DEFER_ACCEPT, 1)
54:       elsif defined?(SO_ACCEPTFILTER) && defined?(FILTER_ARG)
55:         sock.setsockopt(SOL_SOCKET, SO_ACCEPTFILTER, FILTER_ARG)
56:       end
57:     end
sock_name(sock) click to toggle source

Returns the configuration name of a socket as a string. sock may be a string value, in which case it is returned as-is Warning: TCP sockets may not always return the name given to it.

     # File lib/unicorn/socket_helper.rb, line 121
121:     def sock_name(sock)
122:       case sock
123:       when String then sock
124:       when UNIXServer
125:         Socket.unpack_sockaddr_un(sock.getsockname)
126:       when TCPServer
127:         Socket.unpack_sockaddr_in(sock.getsockname).reverse!.join(':')
128:       when Socket
129:         begin
130:           Socket.unpack_sockaddr_in(sock.getsockname).reverse!.join(':')
131:         rescue ArgumentError
132:           Socket.unpack_sockaddr_un(sock.getsockname)
133:         end
134:       else
135:         raise ArgumentError, "Unhandled class #{sock.class}: #{sock.inspect}"
136:       end
137:     end

Disabled; run with --debug to generate this.

[Validate]

Generated with the Darkfish Rdoc Generator 1.1.6.