From: Weichao Tang Date: Tue, 18 Apr 2017 02:57:12 +0000 (+0800) Subject: net/http: close resp.Body when error occurred during redirection X-Git-Tag: go1.9beta1~437 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=e51e0f9cdd2a351fb1cb0ab6405c02d58c35d537;p=gostls13.git 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 --- 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() + } +}