commit 5b8260a55717a51bd99ac6e148cd9bf179561126 from: Oliver Lowe date: Wed Apr 13 06:23:06 2022 UTC wip commit - 7583dd64601bcc2973ff355bf18e4c09f471245e commit + 5b8260a55717a51bd99ac6e148cd9bf179561126 blob - df1f9d043def3d6b98d774a67bec68a14dbc6267 blob + d12434921090a07f23a8ab1eec3054d934401d8a --- client.go +++ client.go @@ -3,10 +3,8 @@ package mailmux import ( "bytes" "encoding/json" - "errors" "fmt" "net/http" - "net/url" ) const apiurl = "https://mailmux.net/v1/aliases" @@ -15,8 +13,8 @@ const jsonContentType = "application/json" type Client struct { *http.Client - addr string - user string + addr string + user string token string } @@ -26,7 +24,7 @@ func Dial(uri, user, token string) *Client { func (c *Client) Register(username, password string) error { mcall := &Mcall{ - Type: Tregister, + Type: Tregister, Username: username, Password: password, } @@ -35,7 +33,7 @@ func (c *Client) Register(username, password string) e if err := json.NewEncoder(body).Encode(mcall); err != nil { return fmt.Errorf("register %s: %v", username, err) } - resp, err := c.Post(c.addr + "/register", jsonContentType, body) + resp, err := c.Post(c.addr+"/register", jsonContentType, body) if err != nil { return fmt.Errorf("register %s: %v", username, err) } @@ -52,34 +50,53 @@ func (c *Client) Register(username, password string) e } func (c *Client) NewAlias() (Alias, error) { - v := url.Values{} - v.Add("username", c.user) - v.Add("token", c.token) - resp, err := http.PostForm(c.addr + "/aliases", v) + mcall := &Mcall{ + Type: Tnew, + Username: c.user, + Password: c.token, + } + buf := &bytes.Buffer{} + if err := json.NewEncoder(buf).Encode(mcall); err != nil { + return Alias{}, fmt.Errorf("new alias: %w", err) + } + resp, err := http.Post(c.addr+"/aliases", jsonContentType, buf) if err != nil { - return Alias{}, err + return Alias{}, fmt.Errorf("new alias: %w", err) } + defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - return Alias{}, errors.New(resp.Status) + rmsg, err := ParseMcall(resp.Body) + if err != nil { + return Alias{}, fmt.Errorf("new alias: parse response: %w", err) } - - return Alias{}, nil + if rmsg.Type == Rerror { + return Alias{}, fmt.Errorf("new alias: %v", rmsg.Error) + } + return rmsg.Aliases[0], nil } func (c *Client) Aliases() ([]Alias, error) { - v := url.Values{} - v.Add("user", c.user) - v.Add("token", c.token) - req, err := http.NewRequest(http.MethodGet, apiurl, nil) - if err != nil { + tmsg := &Mcall{ + Type: Tlist, + Username: c.user, + Password: c.token, + } + buf := &bytes.Buffer{} + if err := json.NewEncoder(buf).Encode(tmsg); err != nil { return nil, fmt.Errorf("list aliases: %w", err) } - req.URL.RawQuery = v.Encode() - resp, err := c.Do(req) + resp, err := http.Post(c.addr+"/aliases", jsonContentType, buf) if err != nil { return nil, fmt.Errorf("list aliases: %w", err) } + defer resp.Body.Close() - return nil, nil + rmsg, err := ParseMcall(resp.Body) + if err != nil { + return nil, fmt.Errorf("list aliases: parse response: %w", err) + } + if rmsg.Type == Rerror { + return nil, fmt.Errorf("list aliases: %v", rmsg.Error) + } + return rmsg.Aliases, nil } blob - 878bf43ea9dab8f037a8240bb85d7449f13ffd31 blob + b3008bfc6eabb6e3a0750bd60e55419257c9291e --- mcall.go +++ mcall.go @@ -24,12 +24,12 @@ const ( // with a diagnostic message, that the request was not completed successfully. // This design is loosely based on the Plan 9 network file protocol 9P. type Mcall struct { - Type uint - Username string // Tregister, Rregister - Password string // Tregister - Error string // Rerror - Aliases []Alias // Rnew, Rlist, Tremove - Expiry time.Time // Tnew, Rnew + Type uint + Username string // Tregister, Rregister + Password string // Tregister + Error string // Rerror + Aliases []Alias // Rnew, Rlist, Tremove + Expiry time.Time // Tnew, Rnew } // ParseMcall parses and validates one Mcall from r.