You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl@perl.apache.org by Arne Skjaerholt <ar...@broadpark.no> on 2005/08/07 07:16:50 UTC

[MP2] Problems with custom config directives

Hello all,
I'm running mod_perl-2.0.1 on apache-2.0.54 and OS X 10.4.
Trying to get a custom apache config directive to work I run into what
appears to be a rather odd problem. It looks like the subroutine
handling the directive is passed a different object from the one being
passed to SERVER_CREATE and when I call Apache2::Module::get_config().
The code being called is as follows (more or less stolen straight from
the perl.apache.org docs):

### BEGIN CODE ###
package ARS2;

use strict;
use warnings;

use Apache2::CmdParms qw//;
use Apache2::Const -compile => qw/RSRC_CONF TAKE1 OK/;
use Apache2::Module qw//;
use Apache2::ServerRec qw//;
use Apache2::ServerUtil qw//;

my @directives = (
        {
                name => "ARS2ConfigFile",
                #func => \&handle_directive, # For some reason hard
references fail to work
                errmsg => "ARS2ConfigFile /path/to/arsconfig.xml",
                req_override => Apache2::Const::RSRC_CONF,
                args_how => Apache2::Const::TAKE1,
        },
);

Apache2::Module::add ( __PACKAGE__, \@directives );

sub ARS2ConfigFile
{
        my ($self, $parms, $arg) = @_;
use Data::Dumper qw//;
my $dump = Data::Dumper::Dumper ( $self );
Apache2::ServerUtil->server ()->log ()->error ( "ARS2ConfigFile $arg
$self $parms $dump " );
        $self->{ "ARS2ConfigFile" } = $arg;
}

sub SERVER_CREATE
{
        my ($package, $parms) = @_;

        my $self = { ARS2ConfigFile =>
"/usr/local/etc/ars2/arsconfig.xml" };
Apache2::ServerUtil->server ()->log ()->error ( "SERVER_CREATE $self" );
        return bless $self => $package;
        #return bless { ARS2ConfigFile =>
"/usr/local/etc/ars2/arsconfig.xml" } => $package;
}

sub SERVER_MERGE
{
        my ($base, $add) = @_;
        my $val = $add->{ "ARS2ConfigFile" } ||
$base->{ "ARS2ConfigFile" };
Apache2::ServerUtil->server ()->log ()->error ( "SERVER_MERGE $base
$add" );
        return bless { ARS2ConfigFile => $val } => ref $base;
}

### END CODE ###

The code fetching the config value is stolen straight from the docs as
well:

### BEGIN CODE ###

my $config = Apache2::Module::get_config ( "ARS2",
Apache2::ServerUtil->server () );
my $file = $config->{ "ARS2ConfigFile" };
Apache2::ServerUtil->server ()->log ()->error ( "Bootstrap $config
'$file'" );

### END CODE ###

The code fetching the value of the config directive is being called from
a PerlPostConfigHandler, but the problem persists if the code is called
from a PerlResponseHandler.
Starting httpd -X gives the following output to console and error.log:
[Sun Aug 07 04:37:56 2005] [error] SERVER_CREATE HASH(0x116776c)
[Sun Aug 07 04:37:56 2005] [error]
ARS2ConfigFile /usr/local/apache2/modules/ars2-mp2/config/arsconfig.xml
ARS2=HASH(0x18adbc0) Apache2::CmdParms=SCALAR(0x1880424) $VAR1 =
bless( {}, 'ARS2' );\n
[Sun Aug 07 04:37:21 2005] [error] Bootstrap ARS2=HASH(0x116776c)
'/usr/local/etc/ars2/arsconfig.xml'
Configuration Failed

As you can see the boostrap method (attempting) to fetch the value is
being passed the same hashref that SERVER_CREATE blessed and returned
(HASH(0x116776c)), but the subroutine handling the directive is being
passed a different hashref, blessed into the appropriate class, that I
fail to find anywhere else in my code.

Does anyone see what I might be doing wrong here?

Thanks in advance,
Arne
:wq