From 556b15a4c338eab5c19ef2037accd9644a1196e7 Mon Sep 17 00:00:00 2001 From: OpenClaw Agent Date: Mon, 21 Sep 2026 20:31:44 +0800 Subject: [PATCH] fix: align WebDAV MOVE overwrite and source errors --- chfs-ng/internal/api/server.go | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/chfs-ng/internal/api/server.go b/chfs-ng/internal/api/server.go index c2faa7a..2d6ae98 100644 --- a/chfs-ng/internal/api/server.go +++ b/chfs-ng/internal/api/server.go @@ -914,9 +914,11 @@ func (f *webdavStorageFS) Copy(ctx context.Context, name, dest string, opts *web func (f *webdavStorageFS) Move(ctx context.Context, name, dest string, opts *webdav.MoveOptions) (bool, error) { src := davStoragePath(name) dst := davStoragePath(dest) - if opts != nil && opts.NoOverwrite { + if opts == nil || opts.NoOverwrite { if _, err := f.store.Stat(dst); err == nil { - return false, fmt.Errorf("destination exists") + return false, webdav.NewHTTPError(http.StatusPreconditionFailed, fmt.Errorf("destination exists")) + } else if !os.IsNotExist(err) { + return false, err } } if m, ok := f.store.(storage.Multi); ok { @@ -926,7 +928,16 @@ func (f *webdavStorageFS) Move(ctx context.Context, name, dest string, opts *web return false, webdav.NewHTTPError(http.StatusForbidden, fmt.Errorf("cross-root move is not supported")) } } + if _, err := f.store.Stat(src); err != nil { + if os.IsNotExist(err) { + return false, webdav.NewHTTPError(http.StatusNotFound, err) + } + return false, err + } if err := f.store.Rename(src, dst); err != nil { + if os.IsNotExist(err) { + return false, webdav.NewHTTPError(http.StatusNotFound, err) + } return false, webdav.NewHTTPError(http.StatusForbidden, err) } return true, nil