From e51e0f9cdd2a351fb1cb0ab6405c02d58c35d537 Mon Sep 17 00:00:00 2001 From: Weichao Tang Date: Tue, 18 Apr 2017 10:57:12 +0800 Subject: [PATCH] net/http: close resp.Body when error occurred during redirection Fixes #19976 Change-Id: I48486467066784a9dcc24357ec94a1be85265a6f Reviewed-on: https://go-review.googlesource.com/40940 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/net/http/client.go | 3 +++ src/net/http/response.go | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/src/net/http/client.go b/src/net/http/client.go index 7752d812cc..fbdc41bdf2 100644 --- a/src/net/http/client.go +++ b/src/net/http/client.go @@ -524,10 +524,12 @@ func (c *Client) Do(req *Request) (*Response, error) { if len(reqs) > 0 { loc := resp.Header.Get("Location") if loc == "" { + resp.closeBody() return nil, uerr(fmt.Errorf("%d response missing Location header", resp.StatusCode)) } u, err := req.URL.Parse(loc) if err != nil { + resp.closeBody() return nil, uerr(fmt.Errorf("failed to parse Location header %q: %v", loc, err)) } ireq := reqs[0] @@ -542,6 +544,7 @@ func (c *Client) Do(req *Request) (*Response, error) { if includeBody && ireq.GetBody != nil { req.Body, err = ireq.GetBody() if err != nil { + resp.closeBody() return nil, uerr(err) } req.ContentLength = ireq.ContentLength diff --git a/src/net/http/response.go b/src/net/http/response.go index 1ebea6c45c..0357b60502 100644 --- a/src/net/http/response.go +++ b/src/net/http/response.go @@ -321,3 +321,9 @@ func (r *Response) Write(w io.Writer) error { // Success return nil } + +func (r *Response) closeBody() { + if r.Body != nil { + r.Body.Close() + } +} -- 2.48.1