Diverge Metal implementation from Rack::Cascade since we want the last app to return its headers and body if the status is a 404.
This commit is contained in:
parent
c3f53f412c
commit
12e416a04b
|
@ -1,31 +0,0 @@
|
|||
require 'active_support/ordered_hash'
|
||||
|
||||
module Rails
|
||||
module Rack
|
||||
# Try a request on several apps; return the first non-404 response.
|
||||
class Cascade
|
||||
attr_reader :apps
|
||||
|
||||
def initialize(apps)
|
||||
@apps = ActiveSupport::OrderedHash.new
|
||||
apps.each { |app| add app }
|
||||
end
|
||||
|
||||
def call(env)
|
||||
@apps.keys.each do |app|
|
||||
result = app.call(env)
|
||||
return result unless result[0].to_i == 404
|
||||
end
|
||||
Metal::NotFoundResponse
|
||||
end
|
||||
|
||||
def add(app)
|
||||
@apps[app] = true
|
||||
end
|
||||
|
||||
def include?(app)
|
||||
@apps.include?(app)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,17 +1,12 @@
|
|||
require 'rails/rack/cascade'
|
||||
require 'active_support/ordered_hash'
|
||||
|
||||
module Rails
|
||||
module Rack
|
||||
module Metal
|
||||
class Metal
|
||||
NotFoundResponse = [404, {}, []].freeze
|
||||
NotFound = lambda { NotFoundResponse }
|
||||
|
||||
class << self
|
||||
def new(app)
|
||||
Cascade.new(builtins + [app])
|
||||
end
|
||||
|
||||
def builtins
|
||||
def self.metals
|
||||
base = "#{Rails.root}/app/metal"
|
||||
matcher = /\A#{Regexp.escape(base)}\/(.*)\.rb\Z/
|
||||
|
||||
|
@ -21,6 +16,20 @@ module Rails
|
|||
file.classify.constantize
|
||||
end
|
||||
end
|
||||
|
||||
def initialize(app)
|
||||
@app = app
|
||||
@metals = ActiveSupport::OrderedHash.new
|
||||
self.class.metals.each { |app| @metals[app] = true }
|
||||
freeze
|
||||
end
|
||||
|
||||
def call(env)
|
||||
@metals.keys.each do |app|
|
||||
result = app.call(env)
|
||||
return result unless result[0].to_i == 404
|
||||
end
|
||||
@app.call(env)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue