fix paramter extraction with charset
This fixes a bug where a charset in the content type blocked the extraction of the payload. A browser may send a string like multipart/form-data; charset=UTF-8 which include? could not find the defined types. Now it gets split and then checked against the defined types.
This commit is contained in:
parent
30215c37d1
commit
00e0c01703
|
@ -16,6 +16,9 @@ module Zero
|
||||||
ENV_KEY_CUSTOM = 'zero.params.custom'
|
ENV_KEY_CUSTOM = 'zero.params.custom'
|
||||||
# the key for the content type
|
# the key for the content type
|
||||||
ENV_KEY_CONTENT_TYPE = 'CONTENT_TYPE'
|
ENV_KEY_CONTENT_TYPE = 'CONTENT_TYPE'
|
||||||
|
# the separator of the type and charset
|
||||||
|
# for example multipart/form-data; charset=UTF-8
|
||||||
|
CONTENT_TYPE_SEPERATOR = ';'
|
||||||
# all content types which used for using the body as a parameter input
|
# all content types which used for using the body as a parameter input
|
||||||
PAYLOAD_CONTENT_TYPES = [
|
PAYLOAD_CONTENT_TYPES = [
|
||||||
'application/x-www-form-urlencoded',
|
'application/x-www-form-urlencoded',
|
||||||
|
@ -87,12 +90,20 @@ module Zero
|
||||||
# extracts the key value pairs from the body
|
# extracts the key value pairs from the body
|
||||||
# @return Hash all key value pairs from the payload
|
# @return Hash all key value pairs from the payload
|
||||||
def extract_payload_params(environment)
|
def extract_payload_params(environment)
|
||||||
unless PAYLOAD_CONTENT_TYPES.include?(environment[ENV_KEY_CONTENT_TYPE])
|
unless matches_payload_types?(environment[ENV_KEY_CONTENT_TYPE])
|
||||||
return {}
|
return {}
|
||||||
end
|
end
|
||||||
parse_string(environment[ENV_KEY_PAYLOAD].read)
|
parse_string(environment[ENV_KEY_PAYLOAD].read)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# check if the content-type matches one of the payload types
|
||||||
|
# @param [String] type - the content type string
|
||||||
|
# @return Boolean true if it matches
|
||||||
|
def matches_payload_types?(type)
|
||||||
|
return false if type.nil?
|
||||||
|
PAYLOAD_CONTENT_TYPES.include?(type.split(CONTENT_TYPE_SEPERATOR)[0])
|
||||||
|
end
|
||||||
|
|
||||||
# parse the query string like input to a hash
|
# parse the query string like input to a hash
|
||||||
# @param query [String] the query string
|
# @param query [String] the query string
|
||||||
# @return [Hash] the key/valuie pairs
|
# @return [Hash] the key/valuie pairs
|
||||||
|
|
|
@ -50,6 +50,16 @@ describe Zero::Request::Parameter, '#payload' do
|
||||||
its(:payload) { should == {'bar[]' => ['foo', 'bar']} }
|
its(:payload) { should == {'bar[]' => ['foo', 'bar']} }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'with encoding in the content type' do
|
||||||
|
let(:env) do
|
||||||
|
EnvGenerator.post('/foo', {
|
||||||
|
:input => 'foo=bar',
|
||||||
|
'CONTENT_TYPE' => 'multipart/form-data; charset=UTF-8'
|
||||||
|
})
|
||||||
|
end
|
||||||
|
its(:payload) { should == {'foo' => 'bar'} }
|
||||||
|
end
|
||||||
|
|
||||||
# TODO behaves like this, but is this really good like this?
|
# TODO behaves like this, but is this really good like this?
|
||||||
context 'with a post body and content type application/json' do
|
context 'with a post body and content type application/json' do
|
||||||
let(:env) do
|
let(:env) do
|
||||||
|
|
Loading…
Reference in New Issue