package acme import ( "bytes" "encoding/json" "net/http" "github.com/square/go-jose" ) type Signer interface { Sign([]byte) ([]byte, error) } var nonces = newNonce() func Get(uri string, v interface{}) error { resp, err := http.Get(uri) if err != nil { return err } defer resp.Body.Close() nonces.parse(resp) return json.NewDecoder(resp.Body).Decode(v) } func Post(s Signer, uri string, v interface{}) (*http.Response, error) { body, err := json.Marshal(v) if err != nil { return nil, err } signed, err := s.Sign(body) if err != nil { return nil, err } resp, err := http.Post(uri, "application/jose+json", bytes.NewReader(signed)) if err != nil { return nil, err } nonces.parse(resp) if resp.StatusCode >= http.StatusBadRequest { return nil, handleError(resp) } return resp, nil } func Sign(acc Account, body []byte) (string, error) { signer, err := jose.NewSigner(jose.RS256, acc.PrivKey) signer.SetNonceSource(nonces) if err != nil { return "", err } obj, err := signer.Sign(body) if err != nil { return "", err } return obj.FullSerialize(), nil }