Mercurial > hg > nginx-tests
annotate proxy_upgrade.t @ 1021:ebdf239722b9
Tests: relaxed proxy_cache_lock.t nolock tests to fix on Solaris.
Assumed that the order of responses being arrived in nolock case may be ignored.
An important part of such case is that the only last response should be cached.
author | Sergey Kandaurov <pluknet@nginx.com> |
---|---|
date | Fri, 02 Sep 2016 12:17:35 +0300 |
parents | 882267679006 |
children | d37983612b04 |
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 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
30 my $t = Test::Nginx->new()->has(qw/http proxy/) |
584
7d6db4ac6ab0
Tests: proxy_upgrade.t tests for bytes sent to a client.
Sergey Kandaurov <pluknet@nginx.com>
parents:
583
diff
changeset
|
31 ->write_file_expand('nginx.conf', <<'EOF')->plan(30); |
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 } |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
58 } |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
59 } |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
60 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
61 EOF |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
62 |
584
7d6db4ac6ab0
Tests: proxy_upgrade.t tests for bytes sent to a client.
Sergey Kandaurov <pluknet@nginx.com>
parents:
583
diff
changeset
|
63 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
|
64 |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
65 $t->run_daemon(\&upgrade_fake_daemon); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
66 $t->run(); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
67 |
974
882267679006
Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
952
diff
changeset
|
68 $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
|
69 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
|
70 |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
71 ############################################################################### |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
72 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
73 # establish connection |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
74 |
584
7d6db4ac6ab0
Tests: proxy_upgrade.t tests for bytes sent to a client.
Sergey Kandaurov <pluknet@nginx.com>
parents:
583
diff
changeset
|
75 my @r; |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
76 my $s = upgrade_connect(); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
77 ok($s, "handshake"); |
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 SKIP: { |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
80 skip "handshake failed", 22 unless $s; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
81 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
82 # send a frame |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
83 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
84 upgrade_write($s, 'foo'); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
85 is(upgrade_read($s), 'bar', "upgrade response"); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
86 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
87 # send some big frame |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
88 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
89 upgrade_write($s, 'foo' x 16384); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
90 like(upgrade_read($s), qr/^(bar){16384}$/, "upgrade big response"); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
91 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
92 # send multiple frames |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
93 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
94 for my $i (1 .. 10) { |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
95 upgrade_write($s, ('foo' x 16384) . $i); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
96 upgrade_write($s, 'bazz' . $i); |
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 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
99 for my $i (1 .. 10) { |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
100 like(upgrade_read($s), qr/^(bar){16384}\d+$/, "upgrade $i"); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
101 is(upgrade_read($s), 'bazz' . $i, "upgrade small $i"); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
102 } |
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 |
584
7d6db4ac6ab0
Tests: proxy_upgrade.t tests for bytes sent to a client.
Sergey Kandaurov <pluknet@nginx.com>
parents:
583
diff
changeset
|
105 push @r, $s ? ${*$s}->{_upgrade_private}->{r} : 'failed'; |
583
5276aceb32a6
Tests: style, no functional changes.
Sergey Kandaurov <pluknet@nginx.com>
parents:
368
diff
changeset
|
106 undef $s; |
5276aceb32a6
Tests: style, no functional changes.
Sergey Kandaurov <pluknet@nginx.com>
parents:
368
diff
changeset
|
107 |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
108 # establish connection with some pipelined data |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
109 # and make sure they are correctly passed upstream |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
110 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
111 $s = upgrade_connect(message => "foo"); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
112 ok($s, "handshake pipelined"); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
113 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
114 SKIP: { |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
115 skip "handshake failed", 2 unless $s; |
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 is(upgrade_read($s), "bar", "response pipelined"); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
118 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
119 upgrade_write($s, "foo"); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
120 is(upgrade_read($s), "bar", "next to pipelined"); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
121 } |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
122 |
584
7d6db4ac6ab0
Tests: proxy_upgrade.t tests for bytes sent to a client.
Sergey Kandaurov <pluknet@nginx.com>
parents:
583
diff
changeset
|
123 push @r, $s ? ${*$s}->{_upgrade_private}->{r} : 'failed'; |
583
5276aceb32a6
Tests: style, no functional changes.
Sergey Kandaurov <pluknet@nginx.com>
parents:
368
diff
changeset
|
124 undef $s; |
5276aceb32a6
Tests: style, no functional changes.
Sergey Kandaurov <pluknet@nginx.com>
parents:
368
diff
changeset
|
125 |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
126 # connection should not be upgraded unless upgrade was actually |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
127 # requested and allowed by configuration |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
128 |
317
a9621dbbd0d4
Tests: remove TODOs with 1.3.x version checks.
Maxim Dounin <mdounin@mdounin.ru>
parents:
280
diff
changeset
|
129 $s = upgrade_connect(noheader => 1); |
277
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
130 ok(!$s, "handshake noupgrade"); |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
131 |
584
7d6db4ac6ab0
Tests: proxy_upgrade.t tests for bytes sent to a client.
Sergey Kandaurov <pluknet@nginx.com>
parents:
583
diff
changeset
|
132 # 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
|
133 # 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
|
134 |
7d6db4ac6ab0
Tests: proxy_upgrade.t tests for bytes sent to a client.
Sergey Kandaurov <pluknet@nginx.com>
parents:
583
diff
changeset
|
135 $t->stop(); |
7d6db4ac6ab0
Tests: proxy_upgrade.t tests for bytes sent to a client.
Sergey Kandaurov <pluknet@nginx.com>
parents:
583
diff
changeset
|
136 |
7d6db4ac6ab0
Tests: proxy_upgrade.t tests for bytes sent to a client.
Sergey Kandaurov <pluknet@nginx.com>
parents:
583
diff
changeset
|
137 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
|
138 |
7d6db4ac6ab0
Tests: proxy_upgrade.t tests for bytes sent to a client.
Sergey Kandaurov <pluknet@nginx.com>
parents:
583
diff
changeset
|
139 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
|
140 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
|
141 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
|
142 |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
143 ############################################################################### |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
144 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
145 sub upgrade_connect { |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
146 my (%opts) = @_; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
147 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
148 my $s = IO::Socket::INET->new( |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
149 Proto => 'tcp', |
974
882267679006
Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
952
diff
changeset
|
150 PeerAddr => '127.0.0.1:' . port(8080), |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
151 ) |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
152 or die "Can't connect to nginx: $!\n"; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
153 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
154 # send request, $h->to_string |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
155 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
156 my $buf = "GET / HTTP/1.1" . CRLF |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
157 . "Host: localhost" . CRLF |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
158 . ($opts{noheader} ? '' : "Upgrade: foo" . CRLF) |
368 | 159 . "Connection: Upgrade" . CRLF . CRLF; |
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 $buf .= $opts{message} . CRLF if defined $opts{message}; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
162 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
163 local $SIG{PIPE} = 'IGNORE'; |
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 log_out($buf); |
279
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
166 $s->syswrite($buf); |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
167 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
168 # read response |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
169 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
170 my $got = ''; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
171 $buf = ''; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
172 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
173 while (1) { |
277
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
174 $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
|
175 last unless defined $buf and length $buf; |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
176 log_in($buf); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
177 $got .= $buf; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
178 last if $got =~ /\x0d?\x0a\x0d?\x0a$/; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
179 } |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
180 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
181 # parse server response |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
182 |
277
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
183 return if $got !~ m!HTTP/1.1 101!; |
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
184 |
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
185 # make sure next line is "handshaked" |
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
186 |
280
3dd8c7acf3ad
Tests: fix couple of possible warnings in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
279
diff
changeset
|
187 $buf = upgrade_read($s); |
3dd8c7acf3ad
Tests: fix couple of possible warnings in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
279
diff
changeset
|
188 |
3dd8c7acf3ad
Tests: fix couple of possible warnings in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
279
diff
changeset
|
189 return if !defined $buf or $buf ne 'handshaked'; |
277
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
190 return $s; |
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
191 } |
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
192 |
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
193 sub upgrade_getline { |
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
194 my ($s) = @_; |
925
6bb1f2ccd386
Tests: removed unused variables.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
665
diff
changeset
|
195 my ($h, $buf); |
277
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
196 |
584
7d6db4ac6ab0
Tests: proxy_upgrade.t tests for bytes sent to a client.
Sergey Kandaurov <pluknet@nginx.com>
parents:
583
diff
changeset
|
197 ${*$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
|
198 $h = ${*$s}->{_upgrade_private}; |
277
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
199 |
279
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
200 if ($h->{b} =~ /^(.*?\x0a)(.*)/ms) { |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
201 $h->{b} = $2; |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
202 return $1; |
277
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 |
279
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
205 $s->blocking(0); |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
206 while (IO::Select->new($s)->can_read(1.5)) { |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
207 my $n = $s->sysread($buf, 1024); |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
208 last unless $n; |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
209 |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
210 $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
|
211 $h->{r} += $n; |
279
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
212 |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
213 if ($h->{b} =~ /^(.*?\x0a)(.*)/ms) { |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
214 $h->{b} = $2; |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
215 return $1; |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
216 } |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
217 }; |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
218 } |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
219 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
220 sub upgrade_write { |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
221 my ($s, $message) = @_; |
279
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
222 |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
223 $message = $message . CRLF; |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
224 |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
225 local $SIG{PIPE} = 'IGNORE'; |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
226 |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
227 $s->blocking(0); |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
228 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
|
229 my $n = $s->syswrite($message); |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
230 last unless $n; |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
231 $message = substr($message, $n); |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
232 last unless length $message; |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
233 } |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
234 |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
235 if (length $message) { |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
236 $s->close(); |
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
237 } |
263
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 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
240 sub upgrade_read { |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
241 my ($s) = @_; |
277
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
242 my $m = upgrade_getline($s); |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
243 $m =~ s/\x0d?\x0a// if defined $m; |
277
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
244 log_in($m); |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
245 return $m; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
246 } |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
247 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
248 ############################################################################### |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
249 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
250 sub upgrade_fake_daemon { |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
251 my $server = IO::Socket::INET->new( |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
252 Proto => 'tcp', |
974
882267679006
Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
952
diff
changeset
|
253 LocalAddr => '127.0.0.1:' . port(8081), |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
254 Listen => 5, |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
255 Reuse => 1 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
256 ) |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
257 or die "Can't create listening socket: $!\n"; |
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 while (my $client = $server->accept()) { |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
260 upgrade_handle_client($client); |
589
a9569f57da98
Tests: whitespaces fix.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
584
diff
changeset
|
261 } |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
262 } |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
263 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
264 sub upgrade_handle_client { |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
265 my ($client) = @_; |
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 $client->autoflush(1); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
268 $client->blocking(0); |
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 my $poll = IO::Poll->new; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
271 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
272 my $handshake = 1; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
273 my $unfinished = ''; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
274 my $buffer = ''; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
275 my $n; |
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 log2c("(new connection $client)"); |
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 (1) { |
343
e7dc8f4d0a4b
Tests: whitespace and spelling fixes.
Sergey Kandaurov <pluknet@nginx.com>
parents:
317
diff
changeset
|
280 $poll->mask($client => ($buffer ? POLLIN|POLLOUT : POLLIN)); |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
281 my $p = $poll->poll(0.5); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
282 log2c("(poll $p)"); |
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 foreach my $reader ($poll->handles(POLLIN)) { |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
285 $n = $client->sysread(my $chunk, 65536); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
286 return unless $n; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
287 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
288 log2i($chunk); |
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 if ($handshake) { |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
291 $buffer .= $chunk; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
292 next unless $buffer =~ /\x0d?\x0a\x0d?\x0a$/; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
293 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
294 log2c("(handshake done)"); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
295 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
296 $handshake = 0; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
297 $buffer = 'HTTP/1.1 101 Switching' . CRLF |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
298 . 'Upgrade: foo' . CRLF |
277
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
299 . 'Connection: Upgrade' . CRLF . CRLF |
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
300 . 'handshaked' . CRLF; |
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
301 |
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
302 log2o($buffer); |
263
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 next; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
305 } |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
306 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
307 $unfinished .= $chunk; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
308 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
309 if ($unfinished =~ m/\x0d?\x0a\z/) { |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
310 $unfinished =~ s/foo/bar/g; |
277
8a41f7d38cc3
Tests: fix proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
311 log2o($unfinished); |
263
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
312 $buffer .= $unfinished; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
313 $unfinished = ''; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
314 } |
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 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
317 foreach my $writer ($poll->handles(POLLOUT)) { |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
318 next unless length $buffer; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
319 $n = $writer->syswrite($buffer); |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
320 substr $buffer, 0, $n, ''; |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
321 } |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
322 } |
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 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
325 sub log2i { Test::Nginx::log_core('|| <<', @_); } |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
326 sub log2o { Test::Nginx::log_core('|| >>', @_); } |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
327 sub log2c { Test::Nginx::log_core('||', @_); } |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
328 |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
329 ############################################################################### |