class Sanford::ConnectionHandler

Constants

ProcessedService

Attributes

connection[R]
logger[R]
server_data[R]

Public Class Methods

new(server_data, connection) click to toggle source
# File lib/sanford/connection_handler.rb, line 14
def initialize(server_data, connection)
  @server_data = server_data
  @connection = connection
  @logger = Sanford::Logger.new(
    @server_data.logger,
    @server_data.verbose_logging
  )
end

Public Instance Methods

run() click to toggle source
# File lib/sanford/connection_handler.rb, line 23
def run
  processed_service = nil
  self.log_received
  benchmark = Benchmark.measure do
    processed_service = self.run!
  end
  processed_service.time_taken = RoundedTime.new(benchmark.real)
  self.log_complete(processed_service)
  processed_service
end

Protected Instance Methods

build_summary_line(processed_service) click to toggle source
# File lib/sanford/connection_handler.rb, line 122
def build_summary_line(processed_service)
  summary_line_args = {
    'time'    => processed_service.time_taken,
    'handler' => processed_service.handler_class
  }
  if (request = processed_service.request)
    summary_line_args['service'] = request.name
    summary_line_args['params']  = request.params.to_hash
  end
  if (response = processed_service.response)
    summary_line_args['status'] = response.code
  end
  if (exception = processed_service.exception)
    summary_line_args['error'] = "#{exception.class}: #{exception.message}"
  end
  SummaryLine.new(summary_line_args)
end
handle_exception(exception, server_data, processed_service) click to toggle source
# File lib/sanford/connection_handler.rb, line 77
def handle_exception(exception, server_data, processed_service)
  error_handler = Sanford::ErrorHandler.new(exception, {
    :server_data   => server_data,
    :request       => processed_service.request,
    :handler_class => processed_service.handler_class,
    :response      => processed_service.response
  })
  processed_service.response  = error_handler.run
  processed_service.exception = error_handler.exception
  self.log_exception(processed_service.exception)
  processed_service
end
log_complete(processed_service) click to toggle source
# File lib/sanford/connection_handler.rb, line 103
def log_complete(processed_service)
  log_verbose "===== Completed in #{processed_service.time_taken}ms " \
              "#{processed_service.response.status} ====="
  log_summary build_summary_line(processed_service)
end
log_exception(exception) click to toggle source
# File lib/sanford/connection_handler.rb, line 109
def log_exception(exception)
  log_verbose("#{exception.class}: #{exception.message}", :error)
  (exception.backtrace || []).each{ |l| log_verbose(l, :error) }
end
log_handler_class(handler_class) click to toggle source
# File lib/sanford/connection_handler.rb, line 99
def log_handler_class(handler_class)
  log_verbose "  Handler: #{handler_class}"
end
log_received() click to toggle source
# File lib/sanford/connection_handler.rb, line 90
def log_received
  log_verbose "===== Received request ====="
end
log_request(request) click to toggle source
# File lib/sanford/connection_handler.rb, line 94
def log_request(request)
  log_verbose "  Service: #{request.name.inspect}"
  log_verbose "  Params:  #{request.params.inspect}"
end
log_summary(message, level = :info) click to toggle source
# File lib/sanford/connection_handler.rb, line 118
def log_summary(message, level = :info)
  self.logger.summary.send(level, "[Sanford] #{message}")
end
log_verbose(message, level = :info) click to toggle source
# File lib/sanford/connection_handler.rb, line 114
def log_verbose(message, level = :info)
  self.logger.verbose.send(level, "[Sanford] #{message}")
end
run!() click to toggle source
# File lib/sanford/connection_handler.rb, line 36
def run!
  processed_service = ProcessedService.new
  begin
    request = Sanford::Protocol::Request.parse(@connection.read_data)
    self.log_request(request)
    processed_service.request = request

    route = @server_data.route_for(request.name)
    self.log_handler_class(route.handler_class)
    processed_service.handler_class = route.handler_class

    response = route.run(request, @server_data)
    processed_service.response = response
  rescue DatWorkerPool::ShutdownError => exception
    error = ShutdownError.new(exception.message)
    error.set_backtrace(exception.backtrace)
    self.handle_exception(error, @server_data, processed_service)
    raise exception
  rescue *Sanford::ErrorHandler::STANDARD_ERROR_CLASSES => exception
    self.handle_exception(exception, @server_data, processed_service)
  ensure
    self.write_response(processed_service)
  end
  processed_service
end
write_response(processed_service) click to toggle source
# File lib/sanford/connection_handler.rb, line 62
def write_response(processed_service)
  begin
    @connection.write_data processed_service.response.to_hash
  rescue *Sanford::ErrorHandler::STANDARD_ERROR_CLASSES => exception
    processed_service = self.handle_exception(
      exception,
      @server_data,
      processed_service
    )
    @connection.write_data processed_service.response.to_hash
  end
  @connection.close_write
  processed_service
end