func()

in internal/httprange/http_reader.go [59:102]


func (r *Reader) ensureResponse() error {
	if r.res != nil {
		return nil
	}

	req, err := r.prepareRequest()
	if err != nil {
		log.WithError(err).WithFields(logrus.Fields{
			"range_start":   r.rangeStart,
			"range_size":    r.rangeSize,
			"offset":        r.offset,
			"resource_size": r.Resource.Size,
			"resource_url":  logging.CleanURL(r.Resource.URL()),
		}).Error(rangeRequestPrepareErrMsg)
		return err
	}

	metrics.HTTPRangeOpenRequests.Inc()

	res, err := r.Resource.httpClient.Do(req)
	if err != nil {
		metrics.HTTPRangeOpenRequests.Dec()
		return err
	}

	err = r.setResponse(res)
	if err != nil {
		metrics.HTTPRangeOpenRequests.Dec()

		// cleanup body on failure from r.setResponse to avoid memory leak
		res.Body.Close()
		logging.LogRequest(req).WithError(err).WithFields(log.Fields{
			"range_start":   r.rangeStart,
			"range_size":    r.rangeSize,
			"offset":        r.offset,
			"resource_size": r.Resource.Size,
			"resource_url":  logging.CleanURL(r.Resource.URL()),
			"status":        res.StatusCode,
			"status_text":   res.Status,
		}).Error(rangeRequestFailedErrMsg)
	}

	return err
}