Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Verify that route constraints respond to the expected messages instea…

…d of silently failing to enforce the constraint
  • Loading branch information...
commit 9fd0c605b9bcfb2c2e854f3120bd3625eaa017f5 1 parent 55193e4
@xavier xavier authored
View
7 actionpack/CHANGELOG.md
@@ -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
7 actionpack/lib/action_dispatch/routing/mapper.rb
@@ -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)
View
15 actionpack/test/dispatch/routing_test.rb
@@ -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
Please sign in to comment.
Something went wrong with that request. Please try again.