<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -108,7 +108,7 @@ module Rack
       else
         @env[&quot;rack.request.query_string&quot;] = query_string
         @env[&quot;rack.request.query_hash&quot;]   =
-          Utils.parse_query(query_string)
+          Utils.parse_nested_query(query_string)
       end
     end
 
@@ -129,7 +129,7 @@ module Rack
           form_vars.sub!(/\0\z/, '')
 
           @env[&quot;rack.request.form_vars&quot;] = form_vars
-          @env[&quot;rack.request.form_hash&quot;] = Utils.parse_query(form_vars)
+          @env[&quot;rack.request.form_hash&quot;] = Utils.parse_nested_query(form_vars)
 
           begin
             @env[&quot;rack.input&quot;].rewind if @env[&quot;rack.input&quot;].respond_to?(:rewind)</diff>
      <filename>lib/rack/request.rb</filename>
    </modified>
    <modified>
      <diff>@@ -29,19 +29,39 @@ module Rack
     # and ';' characters.  You can also use this to parse
     # cookies by changing the characters used in the second
     # parameter (which defaults to '&amp;;').
-
     def parse_query(qs, d = '&amp;;')
       params = {}
 
       (qs || '').split(/[#{d}] */n).each do |p|
         k, v = unescape(p).split('=', 2)
-        normalize_params(params, k, v)
+
+        if cur = params[k]
+          if cur.class == Array
+            params[k] &lt;&lt; v
+          else
+            params[k] = [cur, v]
+          end
+        else
+          params[k] = v
+        end
       end
 
       return params
     end
     module_function :parse_query
 
+    def parse_nested_query(qs, d = '&amp;;')
+      params = {}
+
+      (qs || '').split(/[#{d}] */n).each do |p|
+        k, v = unescape(p).split('=', 2)
+        normalize_params(params, k, v)
+      end
+
+      return params
+    end
+    module_function :parse_nested_query
+
     def normalize_params(params, name, v = nil)
       name =~ %r([\[\]]*([^\[\]]+)\]*)
       k = $1 || ''
@@ -50,15 +70,7 @@ module Rack
       return if k.empty?
 
       if after == &quot;&quot;
-        if cur = params[k]
-          if cur.is_a?(Array)
-            params[k] &lt;&lt; v
-          else
-            params[k] = [cur, v]
-          end
-        else
-          params[k] = v
-        end
+        params[k] = v
       elsif after == &quot;[]&quot;
         params[k] ||= []
         raise TypeError unless params[k].is_a?(Array)</diff>
      <filename>lib/rack/utils.rb</filename>
    </modified>
    <modified>
      <diff>@@ -21,69 +21,79 @@ context &quot;Rack::Utils&quot; do
   end
 
   specify &quot;should parse query strings correctly&quot; do
-    Rack::Utils.parse_query(&quot;foo&quot;).
+    Rack::Utils.parse_query(&quot;foo=bar&quot;).should.equal &quot;foo&quot; =&gt; &quot;bar&quot;
+    Rack::Utils.parse_query(&quot;foo=bar&amp;foo=quux&quot;).
+      should.equal &quot;foo&quot; =&gt; [&quot;bar&quot;, &quot;quux&quot;]
+    Rack::Utils.parse_query(&quot;foo=1&amp;bar=2&quot;).
+      should.equal &quot;foo&quot; =&gt; &quot;1&quot;, &quot;bar&quot; =&gt; &quot;2&quot;
+    Rack::Utils.parse_query(&quot;my+weird+field=q1%212%22%27w%245%267%2Fz8%29%3F&quot;).
+      should.equal &quot;my weird field&quot; =&gt; &quot;q1!2\&quot;'w$5&amp;7/z8)?&quot;
+  end
+
+  specify &quot;should parse nested query strings correctly&quot; do
+    Rack::Utils.parse_nested_query(&quot;foo&quot;).
       should.equal &quot;foo&quot; =&gt; nil
-    Rack::Utils.parse_query(&quot;foo=&quot;).
+    Rack::Utils.parse_nested_query(&quot;foo=&quot;).
       should.equal &quot;foo&quot; =&gt; &quot;&quot;
-    Rack::Utils.parse_query(&quot;foo=bar&quot;).
+    Rack::Utils.parse_nested_query(&quot;foo=bar&quot;).
       should.equal &quot;foo&quot; =&gt; &quot;bar&quot;
 
-    Rack::Utils.parse_query(&quot;foo=bar&amp;foo=quux&quot;).
-      should.equal &quot;foo&quot; =&gt; [&quot;bar&quot;, &quot;quux&quot;]
-    Rack::Utils.parse_query(&quot;foo&amp;foo=&quot;).
+    Rack::Utils.parse_nested_query(&quot;foo=bar&amp;foo=quux&quot;).
+      should.equal &quot;foo&quot; =&gt; &quot;quux&quot;
+    Rack::Utils.parse_nested_query(&quot;foo&amp;foo=&quot;).
       should.equal &quot;foo&quot; =&gt; &quot;&quot;
-    Rack::Utils.parse_query(&quot;foo=1&amp;bar=2&quot;).
+    Rack::Utils.parse_nested_query(&quot;foo=1&amp;bar=2&quot;).
       should.equal &quot;foo&quot; =&gt; &quot;1&quot;, &quot;bar&quot; =&gt; &quot;2&quot;
-    Rack::Utils.parse_query(&quot;&amp;foo=1&amp;&amp;bar=2&quot;).
+    Rack::Utils.parse_nested_query(&quot;&amp;foo=1&amp;&amp;bar=2&quot;).
       should.equal &quot;foo&quot; =&gt; &quot;1&quot;, &quot;bar&quot; =&gt; &quot;2&quot;
-    Rack::Utils.parse_query(&quot;foo&amp;bar=&quot;).
+    Rack::Utils.parse_nested_query(&quot;foo&amp;bar=&quot;).
       should.equal &quot;foo&quot; =&gt; nil, &quot;bar&quot; =&gt; &quot;&quot;
-    Rack::Utils.parse_query(&quot;foo=bar&amp;baz=&quot;).
+    Rack::Utils.parse_nested_query(&quot;foo=bar&amp;baz=&quot;).
       should.equal &quot;foo&quot; =&gt; &quot;bar&quot;, &quot;baz&quot; =&gt; &quot;&quot;
-    Rack::Utils.parse_query(&quot;my+weird+field=q1%212%22%27w%245%267%2Fz8%29%3F&quot;).
+    Rack::Utils.parse_nested_query(&quot;my+weird+field=q1%212%22%27w%245%267%2Fz8%29%3F&quot;).
       should.equal &quot;my weird field&quot; =&gt; &quot;q1!2\&quot;'w$5&amp;7/z8)?&quot;
 
-    Rack::Utils.parse_query(&quot;foo[]&quot;).
+    Rack::Utils.parse_nested_query(&quot;foo[]&quot;).
       should.equal &quot;foo&quot; =&gt; [nil]
-    Rack::Utils.parse_query(&quot;foo[]=&quot;).
+    Rack::Utils.parse_nested_query(&quot;foo[]=&quot;).
       should.equal &quot;foo&quot; =&gt; [&quot;&quot;]
-    Rack::Utils.parse_query(&quot;foo[]=bar&quot;).
+    Rack::Utils.parse_nested_query(&quot;foo[]=bar&quot;).
       should.equal &quot;foo&quot; =&gt; [&quot;bar&quot;]
 
-    Rack::Utils.parse_query(&quot;foo[]=1&amp;foo[]=2&quot;).
+    Rack::Utils.parse_nested_query(&quot;foo[]=1&amp;foo[]=2&quot;).
       should.equal &quot;foo&quot; =&gt; [&quot;1&quot;, &quot;2&quot;]
-    Rack::Utils.parse_query(&quot;foo=bar&amp;baz[]=1&amp;baz[]=2&amp;baz[]=3&quot;).
+    Rack::Utils.parse_nested_query(&quot;foo=bar&amp;baz[]=1&amp;baz[]=2&amp;baz[]=3&quot;).
       should.equal &quot;foo&quot; =&gt; &quot;bar&quot;, &quot;baz&quot; =&gt; [&quot;1&quot;, &quot;2&quot;, &quot;3&quot;]
-    Rack::Utils.parse_query(&quot;foo[]=bar&amp;baz[]=1&amp;baz[]=2&amp;baz[]=3&quot;).
+    Rack::Utils.parse_nested_query(&quot;foo[]=bar&amp;baz[]=1&amp;baz[]=2&amp;baz[]=3&quot;).
       should.equal &quot;foo&quot; =&gt; [&quot;bar&quot;], &quot;baz&quot; =&gt; [&quot;1&quot;, &quot;2&quot;, &quot;3&quot;]
 
-    Rack::Utils.parse_query(&quot;x[y][z]=1&quot;).
+    Rack::Utils.parse_nested_query(&quot;x[y][z]=1&quot;).
       should.equal &quot;x&quot; =&gt; {&quot;y&quot; =&gt; {&quot;z&quot; =&gt; &quot;1&quot;}}
-    Rack::Utils.parse_query(&quot;x[y][z][]=1&quot;).
+    Rack::Utils.parse_nested_query(&quot;x[y][z][]=1&quot;).
       should.equal &quot;x&quot; =&gt; {&quot;y&quot; =&gt; {&quot;z&quot; =&gt; [&quot;1&quot;]}}
-    Rack::Utils.parse_query(&quot;x[y][z]=1&amp;x[y][z]=2&quot;).
-      should.equal &quot;x&quot; =&gt; {&quot;y&quot; =&gt; {&quot;z&quot; =&gt; [&quot;1&quot;, &quot;2&quot;]}}
-    Rack::Utils.parse_query(&quot;x[y][z][]=1&amp;x[y][z][]=2&quot;).
+    Rack::Utils.parse_nested_query(&quot;x[y][z]=1&amp;x[y][z]=2&quot;).
+      should.equal &quot;x&quot; =&gt; {&quot;y&quot; =&gt; {&quot;z&quot; =&gt; &quot;2&quot;}}
+    Rack::Utils.parse_nested_query(&quot;x[y][z][]=1&amp;x[y][z][]=2&quot;).
       should.equal &quot;x&quot; =&gt; {&quot;y&quot; =&gt; {&quot;z&quot; =&gt; [&quot;1&quot;, &quot;2&quot;]}}
 
-    Rack::Utils.parse_query(&quot;x[y][][z]=1&quot;).
+    Rack::Utils.parse_nested_query(&quot;x[y][][z]=1&quot;).
       should.equal &quot;x&quot; =&gt; {&quot;y&quot; =&gt; [{&quot;z&quot; =&gt; &quot;1&quot;}]}
-    Rack::Utils.parse_query(&quot;x[y][][z][]=1&quot;).
+    Rack::Utils.parse_nested_query(&quot;x[y][][z][]=1&quot;).
       should.equal &quot;x&quot; =&gt; {&quot;y&quot; =&gt; [{&quot;z&quot; =&gt; [&quot;1&quot;]}]}
-    Rack::Utils.parse_query(&quot;x[y][][z]=1&amp;x[y][][w]=2&quot;).
+    Rack::Utils.parse_nested_query(&quot;x[y][][z]=1&amp;x[y][][w]=2&quot;).
       should.equal &quot;x&quot; =&gt; {&quot;y&quot; =&gt; [{&quot;z&quot; =&gt; &quot;1&quot;, &quot;w&quot; =&gt; &quot;2&quot;}]}
 
-    Rack::Utils.parse_query(&quot;x[y][][v][w]=1&quot;).
+    Rack::Utils.parse_nested_query(&quot;x[y][][v][w]=1&quot;).
       should.equal &quot;x&quot; =&gt; {&quot;y&quot; =&gt; [{&quot;v&quot; =&gt; {&quot;w&quot; =&gt; &quot;1&quot;}}]}
-    Rack::Utils.parse_query(&quot;x[y][][z]=1&amp;x[y][][v][w]=2&quot;).
+    Rack::Utils.parse_nested_query(&quot;x[y][][z]=1&amp;x[y][][v][w]=2&quot;).
       should.equal &quot;x&quot; =&gt; {&quot;y&quot; =&gt; [{&quot;z&quot; =&gt; &quot;1&quot;, &quot;v&quot; =&gt; {&quot;w&quot; =&gt; &quot;2&quot;}}]}
 
-    Rack::Utils.parse_query(&quot;x[y][][z]=1&amp;x[y][][z]=2&quot;).
+    Rack::Utils.parse_nested_query(&quot;x[y][][z]=1&amp;x[y][][z]=2&quot;).
       should.equal &quot;x&quot; =&gt; {&quot;y&quot; =&gt; [{&quot;z&quot; =&gt; &quot;1&quot;}, {&quot;z&quot; =&gt; &quot;2&quot;}]}
-    Rack::Utils.parse_query(&quot;x[y][][z]=1&amp;x[y][][w]=a&amp;x[y][][z]=2&amp;x[y][][w]=3&quot;).
+    Rack::Utils.parse_nested_query(&quot;x[y][][z]=1&amp;x[y][][w]=a&amp;x[y][][z]=2&amp;x[y][][w]=3&quot;).
       should.equal &quot;x&quot; =&gt; {&quot;y&quot; =&gt; [{&quot;z&quot; =&gt; &quot;1&quot;, &quot;w&quot; =&gt; &quot;a&quot;}, {&quot;z&quot; =&gt; &quot;2&quot;, &quot;w&quot; =&gt; &quot;3&quot;}]}
 
-    lambda { Rack::Utils.parse_query(&quot;foo[bar]=1&amp;foo[]=1&quot;) }.
+    lambda { Rack::Utils.parse_nested_query(&quot;foo[bar]=1&amp;foo[]=1&quot;) }.
       should.raise TypeError
   end
 </diff>
      <filename>test/spec_rack_utils.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>c9b4159e66860188c1abeebb90b1efc9d8fe53de</id>
    </parent>
  </parents>
  <author>
    <name>Joshua Peek</name>
    <email>josh@joshpeek.com</email>
  </author>
  <url>http://github.com/scytrin/rack/commit/5c00dd698edb953b4bee432fa12a20ba69a067c1</url>
  <id>5c00dd698edb953b4bee432fa12a20ba69a067c1</id>
  <committed-date>2009-02-14T16:10:38-08:00</committed-date>
  <authored-date>2009-02-14T16:10:38-08:00</authored-date>
  <message>Split parse_query utility into parse_query and parse_nested_query. parse_nested_query now chooses the last value instead of returning an array of all of them.</message>
  <tree>43b633d9d080493c5292ac071d801141100493a2</tree>
  <committer>
    <name>Joshua Peek</name>
    <email>josh@joshpeek.com</email>
  </committer>
</commit>
