Class: Roda::RodaPlugins::Middleware::Forwarder

Inherits:
Object
  • Object
show all
Defined in:
lib/roda/plugins/middleware.rb

Overview

Forwarder instances are what is actually used as middleware.

Instance Method Summary collapse

Constructor Details

#initialize(mid, app, *args, &block) ⇒ Forwarder

Make a subclass of mid to use as the current middleware, and store app as the next middleware to call.



87
88
89
90
91
92
93
94
95
# File 'lib/roda/plugins/middleware.rb', line 87

def initialize(mid, app, *args, &block)
  @mid = Class.new(mid)
  if configure = @mid.opts[:middleware_configure]
    configure.call(@mid, *args, &block)
  elsif block || !args.empty?
    raise RodaError, "cannot provide middleware args or block unless loading middleware plugin with a block"
  end
  @app = app
end

Instance Method Details

#call(env) ⇒ Object

When calling the middleware, first call the current middleware. If this returns a result, return that result directly. Otherwise, pass handling of the request to the next middleware.



100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/roda/plugins/middleware.rb', line 100

def call(env)
  res = nil

  call_next = catch(:next) do
    env[@mid.opts[:middleware_env_var]] = true
    res = @mid.call(env)
    false
  end

  if call_next
    res = @app.call(env)
  end

  if handle_result = @mid.opts[:middleware_handle_result]
    handle_result.call(env, res)
  end

  res
end