comparison lib/Test/Nginx/HTTP3.pm @ 1886:90a310f3cee6

Tests: workaround for QUIC routing while reloading nginx. Datagrams can be routed to a new worker process that lacks the connection state resulting in a stateless reset. Previously, the QUIC connection was closed in tests on decryption failure including receiving a stateless reset, which is not yet detected in HTTP3.pm. The workaround is to ignore packets that could not be decrypted including a stateless reset. This is enough to continue receiving packets from the old worker process, such as with GOAWAY.
author Sergey Kandaurov <pluknet@nginx.com>
date Thu, 19 Jan 2023 17:38:16 +0400
parents 6f1508d53a26
children 1023354f3a41
comparison
equal deleted inserted replaced
1885:905b1704eb54 1886:90a310f3cee6
1938 while (1) { 1938 while (1) {
1939 @data = $self->parse_stream(); 1939 @data = $self->parse_stream();
1940 return @data if $#data; 1940 return @data if $#data;
1941 return if scalar @{$self->{frames_in}}; 1941 return if scalar @{$self->{frames_in}};
1942 1942
1943 again:
1943 my $txt; 1944 my $txt;
1944 1945
1945 if (!length($self->{buf})) { 1946 if (!length($self->{buf})) {
1946 return unless IO::Select->new($s)->can_read($timo || 3); 1947 return unless IO::Select->new($s)->can_read($timo || 3);
1947 $s->sysread($self->{buf}, 65527); 1948 $s->sysread($self->{buf}, 65527);
1953 Test::Nginx::log_core('||', sprintf("$txt = [%d]", $len)); 1954 Test::Nginx::log_core('||', sprintf("$txt = [%d]", $len));
1954 1955
1955 while ($self->{buf}) { 1956 while ($self->{buf}) {
1956 ($level, $plaintext, $self->{buf}, $self->{token}) 1957 ($level, $plaintext, $self->{buf}, $self->{token})
1957 = $self->decrypt_aead($self->{buf}); 1958 = $self->decrypt_aead($self->{buf});
1958 return if !defined $plaintext; 1959 if (!defined $plaintext) {
1960 $self->{buf} = '';
1961 goto again;
1962 }
1959 goto retry if $self->{token}; 1963 goto retry if $self->{token};
1960 $self->handle_frames(parse_frames($plaintext), $level); 1964 $self->handle_frames(parse_frames($plaintext), $level);
1961 @data = $self->parse_stream(); 1965 @data = $self->parse_stream();
1962 return @data if $#data; 1966 return @data if $#data;
1963 return if scalar @{$self->{frames_in}}; 1967 return if scalar @{$self->{frames_in}};