Skip to content

Commit 19d8c8c

Browse files
committed
Remove the laziness from the middleware stack.
1 parent d7f6f2b commit 19d8c8c

File tree

9 files changed

+51
-106
lines changed

9 files changed

+51
-106
lines changed

actionpack/lib/action_dispatch/middleware/stack.rb

Lines changed: 15 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -3,49 +3,15 @@
33
module ActionDispatch
44
class MiddlewareStack < Array
55
class Middleware
6-
def self.new(klass, *args, &block)
7-
if klass.is_a?(self)
8-
klass
9-
else
10-
super
11-
end
12-
end
13-
146
attr_reader :args, :block
157

168
def initialize(klass, *args, &block)
17-
@klass = klass
18-
19-
options = args.extract_options!
20-
if options.has_key?(:if)
21-
@conditional = options.delete(:if)
22-
else
23-
@conditional = true
24-
end
25-
args << options unless options.empty?
26-
27-
@args = args
28-
@block = block
9+
@klass, @args, @block = klass, args, block
2910
end
3011

3112
def klass
32-
if @klass.respond_to?(:new)
33-
@klass
34-
elsif @klass.respond_to?(:call)
35-
@klass.call
36-
else
37-
ActiveSupport::Inflector.constantize(@klass.to_s)
38-
end
39-
end
40-
41-
def active?
42-
return false unless klass
43-
44-
if @conditional.respond_to?(:call)
45-
@conditional.call
46-
else
47-
@conditional
48-
end
13+
return @klass if @klass.respond_to?(:new)
14+
@klass = ActiveSupport::Inflector.constantize(@klass.to_s)
4915
end
5016

5117
def ==(middleware)
@@ -58,7 +24,7 @@ def ==(middleware)
5824
if lazy_compare?(@klass) && lazy_compare?(middleware)
5925
normalize(@klass) == normalize(middleware)
6026
else
61-
klass.name == middleware.to_s
27+
klass.name == normalize(middleware.to_s)
6228
end
6329
end
6430
end
@@ -68,25 +34,18 @@ def inspect
6834
end
6935

7036
def build(app)
71-
if block
72-
klass.new(app, *build_args, &block)
73-
else
74-
klass.new(app, *build_args)
75-
end
37+
klass.new(app, *args, &block)
7638
end
7739

78-
private
79-
def lazy_compare?(object)
80-
object.is_a?(String) || object.is_a?(Symbol)
81-
end
40+
private
8241

83-
def normalize(object)
84-
object.to_s.strip.sub(/^::/, '')
85-
end
42+
def lazy_compare?(object)
43+
object.is_a?(String) || object.is_a?(Symbol)
44+
end
8645

87-
def build_args
88-
Array(args).map { |arg| arg.respond_to?(:call) ? arg.call : arg }
89-
end
46+
def normalize(object)
47+
object.to_s.strip.sub(/^::/, '')
48+
end
9049
end
9150

9251
def initialize(*args, &block)
@@ -119,15 +78,14 @@ def use(*args, &block)
11978
end
12079

12180
def active
122-
find_all { |middleware| middleware.active? }
81+
ActiveSupport::Deprecation.warn "All middlewares in the chaing are active since the laziness " <<
82+
"was removed from the middleware stack", caller
12383
end
12484

12585
def build(app = nil, &blk)
12686
app ||= blk
127-
12887
raise "MiddlewareStack#build requires an app" unless app
129-
130-
active.reverse.inject(app) { |a, e| e.build(a) }
88+
reverse.inject(app) { |a, e| e.build(a) }
13189
end
13290
end
13391
end

actionpack/test/dispatch/middleware_stack_test.rb

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -66,29 +66,14 @@ def setup
6666
assert_equal BazMiddleware, @stack[0].klass
6767
end
6868

69-
test "active returns all only enabled middleware" do
70-
assert_no_difference "@stack.active.size" do
71-
assert_difference "@stack.size" do
72-
@stack.use BazMiddleware, :if => lambda { false }
73-
end
74-
end
75-
end
76-
7769
test "lazy evaluates middleware class" do
7870
assert_difference "@stack.size" do
79-
@stack.use lambda { BazMiddleware }
71+
@stack.use "MiddlewareStackTest::BazMiddleware"
8072
end
8173
assert_equal BazMiddleware, @stack.last.klass
8274
end
8375

84-
test "lazy evaluates middleware arguments" do
85-
assert_difference "@stack.size" do
86-
@stack.use BazMiddleware, lambda { :foo }
87-
end
88-
assert_equal [:foo], @stack.last.send(:build_args)
89-
end
90-
91-
test "lazy compares so unloaded constants can be loaded" do
76+
test "lazy compares so unloaded constants are not loaded" do
9277
@stack.use "UnknownMiddleware"
9378
@stack.use :"MiddlewareStackTest::BazMiddleware"
9479
assert @stack.include?("::MiddlewareStackTest::BazMiddleware")

railties/lib/rails/application.rb

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,10 @@ def load_generators
124124
end
125125

126126
def app
127-
@app ||= config.middleware.build(routes)
127+
@app ||= begin
128+
config.middleware = config.middleware.merge_into(default_middleware_stack)
129+
config.middleware.build(routes)
130+
end
128131
end
129132

130133
def call(env)
@@ -148,6 +151,29 @@ def initializers
148151

149152
protected
150153

154+
def default_middleware_stack
155+
ActionDispatch::MiddlewareStack.new.tap do |middleware|
156+
middleware.use ::ActionDispatch::Static, paths.public.to_a.first if config.serve_static_assets
157+
middleware.use ::Rack::Lock if !config.allow_concurrency
158+
middleware.use ::Rack::Runtime
159+
middleware.use ::Rails::Rack::Logger
160+
middleware.use ::ActionDispatch::ShowExceptions, config.consider_all_requests_local if config.action_dispatch.show_exceptions
161+
middleware.use ::ActionDispatch::RemoteIp, config.action_dispatch.ip_spoofing_check, config.action_dispatch.trusted_proxies
162+
middleware.use ::Rack::Sendfile, config.action_dispatch.x_sendfile_header
163+
middleware.use ::ActionDispatch::Callbacks, !config.cache_classes
164+
middleware.use ::ActionDispatch::Cookies
165+
166+
if config.session_store
167+
middleware.use config.session_store, config.session_options
168+
middleware.use ::ActionDispatch::Flash
169+
end
170+
171+
middleware.use ::ActionDispatch::ParamsParser
172+
middleware.use ::Rack::MethodOverride
173+
middleware.use ::ActionDispatch::Head
174+
end
175+
end
176+
151177
def initialize_tasks
152178
require "rails/tasks"
153179
task :environment do

railties/lib/rails/application/bootstrap.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ module Bootstrap
4747
silence_warnings { Object.const_set "RAILS_CACHE", ActiveSupport::Cache.lookup_store(config.cache_store) }
4848

4949
if RAILS_CACHE.respond_to?(:middleware)
50-
config.middleware.insert_after(:"Rack::Lock", RAILS_CACHE.middleware)
50+
config.middleware.insert_before("Rack::Runtime", RAILS_CACHE.middleware)
5151
end
5252
end
5353
end

railties/lib/rails/application/configuration.rb

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class Configuration < ::Rails::Engine::Configuration
99

1010
attr_accessor :allow_concurrency, :cache_classes, :cache_store,
1111
:encoding, :consider_all_requests_local, :dependency_loading,
12-
:filter_parameters, :log_level, :logger,
12+
:filter_parameters, :log_level, :logger, :middleware,
1313
:plugins, :preload_frameworks, :reload_engines, :reload_plugins,
1414
:secret_token, :serve_static_assets, :session_options,
1515
:time_zone, :whiny_nils
@@ -25,6 +25,7 @@ def initialize(*)
2525
@session_store = :cookie_store
2626
@session_options = {}
2727
@time_zone = "UTC"
28+
@middleware = app_middleware
2829
end
2930

3031
def encoding=(value)
@@ -41,10 +42,6 @@ def encoding=(value)
4142
end
4243
end
4344

44-
def middleware
45-
@middleware ||= app_middleware.merge_into(default_middleware_stack)
46-
end
47-
4845
def paths
4946
@paths ||= begin
5047
paths = super
@@ -134,27 +131,6 @@ def session_store(*args)
134131
@session_options = args.shift || {}
135132
end
136133
end
137-
138-
protected
139-
140-
def default_middleware_stack
141-
ActionDispatch::MiddlewareStack.new.tap do |middleware|
142-
middleware.use('::ActionDispatch::Static', lambda { paths.public.to_a.first }, :if => lambda { serve_static_assets })
143-
middleware.use('::Rack::Lock', :if => lambda { !allow_concurrency })
144-
middleware.use('::Rack::Runtime')
145-
middleware.use('::Rails::Rack::Logger')
146-
middleware.use('::ActionDispatch::ShowExceptions', lambda { consider_all_requests_local }, :if => lambda { action_dispatch.show_exceptions })
147-
middleware.use('::ActionDispatch::RemoteIp', lambda { action_dispatch.ip_spoofing_check }, lambda { action_dispatch.trusted_proxies })
148-
middleware.use('::Rack::Sendfile', lambda { action_dispatch.x_sendfile_header })
149-
middleware.use('::ActionDispatch::Callbacks', lambda { !cache_classes })
150-
middleware.use('::ActionDispatch::Cookies')
151-
middleware.use(lambda { session_store }, lambda { session_options })
152-
middleware.use('::ActionDispatch::Flash', :if => lambda { session_store })
153-
middleware.use('::ActionDispatch::ParamsParser')
154-
middleware.use('::Rack::MethodOverride')
155-
middleware.use('::ActionDispatch::Head')
156-
end
157-
end
158134
end
159135
end
160136
end

railties/lib/rails/tasks/middleware.rake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
desc 'Prints out your Rack middleware stack'
22
task :middleware => :environment do
3-
Rails.configuration.middleware.active.each do |middleware|
3+
Rails.configuration.middleware.each do |middleware|
44
puts "use #{middleware.inspect}"
55
end
66
puts "run #{Rails::Application.instance.class.name}.routes"

railties/test/application/middleware_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ def boot!
164164
end
165165

166166
def middleware
167-
AppTemplate::Application.middleware.active.map(&:klass).map(&:name)
167+
AppTemplate::Application.middleware.map(&:klass).map(&:name)
168168
end
169169

170170
def remote_ip(env = {})

railties/test/generators/integration_test_generator_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ class IntegrationTestGeneratorTest < Rails::Generators::TestCase
77

88
def test_integration_test_skeleton_is_created
99
run_generator
10-
assert_file "test/integration/integration_test.rb", /class IntegrationTest < ActionController::IntegrationTest/
10+
assert_file "test/integration/integration_test.rb", /class IntegrationTest < ActionDispatch::IntegrationTest/
1111
end
1212
end

railties/test/generators/performance_test_generator_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ class PerformanceTestGeneratorTest < Rails::Generators::TestCase
77

88
def test_performance_test_skeleton_is_created
99
run_generator
10-
assert_file "test/performance/performance_test.rb", /class PerformanceTest < ActionController::PerformanceTest/
10+
assert_file "test/performance/performance_test.rb", /class PerformanceTest < ActionDispatch::PerformanceTest/
1111
end
1212
end

0 commit comments

Comments
 (0)