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

118 lines
3.4 KiB
Go

package proxy
import (
"log"
"net/http"
"net/http/httputil"
"net/url"
"strings"
"github.com/gorilla/mux"
"github.com/zeevdiukman/zprox/internal/auth"
"github.com/zeevdiukman/zprox/internal/config"
)
// func reverseProxypHandler(config *Config, epmr map[string]*mux.Router, rp *httputil.ReverseProxy, data *Router) func(string, string) http.HandlerFunc {
// return func(service string, prefix string) http.HandlerFunc {
// return Matcher(config, epmr, data, rp, service)
// }
// }
func ReverseProxypHandler(epr *mux.Router, rp *httputil.ReverseProxy, routerData *config.Router) func(string, string) http.HandlerFunc {
return func(service string, prefix string) http.HandlerFunc {
return Matcher(epr, routerData, rp, service)
}
}
func reWrite(serviceURL string, prefix string, rp *httputil.ReverseProxy, routerData *config.Router) {
u, err := url.Parse(serviceURL)
if err != nil {
log.Println(err.Error())
}
rp.Rewrite = func(pr *httputil.ProxyRequest) {
pr.SetURL(u)
if routerData.StripPrefix {
pr.Out.URL.Path = strings.TrimPrefix(pr.Out.URL.Path, prefix)
}
// pr.SetXForwarded()
}
}
func Matcher(epr *mux.Router, routerData *config.Router, rp *httputil.ReverseProxy, serviceURL string) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
authEnabled := routerData.Auth.Enabled
match := &mux.RouteMatch{}
if epr.Match(r, match) {
matchID := match.Route.GetName()
pathPrefix := routerData.Routes[matchID].Rule["PathPrefix"]
route := routerData.GetRouteByID(matchID)
reWrite(serviceURL, pathPrefix, rp, routerData)
if authEnabled {
auth.Middleware(routerData, route.ID, w, r, rp)
} else {
rp.ServeHTTP(w, r)
}
} else {
w.WriteHeader(http.StatusNotFound)
}
}
}
// func Matcher(epr *mux.Router, routerData *config.Router, rp *httputil.ReverseProxy, serviceURL string) http.HandlerFunc {
// return func(w http.ResponseWriter, req *http.Request) {
// // if _, ok := config.Data.AuthMap[routerData.Auth.Provider]; ok {
// // authPrefix := config.Data.AuthMap[routerData.Auth.Provider].Paths.Prefix
// // if strings.HasPrefix(req.URL.Path, authPrefix) {
// // dump.P("HasPrefix !")
// // rp.ServeHTTP(w, req)
// // }
// // return
// // }
// authEnabled := routerData.Auth.Enabled
// match := &mux.RouteMatch{}
// // dump.P(strings.HasPrefix(req.URL.Path, authPrefix), req.URL.Path, authPrefix)
// if epr.Match(req, match) {
// matchID := match.Route.GetName()
// pathPrefix := routerData.Routes[matchID].Rule["PathPrefix"]
// route := routerData.GetRouteByID(matchID)
// // IsProtectedRoute := ""
// // if v, ok := route.Rule["Auth"]; ok {
// // IsProtectedRoute = v
// // } else {
// // IsProtectedRoute = "true"
// // }
// // protected := true
// // if !authEnabled {
// // protected = false
// // } else {
// // if IsProtectedRoute == "false" {
// // protected = false
// // }
// // if IsProtectedRoute == "true" {
// // protected = true
// // }
// // }
// reWrite(serviceURL, pathPrefix, rp, routerData)
// dump.P(matchID)
// if authEnabled {
// // if protected {
// // if protected && !strings.HasPrefix(req.URL.Path, "/auth/") {
// auth.Middleware(routerData, route.ID)(rp, w, req)
// } else {
// rp.ServeHTTP(w, req)
// }
// } else {
// w.WriteHeader(http.StatusNotFound)
// }
// }
// }