comparison lib/Test/Nginx/HTTP3.pm @ 1928:2df7d700518f

Tests: fixed parsing STREAM frames split on inner frame headers.
author Sergey Kandaurov <pluknet@nginx.com>
date Wed, 16 Aug 2023 16:36:18 +0400
parents 55e0dee863e2
children 3408c20d2f24
comparison
equal deleted inserted replaced
1927:55e0dee863e2 1928:2df7d700518f
556 } 556 }
557 557
558 my $offset = 0; 558 my $offset = 0;
559 my ($len, $type); 559 my ($len, $type);
560 560
561 if (!length($self->{frames_incomplete}[$stream]{buf})) { 561 ($len, $type) = parse_int(substr($buf, $offset));
562 ($len, $type) = parse_int(substr($buf, $offset)); 562
563 $offset += $len; 563 if (!defined $len) {
564 ($len, $length) = parse_int(substr($buf, $offset)); 564 $self->{frames_incomplete}[$stream]{buf} = $buf;
565 $offset += $len; 565 next;
566 566 }
567 $self->{frames_incomplete}[$stream]{type} = $type; 567
568 $self->{frames_incomplete}[$stream]{length} = $length; 568 $offset += $len;
569 $self->{frames_incomplete}[$stream]{offset} = $offset; 569
570 } 570 ($len, $length) = parse_int(substr($buf, $offset));
571
572 if (!defined $len) {
573 $self->{frames_incomplete}[$stream]{buf} = $buf;
574 next;
575 }
576
577 $offset += $len;
578
579 $self->{frames_incomplete}[$stream]{type} = $type;
580 $self->{frames_incomplete}[$stream]{length} = $length;
581 $self->{frames_incomplete}[$stream]{offset} = $offset;
571 582
572 if (length($buf) < $self->{frames_incomplete}[$stream]{length} 583 if (length($buf) < $self->{frames_incomplete}[$stream]{length}
573 + $self->{frames_incomplete}[$stream]{offset}) 584 + $self->{frames_incomplete}[$stream]{offset})
574 { 585 {
575 $self->{frames_incomplete}[$stream]{buf} = $buf; 586 $self->{frames_incomplete}[$stream]{buf} = $buf;
1985 pack("C", $stream) . $sid . $offset . $length . $r; 1996 pack("C", $stream) . $sid . $offset . $length . $r;
1986 } 1997 }
1987 1998
1988 sub parse_int { 1999 sub parse_int {
1989 my ($buf) = @_; 2000 my ($buf) = @_;
2001 return undef if length($buf) < 1;
2002
1990 my $val = unpack("C", substr($buf, 0, 1)); 2003 my $val = unpack("C", substr($buf, 0, 1));
1991 my $len = my $plen = 1 << ($val >> 6); 2004 my $len = my $plen = 1 << ($val >> 6);
2005 return undef if length($buf) < $len;
2006
1992 $val = $val & 0x3f; 2007 $val = $val & 0x3f;
1993 while (--$len) { 2008 while (--$len) {
1994 $val = ($val << 8) + unpack("C", substr($buf, $plen - $len, 1)) 2009 $val = ($val << 8) + unpack("C", substr($buf, $plen - $len, 1))
1995 } 2010 }
1996 return ($plen, $val); 2011 return ($plen, $val);