57 lines
1.6 KiB
Go
57 lines
1.6 KiB
Go
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
|
|
}
|
|
}
|