Files
dokku-ui/internal/server/router.go
2023-04-25 14:33:14 +08:00

68 lines
1.5 KiB
Go

package server
import (
"github.com/labstack/echo/v4"
"github.com/rs/zerolog/log"
"gitlab.com/texm/shokku/internal/server/dto"
"gitlab.com/texm/shokku/internal/server/middleware"
"io/fs"
"net/http"
)
func initRouter(debugMode bool, appFS fs.FS) *echo.Echo {
r := echo.New()
r.Debug = debugMode
r.HideBanner = true
r.Validator = dto.NewRequestValidator()
r.HTTPErrorHandler = errorHandler(debugMode)
r.Use(middleware.Recover(debugMode))
r.Use(middleware.Secure())
r.Use(middleware.RequestLogger(debugMode))
r.Use(middleware.StaticFiles(appFS))
r.Use(middleware.CSRF())
return r
}
func errorHandler(debug bool) func(error, echo.Context) {
return func(err error, c echo.Context) {
if c.Response().Committed {
return
}
httpErr, ok := err.(*echo.HTTPError)
if ok && httpErr.Internal != nil {
if herr, ok := httpErr.Internal.(*echo.HTTPError); ok {
httpErr = herr
}
} else if !ok {
httpErr = &echo.HTTPError{
Code: http.StatusInternalServerError,
Message: http.StatusText(http.StatusInternalServerError),
}
}
// Issue #1426
code := httpErr.Code
message := httpErr.Message
if m, strOk := httpErr.Message.(string); strOk {
if debug {
message = echo.Map{"message": m, "error": httpErr.Error()}
} else {
message = echo.Map{"message": m}
}
}
// Send response
if c.Request().Method == http.MethodHead { // Issue #608
err = c.NoContent(httpErr.Code)
} else {
err = c.JSON(code, message)
}
if err != nil {
log.Error().Err(err).Msg("error handler response")
}
}
}