diff --git a/rest/dav_controller.go b/rest/dav_controller.go index e1036d9..0db56b6 100644 --- a/rest/dav_controller.go +++ b/rest/dav_controller.go @@ -1,7 +1,9 @@ package rest import ( + "bytes" "fmt" + "io/ioutil" "net/http" "regexp" ) @@ -140,6 +142,19 @@ func (this *DavController) Index(writer http.ResponseWriter, request *http.Reque fmt.Printf("\n------Body:------\n") //ioutil.ReadAll 不可重复读,第二次读的时候就什么都没有了。 + bodyBytes, err := ioutil.ReadAll(request.Body) + if err != nil { + fmt.Println("读取body时出错" + err.Error()) + } + fmt.Println(string(bodyBytes)) + + //关闭之后再重新赋值 + err = request.Body.Close() + if err != nil { + panic(err) + } + request.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes)) + fmt.Println("------------------") //获取请求者 diff --git a/rest/dav_model.go b/rest/dav_model.go index 8b88f1d..ab9e306 100644 --- a/rest/dav_model.go +++ b/rest/dav_model.go @@ -13,14 +13,14 @@ var WEBDAV_PREFFIX = "/api/dav" //动态的文件属性 type LiveProp struct { - findFn func(matter *Matter) string + findFn func(user *User, matter *Matter) string dir bool } //所有的动态属性定义及其值的获取方式 var LivePropMap = map[xml.Name]LiveProp{ {Space: "DAV:", Local: "resourcetype"}: { - findFn: func(matter *Matter) string { + findFn: func(user *User, matter *Matter) string { if matter.Dir { return `` } else { @@ -30,7 +30,7 @@ var LivePropMap = map[xml.Name]LiveProp{ dir: true, }, {Space: "DAV:", Local: "displayname"}: { - findFn: func(matter *Matter) string { + findFn: func(user *User, matter *Matter) string { if dav.SlashClean(matter.Name) == "/" { return "" } else { @@ -40,13 +40,13 @@ var LivePropMap = map[xml.Name]LiveProp{ dir: true, }, {Space: "DAV:", Local: "getcontentlength"}: { - findFn: func(matter *Matter) string { + findFn: func(user *User, matter *Matter) string { return strconv.FormatInt(matter.Size, 10) }, dir: false, }, {Space: "DAV:", Local: "getlastmodified"}: { - findFn: func(matter *Matter) string { + findFn: func(user *User, matter *Matter) string { return matter.UpdateTime.UTC().Format(http.TimeFormat) }, // http://webdav.org/specs/rfc4918.html#PROPERTY_getlastmodified @@ -67,7 +67,7 @@ var LivePropMap = map[xml.Name]LiveProp{ dir: false, }, {Space: "DAV:", Local: "getcontenttype"}: { - findFn: func(matter *Matter) string { + findFn: func(user *User, matter *Matter) string { if matter.Dir { return "" } else { @@ -77,7 +77,7 @@ var LivePropMap = map[xml.Name]LiveProp{ dir: false, }, {Space: "DAV:", Local: "getetag"}: { - findFn: func(matter *Matter) string { + findFn: func(user *User, matter *Matter) string { return fmt.Sprintf(`"%x%x"`, matter.UpdateTime.UnixNano(), matter.Size) }, // findETag implements ETag as the concatenated hex values of a file's @@ -90,7 +90,7 @@ var LivePropMap = map[xml.Name]LiveProp{ // active locks on a resource. {Space: "DAV:", Local: "lockdiscovery"}: {}, {Space: "DAV:", Local: "supportedlock"}: { - findFn: func(matter *Matter) string { + findFn: func(user *User, matter *Matter) string { return `` + `` + `` + @@ -99,4 +99,25 @@ var LivePropMap = map[xml.Name]LiveProp{ }, dir: true, }, + {Space: "DAV:", Local: "quota-available-bytes"}: { + findFn: func(user *User, matter *Matter) string { + var size int64 = 0 + if user.SizeLimit >= 0 { + size = user.SizeLimit + } else { + //没有限制,默认100G + size = 100 * 1024 * 1024 * 1024 + } + return fmt.Sprintf(`%d`, size) + }, + dir: true, + }, + {Space: "DAV:", Local: "quota-used-bytes"}: { + findFn: func(user *User, matter *Matter) string { + //已使用大小,默认0 + return fmt.Sprintf(`%d`, 0) + }, + dir: true, + }, + } diff --git a/rest/dav_service.go b/rest/dav_service.go index ab4fe88..ebaedbc 100644 --- a/rest/dav_service.go +++ b/rest/dav_service.go @@ -78,7 +78,7 @@ func (this *DavService) makePropstatResponse(href string, pstats []dav.Propstat) } //从一个matter中获取其 []dav.Propstat -func (this *DavService) PropstatsFromXmlNames(matter *Matter, xmlNames []xml.Name) []dav.Propstat { +func (this *DavService) PropstatsFromXmlNames(user *User, matter *Matter, xmlNames []xml.Name) []dav.Propstat { propstats := make([]dav.Propstat, 0) @@ -89,7 +89,7 @@ func (this *DavService) PropstatsFromXmlNames(matter *Matter, xmlNames []xml.Nam // Otherwise, it must either be a live property or we don't know it. if liveProp := LivePropMap[xmlName]; liveProp.findFn != nil && (liveProp.dir || !matter.Dir) { - innerXML := liveProp.findFn(matter) + innerXML := liveProp.findFn(user, matter) properties = append(properties, dav.Property{ XMLName: xmlName, @@ -126,7 +126,7 @@ func (this *DavService) AllPropXmlNames(matter *Matter) []xml.Name { } //从一个matter中获取其 []dav.Propstat -func (this *DavService) Propstats(matter *Matter, propfind dav.Propfind) []dav.Propstat { +func (this *DavService) Propstats(user *User, matter *Matter, propfind dav.Propfind) []dav.Propstat { propstats := make([]dav.Propstat, 0) if propfind.Propname != nil { @@ -136,10 +136,10 @@ func (this *DavService) Propstats(matter *Matter, propfind dav.Propfind) []dav.P //TODO: 如果include中还有内容,那么包含进去。 xmlNames := this.AllPropXmlNames(matter) - propstats = this.PropstatsFromXmlNames(matter, xmlNames) + propstats = this.PropstatsFromXmlNames(user, matter, xmlNames) } else { - propstats = this.PropstatsFromXmlNames(matter, propfind.Prop) + propstats = this.PropstatsFromXmlNames(user, matter, propfind.Prop) } return propstats @@ -185,7 +185,7 @@ func (this *DavService) HandlePropfind(writer http.ResponseWriter, request *http fmt.Printf("处理Matter %s\n", matter.Path) - propstats := this.Propstats(matter, propfind) + propstats := this.Propstats(user, matter, propfind) path := fmt.Sprintf("%s%s", WEBDAV_PREFFIX, matter.Path) response := this.makePropstatResponse(path, propstats)