/
httperrorhandler.go
92 lines (77 loc) · 1.66 KB
/
httperrorhandler.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package middlewares
import (
"errors"
"github.com/labstack/echo/v4"
"net/http"
)
type (
HttpErrorHandler interface {
Add(err error, code int)
getStatusCode(err error) int
}
httpErrorHandler struct {
statusCodes map[error]int
}
)
func NewHttpErrorHandler() *httpErrorHandler {
var result = &httpErrorHandler{}
result.statusCodes = make(map[error]int)
return result
}
func (self *httpErrorHandler) Add(err error, code int) {
self.statusCodes[err] = code
}
func (self *httpErrorHandler) getStatusCode(err error) int {
for key, value := range self.statusCodes {
if errors.Is(err, key) {
return value
}
}
return http.StatusInternalServerError
}
func unwrapRecursive(err error) error {
var originalErr = err
for originalErr != nil {
var internalErr = errors.Unwrap(originalErr)
if internalErr == nil {
break
}
originalErr = internalErr
}
return originalErr
}
func (self *httpErrorHandler) Handler(err error, c echo.Context) {
he, ok := err.(*echo.HTTPError)
if ok {
if he.Internal != nil {
if herr, ok := he.Internal.(*echo.HTTPError); ok {
he = herr
}
}
} else {
he = &echo.HTTPError{
Code: self.getStatusCode(err),
Message: unwrapRecursive(err).Error(),
}
}
// {
// Code: "ErrIsNullOrEmpty"
// Message: "role ErrIsNullOrEmpty"
// }
code := he.Code
message := he.Message
if m, ok := he.Message.(string); ok {
message = map[string]interface{}{"code": m, "message": err.Error()}
}
// Send response
if !c.Response().Committed {
if c.Request().Method == http.MethodHead {
err = c.NoContent(he.Code)
} else {
err = c.JSON(code, message)
}
if err != nil {
c.Echo().Logger.Error(err)
}
}
}