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 )