package proxyClient

import (
	"bp.jydev.jianyu360.cn/BaseService/gateway/core/util"
	"context"
	"github.com/gogf/gf/v2/os/gcfg"
	"github.com/gogf/gf/v2/os/gctx"
	"net"
	"net/http"
	"net/http/httputil"
	"net/url"
	"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) {
			req.URL.Scheme = target.Scheme
			req.URL.Host = target.Host
			req.URL.Path = util.SingleJoiningSlash(target.Path, req.URL.Path)
		},
		Transport:      transport,
		ModifyResponse: change,
		ErrorHandler:   errFunc}
}

func ReLoadClient() {
	transport = &http.Transport{
		Proxy: http.ProxyFromEnvironment,
		DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
			dialer := &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, //长连接超时时间
			}
			return dialer.DialContext(ctx, network, addr)
		},
		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(),                                //客户端可以持有的最大空闲连接
		DisableKeepAlives:     gcfg.Instance().MustGet(gctx.New(), "proxy.disableKeepAlives", false).Bool(),
	}
}
