annotate proxy_upgrade.t @ 274:ccebd3168b5b

Tests: fix startup race in proxy_websocket.t, proxy_upgrade.t. Additionally, incorrect skip count fixed in proxy_upgrade.t.
author Maxim Dounin <mdounin@mdounin.ru>
date Thu, 21 Mar 2013 21:23:53 +0400
parents 71bb2a896c7a
children 8a41f7d38cc3
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
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
5 # Tests for http proxy upgrade support. In contrast to proxy_websocket.t
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
6 # this test doesn't try to use binary WebSocket protocol, but uses simple
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
7 # plain text protol instead.
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 IO::Socket::INET;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
19 use Socket qw/ CRLF /;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
20
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
21 BEGIN { use FindBin; chdir($FindBin::Bin); }
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
22
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
23 use lib 'lib';
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
24 use Test::Nginx;
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
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
28 select STDERR; $| = 1;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
29 select STDOUT; $| = 1;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
30
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
31 my $t = Test::Nginx->new()->has(qw/http proxy/)
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
32 ->write_file_expand('nginx.conf', <<'EOF')->plan(28);
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
33
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
34 %%TEST_GLOBALS%%
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
35
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
36 daemon off;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
37
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
38 events {
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
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
41 http {
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
42 %%TEST_GLOBALS_HTTP%%
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
43
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
44 server {
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
45 listen 127.0.0.1:8080;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
46 server_name localhost;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
47
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
48 location / {
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
49 proxy_pass http://127.0.0.1:8081;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
50 proxy_http_version 1.1;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
51 proxy_set_header Upgrade $http_upgrade;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
52 proxy_set_header Connection "Upgrade";
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
53 proxy_read_timeout 2s;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
54 send_timeout 2s;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
55 }
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
56 }
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 EOF
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 $t->run_daemon(\&upgrade_fake_daemon);
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
62 $t->run();
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
63
274
ccebd3168b5b Tests: fix startup race in proxy_websocket.t, proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents: 263
diff changeset
64 $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
65 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
66
263
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
67 ###############################################################################
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
68
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
69 TODO: {
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
70 local $TODO = 'not yet' unless $t->has_version('1.3.13');
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 # establish connection
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
73
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
74 my $s = upgrade_connect();
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
75 ok($s, "handshake");
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
76
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
77 SKIP: {
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
78 skip "handshake failed", 22 unless $s;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
79
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
80 # send a frame
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 upgrade_write($s, 'foo');
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
83 is(upgrade_read($s), 'bar', "upgrade response");
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
84
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
85 # send some big frame
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 upgrade_write($s, 'foo' x 16384);
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
88 like(upgrade_read($s), qr/^(bar){16384}$/, "upgrade big response");
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
89
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
90 # send multiple frames
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 for my $i (1 .. 10) {
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
93 upgrade_write($s, ('foo' x 16384) . $i);
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
94 upgrade_write($s, 'bazz' . $i);
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
95 }
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
96
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
97 for my $i (1 .. 10) {
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
98 like(upgrade_read($s), qr/^(bar){16384}\d+$/, "upgrade $i");
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
99 is(upgrade_read($s), 'bazz' . $i, "upgrade small $i");
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
100 }
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
101 }
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 # establish connection with some pipelined data
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
104 # and make sure they are correctly passed upstream
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
105
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
106 undef $s;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
107 $s = upgrade_connect(message => "foo");
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
108 ok($s, "handshake pipelined");
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
109
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
110 SKIP: {
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
111 skip "handshake failed", 2 unless $s;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
112
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
113 is(upgrade_read($s), "bar", "response pipelined");
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
114
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
115 upgrade_write($s, "foo");
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
116 is(upgrade_read($s), "bar", "next to pipelined");
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
117 }
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 # connection should not be upgraded unless upgrade was actually
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
120 # requested and allowed by configuration
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 undef $s;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
123 $s = upgrade_connect(noheader => 1);
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
124 ok($s, "handshake noupgrade");
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
125
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
126 SKIP: {
274
ccebd3168b5b Tests: fix startup race in proxy_websocket.t, proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents: 263
diff changeset
127 skip "handshake failed", 1 unless $s;
263
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
128
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
129 upgrade_write($s, "foo");
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
130 isnt(upgrade_read($s), "bar", "after handshake noupgrade");
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
131 }
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
132
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
133 }
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
134
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
135 ###############################################################################
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
136
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
137 sub upgrade_connect {
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
138 my (%opts) = @_;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
139
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
140 my $s = IO::Socket::INET->new(
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
141 Proto => 'tcp',
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
142 PeerAddr => '127.0.0.1:8080'
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 or die "Can't connect to nginx: $!\n";
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
145
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
146 # send request, $h->to_string
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 $buf = "GET / HTTP/1.1" . CRLF
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
149 . "Host: localhost" . CRLF
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
150 . ($opts{noheader} ? '' : "Upgrade: foo" . CRLF)
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
151 . "Connection: Upgade" . CRLF . CRLF;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
152
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
153 $buf .= $opts{message} . CRLF if defined $opts{message};
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
154
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
155 local $SIG{PIPE} = 'IGNORE';
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
156
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
157 log_out($buf);
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
158 $s->print($buf);
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
159
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
160 # read response
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
161
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
162 my $got = '';
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
163 $buf = '';
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 while (1) {
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
166 $buf = $s->getline();
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
167 last unless length $buf;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
168 log_in($buf);
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
169 $got .= $buf;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
170 last if $got =~ /\x0d?\x0a\x0d?\x0a$/;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
171 }
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 # parse server response
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
174
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
175 return $s if $got =~ m!HTTP/1.1 101!;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
176 }
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
177
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
178 sub upgrade_write {
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
179 my ($s, $message) = @_;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
180 $s->print($message . CRLF);
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
181 }
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
182
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
183 sub upgrade_read {
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
184 my ($s) = @_;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
185 my $m = $s->getline();
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
186 $m =~ s/\x0d?\x0a// if defined $m;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
187 return $m;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
188 }
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
189
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
190 ###############################################################################
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
191
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
192 sub upgrade_fake_daemon {
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
193 my $server = IO::Socket::INET->new(
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
194 Proto => 'tcp',
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
195 LocalAddr => '127.0.0.1:8081',
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
196 Listen => 5,
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
197 Reuse => 1
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
198 )
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
199 or die "Can't create listening socket: $!\n";
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
200
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
201 while (my $client = $server->accept()) {
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
202 upgrade_handle_client($client);
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
203 }
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
204 }
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
205
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
206 sub upgrade_handle_client {
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
207 my ($client) = @_;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
208
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
209 $client->autoflush(1);
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
210 $client->blocking(0);
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
211
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
212 my $poll = IO::Poll->new;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
213
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
214 my $handshake = 1;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
215 my $unfinished = '';
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
216 my $buffer = '';
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
217 my $n;
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 log2c("(new connection $client)");
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
220
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
221 while (1) {
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
222 $poll->mask($client => ($buffer ? POLLIN|POLLOUT : POLLIN));
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
223 my $p = $poll->poll(0.5);
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
224 log2c("(poll $p)");
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
225
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
226 foreach my $reader ($poll->handles(POLLIN)) {
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
227 $n = $client->sysread(my $chunk, 65536);
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
228 return unless $n;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
229
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
230 log2i($chunk);
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
231
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
232 if ($handshake) {
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
233 $buffer .= $chunk;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
234 next unless $buffer =~ /\x0d?\x0a\x0d?\x0a$/;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
235
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
236 log2c("(handshake done)");
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
237
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
238 $handshake = 0;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
239 $buffer = 'HTTP/1.1 101 Switching' . CRLF
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
240 . 'Upgrade: foo' . CRLF
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
241 . 'Connection: Upgrade' . CRLF . CRLF;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
242
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
243 next;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
244 }
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
245
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
246 $unfinished .= $chunk;
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 if ($unfinished =~ m/\x0d?\x0a\z/) {
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
249 $unfinished =~ s/foo/bar/g;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
250 $buffer .= $unfinished;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
251 $unfinished = '';
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
252 }
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
253 }
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
254
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
255 foreach my $writer ($poll->handles(POLLOUT)) {
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
256 next unless length $buffer;
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
257 $n = $writer->syswrite($buffer);
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
258 substr $buffer, 0, $n, '';
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
259 }
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
260 }
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
261 }
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 sub log2i { Test::Nginx::log_core('|| <<', @_); }
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
264 sub log2o { Test::Nginx::log_core('|| >>', @_); }
71bb2a896c7a Tests: more Upgrade handling tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
265 sub log2c { Test::Nginx::log_core('||', @_); }
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 ###############################################################################