提交 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 * 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 was setting `request.formats` with an array containing a `nil` value, which
raised an error when setting the controller formats. raised an error when setting the controller formats.
......
...@@ -156,6 +156,8 @@ def normalize_defaults! ...@@ -156,6 +156,8 @@ def normalize_defaults!
next unless URL_OPTIONS.include?(key) && (String === default || Fixnum === default) next unless URL_OPTIONS.include?(key) && (String === default || Fixnum === default)
@defaults[key] ||= default @defaults[key] ||= default
end end
elsif options[:constraints]
verify_callable_constraint(options[:constraints])
end end
if Regexp === options[:format] if Regexp === options[:format]
...@@ -165,6 +167,11 @@ def normalize_defaults! ...@@ -165,6 +167,11 @@ def normalize_defaults!
end end
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! def normalize_conditions!
@conditions.merge!(:path_info => path) @conditions.merge!(:path_info => path)
......
...@@ -3593,6 +3593,21 @@ def test_enforce_with_string ...@@ -3593,6 +3593,21 @@ def test_enforce_with_string
end end
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 class TestRouteDefaults < ActionDispatch::IntegrationTest
stub_controllers do |routes| stub_controllers do |routes|
Routes = routes Routes = routes
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册