diff --git a/weed/server/webdav_server.go b/weed/server/webdav_server.go index 5f242689f2..389a3d5fbe 100644 --- a/weed/server/webdav_server.go +++ b/weed/server/webdav_server.go @@ -205,7 +205,7 @@ func (fs *WebDavFileSystem) Mkdir(ctx context.Context, fullDirPath string, perm } return fs.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { - dir, name := util.FullPath(fullDirPath).DirAndName() + dir, name := util.NormalizePath(fullDirPath).DirAndName() request := &filer_pb.CreateEntryRequest{ Directory: dir, Entry: &filer_pb.Entry{ diff --git a/weed/server/webdav_server_test.go b/weed/server/webdav_server_test.go index 705b2f30dc..3be052ec83 100644 --- a/weed/server/webdav_server_test.go +++ b/weed/server/webdav_server_test.go @@ -71,6 +71,20 @@ func (f *noVolumeFiler) LookupVolume(_ context.Context, _ *filer_pb.LookupVolume return &filer_pb.LookupVolumeResponse{LocationsMap: map[string]*filer_pb.Locations{}}, nil } +type createRecordingFiler struct { + filer_pb.UnimplementedSeaweedFilerServer + req *filer_pb.CreateEntryRequest +} + +func (f *createRecordingFiler) LookupDirectoryEntry(_ context.Context, _ *filer_pb.LookupDirectoryEntryRequest) (*filer_pb.LookupDirectoryEntryResponse, error) { + return nil, filer_pb.ErrNotFound +} + +func (f *createRecordingFiler) CreateEntry(_ context.Context, req *filer_pb.CreateEntryRequest) (*filer_pb.CreateEntryResponse, error) { + f.req = req + return &filer_pb.CreateEntryResponse{}, nil +} + func startFakeWebDavFiler(t *testing.T, impl filer_pb.SeaweedFilerServer) pb.ServerAddress { t.Helper() lis, err := net.Listen("tcp", "127.0.0.1:0") @@ -130,3 +144,20 @@ func TestWebDavFile_Read_InlineContent(t *testing.T) { assert.NoError(t, err) assert.Equal(t, "inl", string(buf[:n])) } + +// MKCOL paths end in "/"; the entry must be created under its own name, not as "" inside itself. +func TestWebDavFileSystem_Mkdir_EntryName(t *testing.T) { + filer := &createRecordingFiler{} + filerAddr := startFakeWebDavFiler(t, filer) + fs := &WebDavFileSystem{option: &WebDavOption{ + Filer: filerAddr, + GrpcDialOption: grpc.WithTransportCredentials(insecure.NewCredentials()), + }} + + assert.NoError(t, fs.Mkdir(context.Background(), "/dir/sub/", 0755)) + if assert.NotNil(t, filer.req) { + assert.Equal(t, "/dir", filer.req.Directory) + assert.Equal(t, "sub", filer.req.Entry.Name) + assert.True(t, filer.req.Entry.IsDirectory) + } +}