-
Notifications
You must be signed in to change notification settings - Fork 81
/
Copy pathstream_limit_conn.t
138 lines (96 loc) · 2.7 KB
/
stream_limit_conn.t
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
138
#!/usr/bin/perl
# (C) Andrey Zelenkov
# (C) Nginx, Inc.
# Tests for stream limit_conn module.
###############################################################################
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/http stream stream_limit_conn/)
->plan(8)->write_file_expand('nginx.conf', <<'EOF');
%%TEST_GLOBALS%%
daemon off;
events {
}
stream {
%%TEST_GLOBALS_STREAM%%
limit_conn_zone $binary_remote_addr zone=zone:1m;
limit_conn_zone $binary_remote_addr zone=zone2:1m;
server {
listen 127.0.0.1:8080;
proxy_pass 127.0.0.1:8084;
limit_conn zone 1;
}
server {
listen 127.0.0.1:8085;
proxy_pass 127.0.0.1:8084;
limit_conn zone 5;
}
server {
listen 127.0.0.1:8081;
proxy_pass 127.0.0.1:8084;
limit_conn zone2 1;
}
server {
listen 127.0.0.1:8082;
proxy_pass 127.0.0.1:8080;
limit_conn zone2 1;
}
server {
listen 127.0.0.1:8083;
proxy_pass 127.0.0.1:8080;
limit_conn zone 1;
}
}
http {
%%TEST_GLOBALS_HTTP%%
server {
listen 127.0.0.1:8084;
server_name localhost;
location / { }
}
}
EOF
$t->write_file('index.html', '');
$t->run();
###############################################################################
like(get(), qr/200 OK/, 'passed');
# same and other zones
my $s = http(<<EOF, start => 1, sleep => 0.2);
GET / HTTP/1.0
EOF
ok($s, 'long connection');
is(get(), undef, 'rejected same zone');
like(get('127.0.0.1:' . port(8081)), qr/200 OK/, 'passed different zone');
like(get('127.0.0.1:' . port(8085)), qr/200 OK/, 'passed same zone unlimited');
ok(http(<<EOF, socket => $s), 'long connection closed');
Host: localhost
EOF
# zones proxy chain
like(get('127.0.0.1:' . port(8082)), qr/200 OK/, 'passed proxy');
is(get('127.0.0.1:' . port(8083)), undef, 'rejected proxy');
###############################################################################
sub get {
my $peer = shift;
my $r = http_get('/', socket => getconn($peer));
if (!$r) {
$r = undef;
}
return $r;
}
sub getconn {
my $peer = shift;
my $s = IO::Socket::INET->new(
Proto => 'tcp',
PeerAddr => $peer || '127.0.0.1:' . port(8080)
)
or die "Can't connect to nginx: $!\n";
return $s;
}
###############################################################################