aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremy Kemper <jeremy@bitsweat.net>2007-01-12 09:10:58 +0000
committerJeremy Kemper <jeremy@bitsweat.net>2007-01-12 09:10:58 +0000
commit41198ad3ad1925b2b88df9b16638c36dee43500f (patch)
treea9afcc4da1cc81e24add5a713556cb89a3f6f58a
parentc62e5e1a3a60c2360ae5a356bf7697dd4417ecb6 (diff)
downloadrails-41198ad3ad1925b2b88df9b16638c36dee43500f.tar.gz
rails-41198ad3ad1925b2b88df9b16638c36dee43500f.tar.bz2
rails-41198ad3ad1925b2b88df9b16638c36dee43500f.zip
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
-rw-r--r--actionpack/CHANGELOG2
-rwxr-xr-xactionpack/lib/action_controller/cgi_ext/cgi_methods.rb13
-rwxr-xr-xactionpack/test/controller/cgi_test.rb12
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