view proxy.t @ 1164:cdd44ff602db

Tests: stream udp test with wildcard address. The test ensures that the source address used for outgoing UDP datagrams is the same as the one used for the incoming datagram.
author Sergey Kandaurov <pluknet@nginx.com>
date Tue, 18 Apr 2017 17:51:00 +0300
parents 41690e007ad8
children cf14cfe9ec8c
line wrap: on
line source

#!/usr/bin/perl

# (C) Maxim Dounin

# Tests for http proxy module.

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

use warnings;
use strict;

use Test::More;

use Socket;

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/http proxy/)->plan(7);

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

%%TEST_GLOBALS%%

daemon off;

events {
}

http {
    %%TEST_GLOBALS_HTTP%%

    upstream u {
        server 127.0.0.1:8081;
    }

    server {
        listen       127.0.0.1:8080;
        server_name  localhost;

        location / {
            proxy_pass http://127.0.0.1:8081;
            proxy_read_timeout 1s;
            proxy_connect_timeout 2s;
        }

        location /var {
            proxy_pass http://$arg_b;
            proxy_read_timeout 1s;
            proxy_connect_timeout 2s;
        }

        location /timeout {
            proxy_pass http://127.0.0.1:8081;
            proxy_connect_timeout 2s;
        }
    }
}

EOF

$t->run_daemon(\&http_daemon);
$t->run()->waitforsocket('127.0.0.1:' . port(8081));

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

like(http_get('/'), qr/SEE-THIS/, 'proxy request');
like(http_get('/multi'), qr/AND-THIS/, 'proxy request with multiple packets');

unlike(http_head('/'), qr/SEE-THIS/, 'proxy head request');

like(http_get('/var?b=127.0.0.1:' . port(8081) . '/'), qr/SEE-THIS/,
	'proxy with variables');
like(http_get('/var?b=u/'), qr/SEE-THIS/, 'proxy with variables to upstream');

SKIP: {
skip 'no ipv6', 1 unless $t->has_module('ipv6') or $t->has_feature('ipv6')
	and socket(my $s, &AF_INET6, &SOCK_STREAM, 0);

TODO: {
todo_skip 'heap-buffer-overflow', 1
	unless $ENV{TEST_NGINX_UNSAFE} or $t->has_version('1.11.0');

ok(http_get("/var?b=[::]"), 'proxy with variables - no ipv6 port');

}

}

like(http_get('/timeout'), qr/200 OK/, 'proxy connect timeout');

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

sub http_daemon {
	my $server = IO::Socket::INET->new(
		Proto => 'tcp',
		LocalHost => '127.0.0.1:' . port(8081),
		Listen => 5,
		Reuse => 1
	)
		or die "Can't create listening socket: $!\n";

	local $SIG{PIPE} = 'IGNORE';

	while (my $client = $server->accept()) {
		$client->autoflush(1);

		my $headers = '';
		my $uri = '';

		while (<$client>) {
			$headers .= $_;
			last if (/^\x0d?\x0a?$/);
		}

		$uri = $1 if $headers =~ /^\S+\s+([^ ]+)\s+HTTP/i;

		if ($uri eq '/') {
			print $client <<'EOF';
HTTP/1.1 200 OK
Connection: close

EOF
			print $client "TEST-OK-IF-YOU-SEE-THIS"
				unless $headers =~ /^HEAD/i;

		} elsif ($uri eq '/multi') {

			print $client <<"EOF";
HTTP/1.1 200 OK
Connection: close

TEST-OK-IF-YOU-SEE-THIS
EOF

			select undef, undef, undef, 0.1;
			print $client 'AND-THIS';

		} elsif ($uri eq '/timeout') {
			sleep 3;

			print $client <<"EOF";
HTTP/1.1 200 OK
Connection: close

EOF

		} else {

			print $client <<"EOF";
HTTP/1.1 404 Not Found
Connection: close

Oops, '$uri' not found
EOF
		}

		close $client;
	}
}

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