I'm having a really strange (in my opinion) problem with Perl sections and
using the Apache::ReadConfig namespace explicitly (qualifying variables,
like %Apache::ReadConfig::Location). Here's what I'm doing: I have a small
library of routines; I'm using PerlRequire to load that library. In a Perl
section, I'm then calling a routine from that library that should alter
%Apache::ReadConfig::Location. When I dump out the ReadConfig namespace,
though (using PerlSections->dump), there's nothing in %Location.

*However*, and this is the weird part, this only happens if I don't have a
Perl section before the PerlRequire statement. This will be demonstrated
below.

I have a small test case. Here's the library, called 'foo.pl':

    package Foo;

    sub bar {
        $Apache::ReadConfig::Location{"/foo"} = {
            Options => 'ExecCGI',
        };
    }

    1;

Here's the relevant portion of my httpd.conf, where the PerlRequire is
before the first Perl section:

    PerlRequire conf/foo.pl

    <Perl>
    use Apache::PerlSections;
    Foo::bar();
    print STDERR Apache::PerlSections->dump;
    </Perl>

Here's the output of starting up the webserver with that configuration file
(I compiled with PERL_TRACE on):

    PerlRequire: arg=`conf/foo.pl'
    attempting to require `conf/foo.pl'
    loading perl module 'Apache'...ok
    loading perl module 'Apache::Constants::Exports'...ok
    loading perl module 'Tie::IxHash'...ok
    perl_section: </Files>
    perl_section: </Directory>
    perl_section: </Files>
    perl_section: </Directory>
    perl_section: </VirtualHost>
    perl_section: </Location>
    perl_section: </Location>
    loading perl module 'Apache'...ok
    loading perl module 'Tie::IxHash'...ok
    package Apache::ReadConfig;
    #scalars:

    #arrays:

    #hashes:

    1;
    __END__
    perl_section: </Files>
    perl_section: </Directory>
    perl_section: </Files>
    perl_section: </Directory>
    perl_section: </VirtualHost>
    perl_section: </Location>
    perl_section: </Location>

Nothing in the Apache::ReadConfig namespace, as you can see.

Now, here's the *working* webserver configuration, with a (blank) Perl
section coming before the PerlRequire:

    <Perl>
    </Perl>

    PerlRequire conf/foo.pl

    <Perl>
    use Apache::PerlSections;
    Foo::bar();
    print STDERR Apache::PerlSections->dump;
    </Perl>

And here's the output:

    loading perl module 'Apache'...ok
    loading perl module 'Apache::Constants::Exports'...ok
    loading perl module 'Tie::IxHash'...ok
    perl_section: </Files>
    perl_section: </Directory>
    perl_section: </Files>
    perl_section: </Directory>
    perl_section: </VirtualHost>
    perl_section: </Location>
    perl_section: </Location>
    PerlRequire: arg=`conf/foo.pl'
    attempting to require `conf/foo.pl'
    loading perl module 'Apache'...ok
    loading perl module 'Tie::IxHash'...ok
    package Apache::ReadConfig;
    #scalars:

    #arrays:

    #hashes:

    %Location = (
      '/foo' => {
        'Options' => 'ExecCGI'
      }
    );

    1;
    __END__
    perl_section: </Files>
    perl_section: </Directory>
    perl_section: </Files>
    perl_section: </Directory>
    perl_section: </VirtualHost>
    perl_section: </Location>
    perl_section: <Location /foo>
    Options ExecCGI (OK) Limit=no
    perl_section: </Location>

In other words, it works as expected when the blank Perl section is added
before the PerlRequire. So what seems to be happening--and I don't know the
internals side of this, so I'm just making guesses--is that the first Perl
section initializes the Apache::ReadConfig namespace, including the
%Location hash. Without this initialization, an explicit use of
%Apache::ReadConfig::Location seems to be... broken.

And that's as far as I can go with it. :)

So what I'd really like, if possible, is an explanation for this behavior;
adding the blank Perl section seems to provide a useable workaround, but I'd
like to know *why* this is happening.

Thanks all.

bye,
Benjamin Trott

Reply via email to