68 lines
1.5 KiB
Go
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")
|
|
}
|
|
}
|
|
}
|