# File lib/capybara/server.rb, line 36 def initialize(app, port=Capybara.server_port) @app = app @middleware = Middleware.new(@app) @server_thread = nil # supress warnings @port = port @port ||= Capybara::Server.ports[@app.object_id] @port ||= find_available_port end
# File lib/capybara/server.rb, line 29 def ports @ports ||= {} end
# File lib/capybara/server.rb, line 69 def boot unless responsive? Capybara::Server.ports[@app.object_id] = @port @server_thread = Thread.new do Capybara.server.call(@middleware, @port) end Timeout.timeout(60) { @server_thread.join(0.1) until responsive? } end rescue Timeout::Error raise "Rack application timed out during boot" else self end
# File lib/capybara/server.rb, line 49 def error @middleware.error end
# File lib/capybara/server.rb, line 53 def host Capybara.server_host || "127.0.0.1" end
# File lib/capybara/server.rb, line 45 def reset_error! @middleware.error = nil end
# File lib/capybara/server.rb, line 57 def responsive? return false if @server_thread && @server_thread.join(0) res = Net::HTTP.start(host, @port) { |http| http.get('/__identify__') } if res.is_a?(Net::HTTPSuccess) or res.is_a?(Net::HTTPRedirection) return res.body == @app.object_id.to_s end rescue SystemCallError return false end
# File lib/capybara/server.rb, line 87 def find_available_port server = TCPServer.new('127.0.0.1', 0) server.addr[1] ensure server.close if server end