Mercurial > hg > nginx-tests
annotate proxy_upgrade.t @ 1240:f7eb2875ed45
Tests: avoid interleaved output in Upgrade handling tests.
When the testing script is run in verbose mode by prove that redirects stdout,
a garbled verbose mode line from backend can be produced that incorporates TAP
output of an individual test result, which eventually breaks the testing plan.
Notably, this happens when testing sending multiple frames if backend started
to respond before all frames were received. This is possible due to the line
boundary used as an indicator of last bytes to receive before starting to send.
The fix is to amend the only last frame of many specially, for that purpose.
author | Sergey Kandaurov <pluknet@nginx.com> |
---|---|
date | Wed, 15 Nov 2017 20:16:09 +0300 |
parents | a79bf84726af |
children | 97c8280de681 |
rev | line source |
---|---|
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
1 #!/usr/bin/perl |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
2 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
3 # (C) Maxim Dounin |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
4 |
583
5276aceb32a6
Tests: style, no functional changes.
Sergey Kandaurov <pluknet@nginx.com>
parents:
368
diff
changeset
|
5 # Tests for http proxy upgrade support. |
5276aceb32a6
Tests: style, no functional changes.
Sergey Kandaurov <pluknet@nginx.com>
parents:
368
diff
changeset
|
6 # In contrast to proxy_websocket.t, this test doesn't try to use binary |
5276aceb32a6
Tests: style, no functional changes.
Sergey Kandaurov <pluknet@nginx.com>
parents:
368
diff
changeset
|
7 # WebSocket protocol, but uses simple plain text protocol instead. |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
8 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
9 ############################################################################### |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
10 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
11 use warnings; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
12 use strict; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
13 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
14 use Test::More; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
15 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
16 use IO::Poll; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
17 use IO::Select; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
18 use Socket qw/ CRLF /; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
19 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
20 BEGIN { use FindBin; chdir($FindBin::Bin); } |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
21 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
22 use lib 'lib'; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
23 use Test::Nginx; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
24 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
25 ############################################################################### |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
26 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
27 select STDERR; $| = 1; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
28 select STDOUT; $| = 1; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
29 |
1227
a79bf84726af
Tests: connection upgrade in subrequests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1155
diff
changeset
|
30 my $t = Test::Nginx->new()->has(qw/http proxy ssi/) |
a79bf84726af
Tests: connection upgrade in subrequests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1155
diff
changeset
|
31 ->write_file_expand('nginx.conf', <<'EOF')->plan(31); |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
32 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
33 %%TEST_GLOBALS%% |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
34 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
35 daemon off; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
36 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
37 events { |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
38 } |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
39 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
40 http { |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
41 %%TEST_GLOBALS_HTTP%% |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
42 |
584
7d6db4ac6ab0
Tests: proxy_upgrade.t tests for bytes sent to a client.
Sergey Kandaurov <pluknet@nginx.com>
parents:
583
diff
changeset
|
43 log_format test "$bytes_sent $body_bytes_sent"; |
7d6db4ac6ab0
Tests: proxy_upgrade.t tests for bytes sent to a client.
Sergey Kandaurov <pluknet@nginx.com>
parents:
583
diff
changeset
|
44 access_log %%TESTDIR%%/cc.log test; |
7d6db4ac6ab0
Tests: proxy_upgrade.t tests for bytes sent to a client.
Sergey Kandaurov <pluknet@nginx.com>
parents:
583
diff
changeset
|
45 |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
46 server { |
974
882267679006
Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
952
diff
changeset
|
47 listen 127.0.0.1:8080; |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
48 server_name localhost; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
49 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
50 location / { |
974
882267679006
Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
952
diff
changeset
|
51 proxy_pass http://127.0.0.1:8081; |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
52 proxy_http_version 1.1; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
53 proxy_set_header Upgrade $http_upgrade; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
54 proxy_set_header Connection "Upgrade"; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
55 proxy_read_timeout 2s; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
56 send_timeout 2s; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
57 } |
1227
a79bf84726af
Tests: connection upgrade in subrequests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1155
diff
changeset
|
58 |
a79bf84726af
Tests: connection upgrade in subrequests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1155
diff
changeset
|
59 location /ssi.html { |
a79bf84726af
Tests: connection upgrade in subrequests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1155
diff
changeset
|
60 ssi on; |
a79bf84726af
Tests: connection upgrade in subrequests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1155
diff
changeset
|
61 } |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
62 } |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
63 } |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
64 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
65 EOF |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
66 |
584
7d6db4ac6ab0
Tests: proxy_upgrade.t tests for bytes sent to a client.
Sergey Kandaurov <pluknet@nginx.com>
parents:
583
diff
changeset
|
67 my $d = $t->testdir(); |
7d6db4ac6ab0
Tests: proxy_upgrade.t tests for bytes sent to a client.
Sergey Kandaurov <pluknet@nginx.com>
parents:
583
diff
changeset
|
68 |
1227
a79bf84726af
Tests: connection upgrade in subrequests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1155
diff
changeset
|
69 $t->write_file('ssi.html', '<!--#include virtual="/upgrade" --> SEE-THIS'); |
a79bf84726af
Tests: connection upgrade in subrequests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1155
diff
changeset
|
70 |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
71 $t->run_daemon(\&upgrade_fake_daemon); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
72 $t->run(); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
73 |
974
882267679006
Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
952
diff
changeset
|
74 $t->waitforsocket('127.0.0.1:' . port(8081)) |
274
ccebd3168b5b
Tests: fix startup race in proxy_websocket.t, proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
263
diff
changeset
|
75 or die "Can't start test backend"; |
ccebd3168b5b
Tests: fix startup race in proxy_websocket.t, proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
263
diff
changeset
|
76 |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
77 ############################################################################### |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
78 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
79 # establish connection |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
80 |
584
7d6db4ac6ab0
Tests: proxy_upgrade.t tests for bytes sent to a client.
Sergey Kandaurov <pluknet@nginx.com>
parents:
583
diff
changeset
|
81 my @r; |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
82 my $s = upgrade_connect(); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
83 ok($s, "handshake"); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
84 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
85 SKIP: { |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
86 skip "handshake failed", 22 unless $s; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
87 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
88 # send a frame |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
89 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
90 upgrade_write($s, 'foo'); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
91 is(upgrade_read($s), 'bar', "upgrade response"); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
92 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
93 # send some big frame |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
94 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
95 upgrade_write($s, 'foo' x 16384); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
96 like(upgrade_read($s), qr/^(bar){16384}$/, "upgrade big response"); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
97 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
98 # send multiple frames |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
99 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
100 for my $i (1 .. 10) { |
1240
f7eb2875ed45
Tests: avoid interleaved output in Upgrade handling tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1227
diff
changeset
|
101 upgrade_write($s, ('foo' x 16384) . $i, continue => 1); |
f7eb2875ed45
Tests: avoid interleaved output in Upgrade handling tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1227
diff
changeset
|
102 upgrade_write($s, 'bazz' . $i, continue => $i != 10); |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
103 } |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
104 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
105 for my $i (1 .. 10) { |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
106 like(upgrade_read($s), qr/^(bar){16384}\d+$/, "upgrade $i"); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
107 is(upgrade_read($s), 'bazz' . $i, "upgrade small $i"); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
108 } |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
109 } |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
110 |
584
7d6db4ac6ab0
Tests: proxy_upgrade.t tests for bytes sent to a client.
Sergey Kandaurov <pluknet@nginx.com>
parents:
583
diff
changeset
|
111 push @r, $s ? ${*$s}->{_upgrade_private}->{r} : 'failed'; |
583
5276aceb32a6
Tests: style, no functional changes.
Sergey Kandaurov <pluknet@nginx.com>
parents:
368
diff
changeset
|
112 undef $s; |
5276aceb32a6
Tests: style, no functional changes.
Sergey Kandaurov <pluknet@nginx.com>
parents:
368
diff
changeset
|
113 |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
114 # establish connection with some pipelined data |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
115 # and make sure they are correctly passed upstream |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
116 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
117 $s = upgrade_connect(message => "foo"); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
118 ok($s, "handshake pipelined"); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
119 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
120 SKIP: { |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
121 skip "handshake failed", 2 unless $s; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
122 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
123 is(upgrade_read($s), "bar", "response pipelined"); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
124 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
125 upgrade_write($s, "foo"); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
126 is(upgrade_read($s), "bar", "next to pipelined"); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
127 } |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
128 |
584
7d6db4ac6ab0
Tests: proxy_upgrade.t tests for bytes sent to a client.
Sergey Kandaurov <pluknet@nginx.com>
parents:
583
diff
changeset
|
129 push @r, $s ? ${*$s}->{_upgrade_private}->{r} : 'failed'; |
583
5276aceb32a6
Tests: style, no functional changes.
Sergey Kandaurov <pluknet@nginx.com>
parents:
368
diff
changeset
|
130 undef $s; |
5276aceb32a6
Tests: style, no functional changes.
Sergey Kandaurov <pluknet@nginx.com>
parents:
368
diff
changeset
|
131 |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
132 # connection should not be upgraded unless upgrade was actually |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
133 # requested and allowed by configuration |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
134 |
317
a9621dbbd0d4
Tests: remove TODOs with 1.3.x version checks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
280
diff
changeset
|
135 $s = upgrade_connect(noheader => 1); |
277
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
136 ok(!$s, "handshake noupgrade"); |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
137 |
1227
a79bf84726af
Tests: connection upgrade in subrequests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1155
diff
changeset
|
138 # connection upgrade in subrequests shouldn't cause a segfault |
a79bf84726af
Tests: connection upgrade in subrequests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1155
diff
changeset
|
139 |
a79bf84726af
Tests: connection upgrade in subrequests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1155
diff
changeset
|
140 SKIP: { |
a79bf84726af
Tests: connection upgrade in subrequests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1155
diff
changeset
|
141 skip 'leaves coredump', 1 unless $t->has_version('1.13.7') |
a79bf84726af
Tests: connection upgrade in subrequests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1155
diff
changeset
|
142 or $ENV{TEST_NGINX_UNSAFE}; |
a79bf84726af
Tests: connection upgrade in subrequests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1155
diff
changeset
|
143 |
a79bf84726af
Tests: connection upgrade in subrequests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1155
diff
changeset
|
144 $s = upgrade_connect(uri => '/ssi.html'); |
a79bf84726af
Tests: connection upgrade in subrequests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1155
diff
changeset
|
145 ok(!$s, "handshake in subrequests"); |
a79bf84726af
Tests: connection upgrade in subrequests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1155
diff
changeset
|
146 |
a79bf84726af
Tests: connection upgrade in subrequests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1155
diff
changeset
|
147 } |
a79bf84726af
Tests: connection upgrade in subrequests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1155
diff
changeset
|
148 |
584
7d6db4ac6ab0
Tests: proxy_upgrade.t tests for bytes sent to a client.
Sergey Kandaurov <pluknet@nginx.com>
parents:
583
diff
changeset
|
149 # bytes sent on upgraded connection |
7d6db4ac6ab0
Tests: proxy_upgrade.t tests for bytes sent to a client.
Sergey Kandaurov <pluknet@nginx.com>
parents:
583
diff
changeset
|
150 # verify with 1) data actually read by client, 2) expected data from backend |
7d6db4ac6ab0
Tests: proxy_upgrade.t tests for bytes sent to a client.
Sergey Kandaurov <pluknet@nginx.com>
parents:
583
diff
changeset
|
151 |
7d6db4ac6ab0
Tests: proxy_upgrade.t tests for bytes sent to a client.
Sergey Kandaurov <pluknet@nginx.com>
parents:
583
diff
changeset
|
152 $t->stop(); |
7d6db4ac6ab0
Tests: proxy_upgrade.t tests for bytes sent to a client.
Sergey Kandaurov <pluknet@nginx.com>
parents:
583
diff
changeset
|
153 |
7d6db4ac6ab0
Tests: proxy_upgrade.t tests for bytes sent to a client.
Sergey Kandaurov <pluknet@nginx.com>
parents:
583
diff
changeset
|
154 open my $f, '<', "$d/cc.log" or die "Can't open cc.log: $!"; |
7d6db4ac6ab0
Tests: proxy_upgrade.t tests for bytes sent to a client.
Sergey Kandaurov <pluknet@nginx.com>
parents:
583
diff
changeset
|
155 |
7d6db4ac6ab0
Tests: proxy_upgrade.t tests for bytes sent to a client.
Sergey Kandaurov <pluknet@nginx.com>
parents:
583
diff
changeset
|
156 is($f->getline(), shift (@r) . " 540793\n", 'log - bytes'); |
7d6db4ac6ab0
Tests: proxy_upgrade.t tests for bytes sent to a client.
Sergey Kandaurov <pluknet@nginx.com>
parents:
583
diff
changeset
|
157 is($f->getline(), shift (@r) . " 22\n", 'log - bytes pipelined'); |
665
3a8dc14b98ba
Tests: fixed Upgrade handling tests without client abort detection.
Sergey Kandaurov <pluknet@nginx.com>
parents:
589
diff
changeset
|
158 like($f->getline(), qr/\d+ 0\n/, 'log - bytes noupgrade'); |
584
7d6db4ac6ab0
Tests: proxy_upgrade.t tests for bytes sent to a client.
Sergey Kandaurov <pluknet@nginx.com>
parents:
583
diff
changeset
|
159 |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
160 ############################################################################### |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
161 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
162 sub upgrade_connect { |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
163 my (%opts) = @_; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
164 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
165 my $s = IO::Socket::INET->new( |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
166 Proto => 'tcp', |
974
882267679006
Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
952
diff
changeset
|
167 PeerAddr => '127.0.0.1:' . port(8080), |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
168 ) |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
169 or die "Can't connect to nginx: $!\n"; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
170 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
171 # send request, $h->to_string |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
172 |
1227
a79bf84726af
Tests: connection upgrade in subrequests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1155
diff
changeset
|
173 my $uri = $opts{uri} || '/'; |
a79bf84726af
Tests: connection upgrade in subrequests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1155
diff
changeset
|
174 |
a79bf84726af
Tests: connection upgrade in subrequests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1155
diff
changeset
|
175 my $buf = "GET $uri HTTP/1.1" . CRLF |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
176 . "Host: localhost" . CRLF |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
177 . ($opts{noheader} ? '' : "Upgrade: foo" . CRLF) |
368 | 178 . "Connection: Upgrade" . CRLF . CRLF; |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
179 |
1240
f7eb2875ed45
Tests: avoid interleaved output in Upgrade handling tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1227
diff
changeset
|
180 $buf .= $opts{message} . CRLF . 'FIN' if defined $opts{message}; |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
181 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
182 local $SIG{PIPE} = 'IGNORE'; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
183 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
184 log_out($buf); |
279
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
185 $s->syswrite($buf); |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
186 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
187 # read response |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
188 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
189 my $got = ''; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
190 $buf = ''; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
191 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
192 while (1) { |
277
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
193 $buf = upgrade_getline($s); |
280
3dd8c7acf3ad
Tests: fix couple of possible warnings in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
279
diff
changeset
|
194 last unless defined $buf and length $buf; |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
195 log_in($buf); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
196 $got .= $buf; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
197 last if $got =~ /\x0d?\x0a\x0d?\x0a$/; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
198 } |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
199 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
200 # parse server response |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
201 |
277
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
202 return if $got !~ m!HTTP/1.1 101!; |
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
203 |
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
204 # make sure next line is "handshaked" |
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
205 |
280
3dd8c7acf3ad
Tests: fix couple of possible warnings in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
279
diff
changeset
|
206 $buf = upgrade_read($s); |
3dd8c7acf3ad
Tests: fix couple of possible warnings in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
279
diff
changeset
|
207 |
3dd8c7acf3ad
Tests: fix couple of possible warnings in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
279
diff
changeset
|
208 return if !defined $buf or $buf ne 'handshaked'; |
277
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
209 return $s; |
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
210 } |
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
211 |
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
212 sub upgrade_getline { |
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
213 my ($s) = @_; |
925
6bb1f2ccd386
Tests: removed unused variables.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
665
diff
changeset
|
214 my ($h, $buf); |
277
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
215 |
584
7d6db4ac6ab0
Tests: proxy_upgrade.t tests for bytes sent to a client.
Sergey Kandaurov <pluknet@nginx.com>
parents:
583
diff
changeset
|
216 ${*$s}->{_upgrade_private} ||= { b => '', r => 0 }; |
279
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
217 $h = ${*$s}->{_upgrade_private}; |
277
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
218 |
279
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
219 if ($h->{b} =~ /^(.*?\x0a)(.*)/ms) { |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
220 $h->{b} = $2; |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
221 return $1; |
277
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
222 } |
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
223 |
279
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
224 $s->blocking(0); |
1155
d37983612b04
Tests: adjusted read timeout in proxy upgrade tests for slow hosts.
Sergey Kandaurov <pluknet@nginx.com>
parents:
974
diff
changeset
|
225 while (IO::Select->new($s)->can_read(3)) { |
279
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
226 my $n = $s->sysread($buf, 1024); |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
227 last unless $n; |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
228 |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
229 $h->{b} .= $buf; |
584
7d6db4ac6ab0
Tests: proxy_upgrade.t tests for bytes sent to a client.
Sergey Kandaurov <pluknet@nginx.com>
parents:
583
diff
changeset
|
230 $h->{r} += $n; |
279
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
231 |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
232 if ($h->{b} =~ /^(.*?\x0a)(.*)/ms) { |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
233 $h->{b} = $2; |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
234 return $1; |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
235 } |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
236 }; |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
237 } |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
238 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
239 sub upgrade_write { |
1240
f7eb2875ed45
Tests: avoid interleaved output in Upgrade handling tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1227
diff
changeset
|
240 my ($s, $message, %extra) = @_; |
279
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
241 |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
242 $message = $message . CRLF; |
1240
f7eb2875ed45
Tests: avoid interleaved output in Upgrade handling tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1227
diff
changeset
|
243 $message = $message . 'FIN' unless $extra{continue}; |
279
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
244 |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
245 local $SIG{PIPE} = 'IGNORE'; |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
246 |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
247 $s->blocking(0); |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
248 while (IO::Select->new($s)->can_write(1.5)) { |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
249 my $n = $s->syswrite($message); |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
250 last unless $n; |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
251 $message = substr($message, $n); |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
252 last unless length $message; |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
253 } |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
254 |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
255 if (length $message) { |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
256 $s->close(); |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
257 } |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
258 } |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
259 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
260 sub upgrade_read { |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
261 my ($s) = @_; |
277
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
262 my $m = upgrade_getline($s); |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
263 $m =~ s/\x0d?\x0a// if defined $m; |
277
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
264 log_in($m); |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
265 return $m; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
266 } |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
267 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
268 ############################################################################### |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
269 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
270 sub upgrade_fake_daemon { |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
271 my $server = IO::Socket::INET->new( |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
272 Proto => 'tcp', |
974
882267679006
Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
952
diff
changeset
|
273 LocalAddr => '127.0.0.1:' . port(8081), |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
274 Listen => 5, |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
275 Reuse => 1 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
276 ) |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
277 or die "Can't create listening socket: $!\n"; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
278 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
279 while (my $client = $server->accept()) { |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
280 upgrade_handle_client($client); |
589
a9569f57da98
Tests: whitespaces fix.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
584
diff
changeset
|
281 } |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
282 } |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
283 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
284 sub upgrade_handle_client { |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
285 my ($client) = @_; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
286 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
287 $client->autoflush(1); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
288 $client->blocking(0); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
289 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
290 my $poll = IO::Poll->new; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
291 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
292 my $handshake = 1; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
293 my $unfinished = ''; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
294 my $buffer = ''; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
295 my $n; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
296 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
297 log2c("(new connection $client)"); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
298 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
299 while (1) { |
343
e7dc8f4d0a4b
Tests: whitespace and spelling fixes.
Sergey Kandaurov <pluknet@nginx.com>
parents:
317
diff
changeset
|
300 $poll->mask($client => ($buffer ? POLLIN|POLLOUT : POLLIN)); |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
301 my $p = $poll->poll(0.5); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
302 log2c("(poll $p)"); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
303 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
304 foreach my $reader ($poll->handles(POLLIN)) { |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
305 $n = $client->sysread(my $chunk, 65536); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
306 return unless $n; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
307 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
308 log2i($chunk); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
309 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
310 if ($handshake) { |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
311 $buffer .= $chunk; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
312 next unless $buffer =~ /\x0d?\x0a\x0d?\x0a$/; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
313 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
314 log2c("(handshake done)"); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
315 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
316 $handshake = 0; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
317 $buffer = 'HTTP/1.1 101 Switching' . CRLF |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
318 . 'Upgrade: foo' . CRLF |
277
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
319 . 'Connection: Upgrade' . CRLF . CRLF |
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
320 . 'handshaked' . CRLF; |
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
321 |
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
322 log2o($buffer); |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
323 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
324 next; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
325 } |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
326 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
327 $unfinished .= $chunk; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
328 |
1240
f7eb2875ed45
Tests: avoid interleaved output in Upgrade handling tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1227
diff
changeset
|
329 if ($unfinished =~ m/\x0d?\x0aFIN\z/) { |
f7eb2875ed45
Tests: avoid interleaved output in Upgrade handling tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1227
diff
changeset
|
330 $unfinished =~ s/FIN\z//; |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
331 $unfinished =~ s/foo/bar/g; |
277
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
332 log2o($unfinished); |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
333 $buffer .= $unfinished; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
334 $unfinished = ''; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
335 } |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
336 } |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
337 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
338 foreach my $writer ($poll->handles(POLLOUT)) { |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
339 next unless length $buffer; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
340 $n = $writer->syswrite($buffer); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
341 substr $buffer, 0, $n, ''; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
342 } |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
343 } |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
344 } |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
345 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
346 sub log2i { Test::Nginx::log_core('|| <<', @_); } |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
347 sub log2o { Test::Nginx::log_core('|| >>', @_); } |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
348 sub log2c { Test::Nginx::log_core('||', @_); } |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
349 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
350 ############################################################################### |