code: func (c *Client) Do(req *http.Request, v interface{}) (*http.Response, error) {
  	res, err := c.client.Do(req)
  	if err != nil {
  		return nil, err
  	}
  
  	// BUG(fujin) tightly coupled
  	err = CheckResponse(res) // <--
  	if err != nil {
  		return res, err
  	}
  
  	if v != nil {
  		if w, ok := v.(io.Writer); ok {
  			io.Copy(w, res.Body)
  		} else {
  			err = json.NewDecoder(res.Body).Decode(v)
  			if err != nil {
  				return res, err
  			}
  		}
  	}
  	return res, nil
  }
docs: // Do is used either internally via our magic request shite or a user may use it