1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209
|
# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*-
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 Apache2::RequestRec ();
use Apache2::RequestIO ();
use Apache2::Filter ();
use ModPerl::Util ();
use APR::Table;
use Apache2::Const -compile => qw(OK DECLINED AUTH_REQUIRED SERVER_ERROR);
sub ok {
callback(shift);
return Apache2::Const::OK;
}
sub ok_authen {
my $r = shift;
callback($r);
$r->user("user");
$r->ap_auth_type("Basic");
return Apache2::Const::OK;
}
sub declined {
callback(shift);
return Apache2::Const::DECLINED;
}
sub auth_required {
callback(shift);
return Apache2::Const::AUTH_REQUIRED;
}
sub server_error {
callback(shift);
return Apache2::Const::SERVER_ERROR;
}
sub push_handlers {
my $r = shift;
$r->push_handlers(PerlFixupHandler => \&ok);
callback($r);
return Apache2::Const::OK;
}
sub callback {
my $obj = shift;
my ($r, $callback);
if ($obj->isa('Apache2::Filter')) {
$r = $obj->r;
$callback = 'PerlOutputFilterHandler';
}
else {
$r = $obj
}
$callback ||= ModPerl::Util::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
PerlMapToStorageHandler
PerlHeaderParserHandler
PerlAccessHandler
PerlAuthenHandler
PerlAuthzHandler
PerlTypeHandler
PerlFixupHandler
PerlResponseHandler)) {
my $count = $r->notes->get($callback) || 0;
$r->print("ran $count $callback handlers\n");
}
return Apache2::Const::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?
Apache2::Const::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?
Apache2::Const::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
# 1 run, 1 left behind
PerlMapToStorageHandler 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_authen
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 4 run
PerlFixupHandler TestHooks::stacked_handlers2::ok TestHooks::stacked_handlers2::ok
PerlFixupHandler TestHooks::stacked_handlers2::push_handlers
# 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>
|