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>
diff --git a/quic/stream.go b/quic/stream.go
index a3ab0b5..8068b10 100644
--- a/quic/stream.go
+++ b/quic/stream.go
@@ -315,7 +315,7 @@
 	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 e958b56..2643ae3 100644
--- a/quic/stream_test.go
+++ b/quic/stream_test.go
@@ -568,6 +568,25 @@
 	})
 }
 
+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 {