From ffa409fd7a0a9b95596beb33c393323cecdb999c Mon Sep 17 00:00:00 2001 From: nettnikl Date: Fri, 23 May 2025 10:50:07 +0200 Subject: [PATCH 1/3] Accept strings as message in ResolveProblemDetails Fix "interface conversion: string is not error: missing method Error" in cases like echo.NewHTTPError(http.StatusUnauthorized), where there is not an error in the interface field "message" --- problem_details.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/problem_details.go b/problem_details.go index 129783b..df19281 100644 --- a/problem_details.go +++ b/problem_details.go @@ -131,7 +131,6 @@ func Map[T error](funcProblem func() ProblemDetailErr) { // ResolveProblemDetails retrieve and resolve error with format problem details error func ResolveProblemDetails(w http.ResponseWriter, r *http.Request, err error) (ProblemDetailErr, error) { - var statusCode int = http.StatusInternalServerError var echoError *echo.HTTPError var ginError *gin.Error @@ -142,7 +141,11 @@ func ResolveProblemDetails(w http.ResponseWriter, r *http.Request, err error) (P err = errors.New(fiberError.Message) } else if errors.As(err, &echoError) { statusCode = err.(*echo.HTTPError).Code - err = err.(*echo.HTTPError).Message.(error) + if errors.As(err.(*echo.HTTPError).Message, &err) { + err = err.(*echo.HTTPError).Message.(error) + } else { + err = errors.New(err.(*echo.HTTPError).Message.(string)) + } } else if errors.As(err, &ginError) { var rw, ok = w.(gin.ResponseWriter) if ok && rw.Written() { From e309413f45ffd017b6fa2042f1c9d8675a348341 Mon Sep 17 00:00:00 2001 From: nettnikl Date: Fri, 23 May 2025 11:00:18 +0200 Subject: [PATCH 2/3] Update problem_details.go --- problem_details.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/problem_details.go b/problem_details.go index df19281..3b5f074 100644 --- a/problem_details.go +++ b/problem_details.go @@ -141,10 +141,10 @@ func ResolveProblemDetails(w http.ResponseWriter, r *http.Request, err error) (P err = errors.New(fiberError.Message) } else if errors.As(err, &echoError) { statusCode = err.(*echo.HTTPError).Code - if errors.As(err.(*echo.HTTPError).Message, &err) { - err = err.(*echo.HTTPError).Message.(error) - } else { - err = errors.New(err.(*echo.HTTPError).Message.(string)) + if messageErr, ok := err.(*echo.HTTPError).Message.(error); ok { + err = messageErr + } else if messageStr, ok := err.(*echo.HTTPError).Message.(string); ok { + err = errors.New(messageStr) } } else if errors.As(err, &ginError) { var rw, ok = w.(gin.ResponseWriter) From f372550c16d691742eaa41b657542c4f09159e1a Mon Sep 17 00:00:00 2001 From: "Niklas J. Nett" Date: Sun, 1 Jun 2025 16:18:23 +0200 Subject: [PATCH 3/3] Add test case with a non-error-interface-conforming details value in echo error --- problem_details_test.go | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/problem_details_test.go b/problem_details_test.go index 3182962..893d71e 100644 --- a/problem_details_test.go +++ b/problem_details_test.go @@ -92,7 +92,33 @@ func TestMap_Status_Echo(t *testing.T) { p, _ := ResolveProblemDetails(c.Response(), c.Request(), err) assert.Equal(t, c.Response().Status, http.StatusUnauthorized) - assert.Equal(t, err.(*echo.HTTPError).Message.(error).Error(), p.GetDetails()) + assert.Equal(t, "We have a specific status code error in our endpoint", p.GetDetails()) + assert.Equal(t, "unauthorized", p.GetTitle()) + assert.Equal(t, "https://httpstatuses.io/401", p.GetType()) + assert.Equal(t, http.StatusUnauthorized, p.GetStatus()) +} + +func TestMap_Status2_Echo(t *testing.T) { + + e := echo.New() + req := httptest.NewRequest(http.MethodGet, "http://echo_endpoint2", nil) + rec := httptest.NewRecorder() + c := e.NewContext(req, rec) + + err := echo_endpoint2b(c) + + MapStatus(http.StatusBadGateway, func() ProblemDetailErr { + return &ProblemDetail{ + Status: http.StatusUnauthorized, + Title: "unauthorized", + Detail: err.Error(), + } + }) + + p, _ := ResolveProblemDetails(c.Response(), c.Request(), err) + + assert.Equal(t, c.Response().Status, http.StatusUnauthorized) + assert.Equal(t, "We have a specific status code error in our endpoint", p.GetDetails()) assert.Equal(t, "unauthorized", p.GetTitle()) assert.Equal(t, "https://httpstatuses.io/401", p.GetType()) assert.Equal(t, http.StatusUnauthorized, p.GetStatus()) @@ -397,6 +423,10 @@ func echo_endpoint2(c echo.Context) error { return echo.NewHTTPError(http.StatusBadGateway, err) } +func echo_endpoint2b(c echo.Context) error { + return echo.NewHTTPError(http.StatusBadGateway, "We have a specific status code error in our endpoint") +} + func echo_endpoint3(c echo.Context) error { err := errors.New("We have a unhandeled error in our endpoint") return err