57 lines
1.6 KiB
Go
57 lines
1.6 KiB
Go
|
package caldav
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"github.com/dolanor/caldav-go/http"
|
||
|
"github.com/dolanor/caldav-go/icalendar"
|
||
|
"github.com/dolanor/caldav-go/utils"
|
||
|
"github.com/dolanor/caldav-go/webdav"
|
||
|
"io"
|
||
|
"io/ioutil"
|
||
|
"log"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
var _ = log.Print
|
||
|
|
||
|
// an CalDAV request object
|
||
|
type Request webdav.Request
|
||
|
|
||
|
// downcasts the request to the WebDAV interface
|
||
|
func (r *Request) WebDAV() *webdav.Request {
|
||
|
return (*webdav.Request)(r)
|
||
|
}
|
||
|
|
||
|
// creates a new CalDAV request object
|
||
|
func NewRequest(method string, urlstr string, icaldata ...interface{}) (*Request, error) {
|
||
|
if buffer, err := icalToReadCloser(icaldata...); err != nil {
|
||
|
return nil, utils.NewError(NewRequest, "unable to encode icalendar data", icaldata, err)
|
||
|
} else if r, err := http.NewRequest(method, urlstr, buffer); err != nil {
|
||
|
return nil, utils.NewError(NewRequest, "unable to create request", urlstr, err)
|
||
|
} else {
|
||
|
if buffer != nil {
|
||
|
// set the content type to XML if we have a body
|
||
|
r.Native().Header.Set("Content-Type", "text/calendar; charset=UTF-8")
|
||
|
}
|
||
|
return (*Request)(r), nil
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func icalToReadCloser(icaldata ...interface{}) (io.ReadCloser, error) {
|
||
|
var buffer []string
|
||
|
for _, icaldatum := range icaldata {
|
||
|
if encoded, err := icalendar.Marshal(icaldatum); err != nil {
|
||
|
return nil, utils.NewError(icalToReadCloser, "unable to encode as icalendar data", icaldatum, err)
|
||
|
} else {
|
||
|
// log.Printf("OUT: %+v", encoded)
|
||
|
buffer = append(buffer, encoded)
|
||
|
}
|
||
|
}
|
||
|
if len(buffer) > 0 {
|
||
|
var encoded = strings.Join(buffer, "\n")
|
||
|
return ioutil.NopCloser(bytes.NewBuffer([]byte(encoded))), nil
|
||
|
} else {
|
||
|
return nil, nil
|
||
|
}
|
||
|
}
|