in request.go [93:147]
func request(project *LogProject, method, uri string, headers map[string]string,
body []byte, mock ...interface{}) (*http.Response, error) {
var r *http.Response
var slsErr error
var err error
var mockErr *mockErrorRetry
project.init()
ctx, cancel := context.WithTimeout(context.Background(), project.retryTimeout)
defer cancel()
//fmt.Println("request ", project, method, uri, headers, body)
// all GET method is read function
if method == http.MethodGet {
err = RetryWithCondition(ctx, backoff.NewExponentialBackOff(), func() (bool, error) {
if len(mock) == 0 {
//fmt.Println("real request", project, method, uri, headers, body)
r, slsErr = realRequest(ctx, project, method, uri, headers, body)
//fmt.Println("real request done")
} else {
r, mockErr = nil, mock[0].(*mockErrorRetry)
mockErr.RetryCnt--
if mockErr.RetryCnt <= 0 {
r = &http.Response{}
slsErr = nil
return false, nil
}
slsErr = &mockErr.Err
}
return retryReadErrorCheck(ctx, slsErr)
})
} else {
err = RetryWithCondition(ctx, backoff.NewExponentialBackOff(), func() (bool, error) {
if len(mock) == 0 {
r, slsErr = realRequest(ctx, project, method, uri, headers, body)
} else {
r, mockErr = nil, mock[0].(*mockErrorRetry)
mockErr.RetryCnt--
if mockErr.RetryCnt <= 0 {
r = &http.Response{}
slsErr = nil
return false, nil
}
slsErr = &mockErr.Err
}
return retryWriteErrorCheck(ctx, slsErr)
})
}
if err != nil {
return r, err
}
return r, slsErr
}