240 lines
6.2 KiB
Perl
240 lines
6.2 KiB
Perl
use strict;
|
|
use warnings FATAL => 'all';
|
|
|
|
use Apache::Test;
|
|
use Apache::TestRequest;
|
|
use Apache::TestUtil;
|
|
use Apache::TestConfig ();
|
|
|
|
use constant WINFU => Apache::TestConfig::WINFU();
|
|
|
|
##
|
|
## mod_alias test
|
|
##
|
|
|
|
## redirect codes for Redirect testing ##
|
|
my %redirect = (
|
|
perm => '301',
|
|
perm2 => '301',
|
|
temp => '302',
|
|
temp2 => '302',
|
|
seeother => '303',
|
|
gone => '410',
|
|
forbid => '403'
|
|
);
|
|
|
|
## RedirectMatch testing ##
|
|
my %rm_body = (
|
|
p => '301',
|
|
t => '302'
|
|
);
|
|
|
|
my %rm_rc = (
|
|
s => '303',
|
|
g => '410',
|
|
f => '403'
|
|
);
|
|
|
|
|
|
my %relative_redirects = (
|
|
"/redirect_relative/default" => "^http", # URL should be absolute
|
|
"/redirect_relative/on" => "^/out-on", # URL should be relative
|
|
"/redirect_relative/off" => "^http", # URL should be absolute
|
|
"/redirect_relative/off/fail" => undef, # 500 due to invalid URL
|
|
);
|
|
|
|
#XXX: find something that'll on other platforms (/bin/sh aint it)
|
|
my $script_tests = WINFU ? 0 : 4 + have_min_apache_version("2.4.19");
|
|
|
|
my $tests = 12 + have_min_apache_version("2.4.19") * 10 +
|
|
(keys %redirect) +
|
|
(keys %rm_body) * (1 + have_min_apache_version("2.4.19")) * 10 +
|
|
(keys %rm_rc) * (1 + have_min_apache_version("2.4.19")) * 10 +
|
|
$script_tests;
|
|
|
|
if (have_min_apache_version("2.5.1")) {
|
|
$tests += (keys %relative_redirects)*2;
|
|
}
|
|
|
|
#LWP required to follow redirects
|
|
plan tests => $tests, need need_module('alias'), need_lwp;
|
|
|
|
## simple alias ##
|
|
t_debug "verifying simple aliases";
|
|
ok t_cmp((GET_RC "/alias/"),
|
|
200,
|
|
"/alias/");
|
|
## alias to a non-existant area ##
|
|
ok t_cmp((GET_RC "/bogu/"),
|
|
404,
|
|
"/bogu/");
|
|
|
|
|
|
t_debug "verifying alias match with /ali[0-9].";
|
|
for (my $i=0 ; $i <= 9 ; $i++) {
|
|
ok t_cmp((GET_BODY "/ali$i"),
|
|
$i,
|
|
"/ali$i");
|
|
}
|
|
|
|
if (have_min_apache_version("2.4.19")) {
|
|
t_debug "verifying expression alias match with /expr/ali[0-9].";
|
|
for (my $i=0 ; $i <= 9 ; $i++) {
|
|
ok t_cmp((GET_BODY "/expr/ali$i"),
|
|
$i,
|
|
"/ali$i");
|
|
}
|
|
}
|
|
|
|
my ($actual, $expected);
|
|
foreach (sort keys %redirect) {
|
|
## make LWP not follow the redirect since we
|
|
## are just interested in the return code.
|
|
local $Apache::TestRequest::RedirectOK = 0;
|
|
|
|
$expected = $redirect{$_};
|
|
$actual = GET_RC "/$_";
|
|
ok t_cmp($actual,
|
|
$expected,
|
|
"/$_");
|
|
}
|
|
|
|
print "verifying body of perm and temp redirect match\n";
|
|
foreach (sort keys %rm_body) {
|
|
for (my $i=0 ; $i <= 9 ; $i++) {
|
|
$expected = $i;
|
|
$actual = GET_BODY "/$_$i";
|
|
ok t_cmp($actual,
|
|
$expected,
|
|
"/$_$i");
|
|
}
|
|
}
|
|
|
|
if (have_min_apache_version("2.4.19")) {
|
|
print "verifying body of perm and temp redirect match with expression support\n";
|
|
foreach (sort keys %rm_body) {
|
|
for (my $i=0 ; $i <= 9 ; $i++) {
|
|
$expected = $i;
|
|
$actual = GET_BODY "/expr/$_$i";
|
|
ok t_cmp($actual,
|
|
$expected,
|
|
"/$_$i");
|
|
}
|
|
}
|
|
}
|
|
|
|
print "verifying return code of seeother and gone redirect match\n";
|
|
foreach (keys %rm_rc) {
|
|
## make LWP not follow the redirect since we
|
|
## are just interested in the return code.
|
|
local $Apache::TestRequest::RedirectOK = 0;
|
|
|
|
$expected = $rm_rc{$_};
|
|
for (my $i=0 ; $i <= 9 ; $i++) {
|
|
$actual = GET_RC "$_$i";
|
|
ok t_cmp($actual,
|
|
$expected,
|
|
"$_$i");
|
|
}
|
|
}
|
|
|
|
if (have_min_apache_version("2.4.19")) {
|
|
print "verifying return code of seeother and gone redirect match with expression support\n";
|
|
foreach (keys %rm_rc) {
|
|
## make LWP not follow the redirect since we
|
|
## are just interested in the return code.
|
|
local $Apache::TestRequest::RedirectOK = 0;
|
|
|
|
$expected = $rm_rc{$_};
|
|
for (my $i=0 ; $i <= 9 ; $i++) {
|
|
$actual = GET_RC "/expr/$_$i";
|
|
ok t_cmp($actual,
|
|
$expected,
|
|
"$_$i");
|
|
}
|
|
}
|
|
}
|
|
|
|
## create a little cgi to test ScriptAlias and ScriptAliasMatch ##
|
|
my $string = "this is a shell script cgi.";
|
|
my $cgi =<<EOF;
|
|
#!/bin/sh
|
|
echo Content-type: text/plain
|
|
echo
|
|
echo $string
|
|
EOF
|
|
|
|
my $vars = Apache::Test::vars();
|
|
my $script = "$vars->{t_dir}/htdocs/modules/alias/script";
|
|
|
|
t_write_file($script,$cgi);
|
|
chmod 0755, $script;
|
|
|
|
## if we get the script here it will be plain text ##
|
|
t_debug "verifying /modules/alias/script is plain text";
|
|
ok t_cmp((GET_BODY "/modules/alias/script"),
|
|
$cgi,
|
|
"/modules/alias/script") unless WINFU;
|
|
|
|
if (have_cgi) {
|
|
## here it should be the result of the executed cgi ##
|
|
t_debug "verifying same file accessed at /cgi/script is executed code";
|
|
ok t_cmp((GET_BODY "/cgi/script"),
|
|
"$string\n",
|
|
"/cgi/script") unless WINFU;
|
|
}
|
|
else {
|
|
skip "skipping test without CGI module";
|
|
}
|
|
|
|
if (have_cgi) {
|
|
## with ScriptAliasMatch ##
|
|
t_debug "verifying ScriptAliasMatch with /aliascgi-script";
|
|
ok t_cmp((GET_BODY "/aliascgi-script"),
|
|
"$string\n",
|
|
"/aliascgi-script") unless WINFU;
|
|
}
|
|
else {
|
|
skip "skipping test without CGI module";
|
|
}
|
|
|
|
if (have_min_apache_version("2.4.19")) {
|
|
if (have_cgi) {
|
|
## with ScriptAlias in LocationMatch ##
|
|
t_debug "verifying ScriptAlias in LocationMatch with /expr/aliascgi-script";
|
|
ok t_cmp((GET_BODY "/expr/aliascgi-script"),
|
|
"$string\n",
|
|
"/aliascgi-script") unless WINFU;
|
|
}
|
|
else {
|
|
skip "skipping test without CGI module";
|
|
}
|
|
}
|
|
|
|
## failure with ScriptAliasMatch ##
|
|
t_debug "verifying bad script alias.";
|
|
ok t_cmp((GET_RC "/aliascgi-nada"),
|
|
404,
|
|
"/aliascgi-nada") unless WINFU;
|
|
|
|
## clean up ##
|
|
t_rmtree("$vars->{t_logs}/mod_cgi.log");
|
|
|
|
|
|
if (have_min_apache_version("2.5.1")) {
|
|
my ($path, $regex);
|
|
while (($path, $regex) = each (%relative_redirects)) {
|
|
local $Apache::TestRequest::RedirectOK = 0;
|
|
my $r;
|
|
$r = GET($path);
|
|
if (defined($regex)) {
|
|
ok t_cmp($r->code, "302");
|
|
ok t_cmp($r->header("Location"), qr/$regex/, "failure on $path");
|
|
}
|
|
else {
|
|
ok t_cmp($r->code, "500");
|
|
ok t_cmp($r->header("Location"), undef, "failure on $path");
|
|
}
|
|
}
|
|
}
|
|
|