From 29785b29bfce1a6e20649ce5f3909f290b19ac92 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Tue, 16 Apr 2024 06:35:31 -0700 Subject: [PATCH] http3: simplify tracking of content length (#4438) --- http3/http_stream.go | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/http3/http_stream.go b/http3/http_stream.go index 10955c0d6..efdf05dd9 100644 --- a/http3/http_stream.go +++ b/http3/http_stream.go @@ -237,22 +237,21 @@ var errTooMuchData = errors.New("peer sent too much data") type lengthLimitedStream struct { *stream - contentLength int64 - read int64 - resetStream bool + remainingContentLength int64 + resetStream bool } var _ Stream = &lengthLimitedStream{} func newLengthLimitedStream(str *stream, contentLength int64) *lengthLimitedStream { return &lengthLimitedStream{ - stream: str, - contentLength: contentLength, + stream: str, + remainingContentLength: contentLength, } } func (s *lengthLimitedStream) checkContentLengthViolation() error { - if s.read > s.contentLength || s.read == s.contentLength && s.hasMoreData() { + if s.remainingContentLength < 0 || s.remainingContentLength == 0 && s.hasMoreData() { if !s.resetStream { s.CancelRead(quic.StreamErrorCode(ErrCodeMessageError)) s.CancelWrite(quic.StreamErrorCode(ErrCodeMessageError)) @@ -267,8 +266,8 @@ func (s *lengthLimitedStream) Read(b []byte) (int, error) { if err := s.checkContentLengthViolation(); err != nil { return 0, err } - n, err := s.stream.Read(b[:min(int64(len(b)), s.contentLength-s.read)]) - s.read += int64(n) + n, err := s.stream.Read(b[:min(int64(len(b)), s.remainingContentLength)]) + s.remainingContentLength -= int64(n) if err := s.checkContentLengthViolation(); err != nil { return n, err }