Module: WEBrick::Utils

Defined in:
lib/chef/monkey_patches/webrick-utils.rb

Class Method Summary collapse

Class Method Details

.create_listeners(address, port, logger = nil) ⇒ Object

Creates TCP server sockets bound to +address+:+port+ and returns them.

It will create IPV4 and IPV6 sockets on all interfaces.

NOTE: We need to monkey patch this method because create_listeners on Windows with Ruby > 2.0.0 does not raise an error if we're already listening on a port.


14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/chef/monkey_patches/webrick-utils.rb', line 14

def create_listeners(address, port, logger = nil)
  #
  # utils.rb -- Miscellaneous utilities
  #
  # Author: IPR -- Internet Programming with Ruby -- writers
  # Copyright 2001-2016, TAKAHASHI Masayoshi, GOTOU Yuuzou
  # Copyright 2002-2016, Internet Programming with Ruby writers. All rights
  # reserved.
  #
  # $IPR: utils.rb,v 1.10 2003/02/16 22:22:54 gotoyuzo Exp $
  unless port
    raise ArgumentError, "must specify port"
  end

  res = Socket.getaddrinfo(address, port,
    Socket::AF_UNSPEC,   # address family
    Socket::SOCK_STREAM, # socket type
    0,                   # protocol
    Socket::AI_PASSIVE)  # flag
  last_error = nil
  sockets = []
  res.each do |ai|

    logger.debug("TCPServer.new(#{ai[3]}, #{port})") if logger
    sock = TCPServer.new(ai[3], port)
    port = sock.addr[1] if port == 0
    Utils.set_close_on_exec(sock)
    sockets << sock
  rescue => ex
    logger.warn("TCPServer Error: #{ex}") if logger
    last_error = ex

  end
  raise last_error if sockets.empty?

  sockets
end