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 }