module Deas::SinatraApp

Constants

DEFAULT_ERROR_RESPONSE_STATUS
STANDARD_ERROR_CLASSES

these are standard error classes that we rescue, handle and don't reraise in the rack app, this keeps the app from shutting down unexpectedly; `LoadError`, `NotImplementedError` and `Timeout::Error` are common non `StandardError` exceptions that should be treated like a `StandardError` so we don't want one of these to shutdown the app

Public Class Methods

new(server_config) click to toggle source
# File lib/deas/sinatra_app.rb, line 26
def self.new(server_config)
  # This is generic server initialization stuff.  Eventually do this in the
  # server's initialization logic more like Sanford does.
  server_config.validate!
  server_data = ServerData.new({
    :error_procs            => server_config.error_procs,
    :before_route_run_procs => server_config.before_route_run_procs,
    :after_route_run_procs  => server_config.after_route_run_procs,
    :logger                 => server_config.logger,
    :router                 => server_config.router,
    :template_source        => server_config.template_source
  })

  Sinatra.new do
    # unifying settings - these are used by Deas so extensions can have a
    # common way to identify these low-level settings.  Deas does not use
    # them directly
    set :environment, server_config.env
    set :root,        server_config.root

    # static settings - Deas doesn't care about these anymore so just
    # use some intelligent defaults
    set :views,            server_config.root
    set :public_folder,    server_config.root
    set :default_encoding, 'utf-8'
    set :method_override,  false
    set :reload_templates, false
    set :static,           false
    set :sessions,         false

    # Turn this off b/c Deas won't auto provide it.  We may add an extension
    # gem or something??
    disable :protection

    # raise_errors and show_exceptions prevent Deas error handlers from being
    # called and Deas' logging doesn't finish. They should always be false.
    set :raise_errors,     false
    set :show_exceptions,  false

    # turn off logging, dump_errors b/c Deas handles its own logging logic
    set :dump_errors,      false
    set :logging,          false

    server_config.middlewares.each{ |use_args| use *use_args }

    # routes
    server_config.routes.each do |route|
      send(route.method, route.path) do
        begin
          route.run(
            server_data,
            RequestData.new({
              :request    => request,
              :response   => response,
              :route_path => route.path,
              :params     => params
            })
          )
        rescue *STANDARD_ERROR_CLASSES => err
          request.env['deas.error'] = err
          response.status = DEFAULT_ERROR_RESPONSE_STATUS
          ErrorHandler.run(request.env['deas.error'], {
            :server_data   => server_data,
            :request       => request,
            :response      => response,
            :route_path    => request.env['deas.route_path'],
            :handler_class => request.env['deas.handler_class'],
            :handler       => request.env['deas.handler'],
            :params        => request.env['deas.params'],
            :splat         => request.env['deas.splat']
          })
        end
      end
    end

    not_found do
      # `self` is the sinatra call in this context
      if env['sinatra.error']
        env['deas.error'] = if env['sinatra.error'].instance_of?(::Sinatra::NotFound)
          Deas::NotFound.new("#{env['REQUEST_METHOD']} #{env['PATH_INFO']}").tap do |e|
            e.set_backtrace(env['sinatra.error'].backtrace)
          end
        else
          env['sinatra.error']
        end
        ErrorHandler.run(env['deas.error'], {
          :server_data   => server_data,
          :request       => request,
          :response      => response,
          :route_path    => request.env['deas.route_path'],
          :handler_class => request.env['deas.handler_class'],
          :handler       => request.env['deas.handler'],
          :params        => request.env['deas.params'],
          :splat         => request.env['deas.splat']
        })
      end
    end

  end
end