Mercurial > hg > nginx-tests
annotate proxy_upgrade.t @ 663:4765f3981d91
Tests: fixed extra check for the presence of SSL_VERIFY_NONE.
author | Sergey Kandaurov <pluknet@nginx.com> |
---|---|
date | Wed, 26 Aug 2015 14:14:31 +0300 |
parents | a9569f57da98 |
children | 3a8dc14b98ba |
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 { |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
47 listen 127.0.0.1:8080; |
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 / { |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
51 proxy_pass http://127.0.0.1:8081; |
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 |
274
ccebd3168b5b
Tests: fix startup race in proxy_websocket.t, proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
263
diff
changeset
|
68 $t->waitforsocket('127.0.0.1:8081') |
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'); |
7d6db4ac6ab0
Tests: proxy_upgrade.t tests for bytes sent to a client.
Sergey Kandaurov <pluknet@nginx.com>
parents:
583
diff
changeset
|
141 is($f->getline(), "0 0\n", 'log - bytes noupgrade'); |
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', |
583
5276aceb32a6
Tests: style, no functional changes.
Sergey Kandaurov <pluknet@nginx.com>
parents:
368
diff
changeset
|
150 PeerAddr => '127.0.0.1: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) = @_; |
279
c754b1c79efe
Tests: better timeout handling in proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
277
diff
changeset
|
195 my ($h, $buf, $line); |
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', |
71bb2a896c7a
Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
253 LocalAddr => '127.0.0.1:8081', |
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 ############################################################################### |