From 28eb378ccaccc2d02f3a9de0abf708d869c7292b Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Thu, 7 Jan 2016 10:09:59 +0100 Subject: Add timeout --- provider.go | 93 ++++++++++++++++++++++++++++++++----------------------------- 1 file changed, 49 insertions(+), 44 deletions(-) (limited to 'provider.go') diff --git a/provider.go b/provider.go index 2cad5f4..3334ced 100644 --- a/provider.go +++ b/provider.go @@ -25,6 +25,7 @@ var ( errTimedOut = errors.New("timed out") errContentType = errors.New("unknown content type") errChallengeType = errors.New("unknown challenge") + errStatus = errors.New("unexpected status") ) // Nonce implements jose nonce provider @@ -39,7 +40,12 @@ func (p Provider) Nonce() (string, error) { // NewProvider fetches directory and initializes nonce func NewProvider(directory string) (*Provider, error) { - p := &Provider{nonces: make(chan string, 10)} + p := &Provider{ + nonces: make(chan string, 10), + Client: http.Client{ + Timeout: time.Duration(5 * time.Second), + }, + } resp, err := p.Get(directory) if err != nil { return nil, err @@ -189,12 +195,9 @@ func (p *Provider) Register(s Signer, c Contacts) error { } r = &Registration{ - Resource: ResReg, - Contact: c, - } - - if tos := ns.Link["terms-of-service"]; tos != "" { - r.Agreement = tos + Resource: ResReg, + Contact: c, + Agreement: ns.Link["terms-of-service"], } resp, err = p.post(ns.Location, s, r) @@ -231,53 +234,55 @@ func (p *Provider) Authorize(s ThumbSigner, domain string) error { return err } - switch resp.StatusCode { - case http.StatusCreated: - n, ch := pickChallenge(r.Challenges) - if n < 0 { - return errors.New("can't solve any challenges") - } + if resp.StatusCode != http.StatusCreated { + return errStatus + } - ka, _ := KeyAuthorization(s, ch.Token) - ans := &Challenge{ - Resource: ResChallenge, - Type: ch.Type, - KeyAuthorization: ka, - } + n, ch := pickChallenge(r.Challenges) + if n < 0 { + return errors.New("can't solve any challenges") + } - resp, err = p.post(ch.URI, s, ans) - if err != nil { - return err - } + ka, _ := KeyAuthorization(s, ch.Token) + ans := &Challenge{ + Resource: ResChallenge, + Type: ch.Type, + KeyAuthorization: ka, + } - ns, err := p.parseJson(resp, ans) - if err != nil { - return err - } + resp, err = p.post(ch.URI, s, ans) + if err != nil { + return err + } - var sol Solver + ns, err := p.parseJson(resp, ans) + if err != nil { + return err + } - switch ch.Type { - case ChallengeHTTP: - sol = &httpChallenge{Addr: "localhost:8080", Challenge: *ans} - default: - return errChallengeType - } + var sol Solver - if err := Solve(sol, time.Minute); err != nil { + switch ch.Type { + case ChallengeHTTP: + sol = &httpChallenge{Addr: "localhost:8080", Challenge: *ans} + default: + return errChallengeType + } + + if err := Solve(sol, time.Minute); err != nil { + return err + } + + for { + done, err := p.queryStatus(ns.Location) + if err != nil { return err } - - for { - done, err := p.queryStatus(ns.Location) - if err != nil { - return err - } - if done { - break - } + if done { + break } } + return err } -- cgit v1.2.3