package middleware
import (
"net/http"
"strings"
"github.com/1Panel-dev/1Panel/core/utils/security"
"github.com/gin-gonic/gin"
)
func FrontendFallback() gin.HandlerFunc {
return func(c *gin.Context) {
if !isFrontendFallbackRequest(c) {
c.Next()
return
}
if security.CanServeFrontendPath(c) {
security.ToIndexHtml(c)
c.Abort()
return
}
security.HandleNotSecurity(c, "")
c.Abort()
}
}
func isFrontendFallbackRequest(c *gin.Context) bool {
if c.Request.Method != http.MethodGet && c.Request.Method != http.MethodHead {
return false
}
path := c.Request.URL.Path
if strings.HasPrefix(path, "/api/") ||
strings.HasPrefix(path, "/assets/") ||
strings.HasPrefix(path, "/public") ||
strings.HasPrefix(path, "/1panel/swagger/") ||
path == "/favicon.ico" {
return false
}
if !security.IsFrontendPath(path) {
return false
}
accept := c.GetHeader("Accept")
return accept == "" || strings.Contains(accept, "text/html")
}