def query_values=(new_query_values)
raise TypeError, "Can't modify frozen URI." if self.frozen?
if new_query_values == nil
self.query = nil
return nil
end
if !new_query_values.respond_to?(:to_hash)
raise TypeError, "Can't convert #{new_query_values.class} into Hash."
end
new_query_values = new_query_values.to_hash
new_query_values = new_query_values.map do |key, value|
key = key.to_s if key.kind_of?(Symbol)
[key, value]
end
new_query_values.sort!
buffer = ""
stack = []
e = lambda do |component|
component = component.to_s if component.kind_of?(Symbol)
self.class.encode_component(component, CharacterClasses::UNRESERVED)
end
new_query_values.each do |key, value|
if value.kind_of?(Hash)
stack << [key, value]
elsif value.kind_of?(Array)
stack << [
key,
value.inject({}) { |accu, x| accu[accu.size.to_s] = x; accu }
]
elsif value == true
buffer << "#{e.call(key)}&"
else
buffer << "#{e.call(key)}=#{e.call(value)}&"
end
end
stack.each do |(parent, hash)|
(hash.sort_by { |key| key.to_s }).each do |(key, value)|
if value.kind_of?(Hash)
stack << ["#{parent}[#{key}]", value]
elsif value == true
buffer << "#{parent}[#{e.call(key)}]&"
else
buffer << "#{parent}[#{e.call(key)}]=#{e.call(value)}&"
end
end
end
self.query = buffer.chop
end