From 12d02e7d8e7df75ccbf07ec40028329fcc35c55b Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Mon, 2 Mar 2020 10:16:39 -0500 Subject: [PATCH] net/http: verify RoundTripper invariants in the send function Issue #37598 reports a nil-panic in *Client.send that can only occur if one of the RoundTripper invariants is violated. Unfortunately, that condition is currently difficult to diagnose: it manifests as a panic during a Response field access, rather than something the user can easily associate with an specific erroneous RoundTripper implementation. No test because the new code paths are supposed to be unreachable. Updates #37598 Change-Id: If0451e9c6431f6fab7137de43727297a80def05b Reviewed-on: https://go-review.googlesource.com/c/go/+/221818 Reviewed-by: Brad Fitzpatrick --- src/net/http/client.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/net/http/client.go b/src/net/http/client.go index a496f1c0c7..ec24516833 100644 --- a/src/net/http/client.go +++ b/src/net/http/client.go @@ -265,6 +265,12 @@ func send(ireq *Request, rt RoundTripper, deadline time.Time) (resp *Response, d } return nil, didTimeout, err } + if resp == nil { + return nil, didTimeout, fmt.Errorf("http: RoundTripper implementation (%T) returned a nil *Response with a nil error", rt) + } + if resp.Body == nil { + return nil, didTimeout, fmt.Errorf("http: RoundTripper implementation (%T) returned a *Response with a nil Body", rt) + } if !deadline.IsZero() { resp.Body = &cancelTimerBody{ stop: stopTimer, -- 2.50.0