Mercurial > hg > nginx-tests
comparison stream_realip.t @ 1028:403709429c3b
Tests: stream realip tests, listen proxy_protocol tests.
author | Sergey Kandaurov <pluknet@nginx.com> |
---|---|
date | Thu, 08 Sep 2016 13:01:53 +0300 |
parents | |
children | 094e1247740f |
comparison
equal
deleted
inserted
replaced
1027:6ef255ed4bbc | 1028:403709429c3b |
---|---|
1 #!/usr/bin/perl | |
2 | |
3 # (C) Sergey Kandaurov | |
4 # (C) Nginx, Inc. | |
5 | |
6 # Tests for stream realip module, server side proxy protocol. | |
7 | |
8 ############################################################################### | |
9 | |
10 use warnings; | |
11 use strict; | |
12 | |
13 use Test::More; | |
14 | |
15 use IO::Select; | |
16 use Socket qw/ $CRLF /; | |
17 | |
18 BEGIN { use FindBin; chdir($FindBin::Bin); } | |
19 | |
20 use lib 'lib'; | |
21 use Test::Nginx; | |
22 use Test::Nginx::Stream qw/ stream /; | |
23 | |
24 ############################################################################### | |
25 | |
26 select STDERR; $| = 1; | |
27 select STDOUT; $| = 1; | |
28 | |
29 my $t = Test::Nginx->new()->has(qw/stream stream_return stream_realip ipv6/) | |
30 ->write_file_expand('nginx.conf', <<'EOF'); | |
31 | |
32 %%TEST_GLOBALS%% | |
33 | |
34 daemon off; | |
35 | |
36 events { | |
37 } | |
38 | |
39 stream { | |
40 server { | |
41 listen 127.0.0.1:8083 proxy_protocol; | |
42 listen 127.0.0.1:8084; | |
43 return $proxy_protocol_addr:$proxy_protocol_port; | |
44 } | |
45 | |
46 server { | |
47 listen 127.0.0.1:8085 proxy_protocol; | |
48 proxy_pass 127.0.0.1:8081; | |
49 } | |
50 | |
51 server { | |
52 listen 127.0.0.1:8086 proxy_protocol; | |
53 listen [::1]:%%PORT_8086%% proxy_protocol; | |
54 return "$remote_addr:$remote_port: | |
55 $realip_remote_addr:$realip_remote_port"; | |
56 | |
57 set_real_ip_from ::1; | |
58 set_real_ip_from 127.0.0.2; | |
59 } | |
60 | |
61 server { | |
62 listen 127.0.0.1:8087; | |
63 proxy_pass [::1]:%%PORT_8086%%; | |
64 } | |
65 | |
66 server { | |
67 listen 127.0.0.1:8088 proxy_protocol; | |
68 listen [::1]:%%PORT_8088%% proxy_protocol; | |
69 return "$remote_addr:$remote_port: | |
70 $realip_remote_addr:$realip_remote_port"; | |
71 | |
72 set_real_ip_from 127.0.0.1; | |
73 set_real_ip_from ::2; | |
74 } | |
75 | |
76 server { | |
77 listen 127.0.0.1:8089; | |
78 proxy_pass [::1]:%%PORT_8088%%; | |
79 } | |
80 } | |
81 | |
82 EOF | |
83 | |
84 $t->run_daemon(\&stream_daemon); | |
85 $t->try_run('no stream proxy_protocol and/or inet6 support')->plan(8); | |
86 $t->waitforsocket('127.0.0.1:' . port(8081)); | |
87 | |
88 ############################################################################### | |
89 | |
90 is(stream('127.0.0.1:' . port(8083)) | |
91 ->io("PROXY TCP4 192.0.2.1 192.0.2.2 1234 5678${CRLF}"), | |
92 '192.0.2.1:1234', 'server'); | |
93 | |
94 is(stream('127.0.0.1:' . port(8084)) | |
95 ->io("PROXY TCP4 192.0.2.1 192.0.2.2 1234 5678${CRLF}"), | |
96 ':', 'server off'); | |
97 | |
98 is(stream('127.0.0.1:' . port(8085)) | |
99 ->io("PROXY TCP4 192.0.2.1 192.0.2.2 1234 5678${CRLF}close"), | |
100 'close', 'server payload'); | |
101 | |
102 like(stream('127.0.0.1:' . port(8086)) | |
103 ->io("PROXY TCP4 192.0.2.1 192.0.2.2 1234 5678${CRLF}"), | |
104 qr/^(\Q127.0.0.1:\E\d+):\s+\1$/, 'server ipv6 realip - no match'); | |
105 | |
106 like(stream('127.0.0.1:' . port(8087)) | |
107 ->io("PROXY TCP4 192.0.2.1 192.0.2.2 1234 5678${CRLF}"), | |
108 qr/\Q192.0.2.1:1234:\E\s+\Q::1:\E\d+/, 'server ipv6 realip'); | |
109 | |
110 like(stream('127.0.0.1:' . port(8088)) | |
111 ->io("PROXY TCP4 192.0.2.1 192.0.2.2 1234 5678${CRLF}"), | |
112 qr/\Q192.0.2.1:1234:\E\s+\Q127.0.0.1:\E\d+/, 'server ipv4 realip'); | |
113 | |
114 like(stream('127.0.0.1:' . port(8089)) | |
115 ->io("PROXY TCP4 192.0.2.1 192.0.2.2 1234 5678${CRLF}"), | |
116 qr/^(::1:\d+):\s+\1$/, 'server ipv4 realip - no match'); | |
117 | |
118 like(stream('127.0.0.1:' . port(8088)) | |
119 ->io("PROXY UNKNOWN TCP4 192.0.2.1 192.0.2.2 1234 5678${CRLF}"), | |
120 qr/^(\Q127.0.0.1:\E\d+):\s+\1$/, 'server unknown'); | |
121 | |
122 ############################################################################### | |
123 | |
124 sub stream_daemon { | |
125 my $server = IO::Socket::INET->new( | |
126 Proto => 'tcp', | |
127 LocalAddr => '127.0.0.1:' . port(8081), | |
128 Listen => 5, | |
129 Reuse => 1 | |
130 ) | |
131 or die "Can't create listening socket: $!\n"; | |
132 | |
133 my $sel = IO::Select->new($server); | |
134 | |
135 local $SIG{PIPE} = 'IGNORE'; | |
136 | |
137 while (my @ready = $sel->can_read) { | |
138 foreach my $fh (@ready) { | |
139 if ($server == $fh) { | |
140 my $new = $fh->accept; | |
141 $new->autoflush(1); | |
142 $sel->add($new); | |
143 | |
144 } elsif (stream_handle_client($fh)) { | |
145 $sel->remove($fh); | |
146 $fh->close; | |
147 } | |
148 } | |
149 } | |
150 } | |
151 | |
152 sub stream_handle_client { | |
153 my ($client) = @_; | |
154 | |
155 log2c("(new connection $client)"); | |
156 | |
157 $client->sysread(my $buffer, 65536) or return 1; | |
158 | |
159 log2i("$client $buffer"); | |
160 | |
161 log2o("$client $buffer"); | |
162 | |
163 $client->syswrite($buffer); | |
164 | |
165 return $buffer =~ /close/; | |
166 } | |
167 | |
168 sub log2i { Test::Nginx::log_core('|| <<', @_); } | |
169 sub log2o { Test::Nginx::log_core('|| >>', @_); } | |
170 sub log2c { Test::Nginx::log_core('||', @_); } | |
171 | |
172 ############################################################################### |