1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Add per-controller middleware

This commit is contained in:
Yehuda Katz 2009-09-12 13:51:15 -05:00
parent 3180619c0d
commit 7152a4e9a6
2 changed files with 91 additions and 1 deletions

View file

@ -88,6 +88,16 @@ module ActionController
end
end
extlib_inheritable_accessor(:middleware_stack) { ActionDispatch::MiddlewareStack.new }
def self.use(*args)
middleware_stack.use(*args)
end
def self.middleware
middleware_stack
end
# Return a rack endpoint for the given action. Memoize the endpoint, so
# multiple calls into MyController.action will return the same object
# for the same action.
@ -99,7 +109,10 @@ module ActionController
# Proc:: A rack application
def self.action(name)
@actions ||= {}
@actions[name.to_s] ||= ActionEndpoint.new(self, name)
@actions[name.to_s] ||= begin
endpoint = ActionEndpoint.new(self, name)
middleware_stack.build(endpoint)
end
end
end
end

View file

@ -0,0 +1,77 @@
require File.join(File.expand_path(File.dirname(__FILE__)), "test_helper")
module MiddlewareTest
class MyMiddleware
def initialize(app)
@app = app
end
def call(env)
result = @app.call(env)
result[1]["Middleware-Test"] = "Success"
result[1]["Middleware-Order"] = "First"
result
end
end
class ExclaimerMiddleware
def initialize(app)
@app = app
end
def call(env)
result = @app.call(env)
result[1]["Middleware-Order"] << "!"
result
end
end
class MyController < ActionController::Metal
use MyMiddleware
middleware.insert_before MyMiddleware, ExclaimerMiddleware
def index
self.response_body = "Hello World"
end
end
class InheritedController < MyController
end
module MiddlewareTests
extend ActiveSupport::Testing::Declarative
test "middleware that is 'use'd is called as part of the Rack application" do
result = @app.call(env_for("/"))
assert_equal "Hello World", result[2]
assert_equal "Success", result[1]["Middleware-Test"]
end
test "the middleware stack is exposed as 'middleware' in the controller" do
result = @app.call(env_for("/"))
assert_equal "First!", result[1]["Middleware-Order"]
end
end
class TestMiddleware < ActiveSupport::TestCase
include MiddlewareTests
def setup
@app = MyController.action(:index)
end
def env_for(url)
Rack::MockRequest.env_for(url)
end
end
class TestInheritedMiddleware < TestMiddleware
def setup
@app = InheritedController.action(:index)
end
test "middleware inherits" do
end
end
end