From 41198ad3ad1925b2b88df9b16638c36dee43500f Mon Sep 17 00:00:00 2001 From: Jeremy Kemper Date: Fri, 12 Jan 2007 09:10:58 +0000 Subject: 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 --- actionpack/CHANGELOG | 2 ++ actionpack/lib/action_controller/cgi_ext/cgi_methods.rb | 13 +++++++------ actionpack/test/controller/cgi_test.rb | 12 ++++++++++++ 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG index bc1dd897e1..29456bf301 100644 --- a/actionpack/CHANGELOG +++ b/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] diff --git a/actionpack/lib/action_controller/cgi_ext/cgi_methods.rb b/actionpack/lib/action_controller/cgi_ext/cgi_methods.rb index 329a11969a..437a340b25 100755 --- a/actionpack/lib/action_controller/cgi_ext/cgi_methods.rb +++ b/actionpack/lib/action_controller/cgi_ext/cgi_methods.rb @@ -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 diff --git a/actionpack/test/controller/cgi_test.rb b/actionpack/test/controller/cgi_test.rb index 1d2888ad89..e7d44802a5 100755 --- a/actionpack/test/controller/cgi_test.rb +++ b/actionpack/test/controller/cgi_test.rb @@ -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 -- cgit v1.2.3