titetluc titetluc wrote:
Hello,I am writing a new mod_perl Apache (mod_perl2) to manage session tracking and SSO This module defines a new Apache directive (MyNewDirective), which is usable in a <location>, <files><directory> block.For example <Location /a_test> Set-Handler perl-script MyNewDirective a_test arg1 arg2 PerlResponseHandler ResponseHandlerToTestTheNewDirective </Location> <Location /another_test> Set-Handler perl-script PerlResponseHandler ResponseHandlerToTestTheNewDirective </Location>When this directive is used, my module should a PerlLogHandler automatically to obtain the following configuration<Location /a_test> Set-Handler perl-script MyNewDirective a_test arg1 arg2 PerlResponseHandler ResponseHandlerToTestTheNewDirective PerlLogHandler TestPerlLogHandler </Location> <Location /another_test> Set-Handler perl-script PerlResponseHandler ResponseHandlerToTestTheNewDirective </Location> I tried to use the push_handler method when the 'MyNewDirective' is defined.my @directives = ({name => 'MyNewDirective ', func => __PACKAGE__.'::MyNewDirective'});Apache2::Module::add(__PACKAGE__, [EMAIL PROTECTED]); sub MyNewDirective { my ($self, $parms, $arg) = @_; # blablabla$parms->server->push_handlers(PerlLogHandler => sub {my ($r) _ @_; $r->server->error_log('hello world'); return Apache2::Const::OK;});
Right here, you are adding your handler to the current *server* configuration object, effectively enabling this handler for eery requests to that server/vhost
# blablabla
return;
}
This code works ... but for any blocks.
For example, if I access the URI '/a_test', the PerlLogHandler will be
called BUT if I access the URI '/another_test', the PerlLogHandler will
also be called.
See above.
Do I use the mod_perl API correctly ?
Correctly, yes. Unfortunately, it's not what you are trying to do.
What is wrong in my code ?
If you want to push your loghandler only for requests for your configured
module, I would just delay the loghandler registration until runtime and
do it in your content handler with
$r->push_handlerrs(...)
Or you can do it in your command handler, but like so
sub MyLogHandler {
[...]
}
sub MyNewDirective {
my ($self, $param, $arg) = @_;
$parms->add_config(["PerlLogHandler MyLogHandler"]);
[...]
--
Philippe M. Chiasson GPG: F9BFE0C2480E7680 1AE53631CB32A107 88C3A5A5
http://gozer.ectoplasm.org/ m/gozer\@(apache|cpan|ectoplasm)\.org/
signature.asc
Description: OpenPGP digital signature
