frontend_util.go 1.7 KB

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