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"
|
2019-04-17 00:00:37 +00:00
|
|
|
"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
|
|
|
|
}
|
|
|
|
|
2019-04-17 00:00:37 +00:00
|
|
|
func NewClient(endpoint, token string) *Client {
|
2019-03-07 23:17:33 +00:00
|
|
|
return &Client{
|
|
|
|
http: &http.Client{},
|
2019-04-17 00:00:37 +00:00
|
|
|
Endpoint: endpoint,
|
2019-03-07 23:17:33 +00:00
|
|
|
Token: token,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-04-17 00:00:37 +00:00
|
|
|
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}}},
|
2019-04-17 00:00:37 +00:00
|
|
|
Endpoint: endpoint,
|
2019-03-07 23:17:33 +00:00
|
|
|
Token: token,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-04-17 00:00:37 +00:00
|
|
|
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
|
|
|
|
}
|
2019-04-17 00:00:37 +00:00
|
|
|
return c.NewShortURL(ou, ttl)
|
2019-03-07 23:17:33 +00:00
|
|
|
}
|
|
|
|
|
2019-04-17 00:00:37 +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,
|
2019-04-17 00:00:37 +00:00
|
|
|
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
|
|
|
|
}
|