mirror of
https://github.com/42wim/matterbridge
synced 2024-11-15 06:12:55 +00:00
71 lines
1.5 KiB
Go
71 lines
1.5 KiB
Go
package msauth
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"net/url"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
// ReadLocation reads data from file with path or URL
|
|
func ReadLocation(loc string) ([]byte, error) {
|
|
u, err := url.Parse(loc)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
switch u.Scheme {
|
|
case "", "file":
|
|
return ioutil.ReadFile(u.Path)
|
|
case "http", "https":
|
|
res, err := http.Get(loc)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer res.Body.Close()
|
|
if res.StatusCode != http.StatusOK {
|
|
return nil, fmt.Errorf("%s", res.Status)
|
|
}
|
|
b, err := ioutil.ReadAll(res.Body)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return b, nil
|
|
}
|
|
return nil, fmt.Errorf("Unsupported location to load: %s", loc)
|
|
}
|
|
|
|
// WriteLocation writes data to file with path or URL
|
|
func WriteLocation(loc string, b []byte, m os.FileMode) error {
|
|
u, err := url.Parse(loc)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
switch u.Scheme {
|
|
case "", "file":
|
|
return ioutil.WriteFile(u.Path, b, m)
|
|
case "http", "https":
|
|
if strings.HasSuffix(u.Host, ".blob.core.windows.net") {
|
|
// Azure Blob Storage URL with SAS assumed here
|
|
cli := &http.Client{}
|
|
req, err := http.NewRequest(http.MethodPut, loc, bytes.NewBuffer(b))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
req.Header.Set("x-ms-blob-type", "BlockBlob")
|
|
res, err := cli.Do(req)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer res.Body.Close()
|
|
if res.StatusCode != http.StatusCreated {
|
|
return fmt.Errorf("%s", res.Status)
|
|
}
|
|
return nil
|
|
}
|
|
}
|
|
return fmt.Errorf("Unsupported location to save: %s", loc)
|
|
}
|