From 2ba1abce54aa255de562b24777347919b787fdf3 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Thu, 7 Jan 2016 10:00:25 +0100 Subject: Split parse*(resp) --- provider.go | 57 ++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 36 insertions(+), 21 deletions(-) (limited to 'provider.go') 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 } -- cgit v1.2.3