Skip to content

Commit 9a9930f

Browse files
committed
fix: buffer reuse and release #917
1 parent d598157 commit 9a9930f

File tree

4 files changed

+8
-31
lines changed

4 files changed

+8
-31
lines changed

client.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1236,7 +1236,6 @@ func (c *Client) executeBefore(req *Request) error {
12361236
return wrapNoRetryErr(err)
12371237
}
12381238

1239-
req.RawRequest.Body = newRequestBodyReleaser(req.RawRequest.Body, req.bodyBuf)
12401239
return nil
12411240
}
12421241

request.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1030,6 +1030,7 @@ func (r *Request) Execute(method, url string) (*Response, error) {
10301030
r.Attempt = 1
10311031
resp, err = r.client.execute(r)
10321032
r.client.onErrorHooks(r, resp, unwrapNoRetryErr(err))
1033+
backToBufPool(r.bodyBuf)
10331034
return resp, unwrapNoRetryErr(err)
10341035
}
10351036

@@ -1059,6 +1060,7 @@ func (r *Request) Execute(method, url string) (*Response, error) {
10591060
}
10601061

10611062
r.client.onErrorHooks(r, resp, unwrapNoRetryErr(err))
1063+
backToBufPool(r.bodyBuf)
10621064
return resp, unwrapNoRetryErr(err)
10631065
}
10641066

request_test.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2203,10 +2203,8 @@ func TestRequestGH917(t *testing.T) {
22032203
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
22042204
b, err := io.ReadAll(r.Body)
22052205
assertError(t, err)
2206-
if len(b) > 0 {
2207-
// sometimes, the body is "testtest" instead of "test"
2208-
assertEqual(t, "test", string(b))
2209-
}
2206+
assertEqual(t, "test", string(b))
2207+
22102208
w.WriteHeader(http.StatusInternalServerError)
22112209
}))
22122210

util.go

Lines changed: 4 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import (
1919
"runtime"
2020
"sort"
2121
"strings"
22-
"sync"
2322
)
2423

2524
//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
@@ -297,38 +296,17 @@ func acquireBuffer() *bytes.Buffer {
297296

298297
func releaseBuffer(buf *bytes.Buffer) {
299298
if buf != nil {
299+
buf.Reset()
300300
bufPool.Put(buf)
301301
}
302302
}
303303

304-
// requestBodyReleaser wraps requests's body and implements custom Close for it.
305-
// The Close method closes original body and releases request body back to sync.Pool.
306-
type requestBodyReleaser struct {
307-
releaseOnce sync.Once
308-
reqBuf *bytes.Buffer
309-
io.ReadCloser
310-
}
311-
312-
func newRequestBodyReleaser(respBody io.ReadCloser, reqBuf *bytes.Buffer) io.ReadCloser {
313-
if reqBuf == nil {
314-
return respBody
315-
}
316-
317-
return &requestBodyReleaser{
318-
reqBuf: reqBuf,
319-
ReadCloser: respBody,
304+
func backToBufPool(buf *bytes.Buffer) {
305+
if buf != nil {
306+
bufPool.Put(buf)
320307
}
321308
}
322309

323-
func (rr *requestBodyReleaser) Close() error {
324-
err := rr.ReadCloser.Close()
325-
rr.releaseOnce.Do(func() {
326-
releaseBuffer(rr.reqBuf)
327-
})
328-
329-
return err
330-
}
331-
332310
func closeq(v interface{}) {
333311
if c, ok := v.(io.Closer); ok {
334312
silently(c.Close())

0 commit comments

Comments
 (0)