From 2741d4322ec150df4b80a86fe459a4394430b6fa Mon Sep 17 00:00:00 2001 From: Jordan Owens Date: Sat, 3 Oct 2020 11:31:05 -0400 Subject: [PATCH] Respect content type set in superclass before filter --- lib/sinatra/base.rb | 10 +++++----- test/filter_test.rb | 11 +++++++++++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/lib/sinatra/base.rb b/lib/sinatra/base.rb index a185731f95..96762328bb 100644 --- a/lib/sinatra/base.rb +++ b/lib/sinatra/base.rb @@ -994,11 +994,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 +1006,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 +1124,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..dc96ce4821 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