annotate h2_server_push.t @ 1905:f35824e75b66

Tests: fixed reading QUIC streams on Perl < 5.24. The parse_stream() routine has had a missing explicit return if there were no streams received. In Perl < 5.24 this used to return no value, or an empty array in the list context. In modern Perl this returns an empty value, or an array of 1 element, which made the check for last index of the returned array work rather by accident. The fix is to return explicitly and to check the array size in callers instead.
author Sergey Kandaurov <pluknet@nginx.com>
date Tue, 06 Jun 2023 18:50:07 +0400
parents 236d038dc04a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1279
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
1 #!/usr/bin/perl
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
2
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
3 # (C) Sergey Kandaurov
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
4 # (C) Nginx, Inc.
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
5
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
6 # Tests for HTTP/2 server push.
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
7
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
8 ###############################################################################
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
9
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
10 use warnings;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
11 use strict;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
12
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
13 use Test::More;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
14
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
15 BEGIN { use FindBin; chdir($FindBin::Bin); }
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
16
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
17 use lib 'lib';
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
18 use Test::Nginx;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
19 use Test::Nginx::HTTP2;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
20
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
21 ###############################################################################
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
22
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
23 select STDERR; $| = 1;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
24 select STDOUT; $| = 1;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
25
1734
f7170c7acf3a Tests: added HTTP/2 tests for PUSH_PROMISE with CONTINUATION.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1535
diff changeset
26 my $t = Test::Nginx->new()->has(qw/http http_v2 proxy rewrite gzip/)->plan(54)
1279
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
27 ->write_file_expand('nginx.conf', <<'EOF');
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
28
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
29 %%TEST_GLOBALS%%
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
30
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
31 daemon off;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
32
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
33 events {
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
34 }
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
35
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
36 http {
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
37 %%TEST_GLOBALS_HTTP%%
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
38
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
39 server {
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
40 listen 127.0.0.1:8080 http2;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
41 listen 127.0.0.1:8081;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
42 server_name localhost;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
43
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
44 location /prio {
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
45 http2_push /t1;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
46 http2_push /t2;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
47 return 204;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
48 }
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
49
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
50 location /expl {
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
51 http2_push /push;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
52 http2_push /push2;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
53
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
54 location /expl/off {
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
55 http2_push off;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
56 }
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
57 }
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
58
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
59 location /preload {
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
60 http2_push_preload on;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
61 add_header Link "</push>; rel=preload";
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
62 add_header X-Link $sent_http_link;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
63 return 200 SEE-THIS;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
64 }
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
65
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
66 location /preload2 {
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
67 http2_push_preload on;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
68 add_header Link "</push>; rel=preload"; # valid
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
69 add_header Link "</push2 >; rel=preload"; # valid
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
70 add_header Link "</push3>; rel=preloadX"; # not
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
71 add_header Link '</push4>; rel="preload"'; # valid
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
72 add_header Link '</push5>; rel="preloadX"'; # not
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
73 add_header Link "</push6>; rel=preload; nopush"; # not
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
74 add_header Link '</push7>; rel="foo"'; # not
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
75 add_header Link '</push7>; rel="foo preload"'; # valid
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
76 return 200 SEE-THIS;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
77 }
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
78
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
79 location /preload/many {
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
80 http2_push_preload on;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
81 add_header Link "</push>; rel=preload, </push2>; rel=preload";
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
82 add_header Link "</push3>, </push4>; rel=preload";
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
83 return 200 SEE-THIS;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
84 }
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
85
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
86 location /preload/proxy {
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
87 http2_push_preload on;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
88 proxy_pass http://127.0.0.1:8081/proxied;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
89 }
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
90
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
91 location /proxied {
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
92 add_header Link "</push>; rel=preload";
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
93 add_header Link "</push2>; rel=preload";
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
94 return 200 SEE-THIS;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
95 }
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
96
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
97 location /both {
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
98 http2_push /push;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
99 http2_push_preload on;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
100 add_header Link "</push>; rel=preload";
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
101 return 200 SEE-THIS;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
102 }
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
103
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
104 location /arg {
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
105 http2_push $arg_push;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
106 return 204;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
107 }
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
108
1734
f7170c7acf3a Tests: added HTTP/2 tests for PUSH_PROMISE with CONTINUATION.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1535
diff changeset
109 location /continuation {
f7170c7acf3a Tests: added HTTP/2 tests for PUSH_PROMISE with CONTINUATION.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1535
diff changeset
110 http2_push /push?arg="$args$args$args$args";
f7170c7acf3a Tests: added HTTP/2 tests for PUSH_PROMISE with CONTINUATION.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1535
diff changeset
111 return 204;
f7170c7acf3a Tests: added HTTP/2 tests for PUSH_PROMISE with CONTINUATION.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1535
diff changeset
112 }
f7170c7acf3a Tests: added HTTP/2 tests for PUSH_PROMISE with CONTINUATION.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1535
diff changeset
113
1279
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
114 location /push {
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
115 return 200 PROMISED;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
116 }
1284
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
117
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
118 location /gzip.html {
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
119 gzip on;
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
120 gzip_min_length 0;
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
121 return 200 PROMISED;
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
122 }
1279
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
123 }
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
124
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
125 server {
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
126 listen 127.0.0.1:8082 http2;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
127 server_name max_pushes;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
128
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
129 http2_max_concurrent_pushes 2;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
130 http2_push /push;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
131 http2_push /push;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
132 http2_push /push;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
133 }
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
134 }
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
135
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
136 EOF
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
137
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
138 $t->write_file('t1', join('', map { sprintf "X%04dXXX", $_ } (1 .. 8202)));
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
139 $t->write_file('t2', 'SEE-THIS');
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
140 $t->write_file('explf', join('', map { sprintf "X%06dXXX", $_ } (1 .. 6553)));
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
141
1900
236d038dc04a Tests: suppress "listen .. http2;" deprecation warnings.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1734
diff changeset
142 # suppress deprecation warning
236d038dc04a Tests: suppress "listen .. http2;" deprecation warnings.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1734
diff changeset
143
236d038dc04a Tests: suppress "listen .. http2;" deprecation warnings.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1734
diff changeset
144 open OLDERR, ">&", \*STDERR; close STDERR;
1381
97c8280de681 Tests: removed TODO and try_run() checks for legacy versions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1348
diff changeset
145 $t->run();
1900
236d038dc04a Tests: suppress "listen .. http2;" deprecation warnings.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1734
diff changeset
146 open STDERR, ">&", \*OLDERR;
1279
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
147
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
148 ###############################################################################
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
149
1348
8cb66a4d3ca2 Tests: fixed HTTP/2 server push expectations, adjusted TODO.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1340
diff changeset
150 # 6.6. PUSH_PROMISE
8cb66a4d3ca2 Tests: fixed HTTP/2 server push expectations, adjusted TODO.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1340
diff changeset
151 # PUSH_PROMISE frames MUST only be sent on a peer-initiated stream that
8cb66a4d3ca2 Tests: fixed HTTP/2 server push expectations, adjusted TODO.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1340
diff changeset
152 # is in either the "open" or "half-closed (remote)" state.
8cb66a4d3ca2 Tests: fixed HTTP/2 server push expectations, adjusted TODO.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1340
diff changeset
153
1279
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
154 # preload & format
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
155
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
156 my $s = Test::Nginx::HTTP2->new();
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
157 my $sid = $s->new_stream({ path => '/preload' });
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
158 my $frames = $s->read(all => [{ sid => 1, fin => 1 }, { sid => 2, fin => 1 }]);
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
159
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
160 my ($frame) = grep { $_->{type} eq "PUSH_PROMISE" } @$frames;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
161 ok($frame, 'push promise');
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
162 is($frame->{headers}->{':authority'}, 'localhost', 'authority');
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
163 is($frame->{headers}->{':scheme'}, 'http', 'scheme');
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
164 is($frame->{headers}->{':method'}, 'GET', 'method');
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
165 is($frame->{headers}->{':path'}, '/push', 'path');
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
166 is($frame->{flags}, 4, 'flags');
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
167 is($frame->{promised}, 2, 'promised stream');
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
168
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
169 ($frame) = grep { $_->{type} eq "DATA" && $_->{sid} eq 2 } @$frames;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
170 is($frame->{data}, 'PROMISED', 'promised stream payload');
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
171
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
172 ($frame) = grep { $_->{type} eq "HEADERS" && $_->{sid} eq $sid } @$frames;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
173 is($frame->{headers}->{'x-link'}, '</push>; rel=preload', 'sent_http_link');
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
174
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
175 $s = Test::Nginx::HTTP2->new();
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
176 $sid = $s->new_stream({ path => '/preload2' });
1348
8cb66a4d3ca2 Tests: fixed HTTP/2 server push expectations, adjusted TODO.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1340
diff changeset
177 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
1279
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
178 is(grep({ $_->{type} eq "PUSH_PROMISE" } @$frames), 4, 'preload 2');
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
179
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
180 $s = Test::Nginx::HTTP2->new();
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
181 $sid = $s->new_stream({ path => '/preload/many' });
1348
8cb66a4d3ca2 Tests: fixed HTTP/2 server push expectations, adjusted TODO.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1340
diff changeset
182 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
1279
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
183 is(grep({ $_->{type} eq "PUSH_PROMISE" } @$frames), 3, 'preload many');
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
184
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
185 # preload proxy
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
186
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
187 $s = Test::Nginx::HTTP2->new();
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
188 $sid = $s->new_stream({ path => '/preload/proxy' });
1348
8cb66a4d3ca2 Tests: fixed HTTP/2 server push expectations, adjusted TODO.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1340
diff changeset
189 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
1279
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
190 is(grep({ $_->{type} eq "PUSH_PROMISE" } @$frames), 2, 'preload proxy');
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
191
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
192 # both h2_push & preload
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
193
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
194 $s = Test::Nginx::HTTP2->new();
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
195 $sid = $s->new_stream({ path => '/both' });
1348
8cb66a4d3ca2 Tests: fixed HTTP/2 server push expectations, adjusted TODO.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1340
diff changeset
196 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
1282
fd281e3a3df5 Tests: better test names in h2_server_push.t.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1281
diff changeset
197 is(grep({ $_->{type} eq "PUSH_PROMISE" } @$frames), 2, 'h2_push and preload');
1279
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
198
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
199 # h2_push
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
200
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
201 $s = Test::Nginx::HTTP2->new();
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
202 $sid = $s->new_stream({ path => '/expl' });
1348
8cb66a4d3ca2 Tests: fixed HTTP/2 server push expectations, adjusted TODO.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1340
diff changeset
203 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
1279
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
204
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
205 ($frame) = grep { $_->{type} eq "PUSH_PROMISE" } @$frames;
1282
fd281e3a3df5 Tests: better test names in h2_server_push.t.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1281
diff changeset
206 ok($frame, 'h2_push only');
1279
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
207
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
208 # h2_push off
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
209
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
210 $s = Test::Nginx::HTTP2->new();
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
211 $sid = $s->new_stream({ path => '/expl/off' });
1348
8cb66a4d3ca2 Tests: fixed HTTP/2 server push expectations, adjusted TODO.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1340
diff changeset
212 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
1279
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
213
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
214 ($frame) = grep { $_->{type} eq "PUSH_PROMISE" } @$frames;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
215 ok(!$frame, 'h2_push off');
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
216
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
217 # h2_push $var
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
218
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
219 $s = Test::Nginx::HTTP2->new();
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
220 $sid = $s->new_stream({ path => '/arg?push=/push' });
1348
8cb66a4d3ca2 Tests: fixed HTTP/2 server push expectations, adjusted TODO.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1340
diff changeset
221 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
1279
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
222 ($frame) = grep { $_->{type} eq "PUSH_PROMISE" } @$frames;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
223 ok($frame, 'h2_push variable');
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
224
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
225 $sid = $s->new_stream({ path => '/arg?push=' });
1348
8cb66a4d3ca2 Tests: fixed HTTP/2 server push expectations, adjusted TODO.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1340
diff changeset
226 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
1279
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
227 ($frame) = grep { $_->{type} eq "PUSH_PROMISE" } @$frames;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
228 ok(!$frame, 'h2_push variable empty');
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
229
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
230 $sid = $s->new_stream({ path => '/arg?push=off' });
1348
8cb66a4d3ca2 Tests: fixed HTTP/2 server push expectations, adjusted TODO.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1340
diff changeset
231 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
1279
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
232 ($frame) = grep { $_->{type} eq "PUSH_PROMISE" } @$frames;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
233 ok(!$frame, 'h2_push variable off');
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
234
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
235 $sid = $s->new_stream({ path => '/arg?push=foo' });
1348
8cb66a4d3ca2 Tests: fixed HTTP/2 server push expectations, adjusted TODO.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1340
diff changeset
236 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
1279
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
237 ($frame) = grep { $_->{type} eq "PUSH_PROMISE" } @$frames;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
238 ok(!$frame, 'h2_push variable relative path');
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
239
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
240 # SETTINGS_ENABLE_PUSH
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
241
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
242 $s = Test::Nginx::HTTP2->new();
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
243 $s->h2_settings(0, 0x2 => 0);
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
244 $sid = $s->new_stream({ path => '/expl' });
1348
8cb66a4d3ca2 Tests: fixed HTTP/2 server push expectations, adjusted TODO.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1340
diff changeset
245 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
1279
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
246
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
247 ($frame) = grep { $_->{type} eq "PUSH_PROMISE" } @$frames;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
248 ok(!$frame, 'push setting disabled');
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
249
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
250 $s->h2_settings(0, 0x2 => 1);
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
251 $sid = $s->new_stream({ path => '/expl' });
1348
8cb66a4d3ca2 Tests: fixed HTTP/2 server push expectations, adjusted TODO.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1340
diff changeset
252 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
1279
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
253
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
254 ($frame) = grep { $_->{type} eq "PUSH_PROMISE" } @$frames;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
255 ok($frame, 'push setting enabled');
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
256
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
257 $s->h2_settings(0, 0x2 => 42);
1281
5bbade306a0d Tests: unbreak h2_server_push.t on win32.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1280
diff changeset
258 $frames = $s->read(all => [{ type => 'GOAWAY' }]);
1279
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
259
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
260 ($frame) = grep { $_->{type} =~ "GOAWAY" } @$frames;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
261 is($frame->{'code'}, 1, 'push setting invalid - GOAWAY protocol error');
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
262 cmp_ok($frame->{'last_sid'}, '<', 5, 'push setting invalid - last sid');
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
263
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
264 # SETTINGS_MAX_CONCURRENT_STREAMS
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
265
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
266 $s = Test::Nginx::HTTP2->new();
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
267 $sid = $s->new_stream({ path => '/expl' });
1348
8cb66a4d3ca2 Tests: fixed HTTP/2 server push expectations, adjusted TODO.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1340
diff changeset
268 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
1279
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
269 is(grep({ $_->{type} eq "PUSH_PROMISE" } @$frames), 2, 'max pushes default');
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
270
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
271 $s = Test::Nginx::HTTP2->new();
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
272 $s->h2_settings(0, 0x3 => 1);
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
273 $sid = $s->new_stream({ path => '/expl' });
1348
8cb66a4d3ca2 Tests: fixed HTTP/2 server push expectations, adjusted TODO.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1340
diff changeset
274 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
1279
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
275 is(grep({ $_->{type} eq "PUSH_PROMISE" } @$frames), 1, 'max pushes limited');
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
276
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
277 $s = Test::Nginx::HTTP2->new();
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
278 $s->h2_settings(0, 0x3 => 0);
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
279 $sid = $s->new_stream({ path => '/expl' });
1348
8cb66a4d3ca2 Tests: fixed HTTP/2 server push expectations, adjusted TODO.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1340
diff changeset
280 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
1279
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
281 is(grep({ $_->{type} eq "PUSH_PROMISE" } @$frames), 0, 'max pushes disabled');
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
282
1280
8a88c0d6f80a Tests: TODO HTTP/2 server push flow control tests with "aio on".
Sergey Kandaurov <pluknet@nginx.com>
parents: 1279
diff changeset
283 TODO: {
1348
8cb66a4d3ca2 Tests: fixed HTTP/2 server push expectations, adjusted TODO.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1340
diff changeset
284 todo_skip 'long tests with aio', 6 unless $ENV{TEST_NGINX_UNSAFE}
8cb66a4d3ca2 Tests: fixed HTTP/2 server push expectations, adjusted TODO.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1340
diff changeset
285 or $t->read_file('nginx.conf') !~ /aio (on|threads)/;
8cb66a4d3ca2 Tests: fixed HTTP/2 server push expectations, adjusted TODO.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1340
diff changeset
286 local $TODO = 'not yet' if $t->read_file('nginx.conf') =~ /aio (on|threads)/;
1280
8a88c0d6f80a Tests: TODO HTTP/2 server push flow control tests with "aio on".
Sergey Kandaurov <pluknet@nginx.com>
parents: 1279
diff changeset
287
1279
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
288 # server push flow control & rst
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
289
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
290 $s = Test::Nginx::HTTP2->new();
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
291 $sid = $s->new_stream({ path => '/explf' });
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
292 $frames = $s->read(all => [
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
293 { sid => 1, fin => 1 },
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
294 { sid => 2, length => 5 },
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
295 { sid => 4, fin => 4 }]);
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
296
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
297 ($frame) = grep { $_->{type} eq "DATA" && $_->{sid} == 2 } @$frames;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
298 is($frame->{length}, 5, 'flow control - pushed stream limited');
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
299 is($frame->{flags}, 0, 'flow control - pushed stream flags');
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
300
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
301 ($frame) = grep { $_->{type} eq "DATA" && $_->{sid} == 4 } @$frames;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
302 ok(!$frame, 'flow control - no window for next stream');
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
303
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
304 # window update
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
305
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
306 $s->h2_window(2);
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
307
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
308 $frames = $s->read(all => [{ length => 2 }]);
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
309 ($frame) = grep { $_->{type} eq "DATA" && $_->{sid} == 2 } @$frames;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
310 is($frame->{length}, 2, 'window update');
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
311
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
312 # client refused stream
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
313
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
314 $s->h2_rst(4, 7);
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
315 $s->h2_window(2**16);
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
316
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
317 $frames = $s->read(all => [{ sid => 2, length => 1 }]);
1348
8cb66a4d3ca2 Tests: fixed HTTP/2 server push expectations, adjusted TODO.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1340
diff changeset
318 push @$frames, @{ $s->read(all => [{ sid => 4, fin => 1 }], wait => 0.2) };
1279
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
319
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
320 ($frame) = grep { $_->{type} eq "DATA" && $_->{sid} == 2 } @$frames;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
321 is($frame->{length}, 1, 'pushed response flow control');
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
322 is($frame->{flags}, 1, 'pushed response END_STREAM');
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
323
1280
8a88c0d6f80a Tests: TODO HTTP/2 server push flow control tests with "aio on".
Sergey Kandaurov <pluknet@nginx.com>
parents: 1279
diff changeset
324 }
8a88c0d6f80a Tests: TODO HTTP/2 server push flow control tests with "aio on".
Sergey Kandaurov <pluknet@nginx.com>
parents: 1279
diff changeset
325
1279
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
326 ($frame) = grep { $_->{type} eq "DATA" && $_->{sid} == 4 } @$frames;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
327 ok(!$frame, 'rst pushed stream');
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
328
1280
8a88c0d6f80a Tests: TODO HTTP/2 server push flow control tests with "aio on".
Sergey Kandaurov <pluknet@nginx.com>
parents: 1279
diff changeset
329 TODO: {
1348
8cb66a4d3ca2 Tests: fixed HTTP/2 server push expectations, adjusted TODO.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1340
diff changeset
330 todo_skip 'long tests with aio', 2 unless $ENV{TEST_NGINX_UNSAFE}
8cb66a4d3ca2 Tests: fixed HTTP/2 server push expectations, adjusted TODO.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1340
diff changeset
331 or $t->read_file('nginx.conf') !~ /aio (on|threads)/;
8cb66a4d3ca2 Tests: fixed HTTP/2 server push expectations, adjusted TODO.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1340
diff changeset
332 local $TODO = 'not yet' if $t->read_file('nginx.conf') =~ /aio (on|threads)/;
1280
8a88c0d6f80a Tests: TODO HTTP/2 server push flow control tests with "aio on".
Sergey Kandaurov <pluknet@nginx.com>
parents: 1279
diff changeset
333
1279
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
334 # priority
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
335
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
336 $s = Test::Nginx::HTTP2->new();
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
337 $sid = $s->new_stream({ path => '/prio' });
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
338 $frames = $s->read(all => [{ length => 2**16 - 1 }, { sid => 4, fin => 4 }]);
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
339
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
340 $s->h2_priority(16, 2, 4);
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
341
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
342 $s->h2_window(2**17, 2);
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
343 $s->h2_window(2**17, 4);
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
344 $s->h2_window(2**17);
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
345
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
346 $frames = $s->read(all => [{ sid => 2, fin => 1 }, { sid => 4, fin => 1 }]);
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
347 my @data = grep { $_->{type} eq "DATA" } @$frames;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
348 is(join(' ', map { $_->{sid} } @data), "4 2", 'priority 1');
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
349
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
350 $s = Test::Nginx::HTTP2->new();
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
351 $sid = $s->new_stream({ path => '/prio' });
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
352 $frames = $s->read(all => [{ length => 2**16 - 1 }, { sid => 4, fin => 4 }]);
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
353
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
354 $s->h2_priority(16, 4, 2);
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
355
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
356 $s->h2_window(2**17, 2);
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
357 $s->h2_window(2**17, 4);
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
358 $s->h2_window(2**17);
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
359
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
360 $frames = $s->read(all => [{ sid => 2, fin => 1 }, { sid => 4, fin => 1 }]);
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
361 @data = grep { $_->{type} eq "DATA" } @$frames;
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
362 is(join(' ', map { $_->{sid} } @data), "2 4", 'priority 2');
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
363
1280
8a88c0d6f80a Tests: TODO HTTP/2 server push flow control tests with "aio on".
Sergey Kandaurov <pluknet@nginx.com>
parents: 1279
diff changeset
364 }
8a88c0d6f80a Tests: TODO HTTP/2 server push flow control tests with "aio on".
Sergey Kandaurov <pluknet@nginx.com>
parents: 1279
diff changeset
365
1279
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
366 # http2_max_concurrent_pushes
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
367
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
368 $s = Test::Nginx::HTTP2->new(port(8082));
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
369 $sid = $s->new_stream({ headers => [
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
370 { name => ':method', value => 'GET', mode => 0 },
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
371 { name => ':scheme', value => 'http', mode => 0 },
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
372 { name => ':path', value => '/', mode => 0 },
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
373 { name => ':authority', value => 'max_pushes', mode => 1 }]});
1348
8cb66a4d3ca2 Tests: fixed HTTP/2 server push expectations, adjusted TODO.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1340
diff changeset
374 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
1279
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
375 is(grep({ $_->{type} eq "PUSH_PROMISE" } @$frames), 2, 'http2 max pushes lim');
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
376
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
377 $s = Test::Nginx::HTTP2->new(port(8082));
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
378 $s->h2_settings(0, 0x3 => 1);
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
379 $sid = $s->new_stream({ headers => [
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
380 { name => ':method', value => 'GET', mode => 0 },
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
381 { name => ':scheme', value => 'http', mode => 0 },
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
382 { name => ':path', value => '/', mode => 0 },
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
383 { name => ':authority', value => 'max_pushes', mode => 1 }]});
1348
8cb66a4d3ca2 Tests: fixed HTTP/2 server push expectations, adjusted TODO.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1340
diff changeset
384 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
1279
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
385 is(grep({ $_->{type} eq "PUSH_PROMISE" } @$frames), 1, 'http2 max pushes 2');
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
386
1283
16f091962811 Tests: added h2_server_push.t test for missing ':authority'.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1282
diff changeset
387 # missing request header ':authority'
16f091962811 Tests: added h2_server_push.t test for missing ':authority'.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1282
diff changeset
388
16f091962811 Tests: added h2_server_push.t test for missing ':authority'.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1282
diff changeset
389 $s = Test::Nginx::HTTP2->new(port(8082));
16f091962811 Tests: added h2_server_push.t test for missing ':authority'.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1282
diff changeset
390 $sid = $s->new_stream({ headers => [
16f091962811 Tests: added h2_server_push.t test for missing ':authority'.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1282
diff changeset
391 { name => ':method', value => 'GET', mode => 0 },
16f091962811 Tests: added h2_server_push.t test for missing ':authority'.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1282
diff changeset
392 { name => ':scheme', value => 'http', mode => 0 },
16f091962811 Tests: added h2_server_push.t test for missing ':authority'.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1282
diff changeset
393 { name => ':path', value => '/', mode => 0 }]});
16f091962811 Tests: added h2_server_push.t test for missing ':authority'.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1282
diff changeset
394 $frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
16f091962811 Tests: added h2_server_push.t test for missing ':authority'.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1282
diff changeset
395
16f091962811 Tests: added h2_server_push.t test for missing ':authority'.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1282
diff changeset
396 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
16f091962811 Tests: added h2_server_push.t test for missing ':authority'.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1282
diff changeset
397 is($frame->{headers}->{':status'}, 400, 'incomplete headers');
16f091962811 Tests: added h2_server_push.t test for missing ':authority'.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1282
diff changeset
398
1284
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
399 # gzip tests
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
400
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
401 $s = Test::Nginx::HTTP2->new();
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
402 $sid = $s->new_stream({ headers => [
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
403 { name => ':method', value => 'GET', mode => 0 },
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
404 { name => ':scheme', value => 'http', mode => 0 },
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
405 { name => ':path', value => '/arg?push=/gzip.html' },
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
406 { name => ':authority', value => 'localhost', mode => 1 },
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
407 { name => 'accept-encoding', value => 'gzip' }]});
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
408 $frames = $s->read(all => [{ sid => 2, fin => 1 }]);
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
409
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
410 ($frame) = grep { $_->{type} eq "PUSH_PROMISE" && $_->{sid} == $sid } @$frames;
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
411 is($frame->{headers}->{'accept-encoding'}, 'gzip', 'gzip - push promise');
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
412
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
413 ($frame) = grep { $_->{type} eq "HEADERS" && $_->{sid} == 2 } @$frames;
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
414 is($frame->{headers}->{'content-encoding'}, 'gzip', 'gzip - headers');
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
415
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
416 ($frame) = grep { $_->{type} eq "DATA" && $_->{sid} == 2 } @$frames;
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
417 gunzip_like($frame->{data}, qr/^PROMISED\Z/, 'gzip - response');
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
418
1327
ecbd984ffe04 Tests: added HTTP/2 test for server push with original scheme.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1289
diff changeset
419 # scheme https
ecbd984ffe04 Tests: added HTTP/2 test for server push with original scheme.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1289
diff changeset
420
ecbd984ffe04 Tests: added HTTP/2 test for server push with original scheme.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1289
diff changeset
421 $s = Test::Nginx::HTTP2->new();
ecbd984ffe04 Tests: added HTTP/2 test for server push with original scheme.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1289
diff changeset
422 $sid = $s->new_stream({ headers => [
ecbd984ffe04 Tests: added HTTP/2 test for server push with original scheme.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1289
diff changeset
423 { name => ':method', value => 'GET', mode => 0 },
ecbd984ffe04 Tests: added HTTP/2 test for server push with original scheme.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1289
diff changeset
424 { name => ':scheme', value => 'https', mode => 0 },
ecbd984ffe04 Tests: added HTTP/2 test for server push with original scheme.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1289
diff changeset
425 { name => ':path', value => '/preload' },
ecbd984ffe04 Tests: added HTTP/2 test for server push with original scheme.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1289
diff changeset
426 { name => ':authority', value => 'localhost', mode => 1 }]});
ecbd984ffe04 Tests: added HTTP/2 test for server push with original scheme.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1289
diff changeset
427 $frames = $s->read(all => [{ sid => 2, fin => 1 }]);
ecbd984ffe04 Tests: added HTTP/2 test for server push with original scheme.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1289
diff changeset
428
ecbd984ffe04 Tests: added HTTP/2 test for server push with original scheme.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1289
diff changeset
429 ($frame) = grep { $_->{type} eq "PUSH_PROMISE" && $_->{sid} == $sid } @$frames;
ecbd984ffe04 Tests: added HTTP/2 test for server push with original scheme.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1289
diff changeset
430 is($frame->{headers}->{':scheme'}, 'https', 'scheme https');
ecbd984ffe04 Tests: added HTTP/2 test for server push with original scheme.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1289
diff changeset
431
1734
f7170c7acf3a Tests: added HTTP/2 tests for PUSH_PROMISE with CONTINUATION.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1535
diff changeset
432 # CONTINUATION
f7170c7acf3a Tests: added HTTP/2 tests for PUSH_PROMISE with CONTINUATION.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1535
diff changeset
433
f7170c7acf3a Tests: added HTTP/2 tests for PUSH_PROMISE with CONTINUATION.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1535
diff changeset
434 $s = Test::Nginx::HTTP2->new();
f7170c7acf3a Tests: added HTTP/2 tests for PUSH_PROMISE with CONTINUATION.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1535
diff changeset
435 $sid = $s->new_stream({ path => '/continuation?x=' . ('X' x 4096) });
f7170c7acf3a Tests: added HTTP/2 tests for PUSH_PROMISE with CONTINUATION.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1535
diff changeset
436 $frames = $s->read(all => [{ sid => 1, fin => 1 }, { sid => 2, fin => 1 }]);
f7170c7acf3a Tests: added HTTP/2 tests for PUSH_PROMISE with CONTINUATION.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1535
diff changeset
437
f7170c7acf3a Tests: added HTTP/2 tests for PUSH_PROMISE with CONTINUATION.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1535
diff changeset
438 @$frames = grep { $_->{promised} } @$frames;
f7170c7acf3a Tests: added HTTP/2 tests for PUSH_PROMISE with CONTINUATION.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1535
diff changeset
439 is(@$frames, 2, 'continuation - frames');
f7170c7acf3a Tests: added HTTP/2 tests for PUSH_PROMISE with CONTINUATION.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1535
diff changeset
440
f7170c7acf3a Tests: added HTTP/2 tests for PUSH_PROMISE with CONTINUATION.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1535
diff changeset
441 $frame = shift @$frames;
f7170c7acf3a Tests: added HTTP/2 tests for PUSH_PROMISE with CONTINUATION.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1535
diff changeset
442 is($frame->{type}, 'PUSH_PROMISE', 'continuation - PUSH_PROMISE');
f7170c7acf3a Tests: added HTTP/2 tests for PUSH_PROMISE with CONTINUATION.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1535
diff changeset
443 is($frame->{length}, 16384, 'continuation - PUSH_PROMISE length');
f7170c7acf3a Tests: added HTTP/2 tests for PUSH_PROMISE with CONTINUATION.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1535
diff changeset
444 is($frame->{flags}, 0, 'continuation - PUSH_PROMISE flags');
f7170c7acf3a Tests: added HTTP/2 tests for PUSH_PROMISE with CONTINUATION.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1535
diff changeset
445 is($frame->{sid}, $sid, 'continuation - PUSH_PROMISE sid');
f7170c7acf3a Tests: added HTTP/2 tests for PUSH_PROMISE with CONTINUATION.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1535
diff changeset
446 is($frame->{promised}, 2, 'continuation - promised stream');
f7170c7acf3a Tests: added HTTP/2 tests for PUSH_PROMISE with CONTINUATION.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1535
diff changeset
447
f7170c7acf3a Tests: added HTTP/2 tests for PUSH_PROMISE with CONTINUATION.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1535
diff changeset
448 $frame = shift @$frames;
f7170c7acf3a Tests: added HTTP/2 tests for PUSH_PROMISE with CONTINUATION.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1535
diff changeset
449 is($frame->{type}, 'CONTINUATION', 'continuation - CONTINUATION');
f7170c7acf3a Tests: added HTTP/2 tests for PUSH_PROMISE with CONTINUATION.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1535
diff changeset
450 is($frame->{flags}, 4, 'continuation - CONTINUATION flags');
f7170c7acf3a Tests: added HTTP/2 tests for PUSH_PROMISE with CONTINUATION.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1535
diff changeset
451 is($frame->{headers}->{':authority'}, 'localhost', 'continuation - authority');
f7170c7acf3a Tests: added HTTP/2 tests for PUSH_PROMISE with CONTINUATION.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1535
diff changeset
452 is($frame->{headers}->{':scheme'}, 'http', 'continuation - scheme');
f7170c7acf3a Tests: added HTTP/2 tests for PUSH_PROMISE with CONTINUATION.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1535
diff changeset
453 is($frame->{headers}->{':method'}, 'GET', 'continuation - method');
f7170c7acf3a Tests: added HTTP/2 tests for PUSH_PROMISE with CONTINUATION.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1535
diff changeset
454 like($frame->{headers}->{':path'}, qr!^/push!, 'continuation - path');
f7170c7acf3a Tests: added HTTP/2 tests for PUSH_PROMISE with CONTINUATION.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1535
diff changeset
455
1279
da2ad1d72bb6 Tests: HTTP/2 server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
456 ###############################################################################
1284
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
457
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
458 sub gunzip_like {
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
459 my ($in, $re, $name) = @_;
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
460
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
461 SKIP: {
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
462 eval { require IO::Uncompress::Gunzip; };
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
463 Test::More::skip(
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
464 "IO::Uncompress::Gunzip not installed", 1) if $@;
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
465
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
466 my $out;
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
467
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
468 IO::Uncompress::Gunzip::gunzip(\$in => \$out);
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
469
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
470 if ($in =~ $re) {
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
471 fail($name);
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
472 return;
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
473 }
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
474
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
475 like($out, $re, $name);
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
476 }
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
477 }
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
478
52873012ab26 Tests: added HTTP/2 server push tests with gzip (ticket #1478).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1283
diff changeset
479 ###############################################################################