server/admin/sync/importer_cloud.go

103 lines
2.4 KiB
Go

package sync
import (
"bufio"
"errors"
"net/http"
"net/url"
"os"
"path"
"strings"
"github.com/studio-b12/gowebdav"
)
type CloudImporter struct {
baseDAV url.URL
username string
password string
}
func NewCloudImporter(baseDAV string, username string, password string) (*CloudImporter, error) {
if r, err := url.Parse(baseDAV); err != nil {
return nil, err
} else {
return &CloudImporter{*r, username, password}, nil
}
}
func (i CloudImporter) Kind() string {
return "cloud file importer: " + i.baseDAV.String()
}
func (i CloudImporter) exists(filename string) bool {
fullURL := i.baseDAV
fullURL.Path = path.Join(fullURL.Path, filename)
client := http.Client{}
if req, err := http.NewRequest("HEAD", fullURL.String(), nil); err == nil {
req.SetBasicAuth(i.username, i.password)
if resp, err := client.Do(req); err == nil {
defer resp.Body.Close()
return resp.StatusCode == http.StatusOK
}
}
return false
}
func (i CloudImporter) toURL(filename string) string {
fullURL := i.baseDAV
fullURL.Path = path.Join(fullURL.Path, filename)
return fullURL.String()
}
func (i CloudImporter) importFile(URI string, next func(string, string) (interface{}, error)) (interface{}, error) {
return ImportFile(i, URI, next)
}
func (i CloudImporter) getFile(filename string, writer *bufio.Writer) error {
fullURL := i.baseDAV
fullURL.Path = path.Join(fullURL.Path, filename)
client := http.Client{}
if req, err := http.NewRequest("GET", fullURL.String(), nil); err != nil {
return err
} else {
req.SetBasicAuth(i.username, i.password)
if resp, err := client.Do(req); err != nil {
return err
} else {
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return errors.New(resp.Status)
} else {
reader := bufio.NewReader(resp.Body)
reader.WriteTo(writer)
writer.Flush()
}
}
}
return nil
}
func (i CloudImporter) listDir(filename string) ([]string, error) {
client := gowebdav.NewClient(i.baseDAV.String(), i.username, i.password)
if files, err := client.ReadDir(strings.Replace(url.PathEscape(filename), "%2F", "/", -1)); err != nil {
return nil, err
} else {
res := make([]string, 0)
for _, file := range files {
res = append(res, file.Name())
}
return res, nil
}
}
func (i CloudImporter) stat(filename string) (os.FileInfo, error) {
return gowebdav.NewClient(i.baseDAV.String(), i.username, i.password).Stat(strings.Replace(url.PathEscape(filename), "%2F", "/", -1))
}