aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJamis Buck <jamis@37signals.com>2006-06-05 15:30:09 +0000
committerJamis Buck <jamis@37signals.com>2006-06-05 15:30:09 +0000
commit149f5cad856f14b53780619a3efc0258cdd4759b (patch)
treed8fa0449c888c57928acbf653e6f3f676be652db
parent2ffc84d23ff8f78bf43b277d64a4bcda51e932fc (diff)
downloadrails-149f5cad856f14b53780619a3efc0258cdd4759b.tar.gz
rails-149f5cad856f14b53780619a3efc0258cdd4759b.tar.bz2
rails-149f5cad856f14b53780619a3efc0258cdd4759b.zip
Escape the entire path before trying to recognize it (closes #3671)
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@4436 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
-rw-r--r--actionpack/CHANGELOG2
-rw-r--r--actionpack/lib/action_controller/routing.rb3
-rw-r--r--actionpack/test/controller/routing_test.rb9
3 files changed, 13 insertions, 1 deletions
diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG
index f80caa8266..e3c42ea050 100644
--- a/actionpack/CHANGELOG
+++ b/actionpack/CHANGELOG
@@ -1,5 +1,7 @@
*SVN*
+* Escape the path before routing recognition. #3671
+
* Make sure :id and friends are unescaped properly. #5275 [me@julik.nl]
* Fix documentation for with_routing to reflect new reality. #5281 [rramdas@gmail.com]
diff --git a/actionpack/lib/action_controller/routing.rb b/actionpack/lib/action_controller/routing.rb
index e1ad27fc3a..0b8d9c0a73 100644
--- a/actionpack/lib/action_controller/routing.rb
+++ b/actionpack/lib/action_controller/routing.rb
@@ -502,7 +502,7 @@ module ActionController
hangon = (default ? "|| #{default.inspect}" : "if match[#{next_capture}]")
# All non code-related keys (such as :id, :slug) have to be unescaped as other CGI params
- "params[:#{key}] = match[#{next_capture}] && CGI.unescape(match[#{next_capture}]) #{hangon}"
+ "params[:#{key}] = match[#{next_capture}] #{hangon}"
end
def optionality_implied?
@@ -991,6 +991,7 @@ module ActionController
end
def recognize_path(path, environment={})
+ path = CGI.unescape(path)
routes.each do |route|
result = route.recognize(path, environment) and return result
end
diff --git a/actionpack/test/controller/routing_test.rb b/actionpack/test/controller/routing_test.rb
index acbf226a8c..62bad1fee3 100644
--- a/actionpack/test/controller/routing_test.rb
+++ b/actionpack/test/controller/routing_test.rb
@@ -1207,6 +1207,15 @@ class RouteSetTest < Test::Unit::TestCase
end
end
+ def test_recognize_with_encoded_id_and_regex
+ set.draw do |map|
+ map.connect 'page/:id', :controller => 'pages', :action => 'show', :id => /[a-zA-Z0-9 ]+/
+ end
+
+ assert_equal({:controller => 'pages', :action => 'show', :id => '10'}, set.recognize_path('/page/10'))
+ assert_equal({:controller => 'pages', :action => 'show', :id => 'hello world'}, set.recognize_path('/page/hello+world'))
+ end
+
def test_recognize_with_conditions
Object.const_set(:PeopleController, Class.new)