Bug #7100
closedWEBrick::HTTPServer.new で BindAddress を指定しない場合に必ず警告が記録される
Description
=begin
以下のようにすると必ず警告が記録されるようです。
$ ruby -v -r webrick -e 'WEBrick::HTTPServer.new(Port: 3000)'
ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]
[2012-09-04 19:20:48] INFO WEBrick 1.3.1
[2012-09-04 19:20:48] INFO ruby 1.9.3 (2012-04-20) [x86_64-linux]
[2012-09-04 19:20:48] WARN TCPServer Error: Address already in use - bind(2)
1.8 では記録されませんでした。1.9.1 以降は記録されました。
lib/webrick/utils.rb の WEBrick::Utils#create_listeners が以下のようになっており、
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{|ai|
begin
logger.debug("TCPServer.new(#{ai[3]}, #{port})") if logger
sock = TCPServer.new(ai[3], port)
...
Socket.getaddrinfo が 1.9 から複数値を返すからのようです。1.8.7 だと 0.0.0.0 の方だけでした。
$ ruby -v -r pp -r socket -e 'pp Socket::getaddrinfo(nil, 3000, Socket::AF_UNSPEC, Socket::SOCK_STREAM, 0, Socket::AI_PASSIVE)'
ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]
[["AF_INET", 3000, "0.0.0.0", "0.0.0.0", 2, 1, 6],
["AF_INET6", 3000, "::", "::", 10, 1, 6]]
WEBrick::Utils#create_listeners のコメントとマッチしなくなるデメリットがあるのですが、config[:BindAddress] のデフォルト値を 0.0.0.0 か :: のどちらかにしてしまうのはいかがでしょう。
=end
Files