# HG changeset patch # User Sergey Kandaurov # Date 1683287592 -14400 # Node ID 8303f3633f65b450c3119bd4e519e05af426523a # Parent cc13f7b098db1697d43f0cd07df54a58428710a7 Tests: added HTTP/3 proxy_max_temp_file_size tests. diff --git a/h3_proxy_max_temp_file_size.t b/h3_proxy_max_temp_file_size.t new file mode 100644 --- /dev/null +++ b/h3_proxy_max_temp_file_size.t @@ -0,0 +1,126 @@ +#!/usr/bin/perl + +# (C) Sergey Kandaurov +# (C) Nginx, Inc. + +# Tests for http proxy module, proxy_max_temp_file_size directive. + +############################################################################### + +use warnings; +use strict; + +use Test::More; + +BEGIN { use FindBin; chdir($FindBin::Bin); } + +use lib 'lib'; +use Test::Nginx; +use Test::Nginx::HTTP3; + +############################################################################### + +select STDERR; $| = 1; +select STDOUT; $| = 1; + +eval { require Crypt::Misc; die if $Crypt::Misc::VERSION < 0.067; }; +plan(skip_all => 'CryptX version >= 0.067 required') if $@; + +my $t = Test::Nginx->new()->has(qw/http http_v3 proxy/) + ->has_daemon('openssl')->plan(4); + +$t->write_file_expand('nginx.conf', <<'EOF'); + +%%TEST_GLOBALS%% + +daemon off; + +events { +} + +http { + %%TEST_GLOBALS_HTTP%% + + ssl_certificate_key localhost.key; + ssl_certificate localhost.crt; + + server { + listen 127.0.0.1:%%PORT_8980_UDP%% quic; + server_name localhost; + + proxy_buffer_size 4k; + proxy_buffers 8 4k; + + location / { + proxy_max_temp_file_size 4k; + proxy_pass http://127.0.0.1:8081/; + } + + location /off/ { + proxy_max_temp_file_size 0; + proxy_pass http://127.0.0.1:8081/; + } + } + + server { + listen 127.0.0.1:8081; + server_name localhost; + + location / { } + } +} + +EOF + +$t->write_file('openssl.conf', <testdir(); + +foreach my $name ('localhost') { + system('openssl req -x509 -new ' + . "-config $d/openssl.conf -subj /CN=$name/ " + . "-out $d/$name.crt -keyout $d/$name.key " + . ">>$d/openssl.out 2>&1") == 0 + or die "Can't create certificate for $name: $!\n"; +} + +$t->write_file('1', 'X' x (1024 * 1024)); +$t->run(); + +############################################################################### + +# test that the response is wholly proxied when all event pipe buffers are full + +my $s = Test::Nginx::HTTP3->new(); +my $sid = $s->new_stream({ path => '/1' }); + +select undef, undef, undef, 0.4; +$s->h3_max_data(1024 * 1025, $sid); +$s->h3_max_data(1024 * 1025); + +my $frames = $s->read(all => [{ sid => $sid, fin => 1 }]); +my $body = join '', map { $_->{data} } grep { $_->{type} eq "DATA" } @$frames; +like($body, qr/^X+$/m, 'no pipe bufs - body'); +is(length($body), 1024 * 1024, 'no pipe bufs - body length'); + +# also with disabled proxy temp file + +$s = Test::Nginx::HTTP3->new(); +$sid = $s->new_stream({ path => '/off/1' }); + +select undef, undef, undef, 0.4; +$s->h3_max_data(1024 * 1025, $sid); +$s->h3_max_data(1024 * 1025); + +$frames = $s->read(all => [{ sid => $sid, fin => 1 }]); +$body = join '', map { $_->{data} } grep { $_->{type} eq "DATA" } @$frames; +like($body, qr/^X+$/m, 'no temp file - body'); +is(length($body), 1024 * 1024, 'no temp file - body length'); + +############################################################################### diff --git a/lib/Test/Nginx/HTTP3.pm b/lib/Test/Nginx/HTTP3.pm --- a/lib/Test/Nginx/HTTP3.pm +++ b/lib/Test/Nginx/HTTP3.pm @@ -462,6 +462,15 @@ sub pack_body { $buf .= $body; } +sub h3_max_data { + my ($self, $val, $stream) = @_; + + my $buf = defined $stream + ? "\x11" . build_int($stream) . build_int($val) + : "\x10" . build_int($val); + return $self->raw_write($buf); +} + my %cframe = ( 0 => { name => 'DATA', value => \&data }, 1 => { name => 'HEADERS', value => \&headers },