diff options
Diffstat (limited to 'mastodon/mastodon.go')
-rw-r--r-- | mastodon/mastodon.go | 99 |
1 files changed, 20 insertions, 79 deletions
diff --git a/mastodon/mastodon.go b/mastodon/mastodon.go index 8678314..194ca30 100644 --- a/mastodon/mastodon.go +++ b/mastodon/mastodon.go @@ -2,18 +2,14 @@ package mastodon import ( - "bytes" "context" "encoding/json" "errors" "fmt" "io" - "mime/multipart" "net/http" "net/url" - "os" "path" - "path/filepath" "strings" "github.com/tomnomnom/linkheader" @@ -33,6 +29,11 @@ type Client struct { config *Config } +type multipartRequest struct { + Data io.Reader + ContentType string +} + func (c *Client) doAPI(ctx context.Context, method string, uri string, params interface{}, res interface{}, pg *Pagination) error { u, err := url.Parse(c.config.Server) if err != nil { @@ -56,83 +57,12 @@ func (c *Client) doAPI(ctx context.Context, method string, uri string, params in if err != nil { return err } - } else if file, ok := params.(string); ok { - f, err := os.Open(file) - if err != nil { - return err - } - defer f.Close() - - var buf bytes.Buffer - mw := multipart.NewWriter(&buf) - part, err := mw.CreateFormFile("file", filepath.Base(file)) - if err != nil { - return err - } - _, err = io.Copy(part, f) - if err != nil { - return err - } - err = mw.Close() - if err != nil { - return err - } - req, err = http.NewRequest(method, u.String(), &buf) - if err != nil { - return err - } - ct = mw.FormDataContentType() - } else if file, ok := params.(*multipart.FileHeader); ok { - f, err := file.Open() - if err != nil { - return err - } - defer f.Close() - - var buf bytes.Buffer - mw := multipart.NewWriter(&buf) - fname := filepath.Base(file.Filename) - err = mw.WriteField("description", fname) - if err != nil { - return err - } - part, err := mw.CreateFormFile("file", fname) - if err != nil { - return err - } - _, err = io.Copy(part, f) - if err != nil { - return err - } - err = mw.Close() - if err != nil { - return err - } - req, err = http.NewRequest(method, u.String(), &buf) + } else if mr, ok := params.(*multipartRequest); ok { + req, err = http.NewRequest(method, u.String(), mr.Data) if err != nil { return err } - ct = mw.FormDataContentType() - } else if reader, ok := params.(io.Reader); ok { - var buf bytes.Buffer - mw := multipart.NewWriter(&buf) - part, err := mw.CreateFormFile("file", "upload") - if err != nil { - return err - } - _, err = io.Copy(part, reader) - if err != nil { - return err - } - err = mw.Close() - if err != nil { - return err - } - req, err = http.NewRequest(method, u.String(), &buf) - if err != nil { - return err - } - ct = mw.FormDataContentType() + ct = mr.ContentType } else { if method == http.MethodGet && pg != nil { u.RawQuery = pg.toValues().Encode() @@ -168,12 +98,13 @@ func (c *Client) doAPI(ctx context.Context, method string, uri string, params in } } return json.NewDecoder(resp.Body).Decode(&res) + } // NewClient return new mastodon API client. func NewClient(config *Config) *Client { return &Client{ - Client: http.DefaultClient, + Client: httpClient, config: config, } } @@ -207,6 +138,16 @@ func (c *Client) AuthenticateToken(ctx context.Context, authCode, redirectURI st return c.authenticate(ctx, params) } +func (c *Client) RevokeToken(ctx context.Context) error { + params := url.Values{ + "client_id": {c.config.ClientID}, + "client_secret": {c.config.ClientSecret}, + "token": {c.GetAccessToken(ctx)}, + } + + return c.doAPI(ctx, http.MethodPost, "/oauth/revoke", params, nil, nil) +} + func (c *Client) authenticate(ctx context.Context, params url.Values) error { u, err := url.Parse(c.config.Server) if err != nil { |