From 5143341398d455eedfd57dc65412a0ea0229131d Mon Sep 17 00:00:00 2001 From: Evan Phoenix Date: Thu, 25 Apr 2019 16:27:27 -0700 Subject: [PATCH] Report tcp 0 port properly. Fixes #1679 Prefer ip_port Fix everything --- lib/puma/binder.rb | 26 ++++++++++++++++---------- test/test_binder.rb | 12 ++++++++++++ 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/lib/puma/binder.rb b/lib/puma/binder.rb index f2165f7474..b6d332af59 100644 --- a/lib/puma/binder.rb +++ b/lib/puma/binder.rb @@ -111,10 +111,10 @@ def parse(binds, logger) bak = params.fetch('backlog', 1024).to_i io = add_tcp_listener uri.host, uri.port, opt, bak - logger.log "* Listening on #{str}" + logger.log "* Listening on tcp://#{uri.host}:#{io.local_address.ip_port}" end - @listeners << [str, io] if io + add_to_listeners(str, io) when "unix" path = "#{uri.host}#{uri.path}".gsub("%20", " ") @@ -149,7 +149,7 @@ def parse(binds, logger) logger.log "* Listening on #{str}" end - @listeners << [str, io] + add_to_listeners(str, io) when "ssl" params = Util.parse_query uri.query require 'puma/minissl' @@ -222,7 +222,7 @@ def parse(binds, logger) logger.log "* Listening on #{str}" end - @listeners << [str, io] if io + add_to_listeners(str, io) else logger.error "Invalid URI: #{str}" end @@ -273,10 +273,9 @@ def loopback_addresses # def add_tcp_listener(host, port, optimize_for_latency=true, backlog=1024) if host == "localhost" - loopback_addresses.each do |addr| + return loopback_addresses.map do |addr| add_tcp_listener addr, port, optimize_for_latency, backlog - end - return + end.last end host = host[1..-2] if host and host[0..0] == '[' @@ -312,10 +311,9 @@ def add_ssl_listener(host, port, ctx, MiniSSL.check if host == "localhost" - loopback_addresses.each do |addr| + return loopback_addresses.map do |addr| add_ssl_listener addr, port, ctx, optimize_for_latency, backlog - end - return + end.last end host = host[1..-2] if host[0..0] == '[' @@ -413,5 +411,13 @@ def inherit_unix_listener(path, fd) s end + private + + def add_to_listeners(str, io) + # TODO: It's possible that it's "OK" to add loopback addresses to the listeners + # array, but we're not sure. See https://github.com/puma/puma/pull/1786 + return if !io || io.local_address.ipv4_loopback? || io.local_address.ipv6_loopback? + @listeners << [str, io] + end end end diff --git a/test/test_binder.rb b/test/test_binder.rb index d72bdbafe6..96bab0e1a1 100644 --- a/test/test_binder.rb +++ b/test/test_binder.rb @@ -95,4 +95,16 @@ def test_binder_parses_tlsv1_1_enabled refute ssl_context_for_binder(@binder).no_tlsv1_1 end + + def test_correct_zero_port + @events = Puma::Events.strings + @binder = Puma::Binder.new(@events) + @binder.parse(["tcp://localhost:0"], @events) + + m = %r!tcp://localhost:(\d+)!.match(@events.stdout.string) + + port = m[1].to_i + + refute_equal 0, port + end end