diff --git a/lib/zero/request/parameter.rb b/lib/zero/request/parameter.rb index ac67401..c8d324c 100644 --- a/lib/zero/request/parameter.rb +++ b/lib/zero/request/parameter.rb @@ -21,6 +21,8 @@ module Zero 'application/x-www-form-urlencoded', 'multipart/form-data' ].to_set + # match keys for list attribute + REGEX_MATCH_LIST = /\[\]$/ # get the query parameters attr_reader :query @@ -95,7 +97,16 @@ module Zero # @param query [String] the query string # @return [Hash] the key/valuie pairs def parse_string(query) - Hash[URI.decode_www_form(query)] + result = {} + URI.decode_www_form(query).each do |p| + if p.first.match(REGEX_MATCH_LIST) + result[p.first] ||= [] + result[p.first] << p.last + else + result[p.first] = p.last + end + end + result end end end diff --git a/spec/unit/zero/request/parameter/payload_spec.rb b/spec/unit/zero/request/parameter/payload_spec.rb index 563b21d..9cf1198 100644 --- a/spec/unit/zero/request/parameter/payload_spec.rb +++ b/spec/unit/zero/request/parameter/payload_spec.rb @@ -31,6 +31,25 @@ describe Zero::Request::Parameter, '#payload' do its(:payload) { should == {'bar' => 'foo bar'} } end + context 'with multiple parameters' do + let(:env) do + EnvGenerator.post('/foo', { + :input => 'bar=foo&foo=bar', 'CONTENT_TYPE' => 'multipart/form-data' + }) + end + its(:payload) { should == {'foo' => 'bar', 'bar' => 'foo'} } + end + + context 'with a list' do + let(:env) do + EnvGenerator.post('/foo', { + :input => 'bar[]=foo&bar[]=bar', + 'CONTENT_TYPE' => 'multipart/form-data' + }) + end + its(:payload) { should == {'bar[]' => ['foo', 'bar']} } + end + # TODO behaves like this, but is this really good like this? context 'with a post body and content type application/json' do let(:env) do