class Kwipper::Application

Attributes

action[R]
request[R]
response[R]

Public Instance Methods

process!() click to toggle source
# File lib/kwipper/application.rb, line 30
def process!
  if Controller::ROUTES.key? request.route_key
    response.set_status :ok
    response.content_type = 'text/html'

    controller_class, @action = Controller::ROUTES[request.route_key]
    controller = controller_class.new request, response

    if controller.respond_to? @action
      @view = controller.process @action
      response.body = render :layout
    else
      raise Kwipper::NotFoundError, "#{self} does not know #{@action}"
    end
  elsif (file_name = public_file_request?)
    response.set_status :ok
    response.content_type = get_content_type file_name
    response.body = File.read file_name
  else
    raise Kwipper::NotFoundError
  end
end
respond_to(request) click to toggle source
# File lib/kwipper/application.rb, line 8
def respond_to(request)
  @request = request
  @response = Response.new request

  begin
    start_time = Time.now.to_f
    process!

    log.debug "#{"Processed #{request.info}".blue} in #{sprintf '%.8f', Time.now.to_f - start_time}s"
  rescue Kwipper::AuthenticationRequired
    redirect '/'
    log.debug "401 Not Authorized".yellow
  rescue Kwipper::NotFoundError
    render_not_found
    log.warn @response.info.yellow
  rescue => e
    render_error e
    log.fatal "#{@response.info.red}\n#{verbose_error(e)}"
  end
  @response
end

Private Instance Methods

get_content_type(file_name) click to toggle source
# File lib/kwipper/application.rb, line 60
def get_content_type(file_name)
  if (mime = MIME::Types.of(file_name).first)
    mime.content_type
  else
    log.warn "Unknown content type for file: #{file_name}"
    'text/plain'
  end
end
public_file_request?() click to toggle source
# File lib/kwipper/application.rb, line 55
def public_file_request?
  file = File.join(Kwipper::ROOT, 'public', request.path)
  File.exists?(file) && file
end
render_error(e) click to toggle source
# File lib/kwipper/application.rb, line 76
def render_error(e)
  @error = e
  response.set_status :server_error
  @view = render :server_error
  response.body = render :layout
end
render_not_found() click to toggle source
# File lib/kwipper/application.rb, line 69
def render_not_found
  response.set_status :not_found
  response.status_message = "#{response.status_message}: #{request.info}"
  @view = render :not_found
  response.body = render :layout
end
verbose_error(e) click to toggle source
# File lib/kwipper/application.rb, line 83
def verbose_error(e)
  "#{e.class} #{e.message}\n#{e.backtrace.join "\n"}".red
end