mirror of
https://github.com/rclone/rclone.git
synced 2025-07-12 02:05:30 +02:00
This change adds a new vendor called "infinitescale" to the webdav backend. It enables the ownCloud Infinite Scale https://github.com/owncloud/ocis project and implements its specific chunked uploader following the tus protocol https://tus.io Signed-off-by: Christian Richter <crichter@owncloud.com> Co-authored-by: Klaas Freitag <klaas.freitag@kiteworks.com> Co-authored-by: Christian Richter <crichter@owncloud.com> Co-authored-by: Christian Richter <1058116+dragonchaser@users.noreply.github.com> Co-authored-by: Ralf Haferkamp <r.haferkamp@opencloud.eu>
89 lines
1.7 KiB
Go
89 lines
1.7 KiB
Go
package webdav
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/base64"
|
|
"fmt"
|
|
"io"
|
|
"strings"
|
|
)
|
|
|
|
// Metadata is a typedef for a string to string map to hold metadata
|
|
type Metadata map[string]string
|
|
|
|
// Upload is a struct containing the file status during upload
|
|
type Upload struct {
|
|
stream io.ReadSeeker
|
|
size int64
|
|
offset int64
|
|
|
|
Fingerprint string
|
|
Metadata Metadata
|
|
}
|
|
|
|
// Updates the Upload information based on offset.
|
|
func (u *Upload) updateProgress(offset int64) {
|
|
u.offset = offset
|
|
}
|
|
|
|
// Finished returns whether this upload is finished or not.
|
|
func (u *Upload) Finished() bool {
|
|
return u.offset >= u.size
|
|
}
|
|
|
|
// Progress returns the progress in a percentage.
|
|
func (u *Upload) Progress() int64 {
|
|
return (u.offset * 100) / u.size
|
|
}
|
|
|
|
// Offset returns the current upload offset.
|
|
func (u *Upload) Offset() int64 {
|
|
return u.offset
|
|
}
|
|
|
|
// Size returns the size of the upload body.
|
|
func (u *Upload) Size() int64 {
|
|
return u.size
|
|
}
|
|
|
|
// EncodedMetadata encodes the upload metadata.
|
|
func (u *Upload) EncodedMetadata() string {
|
|
var encoded []string
|
|
|
|
for k, v := range u.Metadata {
|
|
encoded = append(encoded, fmt.Sprintf("%s %s", k, b64encode(v)))
|
|
}
|
|
|
|
return strings.Join(encoded, ",")
|
|
}
|
|
|
|
func b64encode(s string) string {
|
|
return base64.StdEncoding.EncodeToString([]byte(s))
|
|
}
|
|
|
|
// NewUpload creates a new upload from an io.Reader.
|
|
func NewUpload(reader io.Reader, size int64, metadata Metadata, fingerprint string) *Upload {
|
|
stream, ok := reader.(io.ReadSeeker)
|
|
|
|
if !ok {
|
|
buf := new(bytes.Buffer)
|
|
_, err := buf.ReadFrom(reader)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
stream = bytes.NewReader(buf.Bytes())
|
|
}
|
|
|
|
if metadata == nil {
|
|
metadata = make(Metadata)
|
|
}
|
|
|
|
return &Upload{
|
|
stream: stream,
|
|
size: size,
|
|
|
|
Fingerprint: fingerprint,
|
|
Metadata: metadata,
|
|
}
|
|
}
|