From 56691ee141895759d9bc5ad694c9c81df7934b4a Mon Sep 17 00:00:00 2001 From: Damien Neil Date: Mon, 13 Jan 2025 11:22:16 -0800 Subject: [PATCH] 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 Reviewed-by: Jonathan Amsterdam Reviewed-by: Brad Fitzpatrick Auto-Submit: Damien Neil --- quic/stream.go | 2 +- quic/stream_test.go | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/quic/stream.go b/quic/stream.go index a3ab0b53..8068b10a 100644 --- a/quic/stream.go +++ b/quic/stream.go @@ -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 } diff --git a/quic/stream_test.go b/quic/stream_test.go index e958b563..2643ae3d 100644 --- a/quic/stream_test.go +++ b/quic/stream_test.go @@ -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 {