mirror of
https://github.com/opencloud-eu/opencloud.git
synced 2025-12-30 09:38:26 -05:00
78 lines
1.8 KiB
Go
78 lines
1.8 KiB
Go
package webdav
|
|
|
|
import (
|
|
"encoding/xml"
|
|
"net/http"
|
|
)
|
|
|
|
type code int
|
|
|
|
const (
|
|
// SabredavBadRequest maps to HTTP 400
|
|
SabredavBadRequest code = iota
|
|
// SabredavMethodNotAllowed maps to HTTP 405
|
|
SabredavMethodNotAllowed
|
|
// SabredavNotAuthenticated maps to HTTP 401
|
|
SabredavNotAuthenticated
|
|
// SabredavPreconditionFailed maps to HTTP 412
|
|
SabredavPreconditionFailed
|
|
// SabredavPermissionDenied maps to HTTP 403
|
|
SabredavPermissionDenied
|
|
// SabredavNotFound maps to HTTP 404
|
|
SabredavNotFound
|
|
// SabredavConflict maps to HTTP 409
|
|
SabredavConflict
|
|
)
|
|
|
|
var (
|
|
codesEnum = []string{
|
|
"Sabre\\DAV\\Exception\\BadRequest",
|
|
"Sabre\\DAV\\Exception\\MethodNotAllowed",
|
|
"Sabre\\DAV\\Exception\\NotAuthenticated",
|
|
"Sabre\\DAV\\Exception\\PreconditionFailed",
|
|
"Sabre\\DAV\\Exception\\PermissionDenied",
|
|
"Sabre\\DAV\\Exception\\NotFound",
|
|
"Sabre\\DAV\\Exception\\Conflict",
|
|
}
|
|
)
|
|
|
|
type Exception struct {
|
|
Code code
|
|
Message string
|
|
Header string
|
|
}
|
|
|
|
// Marshal just calls the xml marshaller for a given Exception.
|
|
func Marshal(e Exception) ([]byte, error) {
|
|
xmlstring, err := xml.Marshal(&errorXML{
|
|
Xmlnsd: "DAV",
|
|
Xmlnss: "http://sabredav.org/ns",
|
|
Exception: codesEnum[e.Code],
|
|
Message: e.Message,
|
|
Header: e.Header,
|
|
})
|
|
if err != nil {
|
|
return []byte(""), err
|
|
}
|
|
return []byte(xml.Header + string(xmlstring)), err
|
|
}
|
|
|
|
// http://www.webdav.org/specs/rfc4918.html#ELEMENT_error
|
|
type errorXML struct {
|
|
XMLName xml.Name `xml:"d:error"`
|
|
Xmlnsd string `xml:"xmlns:d,attr"`
|
|
Xmlnss string `xml:"xmlns:s,attr"`
|
|
Exception string `xml:"s:Exception"`
|
|
Message string `xml:"s:Message"`
|
|
InnerXML []byte `xml:",innerxml"`
|
|
Header string `xml:"s:Header,omitempty"`
|
|
}
|
|
|
|
func HandleWebdavError(w http.ResponseWriter, b []byte, err error) {
|
|
if err != nil {
|
|
w.WriteHeader(http.StatusInternalServerError)
|
|
return
|
|
}
|
|
_, _ = w.Write(b)
|
|
}
|