Fix parsing of array[] CGI parameters so extra empty values aren't included. Closes #6252.

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@5904 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
Jeremy Kemper
2007-01-12 09:10:58 +00:00
parent c62e5e1a3a
commit 41198ad3ad
3 changed files with 21 additions and 6 deletions

View File

@@ -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 File

@@ -23,18 +23,19 @@ class CGIMethods #:nodoc:
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 File

@@ -425,4 +425,16 @@ class CGIRequestTest < Test::Unit::TestCase
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