lib/rack/query_parser.rb in rack-2.0.0.rc1 vs lib/rack/query_parser.rb in rack-2.0.1
- old
+ new
@@ -100,12 +100,11 @@
params[k] << v
elsif after =~ %r(^\[\]\[([^\[\]]+)\]$) || after =~ %r(^\[\](.+)$)
child_key = $1
params[k] ||= []
raise ParameterTypeError, "expected Array (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Array)
- first_key = child_key.gsub(/[\[\]]/, ' ').split.first
- if params_hash_type?(params[k].last) && !params[k].last.key?(first_key)
+ if params_hash_type?(params[k].last) && !params_hash_has_key?(params[k].last, child_key)
normalize_params(params[k].last, child_key, v, depth - 1)
else
params[k] << normalize_params(make_params, child_key, v, depth - 1)
end
else
@@ -131,9 +130,21 @@
private
def params_hash_type?(obj)
obj.kind_of?(@params_class)
+ end
+
+ def params_hash_has_key?(hash, key)
+ return false if key =~ /\[\]/
+
+ key.split(/[\[\]]+/).inject(hash) do |h, part|
+ next h if part == ''
+ return false unless params_hash_type?(h) && h.key?(part)
+ h[part]
+ end
+
+ true
end
def unescape(s)
Utils.unescape(s)
end