frontend_util.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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) SetNotFoundHandler(fn gin.HandlerFunc) {
  52. s.notFoundHdl = fn
  53. }
  54. func (s *FrontendUtil) SetForbiddenHandler(fn gin.HandlerFunc) {
  55. s.forbiddenHdl = fn
  56. }
  57. func (s *FrontendUtil) DefaultNotFoundHandler(ctx *gin.Context) {
  58. ctx.Writer.WriteString("404 not found")
  59. ctx.Status(404)
  60. }
  61. func (s *FrontendUtil) DefaultForbiddenHandler(ctx *gin.Context) {
  62. ctx.Writer.WriteString("403 forbidden")
  63. ctx.Status(403)
  64. }
  65. func (s *FrontendUtil) VueHistoryModeHandler(ctx *gin.Context) {
  66. ctx.HTML(200, "index.html", &gin.H{})
  67. }