diff --git a/middleman-core/lib/middleman-core/preview_server.rb b/middleman-core/lib/middleman-core/preview_server.rb index 584001ca..073864a2 100644 --- a/middleman-core/lib/middleman-core/preview_server.rb +++ b/middleman-core/lib/middleman-core/preview_server.rb @@ -1,6 +1,7 @@ require 'webrick' require 'webrick/https' require 'openssl' +require 'socket' require 'middleman-core/meta_pages' require 'middleman-core/logger' require 'middleman-core/rack' @@ -200,7 +201,7 @@ module Middleman begin ::WEBrick::HTTPServer.new(http_opts) rescue Errno::EADDRINUSE - logger.error "== Port #{port} is unavailable. Either close the instance of Middleman already running on #{port} or start this Middleman on a new port with: --port=#{port.to_i + 1}" + logger.error "== Port #{port} is unavailable. Either close the instance of Middleman already running on #{port} or start this Middleman on a new port with: --port=#{unused_tcp_port}" exit(1) end end @@ -234,6 +235,15 @@ module Middleman scheme = https? ? 'https' : 'http' URI("#{scheme}://#{host}:#{@port}") end + + # Returns unused TCP port + # @return [Fixnum] + def unused_tcp_port + server = TCPServer.open(0) + port = server.addr[1] + server.close + port + end end class FilteredWebrickLog < ::WEBrick::Log