feat: implement caldav search
This commit is contained in:
+56
@@ -0,0 +1,56 @@
|
||||
package webdav
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/xml"
|
||||
"github.com/dolanor/caldav-go/http"
|
||||
"github.com/dolanor/caldav-go/utils"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var _ = log.Print
|
||||
|
||||
// an WebDAV request object
|
||||
type Request http.Request
|
||||
|
||||
// downcasts the request to the local HTTP interface
|
||||
func (r *Request) Http() *http.Request {
|
||||
return (*http.Request)(r)
|
||||
}
|
||||
|
||||
// creates a new WebDAV request object
|
||||
func NewRequest(method string, urlstr string, xmldata ...interface{}) (*Request, error) {
|
||||
if buffer, length, err := xmlToReadCloser(xmldata); err != nil {
|
||||
return nil, utils.NewError(NewRequest, "unable to encode xml data", xmldata, 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/xml; charset=UTF-8")
|
||||
r.ContentLength = int64(length)
|
||||
}
|
||||
return (*Request)(r), nil
|
||||
}
|
||||
}
|
||||
|
||||
func xmlToReadCloser(xmldata ...interface{}) (io.ReadCloser, int, error) {
|
||||
var buffer []string
|
||||
for _, xmldatum := range xmldata {
|
||||
if encoded, err := xml.Marshal(xmldatum); err != nil {
|
||||
return nil, 0, utils.NewError(xmlToReadCloser, "unable to encode as xml", xmldatum, err)
|
||||
} else {
|
||||
buffer = append(buffer, string(encoded))
|
||||
}
|
||||
}
|
||||
if len(buffer) > 0 {
|
||||
var encoded = strings.Join(buffer, "\n")
|
||||
// log.Printf("[WebDAV Request]\n%+v\n", encoded)
|
||||
return ioutil.NopCloser(bytes.NewBuffer([]byte(encoded))), len(encoded), nil
|
||||
} else {
|
||||
return nil, 0, nil
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user