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