blob: 61dc525c636574b01dc4b4d54e6d46d32116958d [file] [log] [blame]
#!perl
unless (defined $ENV{MOD_PERL}) {
die "\$ENV{MOD_PERL} not set!";
}
BEGIN {
use lib map { "$Apache::Server::CWD/$_" } qw(t/docs blib/lib blib/arch);
require "blib.pl" if -e "./t/docs/blib.pl";
#Perl ignores w/ -T
if ($ENV{PERL5LIB} and $ENV{PASS_PERL5LIB}) {
unshift @INC, map { Apache->untaint($_) } split ":", $ENV{PERL5LIB};
}
$Apache::Server::Starting or warn "Server is not starting !?\n";
\$Apache::Server::Starting == \$Apache::ServerStarting or
warn "GV alias broken\n";
\$Apache::Server::ReStarting == \$Apache::ServerReStarting or
warn "GV alias broken\n";
}
if ($] >= 5.005 and -e "t/docs/local.pl") {
eval {
require "local.pl";
}; $@='' if $@;
}
use Socket (); #test DynaLoader vs. XSLoader workaroud
use Apache ();
use Apache::Registry ();
unless ($INC{'Apache.pm'} =~ /blib/) {
die "Wrong Apache.pm loaded: $INC{'Apache.pm'}";
}
my $version = defined $^V ? sprintf("v%vd", $^V) : $];
Apache::add_version_component("Perl/$version");
# BSD/OS 3.1 gets confused with some dynamically loaded code inside evals,
# so make sure IO::File is loaded here, rather than later within an eval.
# this should not harm any other platforms, since IO::File will be used
# by them anyhow.
use IO::File ();
Apache::Constants->export(qw(HTTP_MULTIPLE_CHOICES));
eval {
require Apache::PerlRunXS;
}; $@ = '' if $@;
{
last;
Apache::warn("use Apache 'warn' is ok\n");
my $s = Apache->server;
my($host,$port) = map { $s->$_() } qw(server_hostname port);
$s->log_error("starting server $host on port $port");
my $admin = $s->server_admin;
$s->warn("report any problems to server_admin $admin");
}
#use HTTP::Status ();
#use Apache::Symbol ();
#Apache::Symbol->make_universal;
$Apache::DoInternalRedirect = 1;
$Apache::ERRSV_CAN_BE_HTTP = 1;
#$Apache::Server::AddPerlVersion = 1;
#warn "ServerStarting=$Apache::ServerStarting\n";
#warn "ServerReStarting=$Apache::ServerReStarting\n";
#use Apache::Debug level => 4;
use mod_perl 1.03_01;
if(defined &main::subversion) {
die "mod_perl.pm is broken\n";
}
if($ENV{PERL_TEST_NEW_READ}) {
*Apache::READ = \&Apache::new_read;
}
unless($ENV{KeyForPerlSetEnv} and
$ENV{KeyForPerlSetEnv} eq "OK") {
warn "PerlSetEnv is broken\n";
}
%net::callback_hooks = ();
require "net/config.pl";
if($net::callback_hooks{PERL_SAFE_STARTUP}) {
eval "open \$0";
unless ($@ =~ /open trapped by operation mask/) {
die "opmask not set";
}
}
else {
require "docs/rl.pl";
}
#for testing perl mod_include's
$Access::Cnt = 0;
sub main::pid { print $$ }
sub main::access { print ++$Access::Cnt }
$ENV{GATEWAY_INTERFACE} =~ /^CGI-Perl/ or die "GATEWAY_INTERFACE not set!";
sub Outside::code {4}
%Outside::hash = (one => 1);
@Outside::array = qw(one);
$Outside::scalar = 'one';
#will be redef'd during tests
sub PerlTransHandler::handler {-1}
#for testing PERL_HANDLER_METHODS
#see httpd.conf and t/docs/LoadClass.pm
require "docs/LoadClass.pm";
sub MyClass::method ($$) {
my($class, $r) = @_;
#warn "$class->method called\n";
0;
}
sub BaseClass::handler ($$) {
my($class, $r) = @_;
#warn "$class->handler called\n";
0;
}
{
package BaseClass;
#so 5.005-tobe doesn't complain:
#No such package "BaseClass" in @ISA assignment at ...
}
$MyClass::Object = bless {}, "MyClass";
@MyClass::ISA = qw(BaseClass);
#testing child init/exit hooks
sub My::child_init {
my $r = shift;
eval {
my $s = $r->server;
my $sa = $s->server_admin;
$s->warn("[notice] child_init for process $$, report any problems to $sa\n");
}; $@='' if $@;
0;
}
sub My::child_exit {
warn "[notice] child process $$ terminating\n";
}
sub My::restart {
my $r = shift;
my $s = $r->server;
my $sa = $s->server_admin;
push @HTTP::Status::ISA, "Apache::Symbol";
HTTP::Status->undef_functions;
}
sub Apache::AuthenTest::handler {
use Apache::Constants ':common';
my $r = shift;
$r->custom_response(AUTH_REQUIRED, "/error.txt");
my($res, $sent_pwd) = $r->get_basic_auth_pw;
return $res if $res; #decline if not Basic
my $user = lc $r->user;
$r->notes("DoAuthenTest", 1);
unless($user eq "dougm" and $sent_pwd eq "mod_perl") {
$r->note_basic_auth_failure;
return AUTH_REQUIRED;
}
return OK;
}
use Apache::Constants qw(DECLINED DIR_MAGIC_TYPE);
sub My::DirIndex::handler {
my $r = shift;
return DECLINED unless $r->content_type and
$r->content_type eq DIR_MAGIC_TYPE;
require DirHandle;
my $dh = DirHandle->new($r->filename) or die $!;
my @entries = $dh->read;
my $x = @entries;
$r->send_http_header('text/plain');
print "1..$x\n";
my $i = 1;
for my $e (@entries) {
print "ok $i #($e)\n";
++$i;
}
1;
}
sub My::ProxyTest::handler {
my $r = shift;
unless ($r->proxyreq and $r->uri =~ /proxytest/) {
#warn sprintf "ProxyTest: proxyreq=%d, uri=%s\n",
$r->proxyreq, $r->uri;
}
return -1 unless $r->proxyreq;
return -1 unless $r->uri =~ /proxytest/;
$r->handler("perl-script");
$r->push_handlers(PerlHandler => sub {
my $r = shift;
$r->send_http_header("text/plain");
$r->print("1..1\n");
$r->print("ok 1\n");
$r->print("URI=`", $r->uri, "'\n");
});
return 0;
}
if(Apache->can_stack_handlers) {
Apache->push_handlers(PerlChildExitHandler => sub {
warn "[notice] push'd PerlChildExitHandler called, pid=$$\n";
});
}
END {
warn "[notice] END block called for startup.pl\n";
}
package Apache::Death;
my $say_ok = <<EOF;
*** The following [error] is expected, no cause for alarm ***
EOF
sub handler {
my $r = shift;
my $args = $r->args || "";
if ($args =~ /die/) {
warn $say_ok;
delete $INC{"badsyntax.pl"};
require "badsyntax.pl"; # contains syntax error
}
if($args =~ /croak/) {
warn $say_ok;
Carp::croak("Apache::Death");
}
$r->content_type('text/html');
$r->send_http_header();
print "<h1>Script completed</h1>\n";
return 0;
}
package Destruction;
sub new { bless {} }
sub DESTROY {
warn "[notice] Destruction->DESTROY called for \$global_object\n"
}
#prior to 1.3b1 (and the child_exit hook), this object's DESTROY method would not be invoked
$global_object = Destruction->new;
1;