Escape globbed parameters in routes correctly.
:controller => 'glob', :action=> 'show', :additional => ['foo/bar', 'baz'] Should generate /glob/show/foo%2Fbar/baz not /glob/show/foo/bar/baz
This commit is contained in:
parent
dc4eec1129
commit
6776edccf6
@ -244,11 +244,12 @@ def match_extraction(next_capture)
|
||||
end
|
||||
|
||||
class PathSegment < DynamicSegment #:nodoc:
|
||||
RESERVED_PCHAR = "#{Segment::RESERVED_PCHAR}/"
|
||||
UNSAFE_PCHAR = Regexp.new("[^#{URI::REGEXP::PATTERN::UNRESERVED}#{RESERVED_PCHAR}]", false, 'N').freeze
|
||||
|
||||
def interpolation_chunk(value_code = "#{local_name}")
|
||||
"\#{URI.escape(#{value_code}.to_s, ActionController::Routing::PathSegment::UNSAFE_PCHAR)}"
|
||||
"\#{#{value_code}}"
|
||||
end
|
||||
|
||||
def extract_value
|
||||
"#{local_name} = hash[:#{key}] && hash[:#{key}].collect { |path_component| URI.escape(path_component, ActionController::Routing::Segment::UNSAFE_PCHAR) }.to_param #{"|| #{default.inspect}" if default}"
|
||||
end
|
||||
|
||||
def default
|
||||
|
@ -25,7 +25,7 @@ def setup
|
||||
ActionController::Routing.use_controllers! ['controller']
|
||||
@set = ActionController::Routing::RouteSet.new
|
||||
@set.draw do |map|
|
||||
map.connect ':controller/:action/:variable'
|
||||
map.connect ':controller/:action/:variable/*additional'
|
||||
end
|
||||
|
||||
safe, unsafe = %w(: @ & = + $ , ;), %w(^ / ? # [ ])
|
||||
@ -36,17 +36,19 @@ def setup
|
||||
end
|
||||
|
||||
def test_route_generation_escapes_unsafe_path_characters
|
||||
assert_equal "/contr#{@segment}oller/act#{@escaped}ion/var#{@escaped}iable",
|
||||
assert_equal "/contr#{@segment}oller/act#{@escaped}ion/var#{@escaped}iable/add#{@escaped}itional-1/add#{@escaped}itional-2",
|
||||
@set.generate(:controller => "contr#{@segment}oller",
|
||||
:action => "act#{@segment}ion",
|
||||
:variable => "var#{@segment}iable")
|
||||
:variable => "var#{@segment}iable",
|
||||
:additional => ["add#{@segment}itional-1", "add#{@segment}itional-2"])
|
||||
end
|
||||
|
||||
def test_route_recognition_unescapes_path_components
|
||||
options = { :controller => "controller",
|
||||
:action => "act#{@segment}ion",
|
||||
:variable => "var#{@segment}iable" }
|
||||
assert_equal options, @set.recognize_path("/controller/act#{@escaped}ion/var#{@escaped}iable")
|
||||
:variable => "var#{@segment}iable",
|
||||
:additional => ["add#{@segment}itional-1", "add#{@segment}itional-2"] }
|
||||
assert_equal options, @set.recognize_path("/controller/act#{@escaped}ion/var#{@escaped}iable/add#{@escaped}itional-1/add#{@escaped}itional-2")
|
||||
end
|
||||
end
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user