diff --git a/lib/sinatra/base.rb b/lib/sinatra/base.rb index a185731f95..9a9f3014e6 100644 --- a/lib/sinatra/base.rb +++ b/lib/sinatra/base.rb @@ -998,6 +998,7 @@ def filter!(type, base = settings) filter! type, base.superclass if base.superclass.respond_to?(:filters) base.filters[type].each do |args| result = process_route(*args) + @pinned_response = !@response['Content-Type'].nil? yield result if block_given? end end @@ -1123,9 +1124,7 @@ def dispatch! invoke do static! if settings.static? && (request.get? || request.head?) - filter! :before do - @pinned_response = !@response['Content-Type'].nil? - end + filter! :before route! end rescue ::Exception => boom 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