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 {