aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--provider.go57
1 files changed, 36 insertions, 21 deletions
diff --git a/provider.go b/provider.go
index 1db7266..2cad5f4 100644
--- a/provider.go
+++ b/provider.go
@@ -44,7 +44,7 @@ func NewProvider(directory string) (*Provider, error) {
if err != nil {
return nil, err
}
- _, err = p.parse(resp, &p.Directory)
+ _, err = p.parseJson(resp, &p.Directory)
if err != nil {
return nil, err
}
@@ -77,7 +77,7 @@ func (p *Provider) post(uri string, s Signer, v interface{}) (*http.Response, er
if err != nil {
return nil, err
}
- return p.Post(uri, "application/json", signed)
+ return p.Post(uri, "application/jose+json", signed)
}
type nextStep struct {
@@ -87,11 +87,17 @@ type nextStep struct {
var linksRe = regexp.MustCompile(`^<(.*)>;rel="(.*)"`)
-func (p *Provider) parse(resp *http.Response, v interface{}) (ns nextStep, err error) {
+func (p *Provider) parseNonce(resp *http.Response) {
+ if rn := resp.Header.Get("Replay-Nonce"); rn != "" {
+ p.nonces <- rn
+ }
+}
+
+func (p *Provider) parseHeader(resp *http.Response) nextStep {
+ var ns nextStep
if lo, _ := resp.Location(); lo != nil {
ns.Location = lo.String()
}
-
ns.Link = make(map[string]string)
for _, li := range resp.Header["Link"] {
re := linksRe.FindStringSubmatch(li)
@@ -99,24 +105,34 @@ func (p *Provider) parse(resp *http.Response, v interface{}) (ns nextStep, err e
ns.Link[re[2]] = re[1]
}
}
+ return ns
+}
- if rn := resp.Header.Get("Replay-Nonce"); rn != "" {
- p.nonces <- rn
+func (p *Provider) parseJson(resp *http.Response, v interface{}) (nextStep, error) {
+ ns := p.parseHeader(resp)
+ go p.parseNonce(resp)
+ defer resp.Body.Close()
+ switch resp.Header.Get("Content-Type") {
+ case "application/problem+json":
+ return ns, problem(resp.Body)
+ case "application/json":
+ return ns, json.NewDecoder(resp.Body).Decode(v)
}
+ return ns, errContentType
+}
+func (p *Provider) parseCert(resp *http.Response) (*x509.Certificate, nextStep, error) {
+ ns := p.parseHeader(resp)
+ go p.parseNonce(resp)
defer resp.Body.Close()
switch resp.Header.Get("Content-Type") {
case "application/problem+json":
- err = problem(resp.Body)
- case "application/json":
- err = json.NewDecoder(resp.Body).Decode(v)
+ return nil, ns, problem(resp.Body)
case "application/pkix-cert":
- // FIXME
- v, err = cert(resp.Body)
- default:
- err = errContentType
+ c, err := cert(resp.Body)
+ return c, ns, err
}
- return
+ return nil, ns, errContentType
}
func problem(r io.Reader) error {
@@ -166,7 +182,7 @@ func (p *Provider) Register(s Signer, c Contacts) error {
return err
}
- ns, err := p.parse(resp, r)
+ ns, err := p.parseJson(resp, r)
if err != nil && err.(Problem).Err != ErrMalformed {
return err
@@ -186,7 +202,7 @@ func (p *Provider) Register(s Signer, c Contacts) error {
return err
}
- _, err = p.parse(resp, r)
+ _, err = p.parseJson(resp, r)
return err
}
@@ -210,7 +226,7 @@ func (p *Provider) Authorize(s ThumbSigner, domain string) error {
if err != nil {
return err
}
- _, err = p.parse(resp, r)
+ _, err = p.parseJson(resp, r)
if err != nil {
return err
}
@@ -234,7 +250,7 @@ func (p *Provider) Authorize(s ThumbSigner, domain string) error {
return err
}
- ns, err := p.parse(resp, ans)
+ ns, err := p.parseJson(resp, ans)
if err != nil {
return err
}
@@ -271,7 +287,7 @@ func (p *Provider) queryStatus(url string) (bool, error) {
if err != nil {
return false, err
}
- _, err = p.parse(resp, r)
+ _, err = p.parseJson(resp, r)
if err != nil {
return false, err
}
@@ -293,8 +309,7 @@ func (p *Provider) Cert(s Signer, altnames []string, key *rsa.PrivateKey) (*x509
return nil, err
}
- crt := new(x509.Certificate)
- _, err = p.parse(resp, crt)
+ crt, _, err := p.parseCert(resp)
if err != nil {
return nil, err
}