The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -w
# Before `make install' is performed this script should be runnable with
# `make test'. After `make install' it should work as `perl t/testmodule.t'

use HTTP::Daemon::SSL;
use HTTP::Status;
eval {require "t/ssl_settings.req";} ||
eval {require "ssl_settings.req";};

$numtests = 9;
$|=1;
$SIG{PIPE}='IGNORE';

foreach ($^O) {
    if (/MacOS/ or /VOS/ or /vmesa/ or /riscos/ or /amigaos/) {
	print "1..0 # Skipped: fork not implemented on this platform\n";
	exit;
    }
}

print "1..$numtests\n";

$test = 0;

my $server = new HTTP::Daemon::SSL(
				   LocalAddr => $SSL_SERVER_ADDR,
				   Listen => 5,
				   Timeout => 30,
				   ReuseAddr => 1,
				   SSL_verify_mode => 0x00,
				   SSL_ca_file => "certs/test-ca.pem",
				   SSL_cert_file => "certs/server-cert.pem");

if (!$server) {
    print "not ok $test\n";
    exit;
}
$SSL_SERVER_PORT = $server->sockport;
&ok("server init port=$SSL_SERVER_PORT");


print "not " if (!defined fileno($server));
&ok("server fileno");

print "not " unless ($server->url =~ m!^https:!);
&ok("server url test");


unless (fork) {
    close($server);

    my $client = new IO::Socket::INET(PeerAddr => $SSL_SERVER_ADDR,
				      PeerPort => $SSL_SERVER_PORT);

    print $client "GET / HTTP/1.0\r\n\r\n";
    (<$client> eq "HTTP/1.1 400 Bad Request\r\n") || print "not ";
    &ok("client bad connection test");
    my @ary = <$client>;
    close $client;

    $client = new IO::Socket::SSL(PeerAddr => $SSL_SERVER_ADDR,
				  PeerPort => $SSL_SERVER_PORT,
				  SSL_verify_mode => 0x01,
				  SSL_ca_file => "certs/test-ca.pem");

    $client || (print("not ok #client failure\n") && exit);
    &ok("client good connection test");

    print $client "GET /foo HTTP/1.0\r\n\r\n";

    (<$client> eq "HTTP/1.1 403 Forbidden\r\n") || print "not ";
    &ok("client permission test");
    @ary = <$client>;

    exit(0);
}


my $conn;
if (!($conn = $server->accept)) {
    # first client request is a bad request
    &ok("bad request handled");
} else {
    print "not ok $test # bad request returned a socket\n";
}

if ($conn = $server->accept) {
    &ok("valid request handled");
} else {
    print "not ok $test # valid request did not return a socket\n";
}

my $r = $conn->get_request();

unless ($r->method eq 'GET' and $r->url->path eq '/foo') {
    print "not ";
}
&ok("server method processing");

$conn->send_error(RC_FORBIDDEN);

close $conn;
wait;

sub ok {
    print "ok #$_[0] ", ++$test, "\n"; 
}