Skip to content

Commit a1f6f0d

Browse files
committed
Fix DefaultEncoder to handle Array-of-pairs input
Add encode_pairs to handle top-level Array input as key-value pairs, while preserving [] notation for nested array values. Update the test expectation to reflect the new encoder's [] array encoding.
1 parent 5e3ab09 commit a1f6f0d

2 files changed

Lines changed: 10 additions & 2 deletions

File tree

lib/http/form_data/urlencoded.rb

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,11 @@ def encode(value, prefix = nil)
7070
when Hash
7171
encode_hash(value, prefix)
7272
when Array
73-
value.map { |v| encode(v, "#{prefix}[]") }.join("&")
73+
if prefix
74+
value.map { |v| encode(v, "#{prefix}[]") }.join("&")
75+
else
76+
encode_pairs(value)
77+
end
7478
when nil then prefix.to_s
7579
else
7680
raise ArgumentError, "value must be a Hash" if prefix.nil?
@@ -80,6 +84,10 @@ def encode(value, prefix = nil)
8084

8185
private
8286

87+
def encode_pairs(pairs)
88+
pairs.map { |k, v| encode(v, escape(k)) }.reject(&:empty?).join("&")
89+
end
90+
8391
def encode_hash(hash, prefix)
8492
hash.map do |k, v|
8593
encode(v, prefix ? "#{prefix}[#{escape(k)}]" : escape(k))

spec/lib/http/form_data/urlencoded_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
it "supports any Enumerables of pairs" do
88
form_data = described_class.new([%w[foo bar], ["foo", %w[baz moo]]])
99

10-
expect(form_data.to_s).to eq("foo=bar&foo=baz&foo=moo")
10+
expect(form_data.to_s).to eq("foo=bar&foo[]=baz&foo[]=moo")
1111
end
1212

1313
describe "#content_type" do

0 commit comments

Comments
 (0)