class WatirSpec::Server

Public Class Methods

bind() click to toggle source
# File lib/watirspec/server.rb, line 20
def bind
  @bind ||= Selenium::WebDriver::Platform.windows? ? '127.0.0.1' : '0.0.0.0'
end
port() click to toggle source
# File lib/watirspec/server.rb, line 16
def port
  @port ||= Selenium::WebDriver::PortProber.above(8180)
end
run!() click to toggle source
# File lib/watirspec/server.rb, line 7
def run!
  return if running?

  Thread.new do
    run_server
    wait_for_connection
  end
end

Private Class Methods

accept_client(client) click to toggle source
# File lib/watirspec/server.rb, line 49
def accept_client(client)
  start_line = client.gets
  return unless start_line

  _, path = start_line.split
  status, headers, body = app.response(path, read_body(client))
  headers = prepare_headers(headers, body)

  client.write(response(status, headers, body))
rescue Errno::ECONNRESET
  Watir.logger.warn 'Client reset connection, skipping.', ids: [:reset_connection]
ensure
  client.close
end
app() click to toggle source
# File lib/watirspec/server.rb, line 45
def app
  @app ||= App.new
end
default_headers() click to toggle source
# File lib/watirspec/server.rb, line 86
def default_headers
  {
    'Cache-Control' => 'no-cache',
    'Connection' => 'close',
    'Content-Type' => 'text/html; charset=UTF-8',
    'Server' => 'watirspec'
  }
end
prepare_headers(headers, body) click to toggle source
# File lib/watirspec/server.rb, line 80
def prepare_headers(headers, body)
  headers = default_headers.merge(headers)
  headers['Content-Length'] = body.size.to_s
  headers.to_a.map { |array| array.join(': ') }
end
read_body(client) click to toggle source
# File lib/watirspec/server.rb, line 64
def read_body(client)
  request_headers = read_headers(client)
  client.read(request_headers['Content-Length'].to_i)
end
read_headers(client) click to toggle source
# File lib/watirspec/server.rb, line 69
def read_headers(client)
  headers = {}
  while (line = client.gets.split(' ', 2))
    break if line[0] == ''

    headers[line[0].chop] = line[1].strip
  end

  headers
end
response(status, headers, body) click to toggle source
# File lib/watirspec/server.rb, line 95
def response(status, headers, body)
  response = ["HTTP/1.1 #{status}"] + headers
  response = response.join("\r\n")
  response << "\r\n\r\n#{body}\r\n"
end
run_server() click to toggle source
# File lib/watirspec/server.rb, line 30
def run_server
  server = TCPServer.new(bind, port)
  @running = true
  loop do
    Thread.start(server.accept) { |client| accept_client(client) }
  end
end
running?() click to toggle source
# File lib/watirspec/server.rb, line 26
def running?
  defined?(@running) && @running
end
wait_for_connection() click to toggle source
# File lib/watirspec/server.rb, line 38
def wait_for_connection
  socket_poller = Selenium::WebDriver::SocketPoller.new(bind, port, 30)
  return if socket_poller.connected?

  raise 'Cannot start WatirSpec server.'
end