aboutsummaryrefslogtreecommitdiff
path: root/provider.go
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2016-01-07 10:09:59 +0100
committerDimitri Sokolyuk <demon@dim13.org>2016-01-07 10:09:59 +0100
commit28eb378ccaccc2d02f3a9de0abf708d869c7292b (patch)
tree55517693ac7f72d50a369c65956315d1aff34a8a /provider.go
parent2ba1abce54aa255de562b24777347919b787fdf3 (diff)
Add timeout
Diffstat (limited to 'provider.go')
-rw-r--r--provider.go93
1 files changed, 49 insertions, 44 deletions
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
}