Hello,
I have two scripts, call them A and B. Here's what I'm doing (paraphrased
heavily to save posting a huge pile of code):
In data.html, I have:
<!--#include virtual="A?action=show" -->
In A, I have:
$q = new CGI;
show() if $q->param('action') eq 'show';
sub show
{
Apache::Include->virtual("B?action=remove");
}
In B, I have:
$q = new CGI;
show() if $q->param('action') eq 'show';
remove() if $q->param('action') eq 'remove';
sub show
{
print "B::show()\n";
}
sub remove
{
print "B::remove()\n";
}
Inveriably, I end up with "B::show()" in my output, not at all what I wanted,
expected or hoped for.
What I see happening is that Apache::Registry is loading CGI.pm into the httpd
child the first time it encounters a script that uses it. This runs a number
of functions within CGI.pm which set up variables, etc. The call to new() in A
then reads the query (GET or POST, doesn't matter) into @QUERY_PARAM.
When B is invoked, within the same child, Apache::Registry DOES NOT reload
CGI.pm and therefore does not initialize any of the variables, etc. This
results in the new() call in B REUSING (!) the @QUERY_PARAM which was built up
during the new() call in A! OOOPS!
In order to make it work, I had to dig thru CGI.pm and found a function that's
in there with comments about mod_perl around it, specifically:
CGI::initialize_globals();
If I add this call in before both of the new() invocations, I get the desired,
expected results.
I'm not sure who to pin this on, mod_perl, Apache::Registry or CGI but it would
seem to me that this qualifies as a bug, somewhere.
Michael