code: func (client *Client) doRequestWithRetries(req *http.Request, maxTime time.Duration) (*http.Response, error) {
  	var (
  		err  error
  		resp *http.Response
  		bo   = backoff.NewExponentialBackOff()
  		body []byte
  	)
  
  	bo.MaxElapsedTime = maxTime
  
  	// Save the body for retries
  	if req.Body != nil {
  		body, err = ioutil.ReadAll(req.Body)
  		if err != nil {
  			return resp, err
  		}
  	}
  
  	operation := func() error {
  		if body != nil {
  			r := bytes.NewReader(body)
  			req.Body = ioutil.NopCloser(r)
  		}
  
  		resp, err = client.HttpClient.Do(req)
  		if err != nil {
  			return err
  		}
  
  		if resp.StatusCode >= 200 && resp.StatusCode < 300 {
  			// 2xx all done
  			return nil
  		} else if resp.StatusCode >= 400 && resp.StatusCode < 500 {
  			// 4xx are not retryable
  			return nil
  		}
  
  		return fmt.Errorf("Received HTTP status code %d", resp.StatusCode)
  	}
  
  	err = backoff.Retry(operation, bo)
  
  	return resp, err
  }
docs: // doRequestWithRetries performs an HTTP request repeatedly for maxTime or until
  // no error and no acceptable HTTP response code was returned.