Mercurial > hg > nginx-tests
annotate stream_proxy_half_close.t @ 1905:f35824e75b66
Tests: fixed reading QUIC streams on Perl < 5.24.
The parse_stream() routine has had a missing explicit return if there were no
streams received. In Perl < 5.24 this used to return no value, or an empty
array in the list context. In modern Perl this returns an empty value, or an
array of 1 element, which made the check for last index of the returned array
work rather by accident.
The fix is to return explicitly and to check the array size in callers instead.
author | Sergey Kandaurov <pluknet@nginx.com> |
---|---|
date | Tue, 06 Jun 2023 18:50:07 +0400 |
parents | 8bdf548487f6 |
children | 2a0a6035a1af |
rev | line source |
---|---|
1735
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1 #!/usr/bin/perl |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
3 # (C) Sergey Kandaurov |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
4 # (C) Nginx, Inc. |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
5 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
6 # Tests for stream proxy_half_close directive. |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
7 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
8 ############################################################################### |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
9 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
10 use warnings; |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
11 use strict; |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
12 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
13 use Test::More; |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
14 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
15 use IO::Select; |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
16 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
17 BEGIN { use FindBin; chdir($FindBin::Bin); } |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
18 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
19 use lib 'lib'; |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
20 use Test::Nginx; |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
21 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
22 ############################################################################### |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
23 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
24 select STDERR; $| = 1; |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
25 select STDOUT; $| = 1; |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
26 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
27 my $t = Test::Nginx->new()->has(qw/stream/); |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
28 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
29 $t->write_file_expand('nginx.conf', <<'EOF'); |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
30 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
31 %%TEST_GLOBALS%% |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
32 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
33 daemon off; |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
34 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
35 events { |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
36 } |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
37 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
38 stream { |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
39 %%TEST_GLOBALS_STREAM%% |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
40 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
41 server { |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
42 listen 127.0.0.1:8080; |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
43 proxy_pass 127.0.0.1:8081; |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
44 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
45 proxy_half_close on; |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
46 } |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
47 } |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
48 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
49 EOF |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
50 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
51 $t->try_run('no proxy_half_close')->plan(2); |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
52 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
53 ############################################################################### |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
54 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
55 my ($s, $u) = pair(8080, 8081); |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
56 shutdown($u, 1); |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
57 is(proxy($s, $u, 'SEE'), 'SEE', 'half close upstream'); |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
58 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
59 ($s, $u) = pair(8080, 8081); |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
60 shutdown($s, 1); |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
61 is(proxy($u, $s, 'SEE'), 'SEE', 'half close client'); |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
62 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
63 ############################################################################### |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
64 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
65 sub pair { |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
66 my ($server, $backend) = @_; |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
67 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
68 my $listen = IO::Socket::INET->new( |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
69 LocalHost => '127.0.0.1:' . port($backend), |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
70 Listen => 5, |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
71 Reuse => 1, |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
72 ) |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
73 or die "Can't listen on $server: $!\n"; |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
74 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
75 my $connect = IO::Socket::INET->new( |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
76 Proto => 'tcp', |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
77 PeerHost => '127.0.0.1:' . port($server), |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
78 ) |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
79 or die "Can't connect to $server: $!\n"; |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
80 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
81 my $accept = $listen->accept() if IO::Select->new($listen)->can_read(3); |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
82 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
83 return $connect, $accept; |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
84 } |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
85 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
86 sub proxy { |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
87 my ($from, $to, $msg) = @_; |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
88 proxy_from($from, $msg); |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
89 return proxy_to($to); |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
90 } |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
91 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
92 sub proxy_from { |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
93 my ($s, $msg) = @_; |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
94 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
95 local $SIG{PIPE} = 'IGNORE'; |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
96 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
97 while (IO::Select->new($s)->can_write(5)) { |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
98 my $n = $s->syswrite($msg); |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
99 log_out(substr($msg, 0, $n)); |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
100 last unless $n; |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
101 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
102 $msg = substr($msg, $n); |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
103 last unless length $msg; |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
104 } |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
105 } |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
106 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
107 sub proxy_to { |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
108 my ($s) = @_; |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
109 my $buf; |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
110 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
111 $s->sysread($buf, 1024) if IO::Select->new($s)->can_read(5); |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
112 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
113 log_in($buf); |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
114 return $buf; |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
115 } |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
116 |
8bdf548487f6
Tests: proxy_half_close tests in the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
117 ############################################################################### |