in oss/client.go [457:507]
func (c *Client) sendHttpRequest(ctx context.Context, signingCtx *signer.SigningContext, opts *Options) (response *http.Response, err error) {
request := signingCtx.Request
retryer := opts.Retryer
maxAttempts := c.retryMaxAttempts(opts)
body, _ := request.Body.(*teeReadNopCloser)
resetTime := signingCtx.Time.IsZero()
body.Mark()
for tries := 1; tries <= maxAttempts; tries++ {
if tries > 1 {
delay, err := retryer.RetryDelay(tries, err)
if err != nil {
break
}
if err = sleepWithContext(ctx, delay); err != nil {
err = &CanceledError{Err: err}
break
}
if err = body.Reset(); err != nil {
break
}
if resetTime {
signingCtx.Time = time.Time{}
}
c.inner.Log.Infof("Attempt retry, request[%p], tries:%v, retry delay:%v", request, tries, delay)
}
if response, err = c.sendHttpRequestOnce(ctx, signingCtx, opts); err == nil {
break
}
c.postSendHttpRequestOnce(signingCtx, response, err)
if isContextError(ctx, &err) {
err = &CanceledError{Err: err}
break
}
if !body.IsSeekable() {
break
}
if !retryer.IsErrorRetryable(err) {
break
}
}
return response, err
}