@@ -13,6 +13,7 @@ import (
13
13
"encoding/xml"
14
14
"errors"
15
15
"io"
16
+ "sync"
16
17
)
17
18
18
19
var (
@@ -106,13 +107,12 @@ func (gz *gzipReader) Close() error {
106
107
return nil
107
108
}
108
109
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 {}) }}
114
111
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
116
116
}
117
117
118
118
type deflateReader struct {
@@ -125,7 +125,9 @@ func (d *deflateReader) Read(p []byte) (n int, err error) {
125
125
}
126
126
127
127
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
+ }
129
131
closeq (d .s )
130
132
return nil
131
133
}
@@ -209,3 +211,10 @@ func (r *nopReadCloser) Read(p []byte) (int, error) {
209
211
}
210
212
211
213
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