package proxyClient import ( "fmt" "github.com/gogf/gf/v2/os/gcfg" "github.com/gogf/gf/v2/os/gctx" "github.com/gogf/gf/v2/util/gconv" "jygit.jydev.jianyu360.cn/dataservice/tripartite_gateway/common/db" "net" "net/http" "net/http/httputil" "net/url" "regexp" "strings" "time" ) var transport = &http.Transport{} func CreateCustomProxyClient(target *url.URL, errFunc func(http.ResponseWriter, *http.Request, error), change func(resp *http.Response) error) *httputil.ReverseProxy { return &httputil.ReverseProxy{ Director: func(req *http.Request) { url_ := req.URL.Path bidReg := regexp.MustCompile(".*/getAllbid/(.*)") winnerReg := regexp.MustCompile(".*/getWinner") if bidReg.MatchString(url_) || winnerReg.MatchString(url_) { urlArr := strings.Split(url_, "/") query := req.URL.Query() startTime, endTime := TimeHandle(query.Get("date")) fmt.Println(query, target.Path) req.URL.Path = target.Path req.Method = "POST" if bidReg.MatchString(url_) { req.URL.RawQuery = fmt.Sprintf("startTime=%d&page=%s&business=%s&endTime=%d", startTime, query.Get("page"), gconv.String(db.AddressMap[urlArr[len(urlArr)-1]]), endTime) } } req.URL.Scheme = target.Scheme req.URL.Host = target.Host }, Transport: transport, ModifyResponse: change, ErrorHandler: errFunc} } func ReLoadClient() { transport = &http.Transport{ Proxy: http.ProxyFromEnvironment, DialContext: (&net.Dialer{ Timeout: time.Duration(gcfg.Instance().MustGet(gctx.New(), "proxy.timeout", 30).Int()) * time.Second, //连接超时 KeepAlive: time.Duration(gcfg.Instance().MustGet(gctx.New(), "proxy.keepAlive", 60).Int()) * time.Second, //长连接超时时间 DualStack: true, }).DialContext, MaxIdleConns: gcfg.Instance().MustGet(gctx.New(), "proxy.maxIdleConns", 120).Int(), //最大空闲连接 0没有限制 IdleConnTimeout: time.Duration(gcfg.Instance().MustGet(gctx.New(), "proxy.idleConnTimeout", 90).Int()) * time.Second, //空闲超时时间 TLSHandshakeTimeout: time.Duration(gcfg.Instance().MustGet(gctx.New(), "proxy.tLSHandshakeTimeout", 1).Int()) * time.Second, //tls握手超时时间 ExpectContinueTimeout: time.Duration(gcfg.Instance().MustGet(gctx.New(), "proxy.expectContinueTimeout", 1).Int()) * time.Second, //100-continue 超时时间 MaxIdleConnsPerHost: gcfg.Instance().MustGet(gctx.New(), "proxy.maxIdleConnsPerHost", 5).Int(), //客户端可以持有的最大空闲连接 } } func TimeHandle(timeStr string) (int64, int64) { // 解析时间字符串 specificTime, _ := time.Parse(time.DateOnly, timeStr) // 获取该时间的开始时间(00:00:00) startOfDay := time.Date(specificTime.Year(), specificTime.Month(), specificTime.Day(), 0, 0, 0, 0, specificTime.Location()) // 获取该时间的截止时间(23:59:59) endOfDay := time.Date(specificTime.Year(), specificTime.Month(), specificTime.Day(), 23, 59, 59, 0, specificTime.Location()) return startOfDay.Unix(), endOfDay.Unix() }