code: func (r *Request) setBodyGzip(body interface{}) error {
  	switch b := body.(type) {
  	case string:
  		buf := new(bytes.Buffer)
  		w := gzip.NewWriter(buf)
  		if _, err := w.Write([]byte(b)); err != nil {
  			return err
  		}
  		if err := w.Close(); err != nil {
  			return err
  		}
  		r.Header.Add("Content-Encoding", "gzip")
  		r.Header.Add("Vary", "Accept-Encoding")
  		return r.setBodyReader(bytes.NewReader(buf.Bytes()))
  	default:
  		data, err := json.Marshal(b)
  		if err != nil {
  			return err
  		}
  		buf := new(bytes.Buffer)
  		w := gzip.NewWriter(buf)
  		if _, err := w.Write(data); err != nil {
  			return err
  		}
  		if err := w.Close(); err != nil {
  			return err
  		}
  		r.Header.Add("Content-Encoding", "gzip")
  		r.Header.Add("Vary", "Accept-Encoding")
  		r.Header.Set("Content-Type", "application/json")
  		return r.setBodyReader(bytes.NewReader(buf.Bytes()))
  	}
  }
docs: // setBodyGzip gzip's the body. It accepts both strings and structs as body.
  // The latter will be encoded via json.Marshal.