26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
# File 'lib/waitress/parse/query.rb', line 26
def self.normalize hash, name, v
name =~ %r(\A[\[\]]*([^\[\]]+)\]*)
k = $1 || ''
after = $' || ''
return if k.empty?
if after == ""
hash[k] = v
elsif after == "["
hash[name] = v
elsif after == "[]"
hash[k] ||= []
raise TypeError, "expected Array (got #{hash[k].class.name}) for param `#{k}'" unless hash[k].is_a?(Array)
hash[k] << v
elsif after =~ %r(^\[\]\[([^\[\]]+)\]$) || after =~ %r(^\[\](.+)$)
child_key = $1
hash[k] ||= []
raise TypeError, "expected Array (got #{hash[k].class.name}) for param `#{k}'" unless hash[k].is_a?(Array)
if hash[k].last.is_a?(Hash) && !hash[k].last.key?(child_key)
normalize(hash[k].last, child_key, v)
else
hash[k] << normalize({}, child_key, v)
end
else
hash[k] ||= {}
raise TypeError, "expected Hash (got #{hash[k].class.name}) for param `#{k}'" unless hash[k].is_a?(Hash)
hash[k] = normalize(hash[k], after, v)
end
hash
end
|