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
}