From 0bffd7d933a46df958c3e6bae1d9871aca515a12 Mon Sep 17 00:00:00 2001 From: Andrew White Date: Sat, 18 Sep 2010 17:49:46 +0100 Subject: Raise ArgumentError instead of normalizing controller name when there is a leading slash [#5651 state:resolved] --- actionpack/lib/action_dispatch/routing/mapper.rb | 6 +++- actionpack/test/dispatch/routing_test.rb | 36 ++++++++++++++++++++---- 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/actionpack/lib/action_dispatch/routing/mapper.rb b/actionpack/lib/action_dispatch/routing/mapper.rb index 42ca351cfa..fe85acb94e 100644 --- a/actionpack/lib/action_dispatch/routing/mapper.rb +++ b/actionpack/lib/action_dispatch/routing/mapper.rb @@ -137,7 +137,7 @@ module ActionDispatch { } else if to.is_a?(String) - controller, action = to.sub(%r{\A/}, '').split('#') + controller, action = to.split('#') elsif to.is_a?(Symbol) action = to.to_s end @@ -149,6 +149,10 @@ module ActionDispatch controller = [@scope[:module], controller].compact.join("/").presence end + if controller.is_a?(String) && controller =~ %r{\A/} + raise ArgumentError, "controller name should not start with a slash" + end + controller = controller.to_s unless controller.is_a?(Regexp) action = action.to_s unless action.is_a?(Regexp) diff --git a/actionpack/test/dispatch/routing_test.rb b/actionpack/test/dispatch/routing_test.rb index b5a4674a16..3daabf7a64 100644 --- a/actionpack/test/dispatch/routing_test.rb +++ b/actionpack/test/dispatch/routing_test.rb @@ -457,8 +457,6 @@ class TestRoutingMapper < ActionDispatch::IntegrationTest match '/cities', :to => 'countries#cities' end - match '/feeds/:service', :to => '/api/feeds#show', :as => :feed - match '/countries/:country/(*other)', :to => redirect{ |params, req| params[:other] ? "/countries/all/#{params[:other]}" : '/countries/all' } match '/:locale/*file.:format', :to => 'files#show', :file => /path\/to\/existing\/file/ @@ -2130,10 +2128,36 @@ class TestRoutingMapper < ActionDispatch::IntegrationTest assert_raises(ActionController::RoutingError){ list_todo_path(:list_id => '2', :id => '1') } end - def test_controller_has_leading_slash_removed - get '/feeds/twitter.xml' - assert_equal 'api/feeds#show', @response.body - assert_equal '/feeds/twitter.xml', feed_path(:service => 'twitter', :format => 'xml') + def test_controller_name_with_leading_slash_raise_error + assert_raise(ArgumentError) do + self.class.stub_controllers do |routes| + routes.draw { get '/feeds/:service', :to => '/feeds#show' } + end + end + + assert_raise(ArgumentError) do + self.class.stub_controllers do |routes| + routes.draw { get '/feeds/:service', :controller => '/feeds', :action => 'show' } + end + end + + assert_raise(ArgumentError) do + self.class.stub_controllers do |routes| + routes.draw { get '/api/feeds/:service', :to => '/api/feeds#show' } + end + end + + assert_raise(ArgumentError) do + self.class.stub_controllers do |routes| + routes.draw { controller("/feeds") { get '/feeds/:service', :to => :show } } + end + end + + assert_raise(ArgumentError) do + self.class.stub_controllers do |routes| + routes.draw { resources :feeds, :controller => '/feeds' } + end + end end private -- cgit v1.2.3