api/api.go
func (a *API) apiRequest(reqMethod string, reqPath string, data []byte) ([]byte, error) {
	backoffs := []uint{2, 4, 8, 16, 32}
	attempts := 0
	success := false

	var result []byte
	var err error

	for !success {
		result, err = a.apiCall(reqMethod, reqPath, data)
		if err == nil {
			success = true
		}

		// break and return error if not using exponential backoff
		if err != nil {
			if !a.useExponentialBackoff {
				break
			}
			if strings.Contains(err.Error(), "code 403") {
				break
			}
		}

		if !success {
			var wait float64
			if attempts >= len(backoffs) {
				wait = backoff(backoffs[len(backoffs)-1])
			} else {
				wait = backoff(backoffs[attempts])
			}
			attempts++
			a.Log.Printf("[WARN] API call failed %s, retrying in %d seconds.\n", err.Error(), uint(wait))
			time.Sleep(time.Duration(wait) * time.Second)
		}
	}

	return result, err
}
func (a *API) apiRequest(reqMethod string, reqPath string, data []byte) ([]byte, error) {
	backoffs := []uint{2, 4, 8, 16, 32}
	attempts := 0
	success := false

	var result []byte
	var err error

	for !success {
		result, err = a.apiCall(reqMethod, reqPath, data)
		if err == nil {
			success = true
		}

		// break and return error if not using exponential backoff
		if err != nil {
			if !a.useExponentialBackoff {
				break
			}
			if strings.Contains(err.Error(), "code 403") {
				break
			}
		}

		if !success {
			var wait float64
			if attempts >= len(backoffs) {
				wait = backoff(backoffs[len(backoffs)-1])
			} else {
				wait = backoff(backoffs[attempts])
			}
			attempts++
			a.Log.Printf("[WARN] API call failed %s, retrying in %d seconds.\n", err.Error(), uint(wait))
			time.Sleep(time.Duration(wait) * time.Second)
		}
	}

	return result, err
}
func ( a * API ) apiRequest ( reqMethod string , reqPath string , data [ ] byte ) ( [ ] byte , error ) { backoffs := [ ] uint { 2 , 4 , 8 , 16 , 32 } attempts := 0 success := false var result [ ] byte var err error for ! success { result , err = a . apiCall ( reqMethod , reqPath , data ) if err == nil { success = true } // break and return error if not using exponential backoff if err != nil { if ! a . useExponentialBackoff { break } if strings . Contains ( err . Error ( ) , " " ) { break } } if ! success { var wait float64 if attempts >= len ( backoffs ) { wait = backoff ( backoffs [ len ( backoffs ) - 1 ] ) } else { wait = backoff ( backoffs [ attempts ] ) } attempts ++ a . Log . Printf ( " \n " , err . Error ( ) , uint ( wait ) ) time . Sleep ( time . Duration ( wait ) * time . Second ) } } return result , err }
// apiRequest manages retry strategy for exponential backoffs
apiRequest manages retry strategy for exponential backoffs