diff --git a/lib/faraday/adapter.rb b/lib/faraday/adapter.rb index 0d528c44..27c3431c 100644 --- a/lib/faraday/adapter.rb +++ b/lib/faraday/adapter.rb @@ -77,9 +77,14 @@ module Faraday end def process_to_params(pieces, params, base = nil, &block) - params.each do |key, value| + params.to_a.each do |key, value| key_str = base ? "#{base}[#{key}]" : key - if value.kind_of?(Hash) + + case value + when Array + values = value.inject([]) { |a,v| a << [nil, v] } + process_to_params(pieces, values, key_str, &block) + when Hash process_to_params(pieces, value, key_str, &block) else pieces << block.call(key_str, value) diff --git a/test/form_post_test.rb b/test/form_post_test.rb index fb6230d2..1f2c629b 100644 --- a/test/form_post_test.rb +++ b/test/form_post_test.rb @@ -39,4 +39,20 @@ class FormPostTest < Faraday::TestCase @app.process_body_for_request @env assert_equal 'abc', @env[:body] end + + def test_processes_array_values + @env[:body] = {:a => [:b, 1]} + @app.process_body_for_request @env + assert_equal 'a[]=b&a[]=1', @env[:body] + end + + def test_processes_nested_array_values + @env[:body] = {:a => [:b, {:c => :d}, [:e]]} + @app.process_body_for_request @env + + # a[]=b&a[][c]=d&a[][]=e + assert_match /a\[\]=b/, @env[:body] + assert_match /a\[\]\[c\]=d/, @env[:body] + assert_match /a\[\]\[\]=e/, @env[:body] + end end