You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by Rich Bowen <rb...@rcbowen.com> on 2003/08/11 20:16:33 UTC

apache 2.0.46 mastercard patch :) (fwd)

I was speaking with someone today on IRC who is experiencing a problem
with QUERY_STRING in Apache 2.0. If I correctly understand the
situation, QUERY_STRING getting sent as an empty string, rather than the
old behavior of just not setting it at all, is causing a strange
interaction with CGI.pm.

More explanation and a patch follows. I wondered if it might not be
better to just undef it, but I guess I'm not clear why this change was
made in the first place. Can someone elaborate on this for me?

Oh, and, ps, MasterCard loves Apache, and is ditching iPlanet in favor
of Apache. :-)

-- 
Rich Bowen - Rbowen@RCBowen.com
Apache Cookbook - http://www.oreilly.com/catalog/apacheckbk/

---------- Forwarded message ----------
Date: Mon, 11 Aug 2003 13:04:35 -0500
From: Sarah NameWithheldToProtectTheInnocent
To: rbowen@rcbowen.com
Subject: apache 2.0.46 mastercard patch :)

file: util_script.c
line: 370
old line: apr_table_setn(e, "QUERY_STRING", r->args ? r->args : "");
new line: apr_table_setn(e, "QUERY_STRING", r->args ? r->args : " ");

Instead of undefing the parameter and dealing with all the possible
consequences of that, we redefined it as a space which seemed to
eliminate the quirky interaction with CGI.pm.  And, again the quirky
behavior appears in the sample code below when the param bug is
defined.

bash-2.03$ diff util_script.c mc_util_script.c
370c370
<     apr_table_setn(e, "QUERY_STRING", r->args ? r->args : " ");
---
>     apr_table_setn(e, "QUERY_STRING", r->args ? r->args : "");


#! /sys_apps_01/webadmin/bin/perl -T
# apache bug fun

use CGI;
$cgi = new CGI;

print $cgi->header();
print "<b>Normal 1:</b><br>";
showData($cgi);

if ($cgi->param("bug")) {
   $cgi2 = new CGI();
   print "<br><b>Bug!!!</b><br>";
}

$cgi = new CGI;

print "<br><b>Normal 2:</b><br>";
showData($cgi);

print "<br><b>Done</b>";
exit;

sub showData {
   my($cgi) = @_;

   foreach ($cgi->param()) {
      print "   $_ = " . $cgi->param("$_") . "<br>";
   }
}