1515package client
1616
1717import (
18+ "fmt"
1819 "net/http"
1920 "time"
2021
21- "github.com/hashicorp/go-retryablehttp "
22+ "github.com/avast/retry-go/v4 "
2223)
2324
2425// Option is a functional option for customizing static signatures.
@@ -30,7 +31,6 @@ type options struct {
3031 RetryWaitMin time.Duration
3132 RetryWaitMax time.Duration
3233 InsecureTLS bool
33- Logger interface {}
3434 NoDisableKeepalives bool
3535 Headers map [string ][]string
3636}
@@ -81,14 +81,9 @@ func WithRetryWaitMax(t time.Duration) Option {
8181 }
8282}
8383
84- // WithLogger sets the logger; it must implement either retryablehttp.Logger or retryablehttp.LeveledLogger; if not, this will not take effect.
85- func WithLogger (logger interface {}) Option {
86- return func (o * options ) {
87- switch logger .(type ) {
88- case retryablehttp.Logger , retryablehttp.LeveledLogger :
89- o .Logger = logger
90- }
91- }
84+ // Deprecated: WithLogger sets the logger; this will have no effect and be removed in future versions.
85+ func WithLogger (interface {}) Option {
86+ return func (* options ) {}
9287}
9388
9489// WithInsecureTLS disables TLS verification.
@@ -113,33 +108,43 @@ func WithHeaders(h map[string][]string) Option {
113108}
114109
115110type roundTripper struct {
116- http.RoundTripper
117- UserAgent string
118- Headers map [string ][]string
111+ inner http.RoundTripper
112+ * options
119113}
120114
121115// RoundTrip implements `http.RoundTripper`
122- func (rt * roundTripper ) RoundTrip (req * http.Request ) (* http.Response , error ) {
123- req .Header .Set ("User-Agent" , rt .UserAgent )
124- for k , v := range rt .Headers {
116+ func (rt * roundTripper ) RoundTrip (req * http.Request ) (res * http.Response , err error ) {
117+ req .Header .Set ("User-Agent" , rt .options . UserAgent )
118+ for k , v := range rt .options . Headers {
125119 for _ , h := range v {
126120 req .Header .Add (k , h )
127121 }
128122 }
129- return rt .RoundTripper .RoundTrip (req )
123+
124+ err = retry .Do (func () (err error ) {
125+ res , err = rt .inner .RoundTrip (req )
126+ if err != nil {
127+ return err
128+ }
129+ if res .StatusCode != 200 {
130+ return fmt .Errorf ("%d: %s" , res .StatusCode , res .Status )
131+ }
132+ return nil
133+ },
134+ retry .Attempts (rt .options .RetryCount ),
135+ retry .Delay (rt .options .RetryWaitMin ),
136+ retry .MaxDelay (rt .options .RetryWaitMax ),
137+ )
138+
139+ return res , err
130140}
131141
132- func createRoundTripper (inner http.RoundTripper , o * options ) http.RoundTripper {
142+ func wrapRoundTripper (inner http.RoundTripper , o * options ) http.RoundTripper {
133143 if inner == nil {
134144 inner = http .DefaultTransport
135145 }
136- if o .UserAgent == "" && o .Headers == nil {
137- // There's nothing to do...
138- return inner
139- }
140146 return & roundTripper {
141- RoundTripper : inner ,
142- UserAgent : o .UserAgent ,
143- Headers : o .Headers ,
147+ inner : inner ,
148+ options : o ,
144149 }
145150}
0 commit comments