提交 9fd0c605 编写于 作者: X Xavier Defrang

Verify that route constraints respond to the expected messages instead of...

Verify that route constraints respond to the expected messages instead of silently failing to enforce the constraint
上级 55193e44
* Added verification of route constraints given as a Proc or an object responding
to `:matches?`. Previously, when given an non-complying object, it would just
silently fail to enforce the constraint. It will now raise an ArgumentError
when setting up the routes.
*Xavier Defrang*
* Fix `Mime::Type.parse` when bad accepts header is looked up. Previously it
was setting `request.formats` with an array containing a `nil` value, which
raised an error when setting the controller formats.
......
......@@ -156,6 +156,8 @@ def normalize_defaults!
next unless URL_OPTIONS.include?(key) && (String === default || Fixnum === default)
@defaults[key] ||= default
end
elsif options[:constraints]
verify_callable_constraint(options[:constraints])
end
if Regexp === options[:format]
......@@ -165,6 +167,11 @@ def normalize_defaults!
end
end
def verify_callable_constraint(callable_constraint)
return if callable_constraint.respond_to?(:call) || callable_constraint.respond_to?(:matches?)
raise ArgumentError, "Invalid constraint: #{callable_constraint.inspect} must respond to :call or :matches?"
end
def normalize_conditions!
@conditions.merge!(:path_info => path)
......
......@@ -3593,6 +3593,21 @@ def test_enforce_with_string
end
end
class TestCallableConstraintValidation < ActionDispatch::IntegrationTest
def test_constraint_with_object_not_callable
assert_raise(ArgumentError) do
ActionDispatch::Routing::RouteSet.new.tap do |app|
app.draw do
ok = lambda { |env| [200, { 'Content-Type' => 'text/plain' }, []] }
get '/test', to: ok, constraints: Object.new
end
end
end
end
end
class TestRouteDefaults < ActionDispatch::IntegrationTest
stub_controllers do |routes|
Routes = routes
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册