code: func (s *Service) Push(deviceToken string, headers *Headers, payload []byte) (string, error) {
  	// check payload length before even hitting Apple.
  	if len(payload) > maxPayload {
  		return "", &Error{
  			Reason: ErrPayloadTooLarge,
  			Status: http.StatusRequestEntityTooLarge,
  		}
  	}
  
  	urlStr := fmt.Sprintf("%v/3/device/%v", s.Host, deviceToken)
  
  	req, err := http.NewRequest("POST", urlStr, bytes.NewReader(payload))
  	if err != nil {
  		return "", err
  	}
  	req.Header.Set("Content-Type", "application/json")
  	headers.set(req.Header)
  
  	resp, err := s.Client.Do(req)
  
  	if err != nil {
  		if e, ok := err.(*url.Error); ok {
  			if e, ok := e.Err.(http2.GoAwayError); ok {
  				// parse DebugData as JSON. no status code known (0)
  				return "", parseErrorResponse(strings.NewReader(e.DebugData), 0)
  			}
  		}
  		return "", err
  	}
  	defer resp.Body.Close()
  
  	if resp.StatusCode == http.StatusOK {
  		return resp.Header.Get("apns-id"), nil
  	}
  
  	return "", parseErrorResponse(resp.Body, resp.StatusCode)
  }
docs: // Push sends a notification and waits for a response.