code: func (c *httpGcmClient) send(apiKey string, m HttpMessage) (*HttpResponse, error) {
  	bs, err := json.Marshal(m)
  	if err != nil {
  		return nil, fmt.Errorf("error marshalling message>%v", err)
  	}
  	debug("sending", string(bs))
  	req, err := http.NewRequest("POST", c.GcmURL, bytes.NewReader(bs))
  	if err != nil {
  		return nil, fmt.Errorf("error creating request>%v", err)
  	}
  	req.Header.Add(http.CanonicalHeaderKey("Content-Type"), "application/json")
  	req.Header.Add(http.CanonicalHeaderKey("Authorization"), authHeader(apiKey))
  	httpResp, err := c.HttpClient.Do(req)
  	if err != nil {
  		return nil, fmt.Errorf("error sending request to HTTP connection server>%v", err)
  	}
  	gcmResp := &HttpResponse{}
  	body, err := ioutil.ReadAll(httpResp.Body)
  	defer httpResp.Body.Close()
  	if err != nil {
  		return gcmResp, fmt.Errorf("error reading http response body>%v", err)
  	}
  	debug("received body", string(body))
  	err = json.Unmarshal(body, &gcmResp)
  	if err != nil {
  		return gcmResp, fmt.Errorf("error unmarshaling json from body: %v", err)
  	}
  	// TODO(silvano): this is assuming that the header contains seconds instead of a date, need to check
  	c.retryAfter = httpResp.Header.Get(http.CanonicalHeaderKey("Retry-After"))
  	return gcmResp, nil
  }
docs: // httpGcmClient implementation to send a message through GCM Http server.