59 lines
1.2 KiB
Go
59 lines
1.2 KiB
Go
package webdav
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"io"
|
|
"path"
|
|
|
|
"github.com/krau/SaveAny-Bot/logger"
|
|
)
|
|
|
|
type WebdavWriter struct {
|
|
pipeWriter *io.PipeWriter
|
|
done chan error
|
|
path string
|
|
}
|
|
|
|
func (w *WebdavWriter) Write(p []byte) (n int, err error) {
|
|
return w.pipeWriter.Write(p)
|
|
}
|
|
|
|
func (w *WebdavWriter) Close() error {
|
|
if err := w.pipeWriter.Close(); err != nil {
|
|
return err
|
|
}
|
|
if err := <-w.done; err != nil {
|
|
return fmt.Errorf("upload failed: %w", err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (w *Webdav) NewUploadStream(ctx context.Context, storagePath string) (io.WriteCloser, error) {
|
|
if err := w.client.MkDir(ctx, path.Dir(storagePath)); err != nil {
|
|
logger.L.Errorf("Failed to create directory %s: %v", path.Dir(storagePath), err)
|
|
return nil, ErrFailedToCreateDirectory
|
|
}
|
|
pipeReader, pipeWriter := io.Pipe()
|
|
done := make(chan error, 1)
|
|
go func() {
|
|
defer func() {
|
|
if err := recover(); err != nil {
|
|
done <- fmt.Errorf("panic during upload: %v", err)
|
|
}
|
|
}()
|
|
|
|
err := w.client.WriteFile(ctx, storagePath, pipeReader)
|
|
|
|
pipeReader.Close()
|
|
done <- err
|
|
}()
|
|
|
|
return &WebdavWriter{
|
|
pipeWriter: pipeWriter,
|
|
done: done,
|
|
path: storagePath,
|
|
}, nil
|
|
}
|