aboutsummaryrefslogtreecommitdiff
path: root/client.go
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2015-12-12 13:01:40 +0100
committerDimitri Sokolyuk <demon@dim13.org>2015-12-12 13:01:40 +0100
commit1ee51c10a2b136a2be08bd2faaf8a972a61db82c (patch)
tree55e466d0b65a5d598a8861c9ec75a430c421452d /client.go
parentdb62ad2af431bff566a953cd799d8034e802c3d8 (diff)
Refactor
Diffstat (limited to 'client.go')
-rw-r--r--client.go59
1 files changed, 29 insertions, 30 deletions
diff --git a/client.go b/client.go
index 7994226..f966ec1 100644
--- a/client.go
+++ b/client.go
@@ -11,15 +11,16 @@ import (
"time"
)
-// Links to the next stage
-type Links map[string]string
+// Link to the next stage
+type Link map[string]string
// Client ...
type Client struct {
- Dir Directory
- nonce chan string
- Links Links
- Next string
+ Dir Directory
+ Link Link
+ Location string
+ nonce chan string
+ RetryAfter time.Duration
}
// NewClient fetches directory and initializes nonce
@@ -67,7 +68,7 @@ func (c Client) Nonce() (string, error) {
// post is used for
// new-reg, new-authz, challenge, new-cert
-func (c *Client) post(s Signer, v interface{}) (*http.Response, error) {
+func (c *Client) post(url string, s Signer, v interface{}) (*http.Response, error) {
body, err := json.Marshal(v)
if err != nil {
return nil, err
@@ -79,43 +80,43 @@ func (c *Client) post(s Signer, v interface{}) (*http.Response, error) {
return nil, err
}
- resp, err := http.Post(c.Next, "application/jose+json",
+ resp, err := http.Post(url, "application/jose+json",
bytes.NewReader(signed))
if err != nil {
return nil, err
}
- c.nonce <- replyNonce(resp)
- c.Links = links(resp)
-
if resp.StatusCode >= http.StatusBadRequest {
return nil, handleError(resp)
}
+ c.nonce <- replyNonce(resp)
+ c.Link = links(resp)
+ c.Location = location(resp)
+
return resp, nil
}
-func (c *Client) response(r *http.Response, v interface{}) (string, error) {
+func (c *Client) response(r *http.Response, v interface{}) error {
defer r.Body.Close()
- next := r.Header.Get("Location")
- if next == "" {
- next = c.Links["next"]
- }
- err := json.NewDecoder(r.Body).Decode(v)
- return next, err
+ return json.NewDecoder(r.Body).Decode(v)
+}
+
+func location(r *http.Response) string {
+ return r.Header.Get("Location")
}
-func links(r *http.Response) Links {
- links := make(Links)
+func links(r *http.Response) Link {
+ link := make(Link)
key := textproto.CanonicalMIMEHeaderKey("Link")
reg := regexp.MustCompile(`^<(.*)>;rel="(.*)"`)
for _, l := range r.Header[key] {
re := reg.FindStringSubmatch(l)
if len(re) == 3 {
- links[re[2]] = re[1]
+ link[re[2]] = re[1]
}
}
- return links
+ return link
}
func retryAfter(r *http.Response) time.Duration {
@@ -154,13 +155,12 @@ func (c *Client) Register(a *Account) error {
Resource: ResNewReg,
Contact: a.Contact,
}
- c.Next = c.Dir.NewReg
- resp, err := c.post(a, r)
+ resp, err := c.post(c.Dir.NewReg, a, r)
if err != nil {
return err
}
re := RegistrationResp{}
- c.Next, err = c.response(resp, &re)
+ err = c.response(resp, &re)
if err != nil {
return err
}
@@ -168,12 +168,12 @@ func (c *Client) Register(a *Account) error {
// Agree to TOS
r.Resource = ResRegister
- r.Agreement = c.Links["terms-of-service"]
- aresp, err := c.post(a, r)
+ r.Agreement = c.Link["terms-of-service"]
+ aresp, err := c.post(c.Location, a, r)
if err != nil {
return err
}
- c.Next, err = c.response(aresp, &re)
+ err = c.response(aresp, &re)
log.Println(re)
return err
@@ -187,8 +187,7 @@ func (c *Client) Authorize(a *Account, domain string) error {
Value: domain,
},
}
- c.Next = c.Dir.NewAuthz
- resp, err := c.post(a, az)
+ resp, err := c.post(c.Dir.NewAuthz, a, az)
if err != nil {
return err
}