49 lines
1.1 KiB
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
|
||
|
}
|