From 4e8c5effe36781de633d92fdb52461e21e22a207 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Mon, 2 May 2022 11:37:45 +0200 Subject: [PATCH] Replace DAVError with HTTPError + Error That way we can avoid having different ways of representing the same error value. --- caldav/server.go | 12 ++++-------- carddav/server.go | 12 ++++-------- internal/internal.go | 11 ----------- internal/server.go | 18 +++++++++++------- 4 files changed, 19 insertions(+), 34 deletions(-) diff --git a/caldav/server.go b/caldav/server.go index c72acde..55e8d44 100644 --- a/caldav/server.go +++ b/caldav/server.go @@ -327,14 +327,10 @@ const ( func NewPreconditionError(err PreconditionType) error { name := xml.Name{"urn:ietf:params:xml:ns:caldav", string(err)} elem := internal.NewRawXMLElement(name, nil, nil) - e := internal.Error{ - Raw: []internal.RawXMLValue{ - *elem, + return &internal.HTTPError{ + Code: 409, + Err: &internal.Error{ + Raw: []internal.RawXMLValue{*elem}, }, } - return &internal.DAVError{ - Code: 409, - Msg: fmt.Sprintf("precondition not met: %s", string(err)), - Err: e, - } } diff --git a/carddav/server.go b/carddav/server.go index a0e326d..e69d3c1 100644 --- a/carddav/server.go +++ b/carddav/server.go @@ -469,14 +469,10 @@ const ( func NewPreconditionError(err PreconditionType) error { name := xml.Name{"urn:ietf:params:xml:ns:carddav", string(err)} elem := internal.NewRawXMLElement(name, nil, nil) - e := internal.Error{ - Raw: []internal.RawXMLValue{ - *elem, + return &internal.HTTPError{ + Code: 409, + Err: &internal.Error{ + Raw: []internal.RawXMLValue{*elem}, }, } - return &internal.DAVError{ - Code: 409, - Msg: fmt.Sprintf("precondition not met: %s", string(err)), - Err: e, - } } diff --git a/internal/internal.go b/internal/internal.go index 2790f3f..13011c5 100644 --- a/internal/internal.go +++ b/internal/internal.go @@ -103,14 +103,3 @@ func (err *HTTPError) Error() string { func (err *HTTPError) Unwrap() error { return err.Err } - -// DAVError is a XML error with HTTP status and a human readable message -type DAVError struct { - Code int - Msg string - Err Error -} - -func (err *DAVError) Error() string { - return err.Msg -} diff --git a/internal/server.go b/internal/server.go index 66f4964..ca11e9b 100644 --- a/internal/server.go +++ b/internal/server.go @@ -2,6 +2,7 @@ package internal import ( "encoding/xml" + "errors" "fmt" "mime" "net/http" @@ -10,16 +11,19 @@ import ( ) func ServeError(w http.ResponseWriter, err error) { - if davErr, ok := err.(*DAVError); ok { - w.WriteHeader(davErr.Code) - ServeXML(w).Encode(davErr.Err) + code := http.StatusInternalServerError + var httpErr *HTTPError + if errors.As(err, &httpErr) { + code = httpErr.Code + } + + var errElt *Error + if errors.As(err, &errElt) { + w.WriteHeader(code) + ServeXML(w).Encode(errElt) return } - code := http.StatusInternalServerError - if httpErr, ok := err.(*HTTPError); ok { - code = httpErr.Code - } http.Error(w, err.Error(), code) }