package check import ( "net/http" "net/http/httptrace" "time" ) //HTTPPing returns the response time to fetch a page. func HTTPPing(target string) (time.Duration, Result, error) { var totalTime time.Duration var err error successCount := 0 okCount := 0 for i := 0; i < TryCount; i++ { duration, successful, getErr := timeGet(target) totalTime += duration if getErr != nil { err = getErr } if successful { okCount++ } successCount++ } return divide(totalTime, successCount), statusFromSuccessCount(okCount), err } func timeGet(url string) (time.Duration, bool, error) { req, _ := http.NewRequest("GET", url, nil) var connect time.Time var duration time.Duration trace := &httptrace.ClientTrace{ ConnectStart: func(network, addr string) { connect = time.Now() }, GotFirstResponseByte: func() { duration = time.Since(connect) }, } req = req.WithContext(httptrace.WithClientTrace(req.Context(), trace)) res, err := http.DefaultTransport.RoundTrip(req) if err != nil { return 0, false, err } return duration, res.StatusCode < 400, nil }