frontend_util.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package websubsvc
  2. import (
  3. "github.com/gin-gonic/gin"
  4. "net/http"
  5. "path"
  6. )
  7. type FrontendUtil struct {
  8. filesystem IFilesystem
  9. vueHistoryMode bool
  10. notFoundHdl gin.HandlerFunc
  11. forbiddenHdl gin.HandlerFunc
  12. fileServer http.Handler
  13. }
  14. func NewFrontendUtil(fs IFilesystem, vueHistoryMode bool) *FrontendUtil {
  15. s := &FrontendUtil{
  16. filesystem: fs,
  17. vueHistoryMode: vueHistoryMode,
  18. fileServer: http.FileServer(http.FS(fs)),
  19. }
  20. s.forbiddenHdl = s.DefaultForbiddenHandler
  21. s.notFoundHdl = s.DefaultNotFoundHandler
  22. return s
  23. }
  24. func (s *FrontendUtil) StaticFilesHandler(ctx *gin.Context) {
  25. url := ctx.Request.URL.Path
  26. fin, err := s.filesystem.Stat(path.Clean(url))
  27. if err != nil {
  28. if s.vueHistoryMode {
  29. s.VueHistoryModeHandler(ctx)
  30. return
  31. } else {
  32. s.notFoundHdl(ctx)
  33. return
  34. }
  35. }
  36. if fin.IsDir() {
  37. _, xerr := s.filesystem.Stat(path.Join(path.Clean(url), "index.html"))
  38. if xerr != nil {
  39. if s.vueHistoryMode {
  40. s.VueHistoryModeHandler(ctx)
  41. return
  42. } else {
  43. s.forbiddenHdl(ctx)
  44. return
  45. }
  46. }
  47. }
  48. ctx.Request.URL.Path = url
  49. s.fileServer.ServeHTTP(ctx.Writer, ctx.Request)
  50. }
  51. func (s *FrontendUtil) DefaultNotFoundHandler(ctx *gin.Context) {
  52. ctx.Writer.WriteString("404 not found")
  53. ctx.Status(404)
  54. }
  55. func (s *FrontendUtil) DefaultForbiddenHandler(ctx *gin.Context) {
  56. ctx.Writer.WriteString("403 forbidden")
  57. ctx.Status(403)
  58. }
  59. func (s *FrontendUtil) VueHistoryModeHandler(ctx *gin.Context) {
  60. ctx.HTML(200, "index.html", &gin.H{})
  61. }