Add the quota method.
This commit is contained in:
parent
8632d7686b
commit
f0be23879d
@ -1,7 +1,9 @@
|
|||||||
package rest
|
package rest
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
"regexp"
|
"regexp"
|
||||||
)
|
)
|
||||||
@ -140,6 +142,19 @@ func (this *DavController) Index(writer http.ResponseWriter, request *http.Reque
|
|||||||
fmt.Printf("\n------Body:------\n")
|
fmt.Printf("\n------Body:------\n")
|
||||||
//ioutil.ReadAll 不可重复读,第二次读的时候就什么都没有了。
|
//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("------------------")
|
fmt.Println("------------------")
|
||||||
|
|
||||||
//获取请求者
|
//获取请求者
|
||||||
|
@ -13,14 +13,14 @@ var WEBDAV_PREFFIX = "/api/dav"
|
|||||||
|
|
||||||
//动态的文件属性
|
//动态的文件属性
|
||||||
type LiveProp struct {
|
type LiveProp struct {
|
||||||
findFn func(matter *Matter) string
|
findFn func(user *User, matter *Matter) string
|
||||||
dir bool
|
dir bool
|
||||||
}
|
}
|
||||||
|
|
||||||
//所有的动态属性定义及其值的获取方式
|
//所有的动态属性定义及其值的获取方式
|
||||||
var LivePropMap = map[xml.Name]LiveProp{
|
var LivePropMap = map[xml.Name]LiveProp{
|
||||||
{Space: "DAV:", Local: "resourcetype"}: {
|
{Space: "DAV:", Local: "resourcetype"}: {
|
||||||
findFn: func(matter *Matter) string {
|
findFn: func(user *User, matter *Matter) string {
|
||||||
if matter.Dir {
|
if matter.Dir {
|
||||||
return `<D:collection xmlns:D="DAV:"/>`
|
return `<D:collection xmlns:D="DAV:"/>`
|
||||||
} else {
|
} else {
|
||||||
@ -30,7 +30,7 @@ var LivePropMap = map[xml.Name]LiveProp{
|
|||||||
dir: true,
|
dir: true,
|
||||||
},
|
},
|
||||||
{Space: "DAV:", Local: "displayname"}: {
|
{Space: "DAV:", Local: "displayname"}: {
|
||||||
findFn: func(matter *Matter) string {
|
findFn: func(user *User, matter *Matter) string {
|
||||||
if dav.SlashClean(matter.Name) == "/" {
|
if dav.SlashClean(matter.Name) == "/" {
|
||||||
return ""
|
return ""
|
||||||
} else {
|
} else {
|
||||||
@ -40,13 +40,13 @@ var LivePropMap = map[xml.Name]LiveProp{
|
|||||||
dir: true,
|
dir: true,
|
||||||
},
|
},
|
||||||
{Space: "DAV:", Local: "getcontentlength"}: {
|
{Space: "DAV:", Local: "getcontentlength"}: {
|
||||||
findFn: func(matter *Matter) string {
|
findFn: func(user *User, matter *Matter) string {
|
||||||
return strconv.FormatInt(matter.Size, 10)
|
return strconv.FormatInt(matter.Size, 10)
|
||||||
},
|
},
|
||||||
dir: false,
|
dir: false,
|
||||||
},
|
},
|
||||||
{Space: "DAV:", Local: "getlastmodified"}: {
|
{Space: "DAV:", Local: "getlastmodified"}: {
|
||||||
findFn: func(matter *Matter) string {
|
findFn: func(user *User, matter *Matter) string {
|
||||||
return matter.UpdateTime.UTC().Format(http.TimeFormat)
|
return matter.UpdateTime.UTC().Format(http.TimeFormat)
|
||||||
},
|
},
|
||||||
// http://webdav.org/specs/rfc4918.html#PROPERTY_getlastmodified
|
// http://webdav.org/specs/rfc4918.html#PROPERTY_getlastmodified
|
||||||
@ -67,7 +67,7 @@ var LivePropMap = map[xml.Name]LiveProp{
|
|||||||
dir: false,
|
dir: false,
|
||||||
},
|
},
|
||||||
{Space: "DAV:", Local: "getcontenttype"}: {
|
{Space: "DAV:", Local: "getcontenttype"}: {
|
||||||
findFn: func(matter *Matter) string {
|
findFn: func(user *User, matter *Matter) string {
|
||||||
if matter.Dir {
|
if matter.Dir {
|
||||||
return ""
|
return ""
|
||||||
} else {
|
} else {
|
||||||
@ -77,7 +77,7 @@ var LivePropMap = map[xml.Name]LiveProp{
|
|||||||
dir: false,
|
dir: false,
|
||||||
},
|
},
|
||||||
{Space: "DAV:", Local: "getetag"}: {
|
{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)
|
return fmt.Sprintf(`"%x%x"`, matter.UpdateTime.UnixNano(), matter.Size)
|
||||||
},
|
},
|
||||||
// findETag implements ETag as the concatenated hex values of a file's
|
// 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.
|
// active locks on a resource.
|
||||||
{Space: "DAV:", Local: "lockdiscovery"}: {},
|
{Space: "DAV:", Local: "lockdiscovery"}: {},
|
||||||
{Space: "DAV:", Local: "supportedlock"}: {
|
{Space: "DAV:", Local: "supportedlock"}: {
|
||||||
findFn: func(matter *Matter) string {
|
findFn: func(user *User, matter *Matter) string {
|
||||||
return `` +
|
return `` +
|
||||||
`<D:lockentry xmlns:D="DAV:">` +
|
`<D:lockentry xmlns:D="DAV:">` +
|
||||||
`<D:lockscope><D:exclusive/></D:lockscope>` +
|
`<D:lockscope><D:exclusive/></D:lockscope>` +
|
||||||
@ -99,4 +99,25 @@ var LivePropMap = map[xml.Name]LiveProp{
|
|||||||
},
|
},
|
||||||
dir: true,
|
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,
|
||||||
|
},
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -78,7 +78,7 @@ func (this *DavService) makePropstatResponse(href string, pstats []dav.Propstat)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//从一个matter中获取其 []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)
|
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.
|
// 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) {
|
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{
|
properties = append(properties, dav.Property{
|
||||||
XMLName: xmlName,
|
XMLName: xmlName,
|
||||||
@ -126,7 +126,7 @@ func (this *DavService) AllPropXmlNames(matter *Matter) []xml.Name {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//从一个matter中获取其 []dav.Propstat
|
//从一个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)
|
propstats := make([]dav.Propstat, 0)
|
||||||
if propfind.Propname != nil {
|
if propfind.Propname != nil {
|
||||||
@ -136,10 +136,10 @@ func (this *DavService) Propstats(matter *Matter, propfind dav.Propfind) []dav.P
|
|||||||
//TODO: 如果include中还有内容,那么包含进去。
|
//TODO: 如果include中还有内容,那么包含进去。
|
||||||
xmlNames := this.AllPropXmlNames(matter)
|
xmlNames := this.AllPropXmlNames(matter)
|
||||||
|
|
||||||
propstats = this.PropstatsFromXmlNames(matter, xmlNames)
|
propstats = this.PropstatsFromXmlNames(user, matter, xmlNames)
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
propstats = this.PropstatsFromXmlNames(matter, propfind.Prop)
|
propstats = this.PropstatsFromXmlNames(user, matter, propfind.Prop)
|
||||||
}
|
}
|
||||||
|
|
||||||
return propstats
|
return propstats
|
||||||
@ -185,7 +185,7 @@ func (this *DavService) HandlePropfind(writer http.ResponseWriter, request *http
|
|||||||
|
|
||||||
fmt.Printf("处理Matter %s\n", matter.Path)
|
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)
|
path := fmt.Sprintf("%s%s", WEBDAV_PREFFIX, matter.Path)
|
||||||
response := this.makePropstatResponse(path, propstats)
|
response := this.makePropstatResponse(path, propstats)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user