// postWithRetry calls post() and retries on HTTP failure // (response code != 200). func postWithRetry(hc *http.Client, url string, form url.Values) ([]byte, uint, int, error) { backoff := lib.Backoff{} for { responseBody, gcpErrorCode, httpStatusCode, err := post(hc, url, form) if responseBody != nil && httpStatusCode == http.StatusOK { return responseBody, gcpErrorCode, httpStatusCode, err } p, retryAgain := backoff.Pause() if !retryAgain { log.Debugf("HTTP error %s, retry timeout hit", err, p) return responseBody, gcpErrorCode, httpStatusCode, err } log.Debugf("HTTP error %s, retrying after %s", err, p) time.Sleep(p) } }
// getWithRetry calls get() and retries on HTTP failure // (response code != 200). func getWithRetry(hc *http.Client, url string) (*http.Response, error) { backoff := lib.Backoff{} for { response, err := get(hc, url) if response != nil && response.StatusCode == http.StatusOK { return response, err } p, retryAgain := backoff.Pause() if !retryAgain { log.Debugf("HTTP error %s, retry timeout hit", err, p) return response, err } log.Debugf("HTTP error %s, retrying after %s", err, p) time.Sleep(p) } }
func postWithRetry(url string, data url.Values) (*http.Response, error) { backoff := lib.Backoff{} for { response, err := http.PostForm(url, data) if err == nil { return response, err } fmt.Printf("POST to %s failed with error: %s\n", url, err) p, retryAgain := backoff.Pause() if !retryAgain { return response, err } fmt.Printf("retrying POST to %s in %s\n", url, p) time.Sleep(p) } }