Seems somewhat similar to a bug I've reported 10 months ago.
You might want to try to run the minimal testcase enclosed in the
forwarded mail.
Phil.
--- Begin Message ---
I've found that mod_perl can get confused when dealing with method
calls during a redirect_internal phase:
1. page /1 uses method calls, and works when accessed as /1
2. an other page /R uses internal_redirect to go to /1, and mod_perl
fails with an undefined subroutine error.
This has been seen on:
apache 1.3.9-14, perl 5.004.05-1.1, and mod_perl 1.25-3 (Debian "potato")
and on:
apache 1.3.22-2.1, perl 5.6.1-6, and mod_perl 1.26-1 (Debian "woody"/testing)
How to reproduce:
Use this startup.pl file:
==
# Common
package Common;
use Apache::Constants qw(:common);
sub handler($$)
{
my $self = shift;
my $req = shift;
$req->content_type('text/plain');
$req->send_http_header();
$req->print($self->doit());
return OK;
}
sub doit
{
return "COMMON";
}
# Common::Impl1
package Common::Impl1;
@ISA=qw(Common);
sub doit
{
return "IMPL1\n";
}
# Common::Impl2;
package Common::Impl2;
@ISA=qw(Common);
sub doit
{
return "IMPL2\n";
}
# Redir
package Redir;
use Apache::Constants qw(:common);
sub handler
{
my $req = shift;
$req->internal_redirect("/1");
return OK;
}
1;
==
PerlRequire the above, and use the following apache configuration:
==
Order allow,deny
Allow from all
SetHandler perl-script
PerlHandler Common
Order allow,deny
Allow from all
SetHandler perl-script
PerlHandler Common::Impl1
Order allow,deny
Allow from all
SetHandler perl-script
PerlHandler Common::Impl2
Order allow,deny
Allow from all
SetHandler perl-script
PerlHandler Redir
PerlRequire startup.pl
==
Then, directing a web browser to /0 prints COMMON, to /1 prints IMPL1,
to /2 prints IMPL2, as expectected.
Similarly, when pointing to /R (which redirects internally to /1),
IMPL1 should appear.
However, I get a 500 Internal server error and this in the logs:
[error] Undefined subroutine &Common::Impl1::handler called at
startup.pl line 49.
I've tried to debug the problem, and the problem lies inside
perl_handler_ismethod() in src/modules/perl/mod_perl.c: it returns
different values when called from inside the internal_redirect than
called without internal_redirect.
Inside perl_handler_ismethod():
if(!sub) return 0;
sv = newSVpv(sub,0);
if(!(cv = sv_2cv(sv, &stash, &gv, FALSE))) {
GV *gvp = gv_fetchmethod(pclass, sub);
if (gvp) cv = GvCV(gvp);
sv_2cv() returns different values when called from inside an
internal_redirect than called without
internal_redirect. Unfortunately, I could not grok sv_2cv(). It's not
even documented in the perl docs.
Phil.
--- End Message ---