diff --git a/client.go b/client.go index 411ca0a..fdb5fb6 100644 --- a/client.go +++ b/client.go @@ -584,6 +584,8 @@ func (c *Client) R() *Request { responseBodyLimit: c.responseBodyLimit, generateCurlOnDebug: c.generateCurlOnDebug, } + + r.retryConditions = append(r.retryConditions, c.retryConditions...) return r } diff --git a/request.go b/request.go index 4753636..4dff539 100644 --- a/request.go +++ b/request.go @@ -855,6 +855,36 @@ func (r *Request) AddRetryCondition(condition RetryConditionFunc) *Request { return r } +// SetRetryCount method enables retry on Resty client and allows you +// to set no. of retry count. Resty uses a Backoff mechanism. +func (r *Request) SetRetryCount(count int) *Request { + r.RetryCount = count + return r +} + +// SetRetryWaitTime method sets the default wait time for sleep before retrying +// +// Default is 100 milliseconds. +func (r *Request) SetRetryWaitTime(waitTime time.Duration) *Request { + r.RetryWaitTime = waitTime + return r +} + +// SetRetryMaxWaitTime method sets the max wait time for sleep before retrying +// +// Default is 2 seconds. +func (r *Request) SetRetryMaxWaitTime(maxWaitTime time.Duration) *Request { + r.RetryMaxWaitTime = maxWaitTime + return r +} + +// SetRetryResetReaders method enables the Resty client to seek the start of all +// file readers are given as multipart files if the object implements [io.ReadSeeker]. +func (r *Request) SetRetryResetReaders(b bool) *Request { + r.RetryResetReaders = b + return r +} + //‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ // HTTP request tracing //_______________________________________________________________________ @@ -1031,7 +1061,7 @@ func (r *Request) Execute(method, url string) (*Response, error) { r.Method = method r.URL = r.selectAddr(addrs, url, 0) - if r.client.retryCount == 0 { + if r.RetryCount == 0 { r.Attempt = 1 resp, err = r.client.execute(r) r.client.onErrorHooks(r, resp, unwrapNoRetryErr(err)) @@ -1054,7 +1084,7 @@ func (r *Request) Execute(method, url string) (*Response, error) { Retries(r.RetryCount), WaitTime(r.RetryWaitTime), MaxWaitTime(r.RetryMaxWaitTime), - RetryConditions(append(r.retryConditions, r.client.RetryConditions()...)), + RetryConditions(r.retryConditions), RetryHooks(r.client.RetryHooks()), ResetMultipartReaders(r.RetryResetReaders), ) diff --git a/retry_test.go b/retry_test.go index 2e722f4..f7d2b48 100644 --- a/retry_test.go +++ b/retry_test.go @@ -158,8 +158,7 @@ func TestConditionalGet(t *testing.T) { logResponse(t, resp) } -// Check to make sure the package Function works. -func TestConditionalGetDefaultClient(t *testing.T) { +func TestConditionalGetRequestLevel(t *testing.T) { ts := createGetServer(t) defer ts.Close() attemptCount := 1 @@ -173,9 +172,12 @@ func TestConditionalGetDefaultClient(t *testing.T) { // Clear the default client. client := dc() - // Proceed to check. - client.AddRetryCondition(check).SetRetryCount(1) resp, err := client.R(). + AddRetryCondition(check). + SetRetryCount(1). + SetRetryWaitTime(time.Duration(50)*time.Millisecond). + SetRetryMaxWaitTime(time.Duration(1)*time.Second). + SetRetryResetReaders(true). SetQueryParam("request_no", strconv.FormatInt(time.Now().Unix(), 10)). Get(ts.URL + "/") @@ -800,7 +802,7 @@ func TestResetMultipartReaderSeekStartError(t *testing.T) { assertEqual(t, err.Error(), errSeekFailure.Error()) } -func TestResetMultipartReaders(t *testing.T) { +func TestClientResetMultipartReaders(t *testing.T) { ts := createFilePostServer(t) defer ts.Close() @@ -834,3 +836,39 @@ func TestResetMultipartReaders(t *testing.T) { assertEqual(t, 500, resp.StatusCode()) assertNil(t, err) } + +func TestRequestResetMultipartReaders(t *testing.T) { + ts := createFilePostServer(t) + defer ts.Close() + + str := "test" + buf := []byte(str) + + bufReader := bytes.NewReader(buf) + bufCpy := make([]byte, len(buf)) + + c := dc(). + SetTimeout(time.Second * 3). + AddRetryAfterErrorCondition(). + AddRetryHook( + func(response *Response, _ error) { + read, err := bufReader.Read(bufCpy) + + assertNil(t, err) + assertEqual(t, len(buf), read) + assertEqual(t, str, string(bufCpy)) + }, + ) + + assertEqual(t, false, c.RetryResetReaders()) + + req := c.R(). + SetRetryCount(2). + SetRetryResetReaders(true). + SetFileReader("name", "filename", bufReader) + resp, err := req.Post(ts.URL + "/set-reset-multipart-readers-test") + + assertEqual(t, true, req.RetryResetReaders) + assertEqual(t, 500, resp.StatusCode()) + assertNil(t, err) +}