From 1ee51c10a2b136a2be08bd2faaf8a972a61db82c Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sat, 12 Dec 2015 13:01:40 +0100 Subject: Refactor --- client.go | 59 +++++++++++++++++++++++++++++------------------------------ 1 file changed, 29 insertions(+), 30 deletions(-) (limited to 'client.go') 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 } -- cgit v1.2.3