Skip to content

Commit 935f8cb

Browse files
authored
transport: Fix reporting of bytes read while reading headers (#7660) (#7667)
1 parent 02bbb65 commit 935f8cb

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

internal/transport/transport.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -616,7 +616,7 @@ func (t *transportReader) ReadHeader(header []byte) (int, error) {
616616
t.er = err
617617
return 0, err
618618
}
619-
t.windowHandler(len(header))
619+
t.windowHandler(n)
620620
return n, nil
621621
}
622622

internal/transport/transport_test.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2845,3 +2845,34 @@ func (s) TestClientCloseReturnsEarlyWhenGoAwayWriteHangs(t *testing.T) {
28452845
isGreetingDone.Store(true)
28462846
ct.Close(errors.New("manually closed by client"))
28472847
}
2848+
2849+
// TestReadHeaderMultipleBuffers tests the stream when the gRPC headers are
2850+
// split across multiple buffers. It verifies that the reporting of the
2851+
// number of bytes read for flow control is correct.
2852+
func (s) TestReadHeaderMultipleBuffers(t *testing.T) {
2853+
headerLen := 5
2854+
recvBuffer := newRecvBuffer()
2855+
recvBuffer.put(recvMsg{buffer: make(mem.SliceBuffer, 3)})
2856+
recvBuffer.put(recvMsg{buffer: make(mem.SliceBuffer, headerLen-3)})
2857+
bytesRead := 0
2858+
s := Stream{
2859+
requestRead: func(int) {},
2860+
trReader: &transportReader{
2861+
reader: &recvBufferReader{
2862+
recv: recvBuffer,
2863+
},
2864+
windowHandler: func(i int) {
2865+
bytesRead += i
2866+
},
2867+
},
2868+
}
2869+
2870+
header := make([]byte, headerLen)
2871+
err := s.ReadHeader(header)
2872+
if err != nil {
2873+
t.Fatalf("ReadHeader(%v) = %v", header, err)
2874+
}
2875+
if bytesRead != headerLen {
2876+
t.Errorf("bytesRead = %d, want = %d", bytesRead, headerLen)
2877+
}
2878+
}

0 commit comments

Comments
 (0)