From 2b56d576c7ac192d8fefa512b91840f85c79f61e Mon Sep 17 00:00:00 2001 From: Gilbert Chen Date: Tue, 26 Feb 2019 14:00:02 -0500 Subject: [PATCH] Fixed a webdav compatibility issue with rclone and other bugs --- src/duplicacy_webdavstorage.go | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/duplicacy_webdavstorage.go b/src/duplicacy_webdavstorage.go index 419f71e..c8e9501 100644 --- a/src/duplicacy_webdavstorage.go +++ b/src/duplicacy_webdavstorage.go @@ -49,7 +49,7 @@ var ( ) func CreateWebDAVStorage(host string, port int, username string, password string, storageDir string, useHTTP bool, threads int) (storage *WebDAVStorage, err error) { - if storageDir[len(storageDir)-1] != '/' { + if len(storageDir) > 0 && storageDir[len(storageDir)-1] != '/' { storageDir += "/" } @@ -59,7 +59,7 @@ func CreateWebDAVStorage(host string, port int, username string, password string username: username, password: password, storageDir: "", - useHTTP: false, + useHTTP: useHTTP, client: http.DefaultClient, threads: threads, @@ -313,6 +313,7 @@ func (storage *WebDAVStorage) ListFiles(threadIndex int, dir string) (files []st // GetFileInfo returns the information about the file or directory at 'filePath'. func (storage *WebDAVStorage) GetFileInfo(threadIndex int, filePath string) (exist bool, isDir bool, size int64, err error) { + properties, err := storage.getProperties(filePath, 0, "getcontentlength", "resourcetype") if err != nil { if err == errWebDAVNotExist { @@ -325,7 +326,14 @@ func (storage *WebDAVStorage) GetFileInfo(threadIndex int, filePath string) (exi return false, false, 0, err } - if m, exist := properties["/"+storage.storageDir+filePath]; !exist { + m, exist := properties["/"+storage.storageDir+filePath] + + // If no properties exist for the given filePath, remove the trailing / from filePath and search again + if !exist && filePath != "" && filePath[len(filePath) - 1] == '/' { + m, exist = properties["/"+storage.storageDir+filePath[:len(filePath) - 1]] + } + + if !exist { return false, false, 0, nil } else if resourceType, exist := m["resourcetype"]; exist && strings.Contains(resourceType, "collection") { return true, true, 0, nil