Skip to content

Commit 1af6e90

Browse files
committed
added check to prevent HasContent() to panic after the reader is
closed * fixes #268 Signed-off-by: Frederic BIDON <[email protected]>
1 parent 337c930 commit 1af6e90

File tree

2 files changed

+40
-0
lines changed

2 files changed

+40
-0
lines changed

request.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ package runtime
1616

1717
import (
1818
"bufio"
19+
"errors"
1920
"io"
2021
"net/http"
2122
"strings"
@@ -96,10 +97,16 @@ func (p *peekingReader) Read(d []byte) (int, error) {
9697
if p == nil {
9798
return 0, io.EOF
9899
}
100+
if p.underlying == nil {
101+
return 0, io.ErrUnexpectedEOF
102+
}
99103
return p.underlying.Read(d)
100104
}
101105

102106
func (p *peekingReader) Close() error {
107+
if p.underlying == nil {
108+
return errors.New("reader already closed")
109+
}
103110
p.underlying = nil
104111
if p.orig != nil {
105112
return p.orig.Close()

request_test.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,39 @@ func TestPeekingReader(t *testing.T) {
137137
require.Equal(t, 1, cbr.peeks)
138138
require.Equal(t, 2, cbr.reads)
139139
require.Equal(t, 0, cbr.br.Buffered())
140+
141+
t.Run("closing a closed peekingReader", func(t *testing.T) {
142+
const content = "content"
143+
r := newPeekingReader(io.NopCloser(strings.NewReader(content)))
144+
require.NoError(t, r.Close())
145+
146+
require.NotPanics(t, func() {
147+
err := r.Close()
148+
require.Error(t, err)
149+
})
150+
})
151+
152+
t.Run("reading from a closed peekingReader", func(t *testing.T) {
153+
const content = "content"
154+
r := newPeekingReader(io.NopCloser(strings.NewReader(content)))
155+
require.NoError(t, r.Close())
156+
157+
require.NotPanics(t, func() {
158+
_, err := io.ReadAll(r)
159+
require.Error(t, err)
160+
require.ErrorIs(t, err, io.ErrUnexpectedEOF)
161+
})
162+
})
163+
164+
t.Run("reading from a nil peekingReader", func(t *testing.T) {
165+
var r *peekingReader
166+
require.NotPanics(t, func() {
167+
buf := make([]byte, 10)
168+
_, err := r.Read(buf)
169+
require.Error(t, err)
170+
require.ErrorIs(t, err, io.EOF)
171+
})
172+
})
140173
}
141174

142175
func TestJSONRequest(t *testing.T) {

0 commit comments

Comments
 (0)