118 lines
3.4 KiB
Go
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)
|
|
// }
|
|
// }
|
|
// }
|