Skip to content
Browse files

Fix parsing of array[] CGI parameters so extra empty values aren't in…

…cluded. Closes #6252.

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@5904 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
  • Loading branch information...
1 parent c62e5e1 commit 41198ad3ad1925b2b88df9b16638c36dee43500f @jeremy jeremy committed
View
2 actionpack/CHANGELOG
@@ -1,5 +1,7 @@
*SVN*
+* Fix parsing of array[] CGI parameters so extra empty values aren't included. #6252 [Nicholas Seckar, aiwilliams, brentrowland]
+
* link_to_unless_current works with full URLs as well as paths. #6891 [Jarkko Laine, manfred, idrifter]
* Lookup the mime type for #auto_discovery_link_tag in the Mime::Type class. Closes #6941 [Josh Peek]
View
13 actionpack/lib/action_controller/cgi_ext/cgi_methods.rb
@@ -23,18 +23,19 @@ def parse_query_parameters(query_string)
def parse_request_parameters(params)
parser = FormEncodedPairParser.new
- finished = false
- until finished
- finished = true
+ params = params.dup
+ until params.empty?
for key, value in params
- next if key.blank?
- if !key.include?('[')
+ if key.blank?
+ params.delete key
+ elsif !key.include?('[')
# much faster to test for the most common case first (GET)
# and avoid the call to build_deep_hash
parser.result[key] = get_typed_value(value[0])
+ params.delete key
elsif value.is_a?(Array)
parser.parse(key, get_typed_value(value.shift))
- finished = false unless value.empty?
+ params.delete key if value.empty?
else
raise TypeError, "Expected array, found #{value.inspect}"
end
View
12 actionpack/test/controller/cgi_test.rb
@@ -425,4 +425,16 @@ def test_cookie_syntax_resilience
assert_equal ["c84ace84796670c052c6ceb2451fb0f2"], alt_cookies["_session_id"]
assert_equal ["yes"], alt_cookies["is_admin"]
end
+
+ def test_unbalanced_query_string_with_array
+ assert_equal(
+ {'location' => ["1", "2"], 'age_group' => ["2"]},
+ CGIMethods.parse_query_parameters("location[]=1&location[]=2&age_group[]=2")
+ )
+ assert_equal(
+ {'location' => ["1", "2"], 'age_group' => ["2"]},
+ CGIMethods.parse_request_parameters({'location[]' => ["1", "2"],
+ 'age_group[]' => ["2"]})
+ )
+ end
end

0 comments on commit 41198ad

Please sign in to comment.
Something went wrong with that request. Please try again.