use strict;
use Test::More;
use t::Utils;
use LWP::UserAgent;
use HTTP::Proxy;
# here are all the requests the client will try
my @requests = (
# host, path, expected code, dns should fail
[ 'www.mongueurs.net', '/', 200 ],
[ 'httpd.apache.org', '/docs', 301 ],
[ 'www.google.com', '/testing/', 404 ],
[ 'www.error.zzz', '/', '5..', 1 ],
);
if ( $^O eq 'MSWin32' ) {
plan skip_all =>
"This test fails on MSWin32. HTTP::Proxy is usable on Win32 with maxchild => 0";
exit;
}
# we skip the tests if the network is not available
my $web_ok = web_ok();
plan tests => @requests + 2;
# this is to work around tests in forked processes
my $test = Test::Builder->new;
$test->use_numbers(0);
$test->no_ending(1);
my $proxy = HTTP::Proxy->new(
port => 0,
max_connections => @requests * $web_ok + 1,
);
$proxy->init; # required to access the url later
# fork a HTTP proxy
my $pid = fork_proxy(
$proxy,
sub {
is( $proxy->conn,
@requests * $web_ok + 1,
"Served the correct number of requests"
);
}
);
# no Host: header
my $content = bare_request( '/', HTTP::Headers->new(), $proxy );
my ($code) = $content =~ m!^HTTP/\d+\.\d+ (\d\d\d) !g;
is( $code, 400, "Relative URL and no Host: Bad Request" );
SKIP: {
skip "Web does not seem to work", scalar @requests unless $web_ok;
for (@requests) {
my ( $host, $path, $status, $dns_fail ) = @$_;
$dns_fail &&= defined +( gethostbyname $host )[4];
SKIP: {
if ($dns_fail) {
$content = bare_request( '/',
HTTP::Headers->new( Host => 'localhost' ), $proxy );
skip "Our DNS shouldn't resolve $host", 1;
}
else {
$content = bare_request( $path,
HTTP::Headers->new( Host => $host ), $proxy );
($code) = $content =~ m!^HTTP/\d+\.\d+ (\d\d\d) !g;
like( $code, qr/^$status$/, "Got an answer ($code)" );
}
}
}
}
# make sure the kid is dead
wait;