Skip to content

Commit 1ce39e1

Browse files
authored
feat: add flate pool to reuse the reader (#949)
1 parent ce2c0be commit 1ce39e1

File tree

2 files changed

+24
-7
lines changed

2 files changed

+24
-7
lines changed

client_test.go

+8
Original file line numberDiff line numberDiff line change
@@ -538,6 +538,14 @@ func TestClientSettingsCoverage(t *testing.T) {
538538
c.EnableRetryDefaultConditions()
539539
assertEqual(t, true, c.IsRetryDefaultConditions())
540540

541+
nr := nopReader{}
542+
n, err1 := nr.Read(nil)
543+
assertEqual(t, 0, n)
544+
assertEqual(t, io.EOF, err1)
545+
b, err1 := nr.ReadByte()
546+
assertEqual(t, byte(0), b)
547+
assertEqual(t, io.EOF, err1)
548+
541549
// [Start] Custom Transport scenario
542550
ct := dcnl()
543551
ct.SetTransport(&CustomRoundTripper1{})

stream.go

+16-7
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"encoding/xml"
1414
"errors"
1515
"io"
16+
"sync"
1617
)
1718

1819
var (
@@ -106,13 +107,12 @@ func (gz *gzipReader) Close() error {
106107
return nil
107108
}
108109

109-
func decompressDeflate(r io.ReadCloser) (io.ReadCloser, error) {
110-
d := &deflateReader{
111-
s: r,
112-
r: flate.NewReader(r),
113-
}
110+
var flatePool = sync.Pool{New: func() any { return flate.NewReader(nopReader{}) }}
114111

115-
return d, nil
112+
func decompressDeflate(r io.ReadCloser) (io.ReadCloser, error) {
113+
fr := flatePool.Get().(io.ReadCloser)
114+
err := fr.(flate.Resetter).Reset(r, nil)
115+
return &deflateReader{s: r, r: fr}, err
116116
}
117117

118118
type deflateReader struct {
@@ -125,7 +125,9 @@ func (d *deflateReader) Read(p []byte) (n int, err error) {
125125
}
126126

127127
func (d *deflateReader) Close() error {
128-
closeq(d.r)
128+
if err := d.r.(flate.Resetter).Reset(nopReader{}, nil); err == nil {
129+
flatePool.Put(d.r)
130+
}
129131
closeq(d.s)
130132
return nil
131133
}
@@ -209,3 +211,10 @@ func (r *nopReadCloser) Read(p []byte) (int, error) {
209211
}
210212

211213
func (r *nopReadCloser) Close() error { return nil }
214+
215+
var _ flate.Reader = (*nopReader)(nil)
216+
217+
type nopReader struct{}
218+
219+
func (nopReader) Read([]byte) (int, error) { return 0, io.EOF }
220+
func (nopReader) ReadByte() (byte, error) { return 0, io.EOF }

0 commit comments

Comments
 (0)