webdav: create a folder under its own name (#11810)

* webdav: create a folder under its own name

* webdav: reuse NormalizePath for the MKCOL entry split

---------

Co-authored-by: Chris Lu <chris.lu@gmail.com>
This commit is contained in:
Jay HemnaniandChris Lu authored and GitHub committed 2026-10-18 11:43:19 -07:00
1 parent ab39e3a51b
commit 006d4150f0
2 files changed
+32 -1

No files matched your search

+1 -1
View File
@@ -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{
+31
View File
@@ -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)
}
}