From 29b1751d0eb9878b48f642286d787fa376bd4eda Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Thu, 27 Jul 2023 12:06:33 +0100 Subject: [PATCH] serve webdav: fix error: Expecting fs.Object or fs.Directory, got Before this change rclone serve webdav would sometimes give this error Expecting fs.Object or fs.Directory, got It turns out that when a file is being updated it doesn't have a DirEntry and it is allowed to be so in this case we create the mime type from the extension. See: https://forum.rclone.org/t/webdav-union-of-onedrive-expecting-fs-object-or-fs-directory-got-nil/40298 --- cmd/serve/webdav/webdav.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cmd/serve/webdav/webdav.go b/cmd/serve/webdav/webdav.go index 0af46ec4d..ae8c4f2d1 100644 --- a/cmd/serve/webdav/webdav.go +++ b/cmd/serve/webdav/webdav.go @@ -6,8 +6,10 @@ import ( "encoding/xml" "errors" "fmt" + "mime" "net/http" "os" + "path" "strconv" "strings" "time" @@ -580,12 +582,14 @@ func (fi FileInfo) ContentType(ctx context.Context) (contentType string, err err fs.Errorf(fi, "Expecting vfs.Node, got %T", fi.FileInfo) return "application/octet-stream", nil } - entry := node.DirEntry() + entry := node.DirEntry() // can be nil switch x := entry.(type) { case fs.Object: return fs.MimeType(ctx, x), nil case fs.Directory: return "inode/directory", nil + case nil: + return mime.TypeByExtension(path.Ext(node.Name())), nil } fs.Errorf(fi, "Expecting fs.Object or fs.Directory, got %T", entry) return "application/octet-stream", nil