Skip to content

Commit 6b48de3

Browse files
authored
Merge pull request #1666 from neotel-at/feature/1477-defaulterrorhandler-with-debug
Fix DefaultHTTPErrorHandler with enabled debug (#1477)
2 parents 095af21 + cdd946a commit 6b48de3

File tree

2 files changed

+49
-4
lines changed

2 files changed

+49
-4
lines changed

echo.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -362,10 +362,12 @@ func (e *Echo) DefaultHTTPErrorHandler(err error, c Context) {
362362
// Issue #1426
363363
code := he.Code
364364
message := he.Message
365-
if e.Debug {
366-
message = err.Error()
367-
} else if m, ok := message.(string); ok {
368-
message = Map{"message": m}
365+
if m, ok := he.Message.(string); ok {
366+
if e.Debug {
367+
message = Map{"message": m, "error": err.Error()}
368+
} else {
369+
message = Map{"message": m}
370+
}
369371
}
370372

371373
// Send response

echo_test.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -568,6 +568,49 @@ func TestHTTPError(t *testing.T) {
568568
})
569569
}
570570

571+
func TestDefaultHTTPErrorHandler(t *testing.T) {
572+
e := New()
573+
e.Debug = true
574+
e.Any("/plain", func(c Context) error {
575+
return errors.New("An error occurred")
576+
})
577+
e.Any("/badrequest", func(c Context) error {
578+
return NewHTTPError(http.StatusBadRequest, "Invalid request")
579+
})
580+
e.Any("/servererror", func(c Context) error {
581+
return NewHTTPError(http.StatusInternalServerError, map[string]interface{}{
582+
"code": 33,
583+
"message": "Something bad happened",
584+
"error": "stackinfo",
585+
})
586+
})
587+
// With Debug=true plain response contains error message
588+
c, b := request(http.MethodGet, "/plain", e)
589+
assert.Equal(t, http.StatusInternalServerError, c)
590+
assert.Equal(t, "{\n \"error\": \"An error occurred\",\n \"message\": \"Internal Server Error\"\n}\n", b)
591+
// and special handling for HTTPError
592+
c, b = request(http.MethodGet, "/badrequest", e)
593+
assert.Equal(t, http.StatusBadRequest, c)
594+
assert.Equal(t, "{\n \"error\": \"code=400, message=Invalid request\",\n \"message\": \"Invalid request\"\n}\n", b)
595+
// complex errors are serialized to pretty JSON
596+
c, b = request(http.MethodGet, "/servererror", e)
597+
assert.Equal(t, http.StatusInternalServerError, c)
598+
assert.Equal(t, "{\n \"code\": 33,\n \"error\": \"stackinfo\",\n \"message\": \"Something bad happened\"\n}\n", b)
599+
600+
e.Debug = false
601+
// With Debug=false the error response is shortened
602+
c, b = request(http.MethodGet, "/plain", e)
603+
assert.Equal(t, http.StatusInternalServerError, c)
604+
assert.Equal(t, "{\"message\":\"Internal Server Error\"}\n", b)
605+
c, b = request(http.MethodGet, "/badrequest", e)
606+
assert.Equal(t, http.StatusBadRequest, c)
607+
assert.Equal(t, "{\"message\":\"Invalid request\"}\n", b)
608+
// No difference for error response with non plain string errors
609+
c, b = request(http.MethodGet, "/servererror", e)
610+
assert.Equal(t, http.StatusInternalServerError, c)
611+
assert.Equal(t, "{\"code\":33,\"error\":\"stackinfo\",\"message\":\"Something bad happened\"}\n", b)
612+
}
613+
571614
func TestEchoClose(t *testing.T) {
572615
e := New()
573616
errCh := make(chan error)

0 commit comments

Comments
 (0)