commit - 7583dd64601bcc2973ff355bf18e4c09f471245e
commit + 5b8260a55717a51bd99ac6e148cd9bf179561126
blob - df1f9d043def3d6b98d774a67bec68a14dbc6267
blob + d12434921090a07f23a8ab1eec3054d934401d8a
--- client.go
+++ client.go
import (
"bytes"
"encoding/json"
- "errors"
"fmt"
"net/http"
- "net/url"
)
const apiurl = "https://mailmux.net/v1/aliases"
type Client struct {
*http.Client
- addr string
- user string
+ addr string
+ user string
token string
}
func (c *Client) Register(username, password string) error {
mcall := &Mcall{
- Type: Tregister,
+ Type: Tregister,
Username: username,
Password: password,
}
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)
}
}
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
// 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.