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


Reply via email to