2016-04-27 23:43:43 +00:00
|
|
|
package utils
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
2016-08-19 12:24:09 +00:00
|
|
|
"github.com/emilevauge/backoff"
|
2016-04-27 23:43:43 +00:00
|
|
|
"net/http"
|
|
|
|
"strconv"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
// TryRequest try operation timeout, and retry backoff
|
|
|
|
func TryRequest(url string, timeout time.Duration, condition Condition) error {
|
|
|
|
exponentialBackOff := backoff.NewExponentialBackOff()
|
|
|
|
exponentialBackOff.MaxElapsedTime = timeout
|
|
|
|
var res *http.Response
|
|
|
|
err := backoff.Retry(func() error {
|
|
|
|
var err error
|
|
|
|
res, err = http.Get(url)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return condition(res)
|
|
|
|
}, exponentialBackOff)
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
// Try try operation timeout, and retry backoff
|
|
|
|
func Try(timeout time.Duration, operation func() error) error {
|
|
|
|
exponentialBackOff := backoff.NewExponentialBackOff()
|
|
|
|
exponentialBackOff.MaxElapsedTime = timeout
|
|
|
|
err := backoff.Retry(operation, exponentialBackOff)
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
// Condition is a retry condition function.
|
|
|
|
// It receives a response, and returns an error
|
|
|
|
// if the response failed the condition.
|
|
|
|
type Condition func(*http.Response) error
|
|
|
|
|
|
|
|
// ErrorIfStatusCodeIsNot returns a retry condition function.
|
|
|
|
// The condition returns an error
|
|
|
|
// if the given response's status code is not the given HTTP status code.
|
|
|
|
func ErrorIfStatusCodeIsNot(status int) Condition {
|
|
|
|
return func(res *http.Response) error {
|
|
|
|
if res.StatusCode != status {
|
|
|
|
return errors.New("Bad status. Got: " + res.Status + ", expected:" + strconv.Itoa(status))
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
}
|