diff --git a/lib/sinatra/base.rb b/lib/sinatra/base.rb index f0dfbd56a3..f33f475161 100644 --- a/lib/sinatra/base.rb +++ b/lib/sinatra/base.rb @@ -934,6 +934,7 @@ def call!(env) # :nodoc: @params = IndifferentHash.new @request = Request.new(env) @response = Response.new + @pinned_response = nil template_cache.clear if settings.reload_templates invoke { dispatch! } @@ -994,11 +995,11 @@ def forward # Run filters defined on the class and all superclasses. # Accepts an optional block to call after each filter is applied. - def filter!(type, base = settings) - filter! type, base.superclass if base.superclass.respond_to?(:filters) + def filter!(type, base = settings, &block) + filter!(type, base.superclass, &block) if base.superclass.respond_to?(:filters) base.filters[type].each do |args| result = process_route(*args) - yield result if block_given? + block.call(result) if block_given? end end @@ -1006,7 +1007,7 @@ def filter!(type, base = settings) def route!(base = settings, pass_block = nil) if routes = base.routes[@request.request_method] routes.each do |pattern, conditions, block| - @response.delete_header('Content-Type') unless @pinned_response + response.delete_header('Content-Type') unless @pinned_response returned_pass_block = process_route(pattern, conditions) do |*args| env['sinatra.route'] = "#{@request.request_method} #{pattern}" @@ -1124,7 +1125,7 @@ def dispatch! invoke do static! if settings.static? && (request.get? || request.head?) filter! :before do - @pinned_response = !@response['Content-Type'].nil? + @pinned_response = !response['Content-Type'].nil? end route! end diff --git a/test/filter_test.rb b/test/filter_test.rb index c2a382a4ae..f13c94a42e 100644 --- a/test/filter_test.rb +++ b/test/filter_test.rb @@ -262,6 +262,17 @@ class AfterFilterTest < Minitest::Test assert_equal 8, count end + it "respects content type set in superclass filter" do + base = Class.new(Sinatra::Base) + base.before { content_type :json } + mock_app(base) do + get('/foo'){ {foo: :bar}.to_json } + end + + get '/foo' + assert_equal 'application/json', response.headers['Content-Type'] + end + it 'does not run after filter when serving static files' do ran_filter = false mock_app do