#!/usr/bin/perl

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

# Stream tests for proxy to ssl backend, use of Server Name Indication
# (proxy_ssl_name, proxy_ssl_server_name directives).

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

use warnings;
use strict;

use Test::More;

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

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

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

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

my $t = Test::Nginx->new()->has(qw/stream stream_ssl http http_ssl sni/)
	->has_daemon('openssl')->plan(5);

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

%%TEST_GLOBALS%%

daemon off;

events {
}

stream {
    %%TEST_GLOBALS_STREAM%%

    proxy_ssl on;
    proxy_ssl_session_reuse off;

    upstream u {
        server 127.0.0.1:8085;
    }

    server {
        listen      127.0.0.1:8080;
        proxy_pass  u;

        proxy_ssl_server_name off;
    }

    server {
        listen      127.0.0.1:8081;
        proxy_pass  u;

        proxy_ssl_server_name on;
    }

    server {
        listen      127.0.0.1:8082;
        proxy_pass  127.0.0.1:8085;

        proxy_ssl_server_name on;
        proxy_ssl_name example.com;
    }

    server {
        listen      127.0.0.1:8083;
        proxy_pass  127.0.0.1:8085;

        proxy_ssl_server_name on;
    }

    server {
        listen      127.0.0.1:8084;
        proxy_pass  127.0.0.1:8085;

        proxy_ssl_server_name on;
        proxy_ssl_name example.com:123;
    }
}

http {
    %%TEST_GLOBALS_HTTP%%

    server {
        listen       127.0.0.1:8085 ssl;
        server_name  localhost;

        ssl_certificate_key localhost.key;
        ssl_certificate localhost.crt;

        location / {
            add_header X-Name $ssl_server_name,;
        }
    }
}

EOF

$t->write_file('openssl.conf', <<EOF);
[ req ]
default_bits = 2048
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";
}

$t->write_file('index.html', '');

$t->run();

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

like(http_get('/'), qr/200 OK.*X-Name: ,/s, 'no name');
like(http_get('/', socket => getconn('127.0.0.1:' . port(8081))),
	qr/200 OK.*X-Name: u,/s, 'name default');
like(http_get('/', socket => getconn('127.0.0.1:' . port(8082))),
	qr/200 OK.*X-Name: example.com,/s, 'name override');
like(http_get('/', socket => getconn('127.0.0.1:' . port(8083))),
	qr/200 OK.*X-Name: ,/s, 'no ip');
like(http_get('/', socket => getconn('127.0.0.1:' . port(8084))),
	qr/200 OK.*X-Name: example.com,/s, 'no port in name');

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

sub getconn {
	my $peer = shift;
	my $s = IO::Socket::INET->new(
		Proto => 'tcp',
		PeerAddr => $peer
	)
		or die "Can't connect to nginx: $!\n";

	return $s;
}

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