From dc881c96f4d649c8c16d35d4d728159f985b7ef6 Mon Sep 17 00:00:00 2001 From: Jeremy Kemper Date: Mon, 1 Sep 2014 07:52:39 -0700 Subject: Restore Rack::Server#middleware backward compatibility Fixes regression in #706. It intends to retain backward compatibility with calls to #middleware by aliasing the method to the new default_middleware_for_environment, but since it doesn't call #middleware internally, subclasses that overrode it no longer work. Restored compatibility by calling #middleware internally and delegating its implementation to the new default_middleware_for_environment methods. --- lib/rack/server.rb | 15 ++++++--------- test/spec_server.rb | 35 ++++++++++++++++++++++------------- 2 files changed, 28 insertions(+), 22 deletions(-) diff --git a/lib/rack/server.rb b/lib/rack/server.rb index 42afb742..d9f971d7 100644 --- a/lib/rack/server.rb +++ b/lib/rack/server.rb @@ -235,17 +235,15 @@ module Rack m end - # Aliased for backwards-compatibility - alias :middleware :default_middleware_by_environment + def middleware + default_middleware_by_environment + end end - def default_middleware_by_environment - self.class.default_middleware_by_environment + def middleware + self.class.middleware end - # Aliased for backwards-compatibility - alias :middleware :default_middleware_by_environment - def start &blk if options[:warn] $-w = true @@ -325,8 +323,7 @@ module Rack end def build_app(app) - middlewares = default_middleware_by_environment[options[:environment]] - middlewares.reverse_each do |middleware| + middleware[options[:environment]].reverse_each do |middleware| middleware = middleware.call(self) if middleware.respond_to?(:call) next unless middleware klass, *args = middleware diff --git a/test/spec_server.rb b/test/spec_server.rb index 6692c99e..b2728505 100644 --- a/test/spec_server.rb +++ b/test/spec_server.rb @@ -28,21 +28,35 @@ describe Rack::Server do Rack::MockRequest.new(server.app).get("/").body.to_s.should.equal 'success' end - should "not include Rack::Lint in deployment or none environments" do + should "allow subclasses to override middleware" do + server = Class.new(Rack::Server).class_eval { def middleware; Hash.new [] end; self } + server.middleware['deployment'].should.not.equal [] + server.new(:app => 'foo').middleware['deployment'].should.equal [] + end + + should "allow subclasses to override default middleware" do + server = Class.new(Rack::Server).instance_eval { def default_middleware_by_environment; Hash.new [] end; self } + server.middleware['deployment'].should.equal [] + server.new(:app => 'foo').middleware['deployment'].should.equal [] + end + + should "only provide default middleware for development and deployment environments" do + Rack::Server.default_middleware_by_environment.keys.sort.should.equal %w(deployment development) + end + + should "always return an empty array for unknown environments" do server = Rack::Server.new(:app => 'foo') - server.default_middleware_by_environment['deployment'].flatten.should.not.include(Rack::Lint) - server.default_middleware_by_environment['none'].flatten.should.not.include(Rack::Lint) + server.middleware['production'].should.equal [] end - should "not include Rack::ShowExceptions in deployment or none environments" do + should "not include Rack::Lint in deployment environment" do server = Rack::Server.new(:app => 'foo') - server.default_middleware_by_environment['deployment'].flatten.should.not.include(Rack::ShowExceptions) - server.default_middleware_by_environment['none'].flatten.should.not.include(Rack::ShowExceptions) + server.middleware['deployment'].flatten.should.not.include(Rack::Lint) end - should "always return an empty array for unknown environments" do + should "not include Rack::ShowExceptions in deployment environment" do server = Rack::Server.new(:app => 'foo') - server.default_middleware_by_environment['production'].should.equal [] + server.middleware['deployment'].flatten.should.not.include(Rack::ShowExceptions) end should "include Rack::TempfileReaper in deployment environment" do @@ -66,11 +80,6 @@ describe Rack::Server do Rack::Server.logging_middleware.call(server).should.eql(nil) end - should "not force any middleware under the none configuration" do - server = Rack::Server.new(:app => 'foo') - server.default_middleware_by_environment['none'].should.be.empty - end - should "use a full path to the pidfile" do # avoids issues with daemonize chdir opts = Rack::Server.new.send(:parse_options, %w[--pid testing.pid]) -- cgit v1.2.3-24-ge0c7