aboutsummaryrefslogtreecommitdiff
path: root/provider.go
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2016-01-07 10:00:25 +0100
committerDimitri Sokolyuk <demon@dim13.org>2016-01-07 10:00:25 +0100
commit2ba1abce54aa255de562b24777347919b787fdf3 (patch)
treed0cff022f6bc23581df437e4ce2ba5f7952f271b /provider.go
parentb2bf8ff1a1983a81bcaf8a90a827de38b8bc1ad8 (diff)
Split parse*(resp)
Diffstat (limited to 'provider.go')
-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
}