mirror of
https://github.com/1f349/go-webdav.git
synced 2024-12-22 08:14:15 +00:00
webdav: allow serving extra props in ServePrincipal
This commit is contained in:
parent
6ae4814028
commit
c2b2f073cc
@ -14,6 +14,15 @@ import (
|
||||
|
||||
// TODO: add support for multiple calendars
|
||||
|
||||
// CalendarHomeSetXML returns the XML name and marshalable value for a
|
||||
// principal's calendar home set. It's designed to be used with
|
||||
// webdav.ServePrincipal.
|
||||
func CalendarHomeSetXML(path string) (xml.Name, xml.Marshaler) {
|
||||
homeSet := &calendarHomeSet{Href: internal.Href{Path: path}}
|
||||
v, _ := internal.EncodeRawXMLElement(homeSet)
|
||||
return calendarHomeSetName, v
|
||||
}
|
||||
|
||||
// Backend is a CalDAV server backend.
|
||||
type Backend interface {
|
||||
Calendar(ctx context.Context) (*Calendar, error)
|
||||
|
@ -14,6 +14,15 @@ import (
|
||||
|
||||
// TODO: add support for multiple address books
|
||||
|
||||
// AddressBookHomeSetXML returns the XML name and marshalable value for a
|
||||
// principal's address book home set. It's designed to be used with
|
||||
// webdav.ServePrincipal.
|
||||
func AddressBookHomeSetXML(path string) (xml.Name, xml.Marshaler) {
|
||||
homeSet := &addressbookHomeSet{Href: internal.Href{Path: path}}
|
||||
v, _ := internal.EncodeRawXMLElement(homeSet)
|
||||
return addressBookHomeSetName, v
|
||||
}
|
||||
|
||||
type PutAddressObjectOptions struct {
|
||||
// IfNoneMatch indicates that the client does not want to overwrite
|
||||
// an existing resource.
|
||||
|
20
server.go
20
server.go
@ -236,8 +236,13 @@ func (b *backend) Move(r *http.Request, dest *internal.Href, overwrite bool) (cr
|
||||
return created, err
|
||||
}
|
||||
|
||||
type ServePrincipalOptions struct {
|
||||
Principal *Principal
|
||||
Props map[xml.Name]xml.Marshaler
|
||||
}
|
||||
|
||||
// ServePrincipal replies to a request on a principal URI.
|
||||
func ServePrincipal(w http.ResponseWriter, r *http.Request, principal *Principal) {
|
||||
func ServePrincipal(w http.ResponseWriter, r *http.Request, options *ServePrincipalOptions) {
|
||||
switch r.Method {
|
||||
case http.MethodOptions:
|
||||
caps := append([]string{"1", "3"})
|
||||
@ -246,7 +251,7 @@ func ServePrincipal(w http.ResponseWriter, r *http.Request, principal *Principal
|
||||
w.Header().Add("Allow", strings.Join(allow, ", "))
|
||||
w.WriteHeader(http.StatusNoContent)
|
||||
case "PROPFIND":
|
||||
if err := servePrincipalPropfind(w, r, principal); err != nil {
|
||||
if err := servePrincipalPropfind(w, r, options); err != nil {
|
||||
internal.ServeError(w, err)
|
||||
}
|
||||
default:
|
||||
@ -254,7 +259,9 @@ func ServePrincipal(w http.ResponseWriter, r *http.Request, principal *Principal
|
||||
}
|
||||
}
|
||||
|
||||
func servePrincipalPropfind(w http.ResponseWriter, r *http.Request, principal *Principal) error {
|
||||
func servePrincipalPropfind(w http.ResponseWriter, r *http.Request, options *ServePrincipalOptions) error {
|
||||
principal := options.Principal
|
||||
|
||||
var propfind internal.Propfind
|
||||
if err := internal.DecodeXMLRequest(r, &propfind); err != nil {
|
||||
return err
|
||||
@ -286,7 +293,12 @@ func servePrincipalPropfind(w http.ResponseWriter, r *http.Request, principal *P
|
||||
},
|
||||
}
|
||||
|
||||
// TODO: allow adding more props such as CardDAV/CalDAV home sets
|
||||
for name, v := range options.Props {
|
||||
v := v // capture variable
|
||||
props[name] = func(*internal.RawXMLValue) (interface{}, error) {
|
||||
return v, nil
|
||||
}
|
||||
}
|
||||
|
||||
resp, err := internal.NewPropfindResponse(r.URL.Path, &propfind, props)
|
||||
if err != nil {
|
||||
|
Loading…
Reference in New Issue
Block a user