diff --git a/request.go b/request.go index 27821ae..ed475e5 100644 --- a/request.go +++ b/request.go @@ -1251,13 +1251,16 @@ func (r *Request) TraceInfo() TraceInfo { RequestAttempt: r.Attempt, } - // Calculate the total time accordingly, - // when connection is reused - if ct.gotConnInfo.Reused { - ti.TotalTime = ct.endTime.Sub(ct.getConn) - } else { - ti.TotalTime = ct.endTime.Sub(ct.dnsStart) + // Calculate the total time accordingly when connection is reused, + // and DNS start and get conn time may be zero if the request is invalid. + // See issue #1016. + requestStartTime := r.Time + if ct.gotConnInfo.Reused && !ct.getConn.IsZero() { + requestStartTime = ct.getConn + } else if !ct.dnsStart.IsZero() { + requestStartTime = ct.dnsStart } + ti.TotalTime = ct.endTime.Sub(requestStartTime) // Only calculate on successful connections if !ct.connectDone.IsZero() { diff --git a/request_test.go b/request_test.go index b35b389..215e04f 100644 --- a/request_test.go +++ b/request_test.go @@ -1830,6 +1830,18 @@ func TestTraceInfo(t *testing.T) { }) + t.Run("enable trace on invalid request, issue #1016", func(t *testing.T) { + resp, err := client.R().EnableTrace().Get("unknown://url.com") + assertNotNil(t, err) + tr := resp.Request.TraceInfo() + assertEqual(t, true, tr.DNSLookup == 0) + assertEqual(t, true, tr.ConnTime == 0) + assertEqual(t, true, tr.TLSHandshake == 0) + assertEqual(t, true, tr.ServerTime == 0) + assertEqual(t, true, tr.ResponseTime == 0) + assertEqual(t, true, tr.TotalTime > 0 && tr.TotalTime < time.Second) + }) + t.Run("enable trace and debug on request", func(t *testing.T) { c, logBuf := dcldb() c.SetBaseURL(ts.URL)