annotate h3_max_headers.t @ 1983:c7315caf2110

Tests: optimized processing of large QUIC packets with padding. Path MTU discovery packets might contain a lot of padding, and creating a copy of the whole buffer for each PADDING frame, which is just one byte with type 0, consumes lots of resources. This was seen to result in flapping of at least h3_keepalive.t and h3_ssl_early_data.t tests. Fix is to copy at most 8 bytes for parse_int() calls when parsing frame types.
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 03 Jun 2024 04:17:28 +0300
parents 2d58bb10ff5d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1979
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1 #!/usr/bin/perl
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3 # (C) Maxim Dounin
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
5 # Tests for max_headers directive, HTTP/3.
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
6
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
7 ###############################################################################
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
8
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
9 use warnings;
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
10 use strict;
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
11
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
12 use Test::More;
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
13 use Socket qw/ CRLF /;
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
14
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
15 BEGIN { use FindBin; chdir($FindBin::Bin); }
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
16
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
17 use lib 'lib';
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
18 use Test::Nginx;
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
19 use Test::Nginx::HTTP3;
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
20
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
21 ###############################################################################
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
22
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
23 select STDERR; $| = 1;
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
24 select STDOUT; $| = 1;
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
25
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
26 my $t = Test::Nginx->new()->has(qw/http http_v3 rewrite cryptx/);
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
27
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
28 $t->write_file_expand('nginx.conf', <<'EOF');
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
29
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
30 %%TEST_GLOBALS%%
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
31
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
32 daemon off;
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
33
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
34 events {
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
35 }
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
36
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
37 http {
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
38 %%TEST_GLOBALS_HTTP%%
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
39
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
40 ssl_certificate localhost.crt;
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
41 ssl_certificate_key localhost.key;
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
42
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
43 server {
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
44 listen 127.0.0.1:%%PORT_8980_UDP%% quic;
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
45 server_name localhost;
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
46
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
47 max_headers 5;
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
48
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
49 location / {
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
50 return 204;
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
51 }
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
52 }
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
53 }
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
54
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
55 EOF
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
56
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
57 $t->write_file('openssl.conf', <<EOF);
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
58 [ req ]
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
59 default_bits = 2048
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
60 encrypt_key = no
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
61 distinguished_name = req_distinguished_name
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
62 [ req_distinguished_name ]
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
63 EOF
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
64
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
65 my $d = $t->testdir();
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
66
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
67 foreach my $name ('localhost') {
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
68 system('openssl req -x509 -new '
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
69 . "-config $d/openssl.conf -subj /CN=$name/ "
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
70 . "-out $d/$name.crt -keyout $d/$name.key "
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
71 . ">>$d/openssl.out 2>&1") == 0
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
72 or die "Can't create certificate for $name: $!\n";
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
73 }
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
74
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
75 $t->try_run('no max_headers')->plan(3);
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
76
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
77 ###############################################################################
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
78
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
79 like(get('/'), qr/ 204/, 'two headers');
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
80 like(get('/', ('Foo: bar') x 3), qr/ 204/, 'five headers');
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
81 like(get('/', ('Foo: bar') x 4), qr/ 400/, 'six headers rejected');
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
82
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
83 ###############################################################################
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
84
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
85 sub get {
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
86 my ($url, @headers) = @_;
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
87
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
88 my $s = Test::Nginx::HTTP3->new();
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
89 my $sid = $s->new_stream({
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
90 headers => [
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
91 { name => ':method', value => 'GET' },
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
92 { name => ':scheme', value => 'http' },
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
93 { name => ':path', value => $url },
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
94 { name => ':authority', value => 'localhost' },
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
95 { name => 'foo', value => 'bar' },
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
96 { name => 'foo', value => 'bar' },
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
97 map {
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
98 my ($n, $v) = split /:/;
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
99 { name => lc $n, value => $v };
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
100 } @headers
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
101 ]
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
102 });
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
103
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
104 my $frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
105
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
106 my ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
107
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
108 return join("\n", map { "$_: " . $frame->{headers}->{$_}; }
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
109 keys %{$frame->{headers}});
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
110 }
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
111
2d58bb10ff5d Tests: max_client_headers test.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
112 ###############################################################################