#!/usr/bin/perl

# (C) Sergey Kandaurov
# (C) Nginx, Inc.

# Tests for HTTP/2 protocol with ssl.

###############################################################################

use warnings;
use strict;

use Test::More;

BEGIN { use FindBin; chdir($FindBin::Bin); }

use lib 'lib';
use Test::Nginx;
use Test::Nginx::HTTP2;

###############################################################################

select STDERR; $| = 1;
select STDOUT; $| = 1;

eval { require IO::Socket::SSL; };
plan(skip_all => 'IO::Socket::SSL not installed') if $@;
eval { IO::Socket::SSL::SSL_VERIFY_NONE(); };
plan(skip_all => 'IO::Socket::SSL too old') if $@;

my $t = Test::Nginx->new()->has(qw/http http_ssl http_v2 rewrite/)
	->has_daemon('openssl')->plan(8);

$t->write_file_expand('nginx.conf', <<'EOF');

%%TEST_GLOBALS%%

daemon off;

events {
}

http {
    %%TEST_GLOBALS_HTTP%%

    server {
        listen       127.0.0.1:8080 http2 ssl;
        server_name  localhost;

        ssl_certificate_key localhost.key;
        ssl_certificate localhost.crt;

        location /h2 {
            return 200 $http2;
        }
        location /sp {
            return 200 $server_protocol;
        }
        location /scheme {
            return 200 $scheme;
        }
        location /https {
            return 200 $https;
        }
    }
}

EOF

$t->write_file('openssl.conf', <<EOF);
[ req ]
default_bits = 1024
encrypt_key = no
distinguished_name = req_distinguished_name
[ req_distinguished_name ]
EOF

my $d = $t->testdir();

foreach my $name ('localhost') {
	system('openssl req -x509 -new '
		. "-config $d/openssl.conf -subj /CN=$name/ "
		. "-out $d/$name.crt -keyout $d/$name.key "
		. ">>$d/openssl.out 2>&1") == 0
		or die "Can't create certificate for $name: $!\n";
}

open OLDERR, ">&", \*STDERR; close STDERR;
$t->run();
open STDERR, ">&", \*OLDERR;

###############################################################################

my ($s, $sid, $frames, $frame);

my $has_npn = eval { Test::Nginx::HTTP2::new_socket(port(8080), SSL => 1,
	npn => 'h2')->next_proto_negotiated() };
my $has_alpn = eval { Test::Nginx::HTTP2::new_socket(port(8080), SSL => 1,
	alpn => 'h2')->alpn_selected() };

# SSL/TLS connection, NPN

SKIP: {
skip 'OpenSSL NPN support required', 1 unless $has_npn;

$s = Test::Nginx::HTTP2->new(port(8080), SSL => 1, npn => 'h2');
$sid = $s->new_stream({ path => '/h2' });
$frames = $s->read(all => [{ sid => $sid, fin => 1 }]);

($frame) = grep { $_->{type} eq "DATA" } @$frames;
is($frame->{data}, 'h2', 'http variable - npn');

}

# SSL/TLS connection, ALPN

SKIP: {
skip 'OpenSSL ALPN support required', 1 unless $has_alpn;

$s = Test::Nginx::HTTP2->new(port(8080), SSL => 1, alpn => 'h2');
$sid = $s->new_stream({ path => '/h2' });
$frames = $s->read(all => [{ sid => $sid, fin => 1 }]);

($frame) = grep { $_->{type} eq "DATA" } @$frames;
is($frame->{data}, 'h2', 'http variable - alpn');

}

# $server_protocol - SSL/TLS connection, NPN

SKIP: {
skip 'OpenSSL NPN support required', 1 unless $has_npn;

$s = Test::Nginx::HTTP2->new(port(8080), SSL => 1, npn => 'h2');
$sid = $s->new_stream({ path => '/sp' });
$frames = $s->read(all => [{ sid => $sid, fin => 1 }]);

($frame) = grep { $_->{type} eq "DATA" } @$frames;
is($frame->{data}, 'HTTP/2.0', 'server_protocol variable - npn');

}

# $server_protocol - SSL/TLS connection, ALPN

SKIP: {
skip 'OpenSSL ALPN support required', 1 unless $has_alpn;

$s = Test::Nginx::HTTP2->new(port(8080), SSL => 1, alpn => 'h2');
$sid = $s->new_stream({ path => '/sp' });
$frames = $s->read(all => [{ sid => $sid, fin => 1 }]);

($frame) = grep { $_->{type} eq "DATA" } @$frames;
is($frame->{data}, 'HTTP/2.0', 'server_protocol variable - alpn');

}

# $scheme - SSL/TLS connection, NPN

SKIP: {
skip 'OpenSSL NPN support required', 1 unless $has_npn;

$s = Test::Nginx::HTTP2->new(port(8080), SSL => 1, npn => 'h2');
$sid = $s->new_stream({ path => '/scheme' });
$frames = $s->read(all => [{ sid => $sid, fin => 1 }]);

($frame) = grep { $_->{type} eq "DATA" } @$frames;
is($frame->{data}, 'https', 'scheme variable - npn');

}

# $scheme - SSL/TLS connection, ALPN

SKIP: {
skip 'OpenSSL ALPN support required', 1 unless $has_alpn;

$s = Test::Nginx::HTTP2->new(port(8080), SSL => 1, alpn => 'h2');
$sid = $s->new_stream({ path => '/scheme' });
$frames = $s->read(all => [{ sid => $sid, fin => 1 }]);

($frame) = grep { $_->{type} eq "DATA" } @$frames;
is($frame->{data}, 'https', 'scheme variable - alpn');

}

# $https - SSL/TLS connection, NPN

SKIP: {
skip 'OpenSSL NPN support required', 1 unless $has_npn;

$s = Test::Nginx::HTTP2->new(port(8080), SSL => 1, npn => 'h2');
$sid = $s->new_stream({ path => '/https' });
$frames = $s->read(all => [{ sid => $sid, fin => 1 }]);

($frame) = grep { $_->{type} eq "DATA" } @$frames;
is($frame->{data}, 'on', 'https variable - npn');

}

# $https - SSL/TLS connection, ALPN

SKIP: {
skip 'OpenSSL ALPN support required', 1 unless $has_alpn;

$s = Test::Nginx::HTTP2->new(port(8080), SSL => 1, alpn => 'h2');
$sid = $s->new_stream({ path => '/https' });
$frames = $s->read(all => [{ sid => $sid, fin => 1 }]);

($frame) = grep { $_->{type} eq "DATA" } @$frames;
is($frame->{data}, 'on', 'https variable - alpn');

}

###############################################################################
