func get()

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)
}