annotate proxy_chunked.t @ 572:ca54b445d982

Tests: masked nginx bug in proxy next upstream. When iterating through several next upstreams per a worker cycle, a previously reported event about upstream connection error may be improperly applied to the next upstream, thus leading to the invalid connection error. E.g., in kqueue, where the problem is visible, this is caused by "ev->instance" that does not tolerate more than one next upstream at once, and kevents placed on the kqueue separately for read and write events. The change is to limit test case to the only one next upstream.
author Sergey Kandaurov <pluknet@nginx.com>
date Thu, 14 May 2015 11:54:24 +0300
parents 6fe0459b6668
children f02dac68d584
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
85
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1 #!/usr/bin/perl
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3 # (C) Maxim Dounin
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
5 # Test for http backend returning response with Transfer-Encoding: chunked.
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
6
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
7 # Since nginx uses HTTP/1.0 in requests to backend it's backend bug, but we
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
8 # want to handle this gracefully. And anyway chunked support will be required
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
9 # for HTTP/1.1 backend connections.
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
10
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
11 ###############################################################################
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
12
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
13 use warnings;
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
14 use strict;
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
15
121
8ac1faaddd2c Tests: better handle various configure arguments.
Maxim Dounin <mdounin@mdounin.ru>
parents: 107
diff changeset
16 use Test::More;
85
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
17
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
18 use IO::Select;
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
19
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
20 BEGIN { use FindBin; chdir($FindBin::Bin); }
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
21
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
22 use lib 'lib';
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
23 use Test::Nginx;
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
24
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
25 ###############################################################################
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
26
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
27 select STDERR; $| = 1;
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
28 select STDOUT; $| = 1;
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
29
121
8ac1faaddd2c Tests: better handle various configure arguments.
Maxim Dounin <mdounin@mdounin.ru>
parents: 107
diff changeset
30 my $t = Test::Nginx->new()->has(qw/http proxy ssi/)->plan(3);
85
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
31
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
32 $t->write_file_expand('nginx.conf', <<'EOF');
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
33
107
1c0ec30614c6 Tests: add TEST_GLOBALS and TEST_GLOBALS_HTTP config chunks.
Maxim Dounin <mdounin@mdounin.ru>
parents: 94
diff changeset
34 %%TEST_GLOBALS%%
1c0ec30614c6 Tests: add TEST_GLOBALS and TEST_GLOBALS_HTTP config chunks.
Maxim Dounin <mdounin@mdounin.ru>
parents: 94
diff changeset
35
249
6a0d934950bc Tests: remove extra spaces in "daemon off".
Maxim Dounin <mdounin@mdounin.ru>
parents: 224
diff changeset
36 daemon off;
85
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
37
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
38 events {
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
39 }
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
40
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
41 http {
107
1c0ec30614c6 Tests: add TEST_GLOBALS and TEST_GLOBALS_HTTP config chunks.
Maxim Dounin <mdounin@mdounin.ru>
parents: 94
diff changeset
42 %%TEST_GLOBALS_HTTP%%
85
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
43
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
44 server {
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
45 listen 127.0.0.1:8080;
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
46 server_name localhost;
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
47
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
48 location / {
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
49 proxy_pass http://127.0.0.1:8081;
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
50 proxy_read_timeout 1s;
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
51 }
94
9ab3762332b9 Tests: chunked tests for unbuffered and inmemory proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 85
diff changeset
52 location /nobuffering {
9ab3762332b9 Tests: chunked tests for unbuffered and inmemory proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 85
diff changeset
53 proxy_pass http://127.0.0.1:8081;
9ab3762332b9 Tests: chunked tests for unbuffered and inmemory proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 85
diff changeset
54 proxy_read_timeout 1s;
9ab3762332b9 Tests: chunked tests for unbuffered and inmemory proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 85
diff changeset
55 proxy_buffering off;
9ab3762332b9 Tests: chunked tests for unbuffered and inmemory proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 85
diff changeset
56 }
9ab3762332b9 Tests: chunked tests for unbuffered and inmemory proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 85
diff changeset
57 location /inmemory.html {
9ab3762332b9 Tests: chunked tests for unbuffered and inmemory proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 85
diff changeset
58 ssi on;
9ab3762332b9 Tests: chunked tests for unbuffered and inmemory proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 85
diff changeset
59 }
85
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
60 }
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
61 }
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
62
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
63 EOF
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
64
94
9ab3762332b9 Tests: chunked tests for unbuffered and inmemory proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 85
diff changeset
65 $t->write_file('inmemory.html',
9ab3762332b9 Tests: chunked tests for unbuffered and inmemory proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 85
diff changeset
66 '<!--#include virtual="/" set="one" --><!--#echo var="one" -->');
9ab3762332b9 Tests: chunked tests for unbuffered and inmemory proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 85
diff changeset
67
85
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
68 $t->run_daemon(\&http_chunked_daemon);
295
6fe0459b6668 Tests: eliminate startup races in proxy and fastcgi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 249
diff changeset
69 $t->run()->waitforsocket('127.0.0.1:8081');
85
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
70
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
71 ###############################################################################
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
72
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
73 like(http_get('/'), qr/\x0d\x0aSEE-THIS$/s, 'chunked');
94
9ab3762332b9 Tests: chunked tests for unbuffered and inmemory proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 85
diff changeset
74 like(http_get('/nobuffering'), qr/\x0d\x0aSEE-THIS$/s, 'chunked nobuffering');
9ab3762332b9 Tests: chunked tests for unbuffered and inmemory proxy.
Maxim Dounin <mdounin@mdounin.ru>
parents: 85
diff changeset
75 like(http_get('/inmemory.html'), qr/\x0d\x0aSEE-THIS$/s, 'chunked inmemory');
85
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
76
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
77 ###############################################################################
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
78
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
79 sub http_chunked_daemon {
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
80 my $server = IO::Socket::INET->new(
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
81 Proto => 'tcp',
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
82 LocalAddr => '127.0.0.1:8081',
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
83 Listen => 5,
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
84 Reuse => 1
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
85 )
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
86 or die "Can't create listening socket: $!\n";
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
87
295
6fe0459b6668 Tests: eliminate startup races in proxy and fastcgi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 249
diff changeset
88 local $SIG{PIPE} = 'IGNORE';
6fe0459b6668 Tests: eliminate startup races in proxy and fastcgi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 249
diff changeset
89
85
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
90 while (my $client = $server->accept()) {
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
91 $client->autoflush(1);
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
92
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
93 while (<$client>) {
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
94 last if (/^\x0d?\x0a?$/);
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
95 }
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
96
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
97 print $client <<'EOF';
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
98 HTTP/1.1 200 OK
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
99 Connection: close
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
100 Transfer-Encoding: chunked
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
101
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
102 9
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
103 SEE-THIS
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
104
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
105 0
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
106
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
107 EOF
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
108
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
109 close $client;
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
110 }
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
111 }
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
112
1bf5eca1c4a9 Tests: add test for chunked transfer-coding from backend.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
113 ###############################################################################