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:
Joshua Peek 2008-12-19 11:04:27 -06:00
parent c3f53f412c
commit 12e416a04b
2 changed files with 24 additions and 46 deletions

View File

@ -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

View File

@ -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