package cache import ( "bytes" "fmt" "io" "net/http" ) type retry struct { transport http.RoundTripper retry int } func (t *retry) RoundTrip(req *http.Request) (*http.Response, error) { var body []byte if req.Body != nil { body, _ = io.ReadAll(req.Body) } for count := 0; count < t.retry; count++ { req.Body = io.NopCloser(bytes.NewBuffer(body)) res, err := t.transport.RoundTrip(req) if err != nil { return nil, err } if t.check(res) { if res.Body != nil { io.Copy(io.Discard, res.Body) res.Body.Close() } continue } return res, err } return nil, fmt.Errorf("too many retries") } func (t *retry) check(res *http.Response) bool { return res.StatusCode > 399 }