Skip to content

Commit

Permalink
use another webdav library
Browse files Browse the repository at this point in the history
  • Loading branch information
zyxkad committed Feb 19, 2024
1 parent 4d1a74e commit 2db1e56
Show file tree
Hide file tree
Showing 9 changed files with 79 additions and 116 deletions.
30 changes: 5 additions & 25 deletions cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -709,25 +709,13 @@ func (cr *Cluster) syncFiles(ctx context.Context, files []FileInfo, heavyCheck b
}
defer srcFd.Close()
for _, target := range f.targets {
dst, err := target.Create(f.Hash)
if err != nil {
logErrorf("Could not create %s: %v", target.String(), err)
continue
}
if _, err = srcFd.Seek(0, io.SeekStart); err != nil {
logErrorf("Could not seek file %q: %v", path, err)
logErrorf("Could not seek file %q to start: %v", path, err)
continue
}
_, err = io.CopyBuffer(dst, srcFd, buf)
if e := dst.Close(); e != nil {
if err == nil {
err = e
} else {
err = errors.Join(err, e)
}
}
err := target.Create(f.Hash, srcFd)
if err != nil {
logErrorf("Could not copy from %q to %s:\n\t%v", path, target.String(), err)
logErrorf("Could not create %s: %v", target.String(), err)
continue
}
}
Expand Down Expand Up @@ -969,21 +957,13 @@ func (cr *Cluster) DownloadFile(ctx context.Context, hash string) (err error) {
size := stat.Size()

for _, target := range cr.storages {
dst, err := target.Create(hash)
if err != nil {
logErrorf("Could not create %q: %v", target.String(), err)
continue
}
if _, err = srcFd.Seek(0, io.SeekStart); err != nil {
logErrorf("Could not seek file %q: %v", path, err)
continue
}
_, err = io.CopyBuffer(dst, srcFd, buf)
if e := dst.Close(); e != nil && err == nil {
err = e
}
err := target.Create(hash, srcFd)
if err != nil {
logErrorf("Could not copy file from %q to %s/%s:\n\t%v", path, target.String(), hash, err)
logErrorf("Could not create %q: %v", target.String(), err)
continue
}
}
Expand Down
24 changes: 4 additions & 20 deletions cmd_webdav.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,11 @@ package main

import (
"context"
"errors"
"io"
"os"
)

func cmdUploadWebdav(args []string) {
config := readConfig()
config = readConfig()

var localOpt *LocalStorageOption
webdavOpts := make([]*WebDavStorageOption, 0, 4)
Expand Down Expand Up @@ -82,6 +80,8 @@ func cmdUploadWebdav(args []string) {
}
if sz, err := s.Size(hash); err == nil && sz == size {
return nil
} else if err != nil {
logDebugf("Cannot get size of %s at %s: %v", hash, s.String(), err)
}

r, err := local.Open(hash)
Expand All @@ -90,26 +90,10 @@ func cmdUploadWebdav(args []string) {
return nil
}
defer r.Close()
w, err := s.Create(hash)
if err != nil {
if err = s.Create(hash, r); err != nil {
logErrorf("Cannot create %s at %s: %v", hash, s.String(), err)
return err
}

var buf [1024 * 1024]byte
_, err = io.CopyBuffer(w, r, buf[:])
if e := w.Close(); e != nil {
if err == nil {
err = e
} else {
err = errors.Join(err, e)
}
}
if err != nil {
s.Remove(hash)
logErrorf("Cannot copy %s to %s: %v", hash, s.String(), err)
return nil
}
logInfof("File %s copied to %s", hash, s.String())
return nil
})
Expand Down
6 changes: 3 additions & 3 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,19 @@ require (
github.com/LiterMC/socket.io v0.1.0
github.com/hamba/avro/v2 v2.18.0
github.com/klauspost/compress v1.17.4
github.com/patrickmn/go-cache v2.1.0+incompatible
github.com/redis/go-redis/v9 v9.4.0
github.com/studio-b12/gowebdav v0.9.0
gopkg.in/yaml.v3 v3.0.1
)

require (
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
github.com/emersion/go-webdav v0.5.0 // indirect
github.com/gorilla/websocket v1.5.1 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/patrickmn/go-cache v2.1.0+incompatible // indirect
github.com/redis/go-redis/v9 v9.4.0 // indirect
golang.org/x/net v0.17.0 // indirect
)
12 changes: 6 additions & 6 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
github.com/LiterMC/socket.io v0.1.0 h1:p3SGNJRKaTldk5Weye1EvKG92l02fLyRgRDmkcLzC7U=
github.com/LiterMC/socket.io v0.1.0/go.mod h1:60lM7+qdBnP64Fk2fB6WmAS6HxI6WCdhlcvaSnutx50=
github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
github.com/emersion/go-ical v0.0.0-20220601085725-0864dccc089f/go.mod h1:2MKFUgfNMULRxqZkadG1Vh44we3y5gJAtTBlVsx1BKQ=
github.com/emersion/go-vcard v0.0.0-20230815062825-8fda7d206ec9/go.mod h1:HMJKR5wlh/ziNp+sHEDV2ltblO4JD2+IdDOWtGcQBTM=
github.com/emersion/go-webdav v0.5.0 h1:Ak/BQLgAihJt/UxJbCsEXDPxS5Uw4nZzgIMOq3rkKjc=
github.com/emersion/go-webdav v0.5.0/go.mod h1:ycyIzTelG5pHln4t+Y32/zBvmrM7+mV7x+V+Gx4ZQno=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY=
github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY=
Expand All @@ -37,8 +37,8 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/teambition/rrule-go v1.7.2/go.mod h1:mBJ1Ht5uboJ6jexKdNUJg2NcwP8uUMNvStWXlJD3MvU=
github.com/teambition/rrule-go v1.8.2/go.mod h1:Ieq5AbrKGciP1V//Wq8ktsTXwSwJHDD5mD/wLBGl3p4=
github.com/studio-b12/gowebdav v0.9.0 h1:1j1sc9gQnNxbXXM4M/CebPOX4aXYtr7MojAVcN4dHjU=
github.com/studio-b12/gowebdav v0.9.0/go.mod h1:bHA7t77X/QFExdeAnDzK6vKM34kEZAcE1OX4MfiwjkE=
golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
Expand Down
2 changes: 1 addition & 1 deletion storage.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ type Storage interface {

Size(hash string) (int64, error)
Open(hash string) (io.ReadCloser, error)
Create(hash string) (io.WriteCloser, error)
Create(hash string, r io.Reader) error
Remove(hash string) error
WalkDir(func(hash string) error) error

Expand Down
13 changes: 11 additions & 2 deletions storage_local.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,8 +96,17 @@ func (s *LocalStorage) Open(hash string) (io.ReadCloser, error) {
return os.Open(s.hashToPath(hash))
}

func (s *LocalStorage) Create(hash string) (io.WriteCloser, error) {
return os.Create(s.hashToPath(hash))
func (s *LocalStorage) Create(hash string, r io.Reader) error {
fd, err := os.Create(s.hashToPath(hash))
if err != nil {
return err
}
var buf [1024 * 512]byte
_, err = io.CopyBuffer(fd, r, buf[:])
if e := fd.Close(); e != nil && err == nil {
err = e
}
return err
}

func (s *LocalStorage) Remove(hash string) error {
Expand Down
13 changes: 11 additions & 2 deletions storage_mount.go
Original file line number Diff line number Diff line change
Expand Up @@ -133,8 +133,17 @@ func (s *MountStorage) Open(hash string) (io.ReadCloser, error) {
return os.Open(s.hashToPath(hash))
}

func (s *MountStorage) Create(hash string) (io.WriteCloser, error) {
return os.Create(s.hashToPath(hash))
func (s *MountStorage) Create(hash string, r io.Reader) error {
fd, err := os.Create(s.hashToPath(hash))
if err != nil {
return err
}
var buf [1024 * 512]byte
_, err = io.CopyBuffer(fd, r, buf[:])
if e := fd.Close(); e != nil && err == nil {
err = e
}
return err
}

func (s *MountStorage) Remove(hash string) error {
Expand Down
85 changes: 28 additions & 57 deletions storage_webdav.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ import (
"strconv"
"strings"

"github.com/emersion/go-webdav"
"github.com/studio-b12/gowebdav"
"gopkg.in/yaml.v3"

"github.com/LiterMC/go-openbmclapi/internal/gosrc"
Expand Down Expand Up @@ -95,7 +95,7 @@ func (o *WebDavStorageOption) GetPassword() string {
type WebDavStorage struct {
opt WebDavStorageOption

cli *webdav.Client
cli *gowebdav.Client
}

var _ Storage = (*WebDavStorage)(nil)
Expand Down Expand Up @@ -149,16 +149,10 @@ func (s *WebDavStorage) Init(ctx context.Context) (err error) {
s.opt.fullEndPoint = s.opt.EndPoint
}

if s.cli, err = webdav.NewClient(
&HTTPClientWithUserAgent{
HTTPClient: webdav.HTTPClientWithBasicAuth(http.DefaultClient, s.opt.GetUsername(), s.opt.GetPassword()),
UserAgent: ClusterUserAgentFull,
},
s.opt.GetEndPoint()); err != nil {
return
}
s.cli = gowebdav.NewClient(s.opt.GetEndPoint(), s.opt.GetUsername(), s.opt.GetPassword())
s.cli.SetHeader("User-Agent", ClusterUserAgentFull)

if err := s.cli.Mkdir(ctx, "measure"); err != nil {
if err := s.cli.Mkdir("measure", 0755); err != nil {
if !webdavIsHTTPError(err, http.StatusConflict) {
logErrorf("Could not create measure folder for %s: %v", s.String(), err)
}
Expand All @@ -180,35 +174,34 @@ func (s *WebDavStorage) hashToPath(hash string) string {
}

func (s *WebDavStorage) Size(hash string) (int64, error) {
stat, err := s.cli.Stat(context.Background(), s.hashToPath(hash))
stat, err := s.cli.Stat(s.hashToPath(hash))
if err != nil {
return 0, err
}
return stat.Size, nil
return stat.Size(), nil
}

func (s *WebDavStorage) Open(hash string) (io.ReadCloser, error) {
return s.cli.Open(context.Background(), s.hashToPath(hash))
return s.cli.ReadStream(s.hashToPath(hash))
}

func (s *WebDavStorage) Create(hash string) (io.WriteCloser, error) {
return s.cli.Create(context.Background(), s.hashToPath(hash))
func (s *WebDavStorage) Create(hash string, r io.Reader) error {
return s.cli.WriteStream(s.hashToPath(hash), r, 0644)
}

func (s *WebDavStorage) Remove(hash string) error {
return s.cli.RemoveAll(context.Background(), s.hashToPath(hash))
return s.cli.Remove(s.hashToPath(hash))
}

func (s *WebDavStorage) WalkDir(walker func(hash string) error) error {
ctx := context.Background()
for _, dir := range hex256 {
files, err := s.cli.ReadDir(ctx, dir, false)
files, err := s.cli.ReadDir(dir)
if err != nil {
continue
}
for _, f := range files {
if !f.IsDir {
if hash := path.Base(f.Path); len(hash) >= 2 && hash[:2] == dir {
if !f.IsDir() {
if hash := f.Name(); len(hash) >= 2 && hash[:2] == dir {
if err := walker(hash); err != nil {
return err
}
Expand Down Expand Up @@ -285,7 +278,7 @@ func (s *WebDavStorage) ServeDownload(rw http.ResponseWriter, req *http.Request,
n, _ := io.Copy(rw, resp.Body)
return n, nil
default:
return 0, webdav.NewHTTPError(resp.StatusCode, nil)
return 0, fmt.Errorf("Unexpected status %d", resp.StatusCode)
}
}

Expand Down Expand Up @@ -342,54 +335,32 @@ func (s *WebDavStorage) ServeMeasure(rw http.ResponseWriter, req *http.Request,

func (s *WebDavStorage) createMeasureFile(ctx context.Context, size int) (err error) {
t := path.Join("measure", strconv.Itoa(size))
if stat, err := s.cli.Stat(ctx, t); err == nil {
tsz := (int64)(size) * mbChunkSize
if size == 0 {
tsz = 2
}
if stat.Size == tsz {
tsz := (int64)(size) * mbChunkSize
if size == 0 {
tsz = 2
}
if stat, err := s.cli.Stat(t); err == nil {
sz := stat.Size()
if sz == tsz {
return nil
}
logDebugf("File [%d] size %d does not match %d", size, stat.Size, tsz)
logDebugf("File [%d] size %d does not match %d", size, sz, tsz)
} else if e := ctx.Err(); e != nil {
return e
} else if !errors.Is(err, os.ErrNotExist) {
logErrorf("Cannot get stat of %s: %v", t, err)
}
logInfof("Creating measure file at %q", t)
w, err := s.cli.Create(ctx, t)
if err != nil {
logErrorf("Cannot create measure file %q: %v", t, err)
return
}
defer func() {
if e := w.Close(); e != nil && err == nil {
logErrorf("Could not create measure file %q: %v", t, err)
err = e
}
}()
if size == 0 {
if _, err = w.Write(mbChunk[:2]); err != nil {
logErrorf("Cannot write measure file %q: %v", t, err)
if err = s.cli.Write(t, mbChunk[:2], 0644); err != nil {
logErrorf("Cannot create measure file %q: %v", t, err)
return
}
} else {
for j := 0; j < size; j++ {
if _, err = w.Write(mbChunk[:]); err != nil {
logErrorf("Cannot write measure file %q: %v", t, err)
return
}
if err = s.cli.WriteStream(t, &io.LimitedReader{R: NoChangeReader, N: tsz}, 0644); err != nil {
logErrorf("Cannot create measure file %q: %v", t, err)
return
}
}
return nil
}

type HTTPClientWithUserAgent struct {
webdav.HTTPClient
UserAgent string
}

func (c *HTTPClientWithUserAgent) Do(req *http.Request) (*http.Response, error) {
req.Header.Set("User-Agent", c.UserAgent)
return c.HTTPClient.Do(req)
}
10 changes: 10 additions & 0 deletions util.go
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,16 @@ func (devNull) ReadAt([]byte, int64) (int, error) { return 0, io.EOF }
func (devNull) Seek(int64, int) (int64, error) { return 0, nil }
func (devNull) Write(buf []byte) (int, error) { return len(buf), nil }

type noChangeReader struct{}

var (
NoChangeReader = noChangeReader{}

_ io.Reader = NoChangeReader
)

func (noChangeReader) Read(buf []byte) (int, error) { return len(buf), nil }

var errNotSeeker = errors.New("r is not an io.Seeker")

func getFileSize(r io.Reader) (n int64, err error) {
Expand Down

0 comments on commit 2db1e56

Please sign in to comment.