package controller import ( "net/http" "net/http/httputil" "net/url" "strings" "github.com/gin-gonic/gin" "github.com/rs/zerolog/log" ) type WafLogController struct { remote string regionUrlMap map[string]string } func NewWafLogController(regionUrlMap map[string]string) *WafLogController { return &WafLogController{ regionUrlMap: regionUrlMap, } } func (c *WafLogController) WafLogProxy(ctx *gin.Context) { region := ctx.Query("region_code") remoteUrl, err := url.Parse(c.regionUrlMap[region]) if err != nil { ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } log.Info().Msgf("remoteUrl: %s", remoteUrl.String()) proxy := httputil.NewSingleHostReverseProxy(remoteUrl) proxy.Director = func(req *http.Request) { req.URL.Scheme = remoteUrl.Scheme req.URL.Path = strings.Replace(req.URL.Path, "/api/v2/containerSec/waf", "/api/v2/waf", 1) req.URL.RawQuery = ctx.Request.URL.RawQuery } proxy.ServeHTTP(ctx.Writer, ctx.Request) }