package handler import ( "bytes" "encoding/json" "github.com/gin-gonic/gin" "github.com/vulcand/oxy/forward" "github.com/vulcand/oxy/testutils" "gitlab.wodcloud.com/apaas/apaas-meshproxy/src/model" "gitlab.wodcloud.com/apaas/apaas-meshproxy/src/service" "io/ioutil" "net/http" "strconv" "strings" ) var Resp *http.Response func Proxy(c *gin.Context) { applyId := c.Query("applyId") if applyId == "" { res := model.WebRes{} res.Data = "applyId不能为空" c.JSON(200, res) return } //获取服务相关信息 proxyData, err := service.GetRealPath(applyId) if err != nil { c.Error(err) return } f, _ := forward.New(forward.PassHostHeader(true), forward.ResponseModifier(func(resp *http.Response) error { Resp = resp //判断是否超过调用次数是否可以调用 callflag, sensitiveflag, err := service.QueryCallsCount(proxyData) if err != nil { Return(err.Error()) return nil } if callflag == false { Return(`调用达到当日限定次数`) return nil } respbody, _ := ioutil.ReadAll(resp.Body) var res interface{} res = respbody //是否需要过滤字段 if proxyData.ResFields != "" { res = service.FiledFilter(proxyData, respbody) } //是否需要屏蔽敏感字段 if sensitiveflag == false { res = service.SensitiveFilter(proxyData, res) } //服务调用计次 //err = service.CallCounts(proxyData) err = service.CallCounts(proxyData) if err != nil { Return(err.Error()) return nil } ////申请调用计次 err = service.ApplyCallCounts(proxyData) if err != nil { Return(err.Error()) return nil } Return(res) return nil })) c.Request.URL = testutils.ParseURI(proxyData.RealUrl) c.Request.RequestURI = proxyData.RealUrl c.Request.Host = getHost(proxyData.RealUrl) f.ServeHTTP(c.Writer, c.Request) } func Return(res interface{}) { var b []byte switch res.(type) { case []byte: b = res.([]byte) case interface{}: b, _ = json.Marshal(res) } Resp.Header.Set("X-Log-By", "Apaas") l := strconv.Itoa(len(b)) Resp.Header.Set("Content-Length", l) Resp.Body = ioutil.NopCloser(bytes.NewBuffer(b)) } // 获取域名 func getHost(url string) (path string) { if strings.Contains(url, "//") { path = strings.Split(url, "//")[1] if strings.Contains(path, "/") { path = strings.Split(path, "/")[0] } } return }