don't generate empty STREAM frames in the send stream (#4812)

This commit is contained in:
Marten Seemann
2024-12-28 16:21:48 +08:00
committed by GitHub
parent 55687a684f
commit 810ef27db5
2 changed files with 11 additions and 7 deletions

View File

@@ -277,6 +277,9 @@ func (s *sendStream) popNewOrRetransmittedStreamFrame(maxBytes protocol.ByteCoun
}
f, hasMoreData := s.popNewStreamFrame(maxBytes, sendWindow, v)
if f == nil {
return nil, hasMoreData, false
}
if dataLen := f.DataLen(); dataLen > 0 {
s.writeOffset += f.DataLen()
s.flowController.AddBytesSent(f.DataLen())
@@ -290,10 +293,12 @@ func (s *sendStream) popNewOrRetransmittedStreamFrame(maxBytes protocol.ByteCoun
func (s *sendStream) popNewStreamFrame(maxBytes, sendWindow protocol.ByteCount, v protocol.Version) (*wire.StreamFrame, bool) {
if s.nextFrame != nil {
maxDataLen := min(sendWindow, s.nextFrame.MaxDataLen(maxBytes, v))
if maxDataLen == 0 {
return nil, true
}
nextFrame := s.nextFrame
s.nextFrame = nil
maxDataLen := min(sendWindow, nextFrame.MaxDataLen(maxBytes, v))
if nextFrame.DataLen() > maxDataLen {
s.nextFrame = wire.GetStreamFrame()
s.nextFrame.StreamID = s.streamID

View File

@@ -122,12 +122,11 @@ func TestSendStreamWriteData(t *testing.T) {
n, err = strWithTimeout.Write([]byte("foobaz"))
require.NoError(t, err)
require.Equal(t, 6, n)
mockFC.EXPECT().SendWindowSize().Return(protocol.MaxByteCount).Times(2)
mockFC.EXPECT().SendWindowSize().Return(protocol.MaxByteCount).Times(3)
mockFC.EXPECT().AddBytesSent(protocol.ByteCount(3)).Times(2)
// TODO(#4807): check that no empty frames are popped
// frame, ok, hasMore = str.popStreamFrame(expectedFrameHeaderLen(streamID, 10), protocol.Version1)
// require.False(t, ok)
// require.True(t, hasMore)
frame, ok, hasMore = str.popStreamFrame(expectedFrameHeaderLen(streamID, 10), protocol.Version1)
require.False(t, ok)
require.True(t, hasMore)
frame, ok, hasMore = str.popStreamFrame(expectedFrameHeaderLen(streamID, 10)+3, protocol.Version1)
require.True(t, ok)
require.True(t, hasMore)