]> Cypherpunks repositories - gostls13.git/commitdiff
net/http: close resp.Body when error occurred during redirection
authorWeichao Tang <tevic.tt@gmail.com>
Tue, 18 Apr 2017 02:57:12 +0000 (10:57 +0800)
committerBrad Fitzpatrick <bradfitz@golang.org>
Thu, 27 Apr 2017 14:28:47 +0000 (14:28 +0000)
Fixes #19976

Change-Id: I48486467066784a9dcc24357ec94a1be85265a6f
Reviewed-on: https://go-review.googlesource.com/40940
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/net/http/client.go
src/net/http/response.go

index 7752d812cc03c03010678e8680625e6a6bb98c3a..fbdc41bdf2cb073ea0d335c81ef2c03d1b3048ab 100644 (file)
@@ -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
index 1ebea6c45cbe12c411d69ab6dfc7e4f4357e7410..0357b605023ade785d441f4247401cc0d48bedee 100644 (file)
@@ -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()
+       }
+}