Finish the MKCOL method.

This commit is contained in:
zicla 2019-04-23 01:19:08 +08:00
parent 99710eb670
commit 27d6234409
2 changed files with 62 additions and 26 deletions

View File

@ -5,6 +5,8 @@ import (
"fmt"
"net/http"
"net/url"
"regexp"
"strings"
"tank/rest/dav"
)
@ -281,7 +283,7 @@ func (this *DavService) HandleMkcol(writer http.ResponseWriter, request *http.Re
matter = this.matterDao.checkByUserUuidAndPath(user.Uuid, dirPath)
}
this.matterService.Upload(request.Body, user, matter.Uuid, thisDirName, true, false)
this.matterService.CreateDirectory(matter.Uuid, thisDirName, user)
}
@ -315,34 +317,56 @@ func (this *DavService) HandleOptions(w http.ResponseWriter, r *http.Request, us
}
//移动或者重命名
func (this *DavService) HandleMove(w http.ResponseWriter, r *http.Request, user *User, subPath string) {
func (this *DavService) HandleMove(writer http.ResponseWriter, request *http.Request, user *User, subPath string) {
fmt.Printf("MOVE %s\n", subPath)
//解析出目标路径。
destinationUrl := r.Header.Get("Destination")
if destinationUrl == "" {
this.PanicBadRequest("Header Destination必填")
}
u, err := url.Parse(destinationUrl)
this.PanicError(err)
if u.Host != r.Host {
this.PanicBadRequest("Destination Host不一致")
}
destinationStr := request.Header.Get("Destination")
//解析出Overwrite。
overwriteStr := r.Header.Get("Overwrite")
overwriteStr := request.Header.Get("Overwrite")
//有前缀的目标path
var fullDestinationPath string
//去掉前缀的目标path
var destinationPath string
if destinationStr == "" {
this.PanicBadRequest("Header Destination必填")
}
//如果是重命名那么就不是http开头了。
if strings.HasPrefix(destinationStr, WEBDAV_PREFFIX) {
fullDestinationPath = destinationStr
} else {
destinationUrl, err := url.Parse(destinationStr)
this.PanicError(err)
if destinationUrl.Host != request.Host {
this.PanicBadRequest("Destination Host不一致. %s %s != %s", destinationStr, destinationUrl.Host, request.Host)
}
fullDestinationPath = destinationUrl.Path
}
//去除前缀
pattern := fmt.Sprintf(`^%s(.*)$`, WEBDAV_PREFFIX)
reg := regexp.MustCompile(pattern)
strs := reg.FindStringSubmatch(fullDestinationPath)
if len(strs) == 2 {
destinationPath = strs[1]
} else {
this.PanicBadRequest("目标前缀必须为:%s", WEBDAV_PREFFIX)
}
destinationName := GetFilenameOfPath(destinationPath)
destinationDirPath := GetDirOfPath(destinationPath)
srcDirPath := GetDirOfPath(subPath)
overwrite := false
if overwriteStr == "T" {
overwrite = true
}
destinationPath := u.Path
destinationName := GetFilenameOfPath(destinationPath)
destinationDirPath := GetDirOfPath(destinationPath)
dirPath := GetDirOfPath(subPath)
//如果前后一致,那么相当于没有改变
if destinationPath == subPath {
return
@ -360,6 +384,14 @@ func (this *DavService) HandleMove(w http.ResponseWriter, r *http.Request, user
//目标matter
destMatter := this.matterDao.findByUserUuidAndPath(user.Uuid, destinationPath)
//目标文件夹matter
var destDirMatter *Matter
if destinationDirPath == "" || destinationDirPath == "/" {
destDirMatter = NewRootMatter(user)
} else {
destDirMatter = this.matterDao.checkByUserUuidAndPath(user.Uuid, destinationDirPath)
}
//如果目标matter存在了。
if destMatter != nil {
@ -373,12 +405,14 @@ func (this *DavService) HandleMove(w http.ResponseWriter, r *http.Request, user
}
//移动到新目录中去。
if destinationDirPath == srcDirPath {
//文件夹没变化,相当于重命名。
this.matterService.Rename(srcMatter, destinationName, user)
} else {
this.matterService.Move(srcMatter, destDirMatter)
}
//目标文件夹matter
destDirMatter := this.matterDao.checkByUserUuidAndPath(user.Uuid, destinationDirPath)
this.matterService.Move(srcMatter, destDirMatter)
this.logger.Info("完成移动 %s => %s", subPath, destinationDirPath)
}
//复制文件/文件夹
@ -439,7 +473,6 @@ func (this *DavService) HandleDav(writer http.ResponseWriter, request *http.Requ
} else if method == "MKCOL" {
//TODO: 创建文件夹
this.HandleMkcol(writer, request, user, subPath)
} else if method == "COPY" {

View File

@ -305,9 +305,12 @@ func (this *MatterDao) findByUserUuidAndPath(userUuid string, path string) *Matt
//根据userUuid和path来查找
func (this *MatterDao) checkByUserUuidAndPath(userUuid string, path string) *Matter {
matter := this.findByUserUuidAndPath(userUuid,path)
if path == "" {
this.PanicBadRequest("path 不能为空")
}
matter := this.findByUserUuidAndPath(userUuid, path)
if matter == nil {
this.PanicNotFound("%s 不存在", path)
this.PanicNotFound("path = %s 不存在", path)
}
return matter