class Capybara::Server

Attributes

app[R]
host[R]
port[R]

Public Class Methods

new(app, *deprecated_options, port: Capybara.server_port, host: Capybara.server_host, reportable_errors: Capybara.server_errors) click to toggle source
# File lib/capybara/server.rb, line 64
def initialize(app, *deprecated_options, port: Capybara.server_port, host: Capybara.server_host, reportable_errors: Capybara.server_errors)
  warn "Positional arguments, other than the application, to Server#new are deprecated, please use keyword arguments" unless deprecated_options.empty?
  @app = app
  @server_thread = nil # suppress warnings
  @host = deprecated_options[1] || host
  @reportable_errors = deprecated_options[2] || reportable_errors
  @using_ssl = false
  @port = deprecated_options[0] || port
  @port ||= Capybara::Server.ports[port_key]
  @port ||= find_available_port(host)
end
ports() click to toggle source
# File lib/capybara/server.rb, line 57
def ports
  @ports ||= {}
end

Public Instance Methods

boot() click to toggle source
# File lib/capybara/server.rb, line 119
def boot
  unless responsive?
    Capybara::Server.ports[port_key] = port

    @server_thread = Thread.new do
      Capybara.server.call(middleware, port, host)
    end

    start_time = Capybara::Helpers.monotonic_time
    until responsive?
      if (Capybara::Helpers.monotonic_time - start_time) > 60
        raise "Rack application timed out during boot"
      end
      @server_thread.join(0.1)
    end
  end

  self
end
error() click to toggle source
# File lib/capybara/server.rb, line 80
def error
  middleware.error
end
reset_error!() click to toggle source
# File lib/capybara/server.rb, line 76
def reset_error!
  middleware.error = nil
end
responsive?() click to toggle source
# File lib/capybara/server.rb, line 88
def responsive?
  return false if @server_thread && @server_thread.join(0)

  begin
    res = if !@using_ssl
      http_connect
    else
      https_connect
    end
  rescue EOFError, Net::ReadTimeout
    res = https_connect
    @using_ssl = true
  end

  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
using_ssl?() click to toggle source
# File lib/capybara/server.rb, line 84
def using_ssl?
  @using_ssl
end
wait_for_pending_requests() click to toggle source
# File lib/capybara/server.rb, line 109
def wait_for_pending_requests
  start_time = Capybara::Helpers.monotonic_time
  while pending_requests?
    if (Capybara::Helpers.monotonic_time - start_time) > 60
      raise "Requests did not finish in 60 seconds"
    end
    sleep 0.01
  end
end

Private Instance Methods

find_available_port(host) click to toggle source
# File lib/capybara/server.rb, line 161
def find_available_port(host)
  server = TCPServer.new(host, 0)
  server.addr[1]
ensure
  server.close if server
end
http_connect() click to toggle source
# File lib/capybara/server.rb, line 141
def http_connect
  Net::HTTP.start(host, port, read_timeout: 2) { |http| http.get('/__identify__') }
end
https_connect() click to toggle source
# File lib/capybara/server.rb, line 145
def https_connect
  Net::HTTP.start(host, port, use_ssl: true, verify_mode: OpenSSL::SSL::VERIFY_NONE) { |http| http.get('/__identify__') }
end
middleware() click to toggle source
# File lib/capybara/server.rb, line 149
def middleware
  @middleware ||= Middleware.new(app, @reportable_errors)
end
pending_requests?() click to toggle source
# File lib/capybara/server.rb, line 157
def pending_requests?
  middleware.pending_requests?
end
port_key() click to toggle source
# File lib/capybara/server.rb, line 153
def port_key
  Capybara.reuse_server ? app.object_id : middleware.object_id
end