Skip to content

Commit

Permalink
Respect content type set in superclass before filter
Browse files Browse the repository at this point in the history
  • Loading branch information
jkowens committed Oct 10, 2020
1 parent 788b806 commit 2741d43
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 5 deletions.
10 changes: 5 additions & 5 deletions lib/sinatra/base.rb
Expand Up @@ -994,19 +994,19 @@ 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

# Run routes defined on the class and all superclasses.
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}"
Expand Down Expand Up @@ -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
Expand Down
11 changes: 11 additions & 0 deletions test/filter_test.rb
Expand Up @@ -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
Expand Down

0 comments on commit 2741d43

Please sign in to comment.