diff --git a/internal/core/client.go b/internal/core/client.go index dd96b53a54..71aea49c38 100644 --- a/internal/core/client.go +++ b/internal/core/client.go @@ -2,6 +2,7 @@ package core import ( "fmt" + "net/http" "strings" "github.com/scaleway/scaleway-sdk-go/logger" @@ -61,6 +62,9 @@ func createClient(buildInfo *BuildInfo, profileName string) (*scw.Client, error) scw.WithDefaultZone(scw.ZoneFrPar1), scw.WithUserAgent(buildInfo.GetUserAgent()), scw.WithProfile(profile), + scw.WithHTTPClient(&http.Client{ + Transport: &retryableHTTPTransport{transport: http.DefaultTransport}, + }), } client, err := scw.NewClient(opts...) @@ -76,6 +80,9 @@ func createAnonymousClient(buildInfo *BuildInfo) (*scw.Client, error) { scw.WithDefaultRegion(scw.RegionFrPar), scw.WithDefaultZone(scw.ZoneFrPar1), scw.WithUserAgent(buildInfo.GetUserAgent()), + scw.WithHTTPClient(&http.Client{ + Transport: &retryableHTTPTransport{transport: http.DefaultTransport}, + }), } client, err := scw.NewClient(opts...) diff --git a/internal/core/http_retry.go b/internal/core/http_retry.go new file mode 100644 index 0000000000..67757ee6b2 --- /dev/null +++ b/internal/core/http_retry.go @@ -0,0 +1,21 @@ +package core + +import ( + "net/http" + "time" +) + +const defaultRetryInterval = 1 * time.Second + +type retryableHTTPTransport struct { + transport http.RoundTripper +} + +func (r *retryableHTTPTransport) RoundTrip(request *http.Request) (*http.Response, error) { + res, err := r.transport.RoundTrip(request) + if err == nil && res.StatusCode == http.StatusTooManyRequests { + time.Sleep(defaultRetryInterval) + return r.RoundTrip(request) + } + return res, err +} diff --git a/internal/core/testing.go b/internal/core/testing.go index 97e92e74ad..2c5a1b370e 100644 --- a/internal/core/testing.go +++ b/internal/core/testing.go @@ -199,6 +199,9 @@ func createTestClient(t *testing.T, testConfig *TestConfig, httpClient *http.Cli scw.WithAuth("SCWXXXXXXXXXXXXXXXXX", "11111111-1111-1111-1111-111111111111"), scw.WithDefaultOrganizationID("11111111-1111-1111-1111-111111111111"), scw.WithUserAgent("cli-e2e-test"), + scw.WithHTTPClient(&http.Client{ + Transport: &retryableHTTPTransport{transport: http.DefaultTransport}, + }), } // If client is NOT an E2E client we init http recorder and load configuration. @@ -615,7 +618,7 @@ func getHTTPRecoder(t *testing.T, update bool) (client *http.Client, cleanup fun return nil }) - return &http.Client{Transport: r}, func() { + return &http.Client{Transport: &retryableHTTPTransport{transport: r}}, func() { assert.NoError(t, r.Stop()) // Make sure recorder is stopped once done with it }, nil }