StatusApp/check/http.go

49 lines
1.1 KiB
Go

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
}