go-dev-zprox-0.01/router.go
2025-03-22 08:57:23 +00:00

225 lines
7.3 KiB
Go

package main
import (
"net/http"
"strings"
"github.com/gorilla/mux"
"github.com/zeevdiukman/zprox/internal/auth"
"github.com/zeevdiukman/zprox/internal/config"
)
func BuildRoutes(routerData *config.Router, handlers map[string]func(string, string) http.HandlerFunc, epr *mux.Router) {
routerData.Routes.ForEach(func(routeID string, route *config.Route) string {
blockedRoutes := map[string]string{}
route.ForEachRule(func(routeID string, ruleName, ruleValue string) string {
if ruleName == "!Host" || ruleName == "!PathPrefix" || ruleName == "!Path" || ruleName == "!Headers" {
blockedRoutes[routeID] = ruleValue
return "break"
}
return ""
})
if len(blockedRoutes) > 0 {
nrBlock := epr.NewRoute().Name(routeID + "_block")
route.ForEachRule(func(routeID string, ruleName, ruleValue string) string {
switch ruleName {
case "!Host":
{
nrBlock = nrBlock.Host(ruleValue)
}
case "!PathPrefix":
{
nrBlock = nrBlock.PathPrefix(ruleValue)
}
case "!Path":
{
nrBlock = nrBlock.Path(ruleValue)
}
case "!Headers":
{
ruleValue := strings.Split(ruleValue, ":")
nrBlock = nrBlock.Headers(ruleValue[0], ruleValue[1])
}
default:
}
return ""
})
nrBlock.HandlerFunc(http.NotFound)
}
nr := epr.NewRoute().Name(routeID)
route.ForEachRule(func(routeID string, ruleName, ruleValue string) string {
switch ruleName {
case "Host":
{
nr = nr.Host(ruleValue)
}
case "PathPrefix":
{
nr = nr.PathPrefix(ruleValue)
}
case "Path":
{
nr = nr.Path(ruleValue)
}
case "Headers":
{
ruleValue := strings.Split(ruleValue, ":")
nr = nr.Headers(ruleValue[0], ruleValue[1])
}
default:
}
return ""
})
serviceURL := config.Data.Services[routerData.Service]
handler := handlers[routerData.EntryPoint]
h := handler(serviceURL, routeID)
nr.HandlerFunc(h)
return ""
})
}
func buildAuthRoutes(epmr *mux.Router, routerData *config.Router) {
if routerData.Auth.Enabled {
var authSubrouter *mux.Router
authConfig := config.Data.AuthMap[routerData.Auth.Provider]
authPrefix := authConfig.Paths.Prefix
// LoginPath := authConfig.Paths.Login
logoutPath := authConfig.Paths.Logout
callbackPath := authConfig.Paths.Callback
// PostLogoutPath := authConfig.Paths.PostLogout
authRoute := epmr.NewRoute().Name(routerData.Name)
routerData.Routes.ForEach(func(routeID string, v *config.Route) string {
if isRouteProtected, ok := v.Rule["Auth"]; (ok && isRouteProtected != "false") || !ok {
if host, ok := v.Rule["Host"]; ok && host != "" {
authSubrouter = authRoute.Host(host).PathPrefix(authPrefix + "/").Subrouter()
} else {
authSubrouter = authRoute.PathPrefix(authPrefix + "/").Subrouter()
}
authSubrouter.Use(func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
next.ServeHTTP(w, r)
})
})
// authSubrouter.Path(LoginPath).HandlerFunc(auth.LoginHandler(authConfig,routerData))
authSubrouter.Path(logoutPath).HandlerFunc(auth.LogoutHandler(authConfig, routerData))
authSubrouter.Path(callbackPath).HandlerFunc(auth.CallbackHandler(authConfig, routerData))
// authSubrouter.Path(PostLogoutPath).HandlerFunc(auth.PostLogoutHandler(authConfig, routerData))
return "break"
}
return ""
})
}
}
// func buildAuthRoutes(epmr *mux.Router, routerData *config.Router, handlers map[string]func(string, string) http.HandlerFunc) {
// if routerData.Auth.Enabled {
// host := ""
// routerData.Routes.ForEach(func(routeID string, v *config.Route) string {
// if isRouteProtected, ok := v.Rule["Auth"]; (ok && isRouteProtected != "false") || !ok {
// if _, ok := v.Rule["Host"]; ok {
// host = v.Rule["Host"]
// return "break"
// }
// }
// return ""
// })
// if host != "" {
// dump.P(host)
// // var r *mux.Router
// authConfig := config.Data.AuthMap[routerData.Auth.Provider]
// authPrefix := authConfig.Paths.Prefix
// // loginPath := authConfig.Paths.Login
// // logoutPath := authConfig.Paths.Logout
// callbackPath := authConfig.Paths.Callback
// // postLogoutPath := authConfig.Paths.PostLogout
// authRoute := epmr.NewRoute().Name(routerData.Name)
// // authSubrouter = authRoute.Host(host).PathPrefix(authPrefix).Subrouter()
// authRoute = authRoute.PathPrefix(authPrefix)
// authRoute = authRoute.Path("/callback")
// authRoute.Handler(auth.CallbackHandler(authConfig, routerData))
// handler := handlers[routerData.EntryPoint]
// h := handler(serviceURL, routeID)
// nr.HandlerFunc(h)
// // authSubrouter.Path(loginPath).HandlerFunc(auth.LoginHandler(authConfig, routerData))
// // authSubrouter.Path(logoutPath).HandlerFunc(auth.LogoutHandler(authConfig, routerData))
// // authSubrouter.Path(callbackPath).HandlerFunc(auth.CallbackHandler(authConfig, routerData))
// // authSubrouter.Path(postLogoutPath).HandlerFunc(auth.PostLogoutHandler(authConfig, routerData))
// }
// // if isRouteProtected, ok := route.Rule["Auth"]; (ok && isRouteProtected != "false") || !ok {
// // if host, ok := v.Rule["Host"]; ok && host != "" {
// // dump.P(authPrefix)
// // return "break"
// // }
// // } else {
// // authSubrouter = authRoute.PathPrefix(authPrefix).Subrouter()
// // }
// // authSubrouter.Use(func(next http.Handler) http.Handler {
// // return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// // next.ServeHTTP(w, r)
// // })
// // serviceURL := config.Data.Services[routerData.Service]
// // handler := handlers[routerData.EntryPoint]
// // h := handler(serviceURL, routeID)
// // nr.HandlerFunc(h)
// // return ""
// // })
// // return "break"
// // }
// // return ""
// // })
// }
// }
// func buildAuthRoutes(epmr *mux.Router, routerData *config.Router) {
// if routerData.Auth.Enabled {
// var authSubrouter *mux.Router
// authConfig := config.Data.AuthMap[routerData.Auth.Provider]
// authPrefix := authConfig.Paths.Prefix
// LoginPath := authConfig.Paths.Login
// LogoutPath := authConfig.Paths.Logout
// CallbackPath := authConfig.Paths.Callback
// PostLogoutPath := authConfig.Paths.PostLogout
// authRoute := epmr.NewRoute().Name(routerData.Name)
// routerData.Routes.ForEach(func(routeID string, v *config.Route) string {
// if isRouteProtected, ok := v.Rule["Auth"]; (ok && isRouteProtected != "false") || !ok {
// if host, ok := v.Rule["Host"]; ok && host != "" {
// authSubrouter = authRoute.Host(host).PathPrefix(authPrefix + "/").Subrouter()
// } else {
// authSubrouter = authRoute.PathPrefix(authPrefix + "/").Subrouter()
// }
// authSubrouter.Use(func(next http.Handler) http.Handler {
// return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// next.ServeHTTP(w, r)
// })
// })
// authSubrouter.Path(LoginPath).HandlerFunc(auth.LoginHandler(authConfig))
// authSubrouter.Path(LogoutPath).HandlerFunc(auth.LogoutHandler(authConfig, routerData))
// authSubrouter.Path(CallbackPath).HandlerFunc(auth.CallbackHandler(authConfig))
// authSubrouter.Path(PostLogoutPath).HandlerFunc(auth.PostLogoutHandler(authConfig, routerData))
// return "break"
// }
// return ""
// })
// }
// }