Mercurial > hg > nginx-tests
view proxy_chunked_extra.t @ 1938:e1059682aeef
Tests: fixed ClientHello with resending Initial QUIC packets.
Previously it was rebuilt each time using distinct ClientHello.random
resulting in different CRYPTO payload. As such, it led to TLS digest
hash and derived secrets mismatch when resending Initial packet. Now
ClientHello is built once and reused when resending Initial packets.
Additionally, this required to preserve a generated secret value used
in shared secret calculation as part of TLS key schedule. Previously
it was regenerated when receiving a Retry packet, but this won't work
with reused ClientHello as the resulting shared secrets won't match.
author | Sergey Kandaurov <pluknet@nginx.com> |
---|---|
date | Wed, 30 Aug 2023 02:22:58 +0400 |
parents | 5ac6efbe5552 |
children |
line wrap: on
line source
#!/usr/bin/perl # (C) Maxim Dounin # (C) Nginx, Inc. # Test for http backend returning response with Transfer-Encoding: chunked, # followed by some extra data. ############################################################################### use warnings; use strict; use Test::More; use Socket qw/ CRLF /; BEGIN { use FindBin; chdir($FindBin::Bin); } use lib 'lib'; use Test::Nginx; ############################################################################### select STDERR; $| = 1; select STDOUT; $| = 1; my $t = Test::Nginx->new()->has(qw/http proxy/)->plan(1); $t->write_file_expand('nginx.conf', <<'EOF'); %%TEST_GLOBALS%% daemon off; events { } http { %%TEST_GLOBALS_HTTP%% server { listen 127.0.0.1:8080; server_name localhost; proxy_buffer_size 128; proxy_buffers 4 128; location / { proxy_pass http://127.0.0.1:8081; proxy_read_timeout 1s; } } } EOF $t->run_daemon(\&http_chunked_daemon); $t->run()->waitforsocket('127.0.0.1:' . port(8081)); ############################################################################### like(http_get('/'), qr/200 OK(?!.*zzz)/s, 'chunked with extra data'); ############################################################################### sub http_chunked_daemon { my $server = IO::Socket::INET->new( Proto => 'tcp', LocalAddr => '127.0.0.1:' . port(8081), Listen => 5, Reuse => 1 ) or die "Can't create listening socket: $!\n"; local $SIG{PIPE} = 'IGNORE'; while (my $client = $server->accept()) { $client->autoflush(1); while (<$client>) { last if (/^\x0d?\x0a?$/); } # return a large response start to allocate # multiple buffers; stop at the buffer end print $client "" . "HTTP/1.1 200 OK" . CRLF . "Connection: close" . CRLF . "Transfer-Encoding: chunked" . CRLF . CRLF . "80" . CRLF . ("x" x 126) . CRLF . CRLF . "80" . CRLF . ("x" x 126) . CRLF . CRLF . "80" . CRLF . ("x" x 126) . CRLF . CRLF . "80" . CRLF . ("x" x 126) . CRLF . CRLF . "20" . CRLF . ("x" x 30) . CRLF . CRLF; select(undef, undef, undef, 0.3); # fill three full buffers here, so they are # processed in order, regardless of the # p->upstream_done flag set print $client "" . "75" . CRLF . ("y" x 115) . CRLF . CRLF . "0" . CRLF . CRLF . "75" . CRLF . ("z" x 115) . CRLF . CRLF . "0" . CRLF . CRLF . "75" . CRLF . ("z" x 115) . CRLF . CRLF . "0" . CRLF . CRLF; close $client; } } ###############################################################################