Permalink
Browse files

make it possible to push lists as paramters

This makes it possible to push lists as paramters by naming the
variables with `[]` at the end, for example `foo[]`.
  • Loading branch information...
1 parent d92dea4 commit 30215c37d1da0cf611854fcc246fe115d166008b @Gibheer Gibheer committed Aug 6, 2013
Showing with 31 additions and 1 deletion.
  1. +12 −1 lib/zero/request/parameter.rb
  2. +19 −0 spec/unit/zero/request/parameter/payload_spec.rb
View
13 lib/zero/request/parameter.rb
@@ -21,6 +21,8 @@ class Parameter
'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 @@ def extract_payload_params(environment)
# @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
View
19 spec/unit/zero/request/parameter/payload_spec.rb
@@ -31,6 +31,25 @@
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

0 comments on commit 30215c3

Please sign in to comment.