Test-Apache-RewriteRules
view release on metacpan or search on metacpan
lib/Test/Apache/RewriteRules.pm view on Meta::CPAN
sub receiver {
my $self = shift;
return $self->{receiver} if $self->{receiver};
my $receiver_path_name = 'url.cgi';
my $receiver = <<"EOS";
#!/usr/bin/env perl
use strict;
use warnings;
use JSON::XS;
print "Content-Type: application/json;\\n\\n";
print encode_json({
host => \$ENV{HTTP_HOST},
path => \$ENV{REQUEST_URI},
path_translated => \$ENV{PATH_TRANSLATED} . (\$ENV{REQUEST_URI} =~ /\\?/ ? "?\$ENV{QUERY_STRING}" : '')
});
EOS
my $receiver_file = sprintf '%s/%s', $self->server_root, $receiver_path_name;
open my $fh, "> $receiver_file" or die $!;
print $fh $receiver;
close $fh;
chmod 0755, $receiver_file
or die "Couldn't chmod receiver file: $receiver_file";
$self->{receiver} = file($receiver_file);
}
sub custom_conf {
my $self = shift;
croak "rewrite conf is required"
if !$self->rewrite_conf;
my $custom_conf = '';
for my $backend (@{$self->{backends}}) {
$custom_conf .= sprintf "SetEnvIf Request_URI .* %s=localhost:%s\n",
$backend->{name}, $backend->{port};
}
$custom_conf .= <<"EOS";
ServerName proxy.test:@{[$self->proxy_port]}
DocumentRoot @{[$self->server_root]}
RewriteRule ^/url\\.cgi/ - [L]
Include "@{[$self->rewrite_conf]}"
Action default-proxy-handler /@{[$self->receiver->basename]} virtual
SetHandler default-proxy-handler
<Location /@{[$self->receiver->basename]}>
SetHandler cgi-script
</Location>
EOS
}
my @required_modules = qw(
log_config
setenvif
alias
rewrite
authn_file
authz_host
auth_basic
mime
proxy
proxy_http
cgi
actions
);
sub apache {
my $self = shift;
return $self->{apache} if $self->{apache};
my $apache_options = $self->{apache_options} || {};
$self->{apache} = Test::Httpd::Apache2->new(
auto_start => 0,
listen => $self->proxy_port,
required_modules => \@required_modules,
%$apache_options,
);
$self->{apache}->server_root($self->{apache}->tmpdir);
$self->{apache}
}
sub start_apache {
my $self = shift;
$self->apache->custom_conf($self->custom_conf);
$self->apache->start;
for my $backend (@{$self->{backends}}) {
$backend->{apache}->start;
}
}
sub stop_apache {
my $self = shift;
$self->apache->stop if $self->apache->pid;
for my $backend (@{$self->{backends}}) {
$backend->{apache}->stop if $backend->{apache}->pid;
}
}
sub create_backend_apache {
my ($self, %backend) = @_;
my $apache_options = $self->{apache_options} || {};
my $proxy_apache = $self->apache;
my $backend_apache = Test::Httpd::Apache2->new(
auto_start => 0,
listen => $backend{port},
required_modules => \@required_modules,
%$apache_options,
);
$backend_apache->server_root($proxy_apache->server_root);
$backend_apache->custom_conf(<<"EOS");
ServerName @{[$backend{name}]}.test:@{[$backend{port}]}
DocumentRoot @{[$backend_apache->server_root]}
( run in 0.524 second using v1.01-cache-2.11-cpan-2398b32b56e )