diff options
author | Joshua Peek <josh@joshpeek.com> | 2009-04-14 15:52:23 -0500 |
---|---|---|
committer | Joshua Peek <josh@joshpeek.com> | 2009-04-14 15:52:23 -0500 |
commit | 4839fe2e8201835a53ab6c75528a613e8bf25bfb (patch) | |
tree | 55f5c3f76358fcbb28fca6ac9bcd915cbefac89a /actionpack/lib/action_dispatch/vendor/rack-1.0/rack/cascade.rb | |
parent | 1120aaceae95b95ef491ca226154500051b5fe38 (diff) | |
download | rails-4839fe2e8201835a53ab6c75528a613e8bf25bfb.tar.gz rails-4839fe2e8201835a53ab6c75528a613e8bf25bfb.tar.bz2 rails-4839fe2e8201835a53ab6c75528a613e8bf25bfb.zip |
Move bundled rack into ActionDispatch
Diffstat (limited to 'actionpack/lib/action_dispatch/vendor/rack-1.0/rack/cascade.rb')
-rw-r--r-- | actionpack/lib/action_dispatch/vendor/rack-1.0/rack/cascade.rb | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/actionpack/lib/action_dispatch/vendor/rack-1.0/rack/cascade.rb b/actionpack/lib/action_dispatch/vendor/rack-1.0/rack/cascade.rb new file mode 100644 index 0000000000..a038aa1105 --- /dev/null +++ b/actionpack/lib/action_dispatch/vendor/rack-1.0/rack/cascade.rb @@ -0,0 +1,36 @@ +module Rack + # Rack::Cascade tries an request on several apps, and returns the + # first response that is not 404 (or in a list of configurable + # status codes). + + class Cascade + attr_reader :apps + + def initialize(apps, catch=404) + @apps = apps + @catch = [*catch] + end + + def call(env) + status = headers = body = nil + raise ArgumentError, "empty cascade" if @apps.empty? + @apps.each { |app| + begin + status, headers, body = app.call(env) + break unless @catch.include?(status.to_i) + end + } + [status, headers, body] + end + + def add app + @apps << app + end + + def include? app + @apps.include? app + end + + alias_method :<<, :add + end +end |