aboutsummaryrefslogtreecommitdiff
path: root/mastodon/mastodon.go
diff options
context:
space:
mode:
Diffstat (limited to 'mastodon/mastodon.go')
-rw-r--r--mastodon/mastodon.go99
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 {