mirror of
https://github.com/teamcapybara/capybara.git
synced 2022-11-09 12:08:07 -05:00
Use TCPServer to find available port for server
This protects against the race conditions which inevitably occur when booting multiple capybara servers (such as running specjour). TCPServer.new() will set recently opened sockets to SOCK_WAIT status to ensure that a certain amount of time elapses before they are reused.
This commit is contained in:
parent
ccced29b47
commit
a8a4efc379
1 changed files with 4 additions and 16 deletions
|
@ -83,8 +83,10 @@ class Capybara::Server
|
||||||
private
|
private
|
||||||
|
|
||||||
def find_available_port
|
def find_available_port
|
||||||
@port = 9887
|
server = TCPServer.new('127.0.0.1', 0)
|
||||||
@port += 1 while is_port_open?(@port) and not is_running_on_port?(@port)
|
@port = server.addr[1]
|
||||||
|
ensure
|
||||||
|
server.close if server
|
||||||
end
|
end
|
||||||
|
|
||||||
def is_running_on_port?(tested_port)
|
def is_running_on_port?(tested_port)
|
||||||
|
@ -97,18 +99,4 @@ private
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
def is_port_open?(tested_port)
|
|
||||||
Timeout::timeout(1) do
|
|
||||||
begin
|
|
||||||
s = TCPSocket.new(host, tested_port)
|
|
||||||
s.close
|
|
||||||
return true
|
|
||||||
rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
rescue Timeout::Error
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue