51 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			51 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package client
 | 
						|
 | 
						|
import (
 | 
						|
	"context"
 | 
						|
 | 
						|
	"go.unistack.org/micro/v3/errors"
 | 
						|
)
 | 
						|
 | 
						|
// RetryFunc that returning either false or a non-nil error will result in the call not being retried
 | 
						|
type RetryFunc func(ctx context.Context, req Request, retryCount int, err error) (bool, error)
 | 
						|
 | 
						|
// RetryAlways always retry on error
 | 
						|
func RetryAlways(ctx context.Context, req Request, retryCount int, err error) (bool, error) {
 | 
						|
	return true, nil
 | 
						|
}
 | 
						|
 | 
						|
// RetryNever never retry on error
 | 
						|
func RetryNever(ctx context.Context, req Request, retryCount int, err error) (bool, error) {
 | 
						|
	return false, nil
 | 
						|
}
 | 
						|
 | 
						|
// RetryOnError retries a request on a 500 or 408 (timeout) error
 | 
						|
func RetryOnError(_ context.Context, _ Request, _ int, err error) (bool, error) {
 | 
						|
	if err == nil {
 | 
						|
		return false, nil
 | 
						|
	}
 | 
						|
	me := errors.FromError(err)
 | 
						|
	switch me.Code {
 | 
						|
	// retry on timeout or internal server error
 | 
						|
	case 408, 500:
 | 
						|
		return true, nil
 | 
						|
	}
 | 
						|
	return false, nil
 | 
						|
}
 | 
						|
 | 
						|
// RetryOnErrors retries a request on specified error codes
 | 
						|
func RetryOnErrors(codes ...int32) RetryFunc {
 | 
						|
	return func(_ context.Context, _ Request, _ int, err error) (bool, error) {
 | 
						|
		if err == nil {
 | 
						|
			return false, nil
 | 
						|
		}
 | 
						|
		me := errors.FromError(err)
 | 
						|
		for _, code := range codes {
 | 
						|
			if me.Code == code {
 | 
						|
				return true, nil
 | 
						|
			}
 | 
						|
		}
 | 
						|
		return false, nil
 | 
						|
	}
 | 
						|
}
 |