File tree Expand file tree Collapse file tree 2 files changed +39
-2
lines changed Expand file tree Collapse file tree 2 files changed +39
-2
lines changed Original file line number Diff line number Diff line change @@ -53,13 +53,45 @@ def encoder=(implementation)
5353 end
5454
5555 # Returns form data encoder implementation.
56- # Default: `URI.encode_www_form` .
56+ # Default: custom realization .
5757 #
5858 # @see .encoder=
5959 # @return [#call]
6060 def encoder
61- @encoder ||= :: URI . method ( :encode_www_form )
61+ @encoder ||= DefaultEncoder . method ( :encode )
6262 end
63+
64+ # Default encoder
65+ module DefaultEncoder
66+ class << self
67+ def encode ( value , prefix = nil )
68+ case value
69+ when Hash
70+ encode_hash ( value , prefix )
71+ when Array
72+ value . map { |v | encode ( v , "#{ prefix } []" ) } . join ( "&" )
73+ when nil then prefix . to_s
74+ else
75+ raise ArgumentError , "value must be a Hash" if prefix . nil?
76+ "#{ prefix } =#{ escape ( value ) } "
77+ end
78+ end
79+
80+ private
81+
82+ def encode_hash ( hash , prefix )
83+ hash . map do |k , v |
84+ encode ( v , prefix ? "#{ prefix } [#{ escape ( k ) } ]" : escape ( k ) )
85+ end . reject ( &:empty? ) . join ( "&" )
86+ end
87+
88+ def escape ( value )
89+ URI . encode_www_form_component ( value )
90+ end
91+ end
92+ end
93+
94+ private_constant :DefaultEncoder
6395 end
6496
6597 # @param [#to_h, Hash] data form data key-value Hash
Original file line number Diff line number Diff line change 2929 it { is_expected . to eq "foo%5Bbar%5D=%D1%82%D0%B5%D1%81%D1%82" }
3030 end
3131
32+ context "with nested hashes" do
33+ let ( :data ) { { "foo" => { "bar" => "test" } } }
34+ it { is_expected . to eq "foo[bar]=test" }
35+ end
36+
3237 it "rewinds content" do
3338 content = form_data . read
3439 expect ( form_data . to_s ) . to eq content
You can’t perform that action at this time.
0 commit comments