class Specter::Server

Attributes

cli[R]
logger[R]
options[R]
socket[R]
stack[R]

Public Class Methods

new(cli) click to toggle source
# File lib/specter/server.rb, line 21
def initialize(cli)
  @cli     = cli
  @options = cli.options

  @logger = Logger.new(STDOUT)
  @socket = TCPServer.new(options[:host], options[:port])
  @stack  = Middleware.new(self)
end

Public Instance Methods

handle_requests() click to toggle source
# File lib/specter/server.rb, line 35
def handle_requests
  loop do
    client = socket.accept
    process_request(client)
  end
end
log_error(client, e) click to toggle source
# File lib/specter/server.rb, line 64
def log_error(client, e)
  logger.error "%s - %s: %s\n%s" % [
    client.remote_address.ip_address, e.class, e.message,
    e.backtrace.join("\n")
  ]
end
log_request(env) click to toggle source
# File lib/specter/server.rb, line 71
def log_request(env)
  logger.info "%s - %s - %s" % [
    env.client.remote_address.ip_address, env.request.command, env.request.args.inspect
  ]
end
log_timeout(client) click to toggle source
# File lib/specter/server.rb, line 58
def log_timeout(client)
  logger.warn "%s - timeout" % [
    client.remote_address.ip_address
  ]
end
process_request(client) click to toggle source
# File lib/specter/server.rb, line 42
def process_request(client)
  Timeout.timeout(5) do
    req = Request.parse(client.gets)
    env = Env.new(client, req)
    log_request(env)
    @stack.call(env)
    client.write env.to_str
  end
rescue Timeout::Error
  log_timeout(client)
rescue Object => e
  log_error(client, e)
ensure
  client.close rescue nil
end
run() click to toggle source
# File lib/specter/server.rb, line 30
def run
  BasicSocket.do_not_reverse_lookup = true
  return @thread = Thread.new { handle_requests }
end