eokvin-mirror/client.go

78 lines
1.5 KiB
Go
Raw Permalink Normal View History

2019-03-07 23:17:33 +00:00
package eokvin // import "github.com/veonik/eokvin"
import (
"crypto/tls"
"encoding/json"
"errors"
"io/ioutil"
"net/http"
"net/url"
"time"
2019-03-07 23:17:33 +00:00
)
type ShortURL struct {
url.URL
Original *url.URL
}
type Client struct {
http *http.Client
Endpoint string
Token string
}
func NewClient(endpoint, token string) *Client {
2019-03-07 23:17:33 +00:00
return &Client{
http: &http.Client{},
Endpoint: endpoint,
2019-03-07 23:17:33 +00:00
Token: token,
}
}
func NewInsecureClient(endpoint, token string) *Client {
2019-03-07 23:17:33 +00:00
return &Client{
http: &http.Client{Transport: &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}}},
Endpoint: endpoint,
2019-03-07 23:17:33 +00:00
Token: token,
}
}
func (c *Client) NewShortURLString(lu string, ttl time.Duration) (*ShortURL, error) {
2019-03-07 23:17:33 +00:00
ou, err := url.Parse(lu)
if err != nil {
return nil, err
}
return c.NewShortURL(ou, ttl)
2019-03-07 23:17:33 +00:00
}
func (c *Client) NewShortURL(ou *url.URL, ttl time.Duration) (*ShortURL, error) {
2019-03-07 23:17:33 +00:00
resp, err := c.http.PostForm(
c.Endpoint,
url.Values{"token": {c.Token}, "url": {ou.String()}, "ttl": {ttl.String()}})
2019-03-07 23:17:33 +00:00
if err != nil {
return nil, err
}
defer resp.Body.Close()
b, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err
}
r := struct {
Error string `json:"error"`
ShortURL string `json:"short-url"`
}{}
if err := json.Unmarshal(b, &r); err != nil {
return nil, err
}
if r.Error != "" {
return nil, errors.New(r.Error)
}
u, err := url.Parse(r.ShortURL)
if err != nil {
return nil, err
}
return &ShortURL{URL: *u, Original: ou}, nil
}