Class: Capybara::Server

Inherits:
Object
  • Object
show all
Defined in:
lib/capybara/server.rb,
lib/capybara/server/middleware.rb,
lib/capybara/server/animation_disabler.rb

Defined Under Namespace

Classes: AnimationDisabler, Middleware

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(app, *deprecated_options, port: Capybara.server_port, host: Capybara.server_host, reportable_errors: Capybara.server_errors, extra_middleware: []) ⇒ Server

Returns a new instance of Server.



19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/capybara/server.rb', line 19

def initialize(app, *deprecated_options, port: Capybara.server_port, host: Capybara.server_host, reportable_errors: Capybara.server_errors, extra_middleware: [])
  warn "Positional arguments, other than the application, to Server#new are deprecated, please use keyword arguments" unless deprecated_options.empty?
  @app = app
  @extra_middleware = extra_middleware
  @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

Instance Attribute Details

#appObject (readonly)

Returns the value of attribute app.



17
18
19
# File 'lib/capybara/server.rb', line 17

def app
  @app
end

#hostObject (readonly)

Returns the value of attribute host.



17
18
19
# File 'lib/capybara/server.rb', line 17

def host
  @host
end

#portObject (readonly)

Returns the value of attribute port.



17
18
19
# File 'lib/capybara/server.rb', line 17

def port
  @port
end

Class Method Details

.portsObject



12
13
14
# File 'lib/capybara/server.rb', line 12

def ports
  @ports ||= {}
end

Instance Method Details

#bootObject



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/capybara/server.rb', line 75

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

#errorObject



36
37
38
# File 'lib/capybara/server.rb', line 36

def error
  middleware.error
end

#reset_error!Object



32
33
34
# File 'lib/capybara/server.rb', line 32

def reset_error!
  middleware.error = nil
end

#responsive?Boolean

Returns:

  • (Boolean)


44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/capybara/server.rb', line 44

def responsive?
  return false if @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) || res.is_a?(Net::HTTPRedirection)
    return res.body == app.object_id.to_s
  end
rescue SystemCallError
  false
end

#using_ssl?Boolean

Returns:

  • (Boolean)


40
41
42
# File 'lib/capybara/server.rb', line 40

def using_ssl?
  @using_ssl
end

#wait_for_pending_requestsObject



65
66
67
68
69
70
71
72
73
# File 'lib/capybara/server.rb', line 65

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