diff --git a/lib/faraday/encoders/flat_params_encoder.rb b/lib/faraday/encoders/flat_params_encoder.rb index 8a4eae358..bc10c8b9a 100644 --- a/lib/faraday/encoders/flat_params_encoder.rb +++ b/lib/faraday/encoders/flat_params_encoder.rb @@ -33,9 +33,9 @@ def self.encode(params) key = key.to_s if key.is_a?(Symbol) [key, value] end - # Useful default for OAuth and caching. + # Only to be used for non-Array inputs. Arrays should preserve order. - params.sort! + params.sort! if @sort_params end # The params have form [['key1', 'value1'], ['key2', 'value2']]. @@ -94,5 +94,12 @@ def self.decode(query) end end end + + class << self + attr_accessor :sort_params + end + + # Useful default for OAuth and caching. + @sort_params = true end end diff --git a/lib/faraday/encoders/nested_params_encoder.rb b/lib/faraday/encoders/nested_params_encoder.rb index d726a535a..705cd3e50 100644 --- a/lib/faraday/encoders/nested_params_encoder.rb +++ b/lib/faraday/encoders/nested_params_encoder.rb @@ -21,9 +21,9 @@ def encode(params) key = key.to_s if key.is_a?(Symbol) [key, value] end - # Useful default for OAuth and caching. + # Only to be used for non-Array inputs. Arrays should preserve order. - params.sort! + params.sort! if @sort_params end # The params have form [['key1', 'value1'], ['key2', 'value2']]. @@ -161,10 +161,15 @@ def dehash(hash, depth) # for your requests. module NestedParamsEncoder class << self + attr_accessor :sort_params + extend Forwardable def_delegators :'Faraday::Utils', :escape, :unescape end + # Useful default for OAuth and caching. + @sort_params = true + extend EncodeMethods extend DecodeMethods end diff --git a/spec/faraday/params_encoders/flat_spec.rb b/spec/faraday/params_encoders/flat_spec.rb index fe746d635..115342e53 100644 --- a/spec/faraday/params_encoders/flat_spec.rb +++ b/spec/faraday/params_encoders/flat_spec.rb @@ -31,4 +31,12 @@ params = { a: [] } expect(subject.encode(params)).to eq('a=') end + + it 'encodes unsorted when asked' do + params = { b: false, a: true } + expect(subject.encode(params)).to eq('a=true&b=false') + Faraday::FlatParamsEncoder.sort_params = false + expect(subject.encode(params)).to eq('b=false&a=true') + Faraday::FlatParamsEncoder.sort_params = true + end end diff --git a/spec/faraday/params_encoders/nested_spec.rb b/spec/faraday/params_encoders/nested_spec.rb index 6909f42f0..98c372ef6 100644 --- a/spec/faraday/params_encoders/nested_spec.rb +++ b/spec/faraday/params_encoders/nested_spec.rb @@ -94,6 +94,14 @@ expect(subject.encode(params)).to eq('a%5B%5D=true&a%5B%5D=false') end + it 'encodes unsorted when asked' do + params = { b: false, a: true } + expect(subject.encode(params)).to eq('a=true&b=false') + Faraday::NestedParamsEncoder.sort_params = false + expect(subject.encode(params)).to eq('b=false&a=true') + Faraday::NestedParamsEncoder.sort_params = true + end + shared_examples 'a wrong decoding' do it do expect { subject.decode(query) }.to raise_error(TypeError) do |e|