12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- package websubsvc
- import (
- "fmt"
- "github.com/gin-gonic/gin"
- "net/http"
- "path"
- )
- type FrontendUtil struct {
- filesystem IFilesystem
- vueHistoryMode bool
- notFoundHdl gin.HandlerFunc
- forbiddenHdl gin.HandlerFunc
- fileServer http.Handler
- }
- func NewFrontendUtil(fs IFilesystem, vueHistoryMode bool) *FrontendUtil {
- s := &FrontendUtil{
- filesystem: fs,
- vueHistoryMode: vueHistoryMode,
- fileServer: http.FileServer(http.FS(fs)),
- }
- s.forbiddenHdl = s.DefaultForbiddenHandler
- s.notFoundHdl = s.DefaultNotFoundHandler
- return s
- }
- func (s *FrontendUtil) StaticFilesHandler(ctx *gin.Context) {
- url := ctx.Request.URL.Path
- fin, err := s.filesystem.Stat(path.Clean(url))
- if err != nil {
- fmt.Println("[TEST] err in STAT file: ", err)
- if s.vueHistoryMode {
- s.VueHistoryModeHandler(ctx)
- return
- } else {
- s.notFoundHdl(ctx)
- return
- }
- }
- if fin.IsDir() {
- _, xerr := s.filesystem.Stat(path.Join(path.Clean(url), "index.html"))
- if xerr != nil {
- fmt.Println("[TEST] err in STAT index.html: ", xerr)
- if s.vueHistoryMode {
- s.VueHistoryModeHandler(ctx)
- return
- } else {
- s.forbiddenHdl(ctx)
- return
- }
- }
- }
- ctx.Request.URL.Path = url
- s.fileServer.ServeHTTP(ctx.Writer, ctx.Request)
- }
- func (s *FrontendUtil) SetNotFoundHandler(fn gin.HandlerFunc) {
- s.notFoundHdl = fn
- }
- func (s *FrontendUtil) SetForbiddenHandler(fn gin.HandlerFunc) {
- s.forbiddenHdl = fn
- }
- func (s *FrontendUtil) DefaultNotFoundHandler(ctx *gin.Context) {
- ctx.Writer.WriteString("404 not found")
- ctx.Status(404)
- }
- func (s *FrontendUtil) DefaultForbiddenHandler(ctx *gin.Context) {
- ctx.Writer.WriteString("403 forbidden")
- ctx.Status(403)
- }
- func (s *FrontendUtil) VueHistoryModeHandler(ctx *gin.Context) {
- ctx.HTML(200, "index.html", &gin.H{})
- }
|