57 lines
1.4 KiB
Go
57 lines
1.4 KiB
Go
package middlewares
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"pink_fox/packages/fw"
|
|
"runtime/debug"
|
|
)
|
|
|
|
type ErrorMiddlewareServices interface {
|
|
Debug() bool
|
|
Logger() fw.Logger
|
|
ResponseFactory() *fw.ResponseFactory
|
|
}
|
|
|
|
func ErrorMiddleware(services ErrorMiddlewareServices, next fw.ActionFunc) (response fw.Response, err fw.Error) {
|
|
defer func() {
|
|
if err_ := recover(); err_ != nil {
|
|
err = fw.ErrPanic(fmt.Errorf("panic: %v", err_), debug.Stack())
|
|
err = errorsHandler(services.ResponseFactory(), err, services.Debug(), services.Logger())
|
|
response = nil
|
|
}
|
|
}()
|
|
|
|
response, err = next()
|
|
if err != nil {
|
|
err = errorsHandler(services.ResponseFactory(), err, services.Debug(), services.Logger())
|
|
return nil, err // ошибку отобразили
|
|
}
|
|
|
|
return nil, nil
|
|
}
|
|
|
|
func errorsHandler(responseFactory *fw.ResponseFactory, errIn fw.Error, debugOn bool, logger fw.Logger) fw.Error {
|
|
if logger != nil {
|
|
logger.Error(errIn.Message(), errIn.Trace())
|
|
}
|
|
|
|
textError := ""
|
|
if debugOn {
|
|
textError = errIn.Error()
|
|
}
|
|
|
|
response := responseFactory.View("errors/500.html", map[string]any{
|
|
"title": fmt.Sprintf("%d %s", http.StatusInternalServerError, http.StatusText(http.StatusInternalServerError)),
|
|
"message": "We have a problem",
|
|
"error": textError,
|
|
})
|
|
response.WriteHeader(http.StatusInternalServerError)
|
|
err := response.Render()
|
|
if err != nil {
|
|
return err.Add("ошибка при создании страницы ошибки")
|
|
}
|
|
|
|
return nil
|
|
}
|