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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
fc6b8270469c Tests: fixed typos.
Sergey Kandaurov <pluknet@nginx.com>
parents: 343
diff changeset
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 ###############################################################################