コード例 #1
0
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, &registration.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 &registration, nil
}