func()

in kinto/client.go [394:435]


func (c *Client) do(r *http.Request, target interface{}, accept expectations) error {
	backoff := c.getBackoff()
	c.authenticate(r)
	if backoff > 0 {
		// Kinto kindly asks us that we backoff when necessary
		// See https://docs.kinto-storage.org/en/stable/api/1.x/backoff.html
		log.Printf("Kinto has asked us to backoff for %d seconds\n", c.backoff)
		time.Sleep(time.Second * c.backoff)
	}
	resp, err := c.inner.Do(r)
	if err != nil {
		return err
	}
	receivedBackoff := resp.Header.Get("Backoff")
	if receivedBackoff != "" {
		b, err := strconv.Atoi(receivedBackoff)
		if err != nil {
			return fmt.Errorf(
				"Kinto gave us a Backoff header, but "+
					"it did not parse to an integer. Got '%s'",
				receivedBackoff)
		}
		c.setBackoff(time.Second * time.Duration(b))
	} else {
		c.setBackoff(time.Duration(0))
	}
	if accept != nil {
		if _, ok := accept[resp.StatusCode]; !ok {
			defer resp.Body.Close()
			b, err := ioutil.ReadAll(resp.Body)
			if err != nil {
				return fmt.Errorf("expected status code %v, got %d", accept, resp.StatusCode)
			}
			return fmt.Errorf("expected status code %v, got %d. Message %s", accept, resp.StatusCode, string(b))
		}
	}
	if target != nil {
		defer resp.Body.Close()
		return json.NewDecoder(resp.Body).Decode(&target)
	}
	return nil
}