<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -4,7 +4,7 @@ SHELL = /bin/sh
 #### Start of system configuration section. ####
 
 srcdir = .
-topdir = /usr/lib/ruby/1.8/x86_64-linux
+topdir = /usr/lib/ruby/1.8/i486-linux
 hdrdir = $(topdir)
 VPATH = $(srcdir):$(topdir):$(hdrdir)
 prefix = $(DESTDIR)/usr
@@ -45,15 +45,15 @@ CFLAGS   =  -fPIC -fno-strict-aliasing -g -g -O2  -fPIC
 INCFLAGS = -I. -I$(topdir) -I$(hdrdir) -I$(srcdir)
 CPPFLAGS =  
 CXXFLAGS = $(CFLAGS) 
-DLDFLAGS = -L. -Wl,-Bsymbolic-functions -rdynamic -Wl,-export-dynamic  
+DLDFLAGS = -L.  -rdynamic -Wl,-export-dynamic  
 LDSHARED = $(CC) -shared
 AR = ar
 EXEEXT = 
 
 RUBY_INSTALL_NAME = ruby1.8
 RUBY_SO_NAME = ruby1.8
-arch = x86_64-linux
-sitearch = x86_64-linux
+arch = i486-linux
+sitearch = i486-linux
 ruby_version = 1.8
 ruby = /usr/bin/ruby1.8
 RUBY = $(ruby)</diff>
      <filename>ext/cgiext/Makefile</filename>
    </modified>
    <modified>
      <diff>@@ -19,6 +19,7 @@ static ID _id_to_s;
 #define LEN(start, end)  ((size_t)(end-start))/sizeof(char)
 
 VALUE cgiext_parse_query_string(VALUE self, VALUE string);
+VALUE cgiext_rails_parse_query_string(VALUE self, VALUE string);
 static VALUE next_token(char *s, char *p);
 
 
@@ -462,7 +463,11 @@ VALUE cgiext_parse_query_string(VALUE self, VALUE string) {
     return params;
 }
 
-VALUE cgiext_rails_parse_query_string(VALUE self, VALUE string) {
+
+//since rails uses its own query string parser, which works slightly differently than ruby's, I adapted the function so that we can also override rails' cgi parser
+//if there are more than one keys with the same name, only the first one is used - in ruby's cgi, the key would point to an array of the multiple values assigned
+VALUE cgiext_rails_parse_query_string(VALUE self, VALUE string) 
+{
     //make sure we are dealing with a string
     Check_Type(string, T_STRING);
     
@@ -511,6 +516,8 @@ VALUE cgiext_rails_parse_query_string(VALUE self, VALUE string) {
             // set parameter
             VALUE list = rb_hash_aref(params, key);              // list = params[key]
 
+
+            //this is the main difference with Ruby's CGI, instead of putting the value into an array, just put the value directly in
             if (list == Qnil)
                 rb_hash_aset(params, key, val);  // params[key] = [val]
 
@@ -528,8 +535,8 @@ VALUE cgiext_rails_parse_query_string(VALUE self, VALUE string) {
     
     VALUE empty_arr = rb_funcall(rb_ary_new(), _id_freeze, 0);
     rb_funcall(params, _id_setdefault, 1, empty_arr);    // params.default = [].freeze
-    printf (&quot;\n******************\n%s\n&quot;, string);
-    printf (&quot;\n******************\nHello World!\n&quot;);
+//    printf (&quot;\n******************\n%s\n&quot;, string);
+//    printf (&quot;\n******************\nHello World!\n&quot;);
     return params;
 }
 
@@ -556,6 +563,8 @@ static VALUE _get_module(char *modname, char *submodname) {
 
 static VALUE cgiext_replace_functions(VALUE self) {
     VALUE module;
+    
+    //replace the Ruby CGI functions
     if ((module = _get_module(&quot;CGI&quot;, NULL)) != Qnil) 
     {
         rb_define_module_function(module, &quot;parse&quot;,        cgiext_parse_query_string, 1);
@@ -565,7 +574,7 @@ static VALUE cgiext_replace_functions(VALUE self) {
         rb_define_module_function(module, &quot;unescape&quot;,     cgiext_unescape_url, 1);
     }
     
-    //for rails
+    //for rails, override the parse_query_parameters function in request.rb (ActionController)
     if ((module = _get_module(&quot;ActionController&quot;, &quot;AbstractRequest&quot;)) != Qnil)
     {
       rb_define_module_function(module, &quot;parse_query_parameters&quot;, cgiext_rails_parse_query_string, 1);      
@@ -588,5 +597,8 @@ void Init_cgiext(void) {
     rb_define_module_function(cCGIExt, &quot;escape_url&quot;, cgiext_escape_url, 1);
     rb_define_module_function(cCGIExt, &quot;unescape_url&quot;, cgiext_unescape_url, 1);
     rb_define_singleton_method(cCGIExt, &quot;replace_functions&quot;, cgiext_replace_functions, 0);
+    
+    rb_define_module_function(cCGIExt, &quot;rparse_query_string&quot;, cgiext_rails_parse_query_string, 1);    
+
     cgiext_replace_functions(cCGIExt);
 }</diff>
      <filename>ext/cgiext/cgiext.c</filename>
    </modified>
    <modified>
      <diff>@@ -2,7 +2,7 @@ module Cgiext
   module VERSION #:nodoc:
     MAJOR = 0
     MINOR = 0
-    TINY  = 1
+    TINY  = 2
 
     STRING = [MAJOR, MINOR, TINY].join('.')
   end</diff>
      <filename>lib/cgiext/version.rb</filename>
    </modified>
    <modified>
      <diff>@@ -203,4 +203,48 @@ class CGIExtTest &lt; Test::Unit::TestCase
   end
 
 
+  def test_rparse_query_string
+    actual = nil
+    ## equal with CGI.parse()
+    [
+      ## '&amp;' separator
+      ['a=10&amp;b=20&amp;key1=val1',  {'a'=&gt;'10', 'b'=&gt;'20', 'key1'=&gt;'val1'} ],
+      ## ';' separator
+      ['a=10;b=20;key1=val1',  {'a'=&gt;'10', 'b'=&gt;'20', 'key1'=&gt;'val1'} ],
+      ## same keys
+      ['a=1&amp;a=2&amp;a=3',          {'a'=&gt;'1'} ],
+      ## no value
+      ['key=&amp;key=', {'key'=&gt;''} ],
+      ## unescape ascii string
+      ['k%5B%5D=%5B%5D%26%3B', {'k[]'=&gt;'[]&amp;;'} ],
+      ## unescape unicode string
+      [&quot;%A4%A2%a4%a4=%A4%a6%A4%A8%A4%Aa&quot;, {&quot;\244\242\244\244&quot;=&gt;&quot;\244\246\244\250\244\252&quot;} ],
+      ## invalid '%' format
+      ['k%XX%5=%%%', {'k%XX%5'=&gt;'%%%'} ],
+    ].each do |input, expected|
+      actual = CGIExt.rparse_query_string(input)
+      assert_equal(expected, actual)
+      #assert_equal(CGI.parse(input), actual)
+    end
+    ## different with CGI.parse()
+    [
+      ## without '=' (CGI: {&quot;a&quot;=&gt;nil, &quot;b&quot;=&gt;nil})
+      ['a&amp;b',     {'a'=&gt;'', 'b'=&gt;''}     ],
+      ## invalid format  (CGI: {&quot;a&quot;=&gt;[&quot;&quot;], &quot;b&quot;=&gt;[nil]})
+      ['a=&amp;b&amp;&amp;',  {'a'=&gt;'', 'b'=&gt;'', ''=&gt;''}  ],
+    ].each do |input, expected|
+      actual = CGIExt.rparse_query_string(input)
+      assert_equal(expected, actual)
+      #assert_equal(CGI.parse(input), actual)
+    end
+    ## default value is frozen empty array
+    assert_equal(actual['unknownkey'], [])
+    assert_raise(TypeError) do
+      actual['unknownkey'] &lt;&lt; 'foo'
+    end
+  end
+  
+  
+
+  
 end</diff>
      <filename>test/test_cgiext_extn.rb</filename>
    </modified>
  </modified>
  <removed type="array">
    <removed>
      <filename>pkg/cgiext-0.0.1.gem</filename>
    </removed>
    <removed>
      <filename>test/test_cgiext_extn.rb~</filename>
    </removed>
  </removed>
  <parents type="array">
    <parent>
      <id>505ce5e47cfd27357fbce7257123b803566ffaad</id>
    </parent>
  </parents>
  <author>
    <name>Ralph Edge</name>
    <email>rledge21@gmail.com</email>
  </author>
  <url>http://github.com/balgarath/cgi-ext/commit/d0b50dc5c2dc86267057689f72cef09a021f2e8f</url>
  <id>d0b50dc5c2dc86267057689f72cef09a021f2e8f</id>
  <committed-date>2008-08-09T14:49:53-07:00</committed-date>
  <authored-date>2008-08-09T14:49:53-07:00</authored-date>
  <message>tests for rails query string parser.  some refactoring.</message>
  <tree>b5cdf1906db390babe54e088b5c74df8d70f90a1</tree>
  <committer>
    <name>Ralph Edge</name>
    <email>rledge21@gmail.com</email>
  </committer>
</commit>
