code: func (hhc *Client) Do(request *http.Request) (*http.Response, error) {
  	var response *http.Response
  	var err error
  
  	var bodyReader *bytes.Reader
  
  	if request.Body != nil {
  		reqData, err := ioutil.ReadAll(request.Body)
  		if err != nil {
  			return nil, err
  		}
  		bodyReader = bytes.NewReader(reqData)
  		request.Body = ioutil.NopCloser(bodyReader) // prevents closing the body between retries
  	}
  
  	for i := 0; i <= hhc.retryCount; i++ {
  		if response != nil {
  			response.Body.Close()
  		}
  
  		err = hystrix.Do(hhc.hystrixCommandName, func() error {
  			response, err = hhc.client.Do(request)
  			if bodyReader != nil {
  				// Reset the body reader after the request since at this point it's already read
  				// Note that it's safe to ignore the error here since the 0,0 position is always valid
  				_, _ = bodyReader.Seek(0, 0)
  			}
  
  			if err != nil {
  				return err
  			}
  
  			if response.StatusCode >= http.StatusInternalServerError {
  				return err5xx
  			}
  			return nil
  		}, hhc.fallbackFunc)
  
  		if err != nil {
  			backoffTime := hhc.retrier.NextInterval(i)
  			time.Sleep(backoffTime)
  			continue
  		}
  
  		break
  	}
  
  	if err == err5xx {
  		return response, nil
  	}
  
  	return response, err
  }
docs: // Do makes an HTTP request with the native `http.Do` interface