func sendRegistration(url string, signingKey types.SigningKey, payload interface{}, old *types.Registration) (*types.Registration, error) { payloadJson, err := json.Marshal(payload) if nil != err { return nil, err } req := utils.HttpRequest{ Method: "POST", URL: url, Headers: utils.HttpRequestHeader{ ContentType: "application/json", }, } resp, err := RunSignedRequest(signingKey, &req, payloadJson) if nil != err { return nil, fmt.Errorf("POSTing registration %s to %s failed: %s", string(payloadJson), url, err) } if resp.StatusCode < 200 || resp.StatusCode >= 300 { return nil, fmt.Errorf("POST %s to %s failed: %s", string(payloadJson), url, resp.Status) } var registration types.Registration err = json.Unmarshal(resp.Body, ®istration.Resource) if nil != err { return nil, fmt.Errorf("Failed decoding response from POST %s to %s: %s", string(payloadJson), url, err) } registration.SigningKey = signingKey if 0 == len(resp.Location) || old.Location == url { registration.Location = old.Location } else { registration.Location = resp.Location } if 0 == len(registration.Location) { return nil, fmt.Errorf("Invalid registration location") } registration.LinkTermsOfService = resp.Links["terms-of-service"].URL // TODO: handle RecoveryToken updates registration.RecoveryToken = old.RecoveryToken registration.Name = old.Name return ®istration, nil }