aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGibheer <gibheer@gmail.com>2013-08-06 14:15:54 +0200
committerGibheer <gibheer@gmail.com>2013-08-06 14:15:54 +0200
commit30215c37d1da0cf611854fcc246fe115d166008b (patch)
tree585d875f9479838b6a699ca5dd6cdbb170a5ce7c
parentd92dea46954b388ec13bc53c6e4f9894f25863c4 (diff)
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[]`.
-rw-r--r--lib/zero/request/parameter.rb13
-rw-r--r--spec/unit/zero/request/parameter/payload_spec.rb19
2 files changed, 31 insertions, 1 deletions
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