quic: don't return EOF from ReadByte when we have a byte

Change-Id: I3be7c43fa6ceeb75582f648ee56025991eda9611
Reviewed-on: https://go-review.googlesource.com/c/net/+/642515
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Jonathan Amsterdam <jba@google.com>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Auto-Submit: Damien Neil <dneil@google.com>
This commit is contained in:
Damien Neil
2025-01-13 11:22:16 -08:00
committed by Gopher Robot
parent 7ad0ebf002
commit 56691ee141
2 changed files with 20 additions and 1 deletions

View File

@@ -315,7 +315,7 @@ func (s *Stream) ReadByte() (byte, error) {
var b [1]byte
n, err := s.Read(b[:])
if n > 0 {
return b[0], err
return b[0], nil
}
return 0, err
}

View File

@@ -568,6 +568,25 @@ func TestStreamReceiveEmptyEOF(t *testing.T) {
})
}
func TestStreamReadByteFromOneByteStream(t *testing.T) {
// ReadByte on the only byte of a stream should not return an error.
testStreamTypes(t, "", func(t *testing.T, styp streamType) {
tc, s := newTestConnAndRemoteStream(t, serverSide, styp, permissiveTransportParameters)
want := byte(1)
tc.writeFrames(packetType1RTT, debugFrameStream{
id: s.id,
data: []byte{want},
fin: true,
})
if got, err := s.ReadByte(); got != want || err != nil {
t.Fatalf("s.ReadByte() = %v, %v; want %v, nil", got, err, want)
}
if got, err := s.ReadByte(); err != io.EOF {
t.Fatalf("s.ReadByte() = %v, %v; want _, EOF", got, err)
}
})
}
func finalSizeTest(t *testing.T, wantErr transportError, f func(tc *testConn, sid streamID) (finalSize int64), opts ...any) {
testStreamTypes(t, "", func(t *testing.T, styp streamType) {
for _, test := range []struct {