1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Verify that route constraints respond to the expected messages instead of silently failing to enforce the constraint

This commit is contained in:
Xavier Defrang 2013-06-28 15:37:26 +02:00
parent 55193e449a
commit 9fd0c605b9
3 changed files with 29 additions and 0 deletions

View file

@ -1,3 +1,10 @@
* 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.

View file

@ -156,6 +156,8 @@ module ActionDispatch
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 @@ module ActionDispatch
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)

View file

@ -3593,6 +3593,21 @@ class TestFormatConstraints < ActionDispatch::IntegrationTest
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