Method: Rack::Cascade#call

Defined in:
lib/rack/cascade.rb

#call(env) ⇒ Object

Call each app in order. If the responses uses a status that requires cascading, try the next app. If all responses require cascading, return the response from the last app.



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/rack/cascade.rb', line 32

def call(env)
  return [404, { CONTENT_TYPE => "text/plain" }, []] if @apps.empty?
  result = nil
  last_body = nil

  @apps.each do |app|
    # The SPEC says that the body must be closed after it has been iterated
    # by the server, or if it is replaced by a middleware action. Cascade
    # replaces the body each time a cascade happens. It is assumed that nil
    # does not respond to close, otherwise the previous application body
    # will be closed. The final application body will not be closed, as it
    # will be passed to the server as a result.
    last_body.close if last_body.respond_to? :close

    result = app.call(env)
    return result unless @cascade_for.include?(result[0].to_i)
    last_body = result[2]
  end

  result
end