Sha256: 9da48cf7802ea1a113f6465f89cd5eb0c769ec71580df02dc69a67ecdbd4abeb

Contents?: true

Size: 1.66 KB

Versions: 16

Compression:

Stored size: 1.66 KB

Contents

# frozen_string_literal: true

class Rage::Application
  def initialize(router)
    @router = router
    @exception_app = build_exception_app
  end

  def call(env)
    init_logger

    handler = @router.lookup(env)

    response = if handler
      params = Rage::ParamsParser.prepare(env, handler[:params])
      handler[:handler].call(env, params)
    else
      [404, {}, ["Not Found"]]
    end

  rescue Rage::Errors::BadRequest => e
    response = @exception_app.call(400, e)

  rescue Exception => e
    response = @exception_app.call(500, e)

  ensure
    finalize_logger(env, response, params)
  end

  private

  DEFAULT_LOG_CONTEXT = {}.freeze
  private_constant :DEFAULT_LOG_CONTEXT

  def init_logger
    Thread.current[:rage_logger] = {
      tags: [Iodine::Rack::Utils.gen_request_tag],
      context: DEFAULT_LOG_CONTEXT,
      request_start: Process.clock_gettime(Process::CLOCK_MONOTONIC)
    }
  end

  def finalize_logger(env, response, params)
    logger = Thread.current[:rage_logger]

    duration = (
      (Process.clock_gettime(Process::CLOCK_MONOTONIC) - logger[:request_start]) * 1000
    ).round(2)

    logger[:final] = { env:, params:, response:, duration: }
    Rage.logger.info("")
    logger[:final] = nil
  end

  def build_exception_app
    if Rage.env.development?
      ->(status, e) do
        exception_str = "#{e.class} (#{e.message}):\n#{e.backtrace.join("\n")}"
        Rage.logger.error(exception_str)
        [status, {}, [exception_str]]
      end
    else
      ->(status, e) do
        exception_str = "#{e.class} (#{e.message}):\n#{e.backtrace.join("\n")}"
        Rage.logger.error(exception_str)
        [status, {}, []]
      end
    end
  end
end

Version data entries

16 entries across 16 versions & 1 rubygems

Version Path
rage-rb-1.12.0 lib/rage/application.rb
rage-rb-1.11.0 lib/rage/application.rb
rage-rb-1.10.1 lib/rage/application.rb
rage-rb-1.10.0 lib/rage/application.rb
rage-rb-1.9.0 lib/rage/application.rb
rage-rb-1.8.0 lib/rage/application.rb
rage-rb-1.7.0 lib/rage/application.rb
rage-rb-1.6.0 lib/rage/application.rb
rage-rb-1.4.0 lib/rage/application.rb
rage-rb-1.3.0 lib/rage/application.rb
rage-rb-1.2.2 lib/rage/application.rb
rage-rb-1.2.1 lib/rage/application.rb
rage-rb-1.2.0 lib/rage/application.rb
rage-rb-1.1.0 lib/rage/application.rb
rage-rb-1.0.0 lib/rage/application.rb
rage-rb-0.7.0 lib/rage/application.rb