Mercurial > hg > nginx-tests
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); |