package e3
import (
"bytes"
"context"
"fmt"
"io"
"io/ioutil"
"mime/multipart"
"net/http"
"strings"
)
type E3 struct {
user, pass, url string
client *http.Client
}
const DefaultURL = "https://e3.evanjon.es/api"
func New(user, pass, url string) E3 {
return E3{
user,
pass,
url,
http.DefaultClient,
}
}
func WithClient(user, pass, url string, client *http.Client) E3 {
return E3{
user,
pass,
url,
client,
}
}
func (e3 E3) URL() string {
return e3.url
}
func (e3 E3) Upload(ctx context.Context, public bool, filename string, file io.Reader) (string, error) {
var requestBody bytes.Buffer
mpwriter := multipart.NewWriter(&requestBody)
filewriter, err := mpwriter.CreateFormFile("data", filename)
if err != nil {
return "", err
}
if _, err := io.Copy(filewriter, file); err != nil {
return "", err
}
if public {
fieldwriter, err := mpwriter.CreateFormField("access")
if err != nil {
return "", err
}
_, err = fieldwriter.Write([]byte("public"))
if err != nil {
return "", err
}
}
if err := mpwriter.Close(); err != nil {
return "", err
}
// Request as usual.
req, err := http.NewRequestWithContext(ctx, "POST", e3.url, &requestBody)
if err != nil {
return "", err
}
req.SetBasicAuth(e3.user, e3.pass)
req.Header.Set("Content-Type", mpwriter.FormDataContentType())
resp, err := e3.client.Do(req)
if err != nil {
return "", err
}
defer resp.Body.Close()
bytes, err := ioutil.ReadAll(resp.Body)
if err != nil {
return "", err
}
res := strings.TrimSpace(string(bytes))
if resp.StatusCode != http.StatusOK {
return "", fmt.Errorf("%s", res)
}
return res, nil
}
func (e3 E3) Proxy(ctx context.Context, objectURL string) ([]byte, error) {
req, err := http.NewRequestWithContext(ctx, "GET", objectURL, nil)
if err != nil {
return []byte{}, err
}
req.SetBasicAuth(e3.user, e3.pass)
resp, err := e3.client.Do(req)
if err != nil {
return []byte{}, err
}
defer resp.Body.Close()
bytes, err := ioutil.ReadAll(resp.Body)
if err != nil {
return []byte{}, err
}
return bytes, nil
}