diff --git a/client.go b/client.go index 26f1385c..4e54f694 100644 --- a/client.go +++ b/client.go @@ -578,6 +578,19 @@ func (c *Client) AddRetryCondition(condition RetryConditionFunc) *Client { return c } +// AddRetryAfterErrorCondition adds the basic condition of retrying after encountering +// an error from the http response +func (c *Client) AddRetryAfterErrorCondition() *Client { + c.AddRetryCondition(func(response *Response, err error) bool { + if response.IsError() { + return true + } + + return false + }) + return c +} + // SetTLSClientConfig method sets TLSClientConfig for underling client Transport. // // For Example: diff --git a/client_test.go b/client_test.go index 3c9ab76d..46fded1f 100644 --- a/client_test.go +++ b/client_test.go @@ -352,6 +352,15 @@ func TestClientOptions(t *testing.T) { client.SetRetryMaxWaitTime(mrwt) assertEqual(t, mrwt, client.RetryMaxWaitTime) + client.AddRetryAfterErrorCondition() + equal(client.RetryConditions[0], func(response *Response, err error) bool { + if response.IsError() { + return true + } + + return false + }) + err := &AuthError{} client.SetError(err) if reflect.TypeOf(err) == client.Error { diff --git a/retry_test.go b/retry_test.go index cfd7b7a8..19d274d1 100644 --- a/retry_test.go +++ b/retry_test.go @@ -626,6 +626,31 @@ func TestClientRetryCount(t *testing.T) { strings.HasPrefix(err.Error(), "Get \""+ts.URL+"/set-retrycount-test\""))) } +func TestClientErrorRetry(t *testing.T) { + ts := createGetServer(t) + defer ts.Close() + + c := dc(). + SetTimeout(time.Second * 3). + SetRetryCount(1). + AddRetryAfterErrorCondition() + + resp, err := c.R(). + SetHeader(hdrContentTypeKey, "application/json; charset=utf-8"). + SetJSONEscapeHTML(false). + SetResult(AuthSuccess{}). + Get(ts.URL + "/set-retry-error-recover") + + assertError(t, err) + + authSuccess := resp.Result().(*AuthSuccess) + + assertEqual(t, http.StatusOK, resp.StatusCode()) + assertEqual(t, "hello", authSuccess.Message) + + assertNil(t, resp.Error()) +} + func filler(*Response, error) bool { return false }