func NewHTTPClient(conf *ProxyChannelConfig) (*http.Client, error) { localDial := func(network, addr string) (net.Conn, error) { host, port, _ := net.SplitHostPort(addr) if port == "443" && len(conf.SNIProxy) > 0 && hosts.InHosts(conf.SNIProxy) { addr = hosts.GetAddr(conf.SNIProxy, "443") host, _, _ = net.SplitHostPort(addr) } if net.ParseIP(host) == nil { iphost, err := DnsGetDoaminIP(host) if nil != err { return nil, err } addr = net.JoinHostPort(iphost, port) } dailTimeout := conf.DialTimeout if 0 == dailTimeout { dailTimeout = 5 } log.Printf("[Proxy]Connect %s", addr) return netx.DialTimeout(network, addr, time.Duration(dailTimeout)*time.Second) } readTimeout := conf.ReadTimeout if 0 == readTimeout { readTimeout = 30 } tr := &http.Transport{ Dial: localDial, DisableCompression: true, MaxIdleConnsPerHost: 2 * int(conf.ConnsPerServer), ResponseHeaderTimeout: time.Duration(readTimeout) * time.Second, } if len(conf.SNI) > 0 { tlscfg := &tls.Config{} tlscfg.InsecureSkipVerify = true tlscfg.ServerName = conf.SNI[0] tr.TLSClientConfig = tlscfg } if len(conf.Proxy) > 0 { proxyUrl, err := url.Parse(conf.Proxy) if nil != err { log.Printf("[ERROR]Invalid proxy url:%s to create http client.", conf.Proxy) return nil, err } tr.Proxy = http.ProxyURL(proxyUrl) } hc := &http.Client{} hc.Timeout = tr.ResponseHeaderTimeout hc.Transport = tr return hc, nil }
func (tc *tcpChannel) Open() error { dailTimeout := tc.conf.DialTimeout if 0 == dailTimeout { dailTimeout = 5 } var tlscfg *tls.Config hostport := tc.rurl.Host vpsHost, vpsPort, _ := net.SplitHostPort(hostport) if strings.EqualFold(tc.rurl.Scheme, "tls") { tlscfg = &tls.Config{} tlscfg.ServerName = vpsHost if len(tc.conf.SNIProxy) > 0 && vpsPort == "443" && hosts.InHosts(tc.conf.SNIProxy) { hostport = hosts.GetAddr(tc.conf.SNIProxy, "443") vpsHost, _, _ = net.SplitHostPort(hostport) tc.useSNIProxy = true log.Printf("VPS channel select SNIProxy %s to connect", hostport) } } if net.ParseIP(vpsHost) == nil { iphost, err := proxy.DnsGetDoaminIP(vpsHost) if nil != err { return err } hostport = net.JoinHostPort(iphost, vpsPort) } //log.Printf("######%s %s", vpsHost, tc.hostport) timeout := time.Duration(dailTimeout) * time.Second var c net.Conn var err error if len(tc.conf.Proxy) > 0 { c, err = helper.HTTPProxyDial(tc.conf.Proxy, hostport, timeout) } else { c, err = netx.DialTimeout("tcp", hostport, timeout) } if nil != tlscfg && nil == err { c = tls.Client(c, tlscfg) } if err != nil { if tc.rurl.String() != tc.originAddr { tc.rurl, _ = url.Parse(tc.originAddr) tc.proxyChannel.Addr = tc.rurl.String() } log.Printf("###Failed to connect %s with err:%v", hostport, err) return err } tc.conn = c return nil }