Mercurial > hg > nginx-tests
annotate ssl_proxy_upgrade.t @ 1752:ba6e24e38f03
Tests: improved stop_daemons() to send signal again.
As was observed, it's possible that a signal to complete a uwsgi daemon
can be ignored while it is starting up, which results in tests hang due
to eternal waiting on child processes termination. Notably, it is seen
when running tests with a high number of prove jobs on a low-profile VM
against nginx with broken modules and/or configuration. To reproduce:
$ TEST_NGINX_GLOBALS=ERROR prove -j16 uwsgi*.t
Inspecting uwsgi under ktrace on FreeBSD confirms that a SIGTERM signal
is ignored at the very beginning of uwsgi startup. It is then replaced
with a default action after listen(), thus waiting until uwsgi is ready
to accept new TCP connections doesn't completely solve the hang window.
The fix is to retry sending a signal some time after waitpid(WNOHANG)
continuously demonstrated no progress with reaping a signaled process.
It is modelled after f13ead27f89c that improved stop() for nginx.
author | Sergey Kandaurov <pluknet@nginx.com> |
---|---|
date | Wed, 29 Dec 2021 22:29:23 +0300 |
parents | dbce8fb5f5f8 |
children | cdcd75657e52 |
rev | line source |
---|---|
585
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1 #!/usr/bin/perl |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
3 # (C) Maxim Dounin |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
4 # (C) Sergey Kandaurov |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
5 # (C) Nginx, Inc. |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
6 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
7 # Tests for http proxy upgrade support with http ssl module. |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
8 # In contrast to proxy_websocket.t, this test doesn't try to use binary |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
9 # WebSocket protocol, but uses simple plain text protocol instead. |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
10 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
11 ############################################################################### |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
12 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
13 use warnings; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
14 use strict; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
15 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
16 use Test::More; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
17 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
18 use IO::Poll; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
19 use IO::Select; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
20 use Socket qw/ CRLF /; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
21 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
22 BEGIN { use FindBin; chdir($FindBin::Bin); } |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
23 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
24 use lib 'lib'; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
25 use Test::Nginx; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
26 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
27 ############################################################################### |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
28 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
29 select STDERR; $| = 1; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
30 select STDOUT; $| = 1; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
31 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
32 eval { require IO::Socket::SSL; }; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
33 plan(skip_all => 'IO::Socket::SSL not installed') if $@; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
34 eval { IO::Socket::SSL::SSL_VERIFY_NONE(); }; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
35 plan(skip_all => 'IO::Socket::SSL too old') if $@; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
36 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
37 my $t = Test::Nginx->new()->has(qw/http proxy http_ssl/)->has_daemon('openssl') |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
38 ->write_file_expand('nginx.conf', <<'EOF')->plan(30); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
39 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
40 %%TEST_GLOBALS%% |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
41 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
42 daemon off; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
43 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
44 events { |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
45 } |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
46 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
47 http { |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
48 %%TEST_GLOBALS_HTTP%% |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
49 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
50 log_format test "$bytes_sent $body_bytes_sent"; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
51 access_log %%TESTDIR%%/cc.log test; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
52 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
53 server { |
974
882267679006
Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
952
diff
changeset
|
54 listen 127.0.0.1:8080 ssl; |
585
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
55 server_name localhost; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
56 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
57 ssl_certificate_key localhost.key; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
58 ssl_certificate localhost.crt; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
59 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
60 location / { |
974
882267679006
Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
952
diff
changeset
|
61 proxy_pass http://127.0.0.1:8081; |
585
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
62 proxy_http_version 1.1; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
63 proxy_set_header Upgrade $http_upgrade; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
64 proxy_set_header Connection "Upgrade"; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
65 proxy_read_timeout 2s; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
66 send_timeout 2s; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
67 } |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
68 } |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
69 } |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
70 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
71 EOF |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
72 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
73 $t->write_file('openssl.conf', <<EOF); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
74 [ req ] |
1488
dbce8fb5f5f8
Tests: align with OpenSSL security level 2.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1240
diff
changeset
|
75 default_bits = 2048 |
585
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
76 encrypt_key = no |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
77 distinguished_name = req_distinguished_name |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
78 [ req_distinguished_name ] |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
79 EOF |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
80 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
81 my $d = $t->testdir(); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
82 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
83 foreach my $name ('localhost') { |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
84 system('openssl req -x509 -new ' |
1220
0af58b78df35
Tests: removed single quotes from system() calls.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1156
diff
changeset
|
85 . "-config $d/openssl.conf -subj /CN=$name/ " |
0af58b78df35
Tests: removed single quotes from system() calls.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1156
diff
changeset
|
86 . "-out $d/$name.crt -keyout $d/$name.key " |
585
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
87 . ">>$d/openssl.out 2>&1") == 0 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
88 or die "Can't create certificate for $name: $!\n"; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
89 } |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
90 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
91 $t->run_daemon(\&upgrade_fake_daemon); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
92 $t->run(); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
93 |
974
882267679006
Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
952
diff
changeset
|
94 $t->waitforsocket('127.0.0.1:' . port(8081)) |
585
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
95 or die "Can't start test backend"; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
96 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
97 ############################################################################### |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
98 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
99 # establish connection |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
100 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
101 my @r; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
102 my $s = upgrade_connect(); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
103 ok($s, "handshake"); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
104 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
105 SKIP: { |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
106 skip "handshake failed", 22 unless $s; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
107 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
108 # send a frame |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
109 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
110 upgrade_write($s, 'foo'); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
111 is(upgrade_read($s), 'bar', "upgrade response"); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
112 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
113 # send some big frame |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
114 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
115 upgrade_write($s, 'foo' x 16384); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
116 like(upgrade_read($s), qr/^(bar){16384}$/, "upgrade big response"); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
117 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
118 # send multiple frames |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
119 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
120 for my $i (1 .. 10) { |
1240
f7eb2875ed45
Tests: avoid interleaved output in Upgrade handling tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1220
diff
changeset
|
121 upgrade_write($s, ('foo' x 16384) . $i, continue => 1); |
f7eb2875ed45
Tests: avoid interleaved output in Upgrade handling tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1220
diff
changeset
|
122 upgrade_write($s, 'bazz' . $i, continue => $i != 10); |
585
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
123 } |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
124 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
125 for my $i (1 .. 10) { |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
126 like(upgrade_read($s), qr/^(bar){16384}\d+$/, "upgrade $i"); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
127 is(upgrade_read($s), 'bazz' . $i, "upgrade small $i"); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
128 } |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
129 } |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
130 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
131 push @r, $s ? ${*$s}->{_upgrade_private}->{r} : 'failed'; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
132 undef $s; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
133 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
134 # establish connection with some pipelined data |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
135 # and make sure they are correctly passed upstream |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
136 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
137 $s = upgrade_connect(message => "foo"); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
138 ok($s, "handshake pipelined"); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
139 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
140 SKIP: { |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
141 skip "handshake failed", 2 unless $s; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
142 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
143 is(upgrade_read($s), "bar", "response pipelined"); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
144 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
145 upgrade_write($s, "foo"); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
146 is(upgrade_read($s), "bar", "next to pipelined"); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
147 } |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
148 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
149 push @r, $s ? ${*$s}->{_upgrade_private}->{r} : 'failed'; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
150 undef $s; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
151 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
152 # connection should not be upgraded unless upgrade was actually |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
153 # requested and allowed by configuration |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
154 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
155 $s = upgrade_connect(noheader => 1); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
156 ok(!$s, "handshake noupgrade"); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
157 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
158 # bytes sent on upgraded connection, fixed in c2f309fb7ad2 (1.7.11) |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
159 # verify with 1) data actually read by client, 2) expected data from backend |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
160 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
161 $t->stop(); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
162 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
163 open my $f, '<', "$d/cc.log" or die "Can't open cc.log: $!"; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
164 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
165 is($f->getline(), shift (@r) . " 540793\n", 'log - bytes'); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
166 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:
602
diff
changeset
|
167 like($f->getline(), qr/\d+ 0\n/, 'log - bytes noupgrade'); |
585
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
168 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
169 ############################################################################### |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
170 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
171 sub upgrade_connect { |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
172 my (%opts) = @_; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
173 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
174 my $s = IO::Socket::SSL->new( |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
175 Proto => 'tcp', |
974
882267679006
Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
952
diff
changeset
|
176 PeerAddr => '127.0.0.1:' . port(8080), |
585
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
177 SSL_verify_mode => IO::Socket::SSL::SSL_VERIFY_NONE(), |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
178 ) |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
179 or die "Can't connect to nginx: $!\n"; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
180 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
181 # send request, $h->to_string |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
182 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
183 my $buf = "GET / HTTP/1.1" . CRLF |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
184 . "Host: localhost" . CRLF |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
185 . ($opts{noheader} ? '' : "Upgrade: foo" . CRLF) |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
186 . "Connection: Upgrade" . CRLF . CRLF; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
187 |
1240
f7eb2875ed45
Tests: avoid interleaved output in Upgrade handling tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1220
diff
changeset
|
188 $buf .= $opts{message} . CRLF . 'FIN' if defined $opts{message}; |
585
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
189 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
190 local $SIG{PIPE} = 'IGNORE'; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
191 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
192 log_out($buf); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
193 $s->syswrite($buf); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
194 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
195 # read response |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
196 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
197 my $got = ''; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
198 $buf = ''; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
199 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
200 while (1) { |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
201 $buf = upgrade_getline($s); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
202 last unless defined $buf and length $buf; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
203 log_in($buf); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
204 $got .= $buf; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
205 last if $got =~ /\x0d?\x0a\x0d?\x0a$/; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
206 } |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
207 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
208 # parse server response |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
209 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
210 return if $got !~ m!HTTP/1.1 101!; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
211 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
212 # make sure next line is "handshaked" |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
213 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
214 $buf = upgrade_read($s); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
215 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
216 return if !defined $buf or $buf ne 'handshaked'; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
217 return $s; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
218 } |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
219 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
220 sub upgrade_getline { |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
221 my ($s) = @_; |
925
6bb1f2ccd386
Tests: removed unused variables.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
665
diff
changeset
|
222 my ($h, $buf); |
585
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
223 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
224 ${*$s}->{_upgrade_private} ||= { b => '', r => 0 }; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
225 $h = ${*$s}->{_upgrade_private}; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
226 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
227 if ($h->{b} =~ /^(.*?\x0a)(.*)/ms) { |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
228 $h->{b} = $2; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
229 return $1; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
230 } |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
231 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
232 $s->blocking(0); |
1155
d37983612b04
Tests: adjusted read timeout in proxy upgrade tests for slow hosts.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1116
diff
changeset
|
233 while (IO::Select->new($s)->can_read(3)) { |
602
1177e4dd249a
Tests: read in full-size SSL records in ssl_proxy_upgrade.t.
Sergey Kandaurov <pluknet@nginx.com>
parents:
591
diff
changeset
|
234 my $n = $s->sysread($buf, 16384); |
1156
d12c45f14102
Tests: handled EOF in ssl_proxy_upgrade.t.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1155
diff
changeset
|
235 if (!defined $n) { |
591
0b059d5e6887
Tests: retry on SSL_WANT_READ in ssl_proxy_upgrade.t.
Sergey Kandaurov <pluknet@nginx.com>
parents:
589
diff
changeset
|
236 next if $s->errstr() == IO::Socket::SSL->SSL_WANT_READ; |
0b059d5e6887
Tests: retry on SSL_WANT_READ in ssl_proxy_upgrade.t.
Sergey Kandaurov <pluknet@nginx.com>
parents:
589
diff
changeset
|
237 last; |
1156
d12c45f14102
Tests: handled EOF in ssl_proxy_upgrade.t.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1155
diff
changeset
|
238 |
d12c45f14102
Tests: handled EOF in ssl_proxy_upgrade.t.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1155
diff
changeset
|
239 } elsif (!$n) { |
d12c45f14102
Tests: handled EOF in ssl_proxy_upgrade.t.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1155
diff
changeset
|
240 last; |
591
0b059d5e6887
Tests: retry on SSL_WANT_READ in ssl_proxy_upgrade.t.
Sergey Kandaurov <pluknet@nginx.com>
parents:
589
diff
changeset
|
241 } |
585
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
242 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
243 $h->{b} .= $buf; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
244 $h->{r} += $n; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
245 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
246 if ($h->{b} =~ /^(.*?\x0a)(.*)/ms) { |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
247 $h->{b} = $2; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
248 return $1; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
249 } |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
250 }; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
251 } |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
252 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
253 sub upgrade_write { |
1240
f7eb2875ed45
Tests: avoid interleaved output in Upgrade handling tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1220
diff
changeset
|
254 my ($s, $message, %extra) = @_; |
585
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
255 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
256 $message = $message . CRLF; |
1240
f7eb2875ed45
Tests: avoid interleaved output in Upgrade handling tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1220
diff
changeset
|
257 $message = $message . 'FIN' unless $extra{continue}; |
585
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
258 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
259 local $SIG{PIPE} = 'IGNORE'; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
260 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
261 $s->blocking(0); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
262 while (IO::Select->new($s)->can_write(1.5)) { |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
263 my $n = $s->syswrite($message); |
588
53b7c3c33a79
Tests: retry on SSL_WANT_WRITE in ssl_proxy_upgrade.t.
Sergey Kandaurov <pluknet@nginx.com>
parents:
585
diff
changeset
|
264 unless ($n) { |
53b7c3c33a79
Tests: retry on SSL_WANT_WRITE in ssl_proxy_upgrade.t.
Sergey Kandaurov <pluknet@nginx.com>
parents:
585
diff
changeset
|
265 next if $s->errstr() == IO::Socket::SSL->SSL_WANT_WRITE; |
53b7c3c33a79
Tests: retry on SSL_WANT_WRITE in ssl_proxy_upgrade.t.
Sergey Kandaurov <pluknet@nginx.com>
parents:
585
diff
changeset
|
266 last; |
53b7c3c33a79
Tests: retry on SSL_WANT_WRITE in ssl_proxy_upgrade.t.
Sergey Kandaurov <pluknet@nginx.com>
parents:
585
diff
changeset
|
267 } |
585
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
268 $message = substr($message, $n); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
269 last unless length $message; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
270 } |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
271 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
272 if (length $message) { |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
273 $s->close(); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
274 } |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
275 } |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
276 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
277 sub upgrade_read { |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
278 my ($s) = @_; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
279 my $m = upgrade_getline($s); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
280 $m =~ s/\x0d?\x0a// if defined $m; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
281 log_in($m); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
282 return $m; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
283 } |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
284 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
285 ############################################################################### |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
286 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
287 sub upgrade_fake_daemon { |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
288 my $server = IO::Socket::INET->new( |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
289 Proto => 'tcp', |
974
882267679006
Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
952
diff
changeset
|
290 LocalAddr => '127.0.0.1:' . port(8081), |
585
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
291 Listen => 5, |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
292 Reuse => 1 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
293 ) |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
294 or die "Can't create listening socket: $!\n"; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
295 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
296 while (my $client = $server->accept()) { |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
297 upgrade_handle_client($client); |
589
a9569f57da98
Tests: whitespaces fix.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
588
diff
changeset
|
298 } |
585
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
299 } |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
300 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
301 sub upgrade_handle_client { |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
302 my ($client) = @_; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
303 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
304 $client->autoflush(1); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
305 $client->blocking(0); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
306 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
307 my $poll = IO::Poll->new; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
308 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
309 my $handshake = 1; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
310 my $unfinished = ''; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
311 my $buffer = ''; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
312 my $n; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
313 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
314 log2c("(new connection $client)"); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
315 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
316 while (1) { |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
317 $poll->mask($client => ($buffer ? POLLIN|POLLOUT : POLLIN)); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
318 my $p = $poll->poll(0.5); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
319 log2c("(poll $p)"); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
320 |
925
6bb1f2ccd386
Tests: removed unused variables.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
665
diff
changeset
|
321 foreach ($poll->handles(POLLIN)) { |
585
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
322 $n = $client->sysread(my $chunk, 65536); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
323 return unless $n; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
324 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
325 log2i($chunk); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
326 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
327 if ($handshake) { |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
328 $buffer .= $chunk; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
329 next unless $buffer =~ /\x0d?\x0a\x0d?\x0a$/; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
330 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
331 log2c("(handshake done)"); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
332 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
333 $handshake = 0; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
334 $buffer = 'HTTP/1.1 101 Switching' . CRLF |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
335 . 'Upgrade: foo' . CRLF |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
336 . 'Connection: Upgrade' . CRLF . CRLF |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
337 . 'handshaked' . CRLF; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
338 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
339 log2o($buffer); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
340 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
341 next; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
342 } |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
343 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
344 $unfinished .= $chunk; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
345 |
1240
f7eb2875ed45
Tests: avoid interleaved output in Upgrade handling tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1220
diff
changeset
|
346 if ($unfinished =~ m/\x0d?\x0aFIN\z/) { |
f7eb2875ed45
Tests: avoid interleaved output in Upgrade handling tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1220
diff
changeset
|
347 $unfinished =~ s/FIN\z//; |
585
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
348 $unfinished =~ s/foo/bar/g; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
349 log2o($unfinished); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
350 $buffer .= $unfinished; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
351 $unfinished = ''; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
352 } |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
353 } |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
354 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
355 foreach my $writer ($poll->handles(POLLOUT)) { |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
356 next unless length $buffer; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
357 $n = $writer->syswrite($buffer); |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
358 substr $buffer, 0, $n, ''; |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
359 } |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
360 } |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
361 } |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
362 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
363 sub log2i { Test::Nginx::log_core('|| <<', @_); } |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
364 sub log2o { Test::Nginx::log_core('|| >>', @_); } |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
365 sub log2c { Test::Nginx::log_core('||', @_); } |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
366 |
5bb19f7448b5
Tests: Upgrade handling tests with http ssl module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
367 ############################################################################### |