/
recovery.go
41 lines (34 loc) · 955 Bytes
/
recovery.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
package middleware
import (
"errors"
"github.com/IvanLutokhin/go-beanstalk-interface/internal/app/api/net/http/response"
"github.com/IvanLutokhin/go-beanstalk-interface/internal/app/api/net/http/writer"
"net/http"
)
type Recovery struct{}
func NewRecovery() *Recovery {
return &Recovery{}
}
func (m *Recovery) Middleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
defer func() {
if e := recover(); e != nil {
var err error
switch v := e.(type) {
case error:
err = v
case string:
err = errors.New(v)
default:
err = errors.New("unknown error")
}
if fields, ok := r.Context().Value("middleware:logging:fields").(map[string]interface{}); ok {
fields["error"] = err
fields["panic_occurred"] = true
}
writer.JSON(w, http.StatusInternalServerError, response.InternalServerError())
}
}()
next.ServeHTTP(w, r)
})
}