in httputil/httputil.go [77:112]
func get(url, auth string) (*http.Response, error) {
req, err := http.NewRequest("GET", url, nil)
if err != nil {
return nil, fmt.Errorf("could not create request: %v", err)
}
req.Header.Set("User-Agent", UserAgent)
if auth != "" {
req.Header.Set("Authorization", auth)
}
client := &http.Client{Transport: DefaultTransport}
deadline := RetryClock.Now().Add(MaxRequestDuration)
lastStatus := 0
for attempt := 0; attempt <= MaxRetries; attempt++ {
res, err := client.Do(req)
// Do not retry on success and permanent/fatal errors
if err != nil || !shouldRetry(res) {
return res, err
}
lastStatus = res.StatusCode
waitFor, err := getWaitPeriod(res, attempt)
if err != nil {
return nil, err
}
nextTryAt := RetryClock.Now().Add(waitFor)
if nextTryAt.After(deadline) {
return nil, fmt.Errorf("unable to complete request to %s within %v", url, MaxRequestDuration)
}
if attempt < MaxRetries {
RetryClock.Sleep(waitFor)
}
}
return nil, fmt.Errorf("unable to complete request to %s after %d retries. Most recent status: %d", url, MaxRetries, lastStatus)
}