From 4c0dc5d900558c461b577c84ca4df919d728ca3d Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Wed, 13 May 2020 15:02:52 +0200 Subject: [PATCH] internal: parse WebDAV toplevel elements --- internal/client.go | 18 +++++++++++++++++- internal/elements.go | 5 +++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/internal/client.go b/internal/client.go index 9040cf0..030e888 100644 --- a/internal/client.go +++ b/internal/client.go @@ -5,6 +5,7 @@ import ( "encoding/xml" "fmt" "io" + "mime" "net/http" "net/url" "path" @@ -77,8 +78,23 @@ func (c *Client) Do(req *http.Request) (*http.Response, error) { return nil, err } if resp.StatusCode/100 != 2 { + defer resp.Body.Close() + + contentType := resp.Header.Get("Content-Type") + if contentType == "" { + contentType = "text/plain" + } + var wrappedErr error - if strings.HasPrefix(resp.Header.Get("Content-Type"), "text/") { + t, _, _ := mime.ParseMediaType(contentType) + if t == "application/xml" || t == "text/xml" { + var davErr Error + if err := xml.NewDecoder(resp.Body).Decode(&davErr); err != nil { + wrappedErr = err + } else { + wrappedErr = &davErr + } + } else if strings.HasPrefix(t, "text/") { lr := io.LimitedReader{R: resp.Body, N: 1024} var buf bytes.Buffer io.Copy(&buf, &lr) diff --git a/internal/elements.go b/internal/elements.go index 72d07ea..3c1932e 100644 --- a/internal/elements.go +++ b/internal/elements.go @@ -360,6 +360,11 @@ type Error struct { Raw []RawXMLValue `xml:",any"` } +func (err *Error) Error() string { + b, _ := xml.Marshal(err) + return string(b) +} + // https://tools.ietf.org/html/rfc4918#section-15.2 type DisplayName struct { XMLName xml.Name `xml:"DAV: displayname"`