]> Cypherpunks repositories - gostls13.git/commitdiff
net/http: don't assume Response.Request is populated after redirect errors
authorBrad Fitzpatrick <bradfitz@golang.org>
Fri, 6 May 2016 18:11:38 +0000 (18:11 +0000)
committerRuss Cox <rsc@golang.org>
Fri, 6 May 2016 18:37:34 +0000 (18:37 +0000)
Fixes #15577

Change-Id: I5f023790a393b17235db2e66c02c2483773ddc1a
Reviewed-on: https://go-review.googlesource.com/22857
Reviewed-by: Russ Cox <rsc@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/net/http/client.go
src/net/http/client_test.go

index f8ab675a3de04794384b97cefe9beac77dd2523d..1127634beca3b99ef5dd3729ad7a9c4ca79139a4 100644 (file)
@@ -442,7 +442,7 @@ func (c *Client) doFollowingRedirects(req *Request, shouldRedirect func(int) boo
                req.closeBody()
                method := valueOrDefault(reqs[0].Method, "GET")
                var urlStr string
-               if resp != nil {
+               if resp != nil && resp.Request != nil {
                        urlStr = resp.Request.URL.String()
                } else {
                        urlStr = req.URL.String()
index a9b30b1bf5c1347a25c5deb87fb99aa0a217c2fc..6f7ab965cbcf9434a4bd8750862aaa9bd6c91d3c 100644 (file)
@@ -1168,3 +1168,26 @@ func TestReferer(t *testing.T) {
                }
        }
 }
+
+// issue15577Tripper returns a Response with a redirect response
+// header and doesn't populate its Response.Request field.
+type issue15577Tripper struct{}
+
+func (issue15577Tripper) RoundTrip(*Request) (*Response, error) {
+       resp := &Response{
+               StatusCode: 303,
+               Header:     map[string][]string{"Location": {"http://www.example.com/"}},
+               Body:       ioutil.NopCloser(strings.NewReader("")),
+       }
+       return resp, nil
+}
+
+// Issue 15577: don't assume the roundtripper's response populates its Request field.
+func TestClientRedirectResponseWithoutRequest(t *testing.T) {
+       c := &Client{
+               CheckRedirect: func(*Request, []*Request) error { return fmt.Errorf("no redirects!") },
+               Transport:     issue15577Tripper{},
+       }
+       // Check that this doesn't crash:
+       c.Get("http://dummy.tld")
+}