so I take it you're +1, save the below tweaks?
I haven't tested it, but looks ok, i can test it soonish, if you have a cleaned up version that would be better.
attached.
it passes all tests for me with 5.8.0/bleedperl and prefork. 5.8.0/worker is failing t/modperl/method.t with "not a CODE reference" when run as part of the test suite but not when run by itself. I'll look into it some more - I'm not sure if it's related or not, but I haven't tested worker in a while.
--Geoff
Index: lib/ModPerl/Code.pm
===================================================================
RCS file: /home/cvspublic/modperl-2.0/lib/ModPerl/Code.pm,v
retrieving revision 1.100
diff -u -r1.100 Code.pm
--- lib/ModPerl/Code.pm 20 May 2003 01:31:49 -0000 1.100
+++ lib/ModPerl/Code.pm 7 Aug 2003 19:34:31 -0000
@@ -37,27 +37,32 @@
Process => {
ret => 'void',
args => [{type => 'apr_pool_t', name => 'p'},
- {type => 'server_rec', name => 's'}],
+ {type => 'server_rec', name => 's'},
+ {type => 'dummy', name => 'VOID'}],
},
Files => {
ret => 'int',
args => [{type => 'apr_pool_t', name => 'pconf'},
{type => 'apr_pool_t', name => 'plog'},
{type => 'apr_pool_t', name => 'ptemp'},
- {type => 'server_rec', name => 's'}],
+ {type => 'server_rec', name => 's'},
+ {type => 'dummy', name => 'RUN_ALL'}],
},
PerSrv => {
ret => 'int',
- args => [{type => 'request_rec', name => 'r'}],
+ args => [{type => 'request_rec', name => 'r'},
+ {type => 'dummy', name => 'RUN_ALL'}],
},
Connection => {
ret => 'int',
- args => [{type => 'conn_rec', name => 'c'}],
+ args => [{type => 'conn_rec', name => 'c'},
+ {type => 'dummy', name => 'RUN_FIRST'}],
},
PreConnection => {
ret => 'int',
args => [{type => 'conn_rec', name => 'c'},
- {type => 'void', name => 'csd'}],
+ {type => 'void', name => 'csd'},
+ {type => 'dummy', name => 'RUN_ALL'}],
},
);
@@ -211,6 +216,12 @@
my($protostr, $pass) = canon_proto($prototype, $name);
my $ix = $self->{handler_index}->{$class}->[$i];
+ if ($callback =~ m/modperl_callback_per_(dir|srv)/) {
+ if ($ix =~ m/AUTH|TYPE|TRANS/) {
+ $pass =~ s/RUN_ALL/RUN_FIRST/;
+ }
+ }
+
print $h_fh "\n$protostr;\n";
print $c_fh <<EOF;
@@ -557,8 +568,12 @@
sub canon_args {
my $args = shift->{args};
- my @in = map { "$_->{type} *$_->{name}" } @$args;
my @pass = map { $_->{name} } @$args;
+ my @in;
+ foreach my $href (@$args) {
+ push @in, "$href->{type} *$href->{name}"
+ unless $href->{type} eq 'dummy';
+ }
return wantarray ? ([EMAIL PROTECTED], [EMAIL PROTECTED]) : [EMAIL PROTECTED];
}
Index: src/modules/perl/mod_perl.c
===================================================================
RCS file: /home/cvspublic/modperl-2.0/src/modules/perl/mod_perl.c,v
retrieving revision 1.175
diff -u -r1.175 mod_perl.c
--- src/modules/perl/mod_perl.c 6 Aug 2003 06:46:35 -0000 1.175
+++ src/modules/perl/mod_perl.c 7 Aug 2003 19:34:33 -0000
@@ -660,7 +660,7 @@
char *level = NULL;
server_rec *s = (server_rec *)data;
- modperl_callback_process(MP_CHILD_EXIT_HANDLER, server_pool, s);
+ modperl_callback_process(MP_CHILD_EXIT_HANDLER, server_pool, s, VOID);
if ((level = getenv("PERL_DESTRUCT_LEVEL"))) {
modperl_destruct_level = atoi(level);
@@ -849,7 +849,7 @@
modperl_response_init(r);
- retval = modperl_callback_per_dir(MP_RESPONSE_HANDLER, r);
+ retval = modperl_callback_per_dir(MP_RESPONSE_HANDLER, r, RUN_FIRST);
if ((retval == DECLINED) && r->content_type) {
r->handler = r->content_type; /* let http_core or whatever try */
Index: src/modules/perl/modperl_callback.c
===================================================================
RCS file: /home/cvspublic/modperl-2.0/src/modules/perl/modperl_callback.c,v
retrieving revision 1.54
diff -u -r1.54 modperl_callback.c
--- src/modules/perl/modperl_callback.c 17 Feb 2003 09:03:16 -0000 1.54
+++ src/modules/perl/modperl_callback.c 7 Aug 2003 19:34:33 -0000
@@ -81,7 +81,8 @@
request_rec *r, conn_rec *c, server_rec *s,
apr_pool_t *pconf,
apr_pool_t *plog,
- apr_pool_t *ptemp)
+ apr_pool_t *ptemp,
+ modperl_hook_run_mode_e run_mode)
{
#ifdef USE_ITHREADS
pTHX;
@@ -188,17 +189,61 @@
MP_TRACE_h(MP_FUNC, "%s returned %d\n", handlers[i]->name, status);
- if ((status != OK) && (status != DECLINED)) {
- status = modperl_errsv(aTHX_ status, r, s);
+ /* follow Apache's lead and let OK terminate the phase for
+ * RUN_FIRST handlers. RUN_ALL handlers keep going on OK.
+ * VOID handler ignore all errors.
+ */
+
+ if (run_mode == RUN_ALL) {
+ /* the normal case:
+ * OK and DECLINED continue
+ * errors end the phase
+ */
+ if ((status != OK) && (status != DECLINED)) {
+
+ status = modperl_errsv(aTHX_ status, r, s);
#ifdef MP_TRACE
- if (i+1 != nelts) {
- MP_TRACE_h(MP_FUNC, "there were %d uncalled handlers\n",
- nelts-i-1);
- }
+ if (i+1 != nelts) {
+ MP_TRACE_h(MP_FUNC, "error status %d leaves %d uncalled
handlers\n",
+ status, desc, nelts-i-1);
+ }
#endif
- break;
+ break;
+ }
}
+ else if (run_mode == RUN_FIRST) {
+ /* the exceptional case:
+ * OK and errors end the phase
+ * DECLINED continues
+ */
+ if (status == OK) {
+#ifdef MP_TRACE
+ if (i+1 != nelts) {
+ MP_TRACE_h(MP_FUNC, "OK ends the %s stack, leaving %d uncalled
handlers\n",
+ desc, nelts-i-1);
+ }
+#endif
+ break;
+ }
+ if (status != DECLINED) {
+ status = modperl_errsv(aTHX_ status, r, s);
+#ifdef MP_TRACE
+ if (i+1 != nelts) {
+ MP_TRACE_h(MP_FUNC, "error status %d leaves %d uncalled
handlers\n",
+ status, desc, nelts-i-1);
+ }
+#endif
+ break;
+ }
+ }
+ else {
+ /* the rare case.
+ * VOID handlers completely ignore the return status
+ * Apache should handle whatever mod_perl returns,
+ * so there is no need to mess with the status
+ */
+ }
}
SvREFCNT_dec((SV*)av_args);
@@ -213,46 +258,52 @@
return status;
}
-int modperl_callback_per_dir(int idx, request_rec *r)
+int modperl_callback_per_dir(int idx, request_rec *r,
+ modperl_hook_run_mode_e run_mode)
{
return modperl_callback_run_handlers(idx, MP_HANDLER_TYPE_PER_DIR,
r, NULL, r->server,
- NULL, NULL, NULL);
+ NULL, NULL, NULL, run_mode);
}
-int modperl_callback_per_srv(int idx, request_rec *r)
+int modperl_callback_per_srv(int idx, request_rec *r,
+ modperl_hook_run_mode_e run_mode)
{
return modperl_callback_run_handlers(idx, MP_HANDLER_TYPE_PER_SRV,
r, NULL, r->server,
- NULL, NULL, NULL);
+ NULL, NULL, NULL, run_mode);
}
-int modperl_callback_connection(int idx, conn_rec *c)
+int modperl_callback_connection(int idx, conn_rec *c,
+ modperl_hook_run_mode_e run_mode)
{
return modperl_callback_run_handlers(idx, MP_HANDLER_TYPE_CONNECTION,
NULL, c, c->base_server,
- NULL, NULL, NULL);
+ NULL, NULL, NULL, run_mode);
}
-int modperl_callback_pre_connection(int idx, conn_rec *c, void *csd)
+int modperl_callback_pre_connection(int idx, conn_rec *c, void *csd,
+ modperl_hook_run_mode_e run_mode)
{
return modperl_callback_run_handlers(idx, MP_HANDLER_TYPE_PRE_CONNECTION,
NULL, c, c->base_server,
- NULL, NULL, NULL);
+ NULL, NULL, NULL, run_mode);
}
-void modperl_callback_process(int idx, apr_pool_t *p, server_rec *s)
+void modperl_callback_process(int idx, apr_pool_t *p, server_rec *s,
+ modperl_hook_run_mode_e run_mode)
{
modperl_callback_run_handlers(idx, MP_HANDLER_TYPE_PROCESS,
NULL, NULL, s,
- p, NULL, NULL);
+ p, NULL, NULL, run_mode);
}
int modperl_callback_files(int idx,
apr_pool_t *pconf, apr_pool_t *plog,
- apr_pool_t *ptemp, server_rec *s)
+ apr_pool_t *ptemp, server_rec *s,
+ modperl_hook_run_mode_e run_mode)
{
return modperl_callback_run_handlers(idx, MP_HANDLER_TYPE_FILES,
NULL, NULL, s,
- pconf, plog, ptemp);
+ pconf, plog, ptemp, run_mode);
}
Index: src/modules/perl/modperl_callback.h
===================================================================
RCS file: /home/cvspublic/modperl-2.0/src/modules/perl/modperl_callback.h,v
retrieving revision 1.22
diff -u -r1.22 modperl_callback.h
--- src/modules/perl/modperl_callback.h 17 Feb 2003 09:03:16 -0000 1.22
+++ src/modules/perl/modperl_callback.h 7 Aug 2003 19:34:33 -0000
@@ -26,20 +26,27 @@
request_rec *r, conn_rec *c, server_rec *s,
apr_pool_t *pconf,
apr_pool_t *plog,
- apr_pool_t *ptemp);
+ apr_pool_t *ptemp,
+ modperl_hook_run_mode_e run_mode);
-int modperl_callback_per_dir(int idx, request_rec *r);
+int modperl_callback_per_dir(int idx, request_rec *r,
+ modperl_hook_run_mode_e run_mode);
-int modperl_callback_per_srv(int idx, request_rec *r);
+int modperl_callback_per_srv(int idx, request_rec *r,
+ modperl_hook_run_mode_e run_mode);
-int modperl_callback_connection(int idx, conn_rec *c);
+int modperl_callback_connection(int idx, conn_rec *c,
+ modperl_hook_run_mode_e run_mode);
-int modperl_callback_pre_connection(int idx, conn_rec *c, void *csd);
+int modperl_callback_pre_connection(int idx, conn_rec *c, void *csd,
+ modperl_hook_run_mode_e run_mode);
-void modperl_callback_process(int idx, apr_pool_t *p, server_rec *s);
+void modperl_callback_process(int idx, apr_pool_t *p, server_rec *s,
+ modperl_hook_run_mode_e run_mode);
int modperl_callback_files(int idx,
apr_pool_t *pconf, apr_pool_t *plog,
- apr_pool_t *ptemp, server_rec *s);
+ apr_pool_t *ptemp, server_rec *s,
+ modperl_hook_run_mode_e run_mode);
#endif /* MODPERL_CALLBACK_H */
Index: src/modules/perl/modperl_config.c
===================================================================
RCS file: /home/cvspublic/modperl-2.0/src/modules/perl/modperl_config.c,v
retrieving revision 1.63
diff -u -r1.63 modperl_config.c
--- src/modules/perl/modperl_config.c 20 May 2003 06:02:47 -0000 1.63
+++ src/modules/perl/modperl_config.c 7 Aug 2003 19:34:33 -0000
@@ -290,7 +290,7 @@
rcfg->pnotes = Nullhv;
}
- retval = modperl_callback_per_dir(MP_CLEANUP_HANDLER, r);
+ retval = modperl_callback_per_dir(MP_CLEANUP_HANDLER, r, RUN_ALL);
return retval;
}
Index: src/modules/perl/modperl_filter.c
===================================================================
RCS file: /home/cvspublic/modperl-2.0/src/modules/perl/modperl_filter.c,v
retrieving revision 1.64
diff -u -r1.64 modperl_filter.c
--- src/modules/perl/modperl_filter.c 13 May 2003 09:18:58 -0000 1.64
+++ src/modules/perl/modperl_filter.c 7 Aug 2003 19:34:34 -0000
@@ -341,6 +341,7 @@
modperl_filter_mg_set(aTHX_ AvARRAY(args)[0],
modperl_filter_new(f, NULL, mode, 0, 0, 0));
+ /* XXX filters are VOID handlers. should we ignore the status? */
if ((status = modperl_callback(aTHX_ handler, p, r, s, args)) != OK) {
status = modperl_errsv(aTHX_ status, r, s);
}
@@ -384,6 +385,7 @@
av_push(args, newSViv(filter->readbytes));
}
+ /* XXX filters are VOID handlers. should we ignore the status? */
if ((status = modperl_callback(aTHX_ handler, p, r, s, args)) != OK) {
status = modperl_errsv(aTHX_ status, r, s);
}
Index: src/modules/perl/modperl_types.h
===================================================================
RCS file: /home/cvspublic/modperl-2.0/src/modules/perl/modperl_types.h,v
retrieving revision 1.67
diff -u -r1.67 modperl_types.h
--- src/modules/perl/modperl_types.h 30 May 2003 12:55:14 -0000 1.67
+++ src/modules/perl/modperl_types.h 7 Aug 2003 19:34:37 -0000
@@ -248,4 +248,10 @@
const char *func_name;
} modperl_module_cmd_data_t;
+typedef enum {
+ RUN_ALL,
+ RUN_FIRST,
+ VOID
+} modperl_hook_run_mode_e;
+
#endif /* MODPERL_TYPES_H */
Index: src/modules/perl/modperl_util.h
===================================================================
RCS file: /home/cvspublic/modperl-2.0/src/modules/perl/modperl_util.h,v
retrieving revision 1.42
diff -u -r1.42 modperl_util.h
--- src/modules/perl/modperl_util.h 14 Mar 2003 05:50:31 -0000 1.42
+++ src/modules/perl/modperl_util.h 7 Aug 2003 19:34:37 -0000
@@ -64,7 +64,7 @@
}
/* turn off cgi header parsing. in case we are already inside
- * modperl_callback_per_dir(MP_RESPONSE_HANDLER, r);
+ * modperl_callback_per_dir(MP_RESPONSE_HANDLER, r, RUN_FIRST);
* but haven't sent any data yet, it's too late to change
* MpReqPARSE_HEADERS, so change the wbucket's private flag directly
*/
Index: t/hooks/TestHooks/init.pm
===================================================================
RCS file: /home/cvspublic/modperl-2.0/t/hooks/TestHooks/init.pm,v
retrieving revision 1.4
diff -u -r1.4 init.pm
--- t/hooks/TestHooks/init.pm 31 Mar 2003 01:50:52 -0000 1.4
+++ t/hooks/TestHooks/init.pm 7 Aug 2003 19:34:37 -0000
@@ -8,7 +8,7 @@
use APR::Table ();
use Apache::RequestRec ();
-use Apache::Const -compile => 'OK';
+use Apache::Const -compile => qw(OK DECLINED);
sub first {
my $r = shift;
@@ -35,7 +35,7 @@
$r->notes->set(ok3 => $ok + 1);
- Apache::OK;
+ Apache::DECLINED;
}
sub response {
Index: t/hooks/TestHooks/push_handlers.pm
===================================================================
RCS file: /home/cvspublic/modperl-2.0/t/hooks/TestHooks/push_handlers.pm,v
retrieving revision 1.5
diff -u -r1.5 push_handlers.pm
--- t/hooks/TestHooks/push_handlers.pm 18 Apr 2003 06:18:57 -0000 1.5
+++ t/hooks/TestHooks/push_handlers.pm 7 Aug 2003 19:34:37 -0000
@@ -39,7 +39,7 @@
}
sub end { return Apache::DONE }
-sub say { shift->print(shift,"\n"); return Apache::OK }
+sub say { shift->print(shift,"\n"); return Apache::DECLINED }
sub conf {
# this one is configured from httpd.conf
Index: t/hooks/TestHooks/stacked_handlers.pm
===================================================================
RCS file: /home/cvspublic/modperl-2.0/t/hooks/TestHooks/stacked_handlers.pm,v
retrieving revision 1.5
diff -u -r1.5 stacked_handlers.pm
--- t/hooks/TestHooks/stacked_handlers.pm 18 Apr 2003 06:18:57 -0000 1.5
+++ t/hooks/TestHooks/stacked_handlers.pm 7 Aug 2003 19:34:37 -0000
@@ -28,7 +28,7 @@
$r->content_type('text/plain');
$r->print("one\n");
- return Apache::OK;
+ return Apache::DECLINED;
}
sub two {
@@ -36,7 +36,7 @@
$r->print("two\n");
- return Apache::OK;
+ return Apache::DECLINED;
}
sub three {
Index: xs/tables/current/ModPerl/FunctionTable.pm
===================================================================
RCS file: /home/cvspublic/modperl-2.0/xs/tables/current/ModPerl/FunctionTable.pm,v
retrieving revision 1.117
diff -u -r1.117 FunctionTable.pm
--- xs/tables/current/ModPerl/FunctionTable.pm 7 Jul 2003 03:06:14 -0000 1.117
+++ xs/tables/current/ModPerl/FunctionTable.pm 7 Aug 2003 19:34:41 -0000
@@ -150,6 +150,10 @@
{
'type' => 'conn_rec *',
'name' => 'c'
+ },
+ {
+ 'type' => 'modperl_hook_run_mode_e',
+ 'name' => 'run_mode'
}
]
},
@@ -176,6 +180,10 @@
{
'type' => 'server_rec *',
'name' => 's'
+ },
+ {
+ 'type' => 'modperl_hook_run_mode_e',
+ 'name' => 'run_mode'
}
]
},
@@ -190,6 +198,10 @@
{
'type' => 'request_rec *',
'name' => 'r'
+ },
+ {
+ 'type' => 'modperl_hook_run_mode_e',
+ 'name' => 'run_mode'
}
]
},
@@ -204,6 +216,10 @@
{
'type' => 'request_rec *',
'name' => 'r'
+ },
+ {
+ 'type' => 'modperl_hook_run_mode_e',
+ 'name' => 'run_mode'
}
]
},
@@ -222,6 +238,10 @@
{
'type' => 'void *',
'name' => 'csd'
+ },
+ {
+ 'type' => 'modperl_hook_run_mode_e',
+ 'name' => 'run_mode'
}
]
},
@@ -240,6 +260,10 @@
{
'type' => 'server_rec *',
'name' => 's'
+ },
+ {
+ 'type' => 'modperl_hook_run_mode_e',
+ 'name' => 'run_mode'
}
]
},
@@ -278,6 +302,10 @@
{
'type' => 'apr_pool_t *',
'name' => 'ptemp'
+ },
+ {
+ 'type' => 'modperl_hook_run_mode_e',
+ 'name' => 'run_mode'
}
]
},--- /dev/null 2003-01-30 05:24:37.000000000 -0500 +++ t/hooks/stacked_handlers2.t 2003-08-07 15:07:38.000000000 -0400 @@ -0,0 +1,34 @@ +use strict; +use warnings FATAL => 'all'; + +use Apache::TestRequest; +use Apache::Test; +use Apache::TestUtil; + +my $module = "TestHooks::stacked_handlers2"; +Apache::TestRequest::module($module); + +my $config = Apache::Test::config(); +my $hostport = Apache::TestRequest::hostport($config); +my $path = Apache::TestRequest::module2path($module); + +my $location = "http://$hostport/$path"; + +t_debug("connecting to $location"); + +plan tests => 1; + +my $expected = q!ran 2 PerlPostReadRequestHandler handlers +ran 1 PerlTransHandler handlers +ran 4 PerlHeaderParserHandler handlers +ran 2 PerlAccessHandler handlers +ran 2 PerlAuthenHandler handlers +ran 2 PerlAuthzHandler handlers +ran 1 PerlTypeHandler handlers +ran 2 PerlFixupHandler handlers +ran 2 PerlResponseHandler handlers +ran 2 PerlOutputFilterHandler handlers!; + +chomp(my $received = GET_BODY_ASSERT $location); + +ok t_cmp($expected, $received, "stacked_handlers"); --- /dev/null 2003-01-30 05:24:37.000000000 -0500 +++ t/hooks/TestHooks/stacked_handlers2.pm 2003-08-07 15:07:23.000000000 -0400 @@ -0,0 +1,179 @@ +package TestHooks::stacked_handlers2; + +# this test exercises the execution of the stacked handlers +# connection, translation, authen, authz, type, and response +# phases should end for the first handler that returns OK + +use strict; +use warnings FATAL => 'all'; + +use Apache::RequestRec (); +use Apache::RequestIO (); +use Apache::Filter (); + +use APR::Table; + +use Apache::Const -compile => qw(OK DECLINED AUTH_REQUIRED SERVER_ERROR); + +sub ok { + + callback(shift); + + return Apache::OK +} + +sub declined { + + callback(shift); + + return Apache::DECLINED +} + +sub auth_required { + + callback(shift); + + return Apache::AUTH_REQUIRED +} + +sub server_error { + + callback(shift); + + return Apache::SERVER_ERROR +} + +sub callback { + + my $obj = shift; + + my ($r, $callback); + + if ($obj->isa('Apache::Filter')) { + $r = $obj->r; + $callback = 'PerlOutputFilterHandler'; + } + else { + $r = $obj + } + + $callback ||= Apache::current_callback; + + my $count = $r->notes->get($callback) || 0; + + $r->notes->set($callback, ++$count); +} + +sub handler { + + my $r = shift; + + $r->content_type('text/plain'); + + callback($r); + + foreach my $callback (qw(PerlPostReadRequestHandler + PerlTransHandler + PerlHeaderParserHandler + PerlAccessHandler + PerlAuthenHandler + PerlAuthzHandler + PerlTypeHandler + PerlFixupHandler + PerlResponseHandler)) { + + my $count = $r->notes->get($callback) || 0; + + $r->print("ran $count $callback handlers\n"); + } + + return Apache::OK; +} + +sub passthru { + my $filter = shift; + + unless ($filter->ctx) { + callback($filter); + $filter->ctx({seen => 1}); + } + + while ($filter->read(my $buffer, 1024)) { + $filter->print($buffer); + } + + # this should be ignored? + Apache::OK; +} + +sub filter { + my $filter = shift; + + unless ($filter->ctx) { + callback($filter); + $filter->ctx({seen => 1}); + } + + while ($filter->read(my $buffer, 1024)) { + $filter->print($buffer); + } + + if ($filter->seen_eos) { + my $count = $filter->r->notes->get('PerlOutputFilterHandler') || 0; + + $filter->print("ran $count PerlOutputFilterHandler handlers\n"); + } + + # this should be ignored? + Apache::OK; +} + +1; +__DATA__ +# create a new virtual host so we can test (almost all) all the hooks +<NoAutoConfig> +<VirtualHost TestHooks::stacked_handlers2> + + PerlModule TestHooks::stacked_handlers2 + + # all 2 run + PerlPostReadRequestHandler TestHooks::stacked_handlers2::ok TestHooks::stacked_handlers2::ok + + # 1 run, 1 left behind + PerlTransHandler TestHooks::stacked_handlers2::ok TestHooks::stacked_handlers2::server_error + + <Location /TestHooks__stacked_handlers2> + # all 4 run + PerlHeaderParserHandler TestHooks::stacked_handlers2::ok TestHooks::stacked_handlers2::declined + PerlHeaderParserHandler TestHooks::stacked_handlers2::declined TestHooks::stacked_handlers2::ok + + # all 2 run + PerlAccessHandler TestHooks::stacked_handlers2::ok TestHooks::stacked_handlers2::ok + + # 2 run, 1 left behind + PerlAuthenHandler TestHooks::stacked_handlers2::declined TestHooks::stacked_handlers2::ok + PerlAuthenHandler TestHooks::stacked_handlers2::auth_required + + # 2 run, 1 left behind + PerlAuthzHandler TestHooks::stacked_handlers2::declined TestHooks::stacked_handlers2::ok + PerlAuthzHandler TestHooks::stacked_handlers2::auth_required + + # 1 run, 1 left behind + PerlTypeHandler TestHooks::stacked_handlers2::ok TestHooks::stacked_handlers3::server_error + + # all 2 run + PerlFixupHandler TestHooks::stacked_handlers2::ok TestHooks::stacked_handlers2::ok + + # 2 run, 2 left behind + PerlResponseHandler TestHooks::stacked_handlers2::declined TestHooks::stacked_handlers2 + PerlResponseHandler TestHooks::stacked_handlers2::ok TestHooks::stacked_handlers2::server_error + + SetHandler modperl + AuthType Basic + Require valid-user + + PerlOutputFilterHandler TestHooks::stacked_handlers2::passthru TestHooks::stacked_handlers2::filter + </Location> + +</VirtualHost> +</NoAutoConfig>
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
