1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
#!/usr/bin/perl
# (C) Dmitry Volyntsev
# (C) Nginx, Inc.
# Tests for js_shared_dict_zone directive, state= parameter.
###############################################################################
use warnings;
use strict;
use Test::More;
BEGIN { use FindBin; chdir($FindBin::Bin); }
use lib 'lib';
use Test::Nginx;
use Test::Nginx::Stream qw/ stream /;
###############################################################################
select STDERR; $| = 1;
select STDOUT; $| = 1;
my $t = Test::Nginx->new()->has(qw/stream/)
->write_file_expand('nginx.conf', <<'EOF');
%%TEST_GLOBALS%%
daemon off;
events {
}
stream {
%%TEST_GLOBALS_STREAM%%
js_import test.js;
js_shared_dict_zone zone=foo:32k state=foo.json;
server {
listen 127.0.0.1:8081;
js_preread test.preread_verify;
proxy_pass 127.0.0.1:8090;
}
}
EOF
$t->write_file('foo.json', <<EOF);
{"QZ":{"value":"1"},"QQ":{"value":"1"}}
EOF
$t->write_file('test.js', <<EOF);
function preread_verify(s) {
var collect = Buffer.from([]);
s.on('upstream', function (data, flags) {
collect = Buffer.concat([collect, data]);
if (collect.length >= 4 && collect.readUInt16BE(0) == 0xabcd) {
let id = collect.slice(2,4);
ngx.shared.foo.get(id) ? s.done(): s.deny();
} else if (collect.length) {
s.deny();
}
});
}
export default { preread_verify };
EOF
$t->try_run('no js_shared_dict_zone with state=');
$t->plan(2);
$t->run_daemon(\&stream_daemon, port(8090));
$t->waitforsocket('127.0.0.1:' . port(8090));
###############################################################################
is(stream('127.0.0.1:' . port(8081))->io("\xAB\xCDQY##"), "",
'access failed, QY is not in the shared dict');
is(stream('127.0.0.1:' . port(8081))->io("\xAB\xCDQZ##"), "\xAB\xCDQZ##",
'access granted');
###############################################################################
sub stream_daemon {
my $server = IO::Socket::INET->new(
Proto => 'tcp',
LocalAddr => '127.0.0.1:' . port(8090),
Listen => 5,
Reuse => 1
)
or die "Can't create listening socket: $!\n";
local $SIG{PIPE} = 'IGNORE';
while (my $client = $server->accept()) {
$client->autoflush(1);
log2c("(new connection $client)");
$client->sysread(my $buffer, 65536) or next;
log2i("$client $buffer");
log2o("$client $buffer");
$client->syswrite($buffer);
close $client;
}
}
sub log2i { Test::Nginx::log_core('|| <<', @_); }
sub log2o { Test::Nginx::log_core('|| >>', @_); }
sub log2c { Test::Nginx::log_core('||', @_); }
sub get {
my ($url, %extra) = @_;
my $s = IO::Socket::INET->new(
Proto => 'tcp',
PeerAddr => '127.0.0.1:' . port(8082)
) or die "Can't connect to nginx: $!\n";
return http_get($url, socket => $s);
}
###############################################################################
|