The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*-
use strict;
use warnings FATAL => 'all';

use Apache::Test;
use Apache::TestUtil;

use Apache::TestRequest;

my $module = 'TestFilter::in_bbs_inject_header';
my $location = "/" . Apache::TestRequest::module2path($module);

Apache::TestRequest::scheme('http'); #force http for t/TEST -ssl
Apache::TestRequest::module($module);

my $config = Apache::Test::config();
my $hostport = Apache::TestRequest::hostport($config);
t_debug("connecting to $hostport");

my $content = "This body shouldn't be seen by the filter";

my $header1_key = 'X-My-Protocol';
my $header1_val = 'POST-IT';

my %headers = (
    'X-Extra-Header2' => 'Value 2',
    'X-Extra-Header3' => 'Value 3',
);

my $keep_alive_times     = 4;
my $non_keep_alive_times = 4;
my $tests = 2 + keys %headers;
my $times = $non_keep_alive_times + $keep_alive_times + 1;

plan tests => $tests * $times;

# try non-keepalive conn
validate(POST($location, content => $content)) for 1..$non_keep_alive_times;

# try keepalive conns
Apache::TestRequest::user_agent(reset => 1, keep_alive => 1);
validate(POST($location, content => $content)) for 1..$keep_alive_times;

# try non-keepalive conn
Apache::TestRequest::user_agent(reset => 1, keep_alive => 0);
validate(POST($location, content => $content));

# 4 sub-tests
sub validate {
    my $res = shift;

    die join "\n",
        "request has failed (the response code was: " . $res->code . ")",
        "see t/logs/error_log for more details\n" unless $res->is_success;

    ok t_cmp($res->content, $content, "body");

    ok t_cmp($res->header($header1_key),
             $header1_val,
             "injected header $header1_key");

    for my $key (sort keys %headers) {
        ok t_cmp($res->header($key),
                 $headers{$key},
                 "injected header $key");
    }
}