From 3a38a18ba3d9a8046a11a3f8d24306c1ec85570e Mon Sep 17 00:00:00 2001 From: git-hulk Date: Fri, 9 May 2025 19:28:20 +0800 Subject: [PATCH 1/2] Fix potential wrong total time in trace info when the request is invalid --- request.go | 11 +++++++++-- request_test.go | 12 ++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/request.go b/request.go index 27821ae5..1fd8508c 100644 --- a/request.go +++ b/request.go @@ -1253,11 +1253,18 @@ func (r *Request) TraceInfo() TraceInfo { // Calculate the total time accordingly, // when connection is reused + var requestStartTime time.Time if ct.gotConnInfo.Reused { - ti.TotalTime = ct.endTime.Sub(ct.getConn) + requestStartTime = ct.getConn } else { - ti.TotalTime = ct.endTime.Sub(ct.dnsStart) + requestStartTime = ct.dnsStart } + // DNS start and get conn time may be zero if the request is invalid. + // See issue #1016. + if requestStartTime.IsZero() { + requestStartTime = r.Time + } + 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 b35b389a..215e04f1 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) From 1ad996e54b97951b9fdcc0442e4734b6d848f1ed Mon Sep 17 00:00:00 2001 From: git-hulk Date: Sat, 10 May 2025 08:38:39 +0800 Subject: [PATCH 2/2] Adjust according to review comment --- request.go | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/request.go b/request.go index 1fd8508c..ed475e52 100644 --- a/request.go +++ b/request.go @@ -1251,19 +1251,15 @@ func (r *Request) TraceInfo() TraceInfo { RequestAttempt: r.Attempt, } - // Calculate the total time accordingly, - // when connection is reused - var requestStartTime time.Time - if ct.gotConnInfo.Reused { + // 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 { + } else if !ct.dnsStart.IsZero() { requestStartTime = ct.dnsStart } - // DNS start and get conn time may be zero if the request is invalid. - // See issue #1016. - if requestStartTime.IsZero() { - requestStartTime = r.Time - } ti.TotalTime = ct.endTime.Sub(requestStartTime) // Only calculate on successful connections