func NewUpstream(host string, port int, forceHttp bool, rewriteHost bool) *Upstream { u := new(Upstream) u.Host = host u.Port = port u.ForceHttp = forceHttp u.RewriteHost = rewriteHost ips, err := net.LookupIP(host) var ip net.IP = nil for i := range ips { ip = ips[i].To4() if ip != nil { break } } if err == nil && ip != nil { u.tcpaddr = new(net.TCPAddr) u.tcpaddr.Port = port u.tcpaddr.IP = ip } else { falcore.Warn("Can't get IP addr for %v: %v", host, err) } u.Timeout = 60e9 u.host = fmt.Sprintf("%v:%v", u.Host, u.Port) u.transport = new(http.Transport) u.transport.Dial = func(n, addr string) (c net.Conn, err error) { falcore.Fine("Dialing connection to %v", u.tcpaddr) var ctcp *net.TCPConn ctcp, err = net.DialTCP("tcp4", nil, u.tcpaddr) if ctcp != nil { u.tcpconn = ctcp u.tcpconn.SetDeadline(time.Now().Add(u.Timeout)) } if err != nil { falcore.Error("Dial Failed: %v", err) } return ctcp, err } u.transport.MaxIdleConnsPerHost = 15 return u }
func NewUpstream(host string, port int, forceHttp bool) *Upstream { u := new(Upstream) u.Host = host u.Port = port u.ForceHttp = forceHttp ips, err := net.LookupIP(host) var ip net.IP = nil for i := range ips { ip = ips[i].To4() if ip != nil { break } } if err == nil && ip != nil { u.tcpaddr = &net.TCPAddr{} u.tcpaddr.Port = port u.tcpaddr.IP = ip } else { falcore.Warn("Can't get IP addr for %v: %v", host, err) } u.Timeout = 60 * time.Second u.host = fmt.Sprintf("%v:%v", u.Host, u.Port) u.transport = &http.Transport{} // This dial ignores the addr passed in and dials based on the upstream host and port u.transport.Dial = func(n, addr string) (c net.Conn, err error) { falcore.Fine("Dialing connection to %v", u.tcpaddr) var ctcp *net.TCPConn ctcp, err = net.DialTCP("tcp4", nil, u.tcpaddr) if err != nil { falcore.Error("Dial Failed: %v", err) return } c = &connWrapper{conn: ctcp, timeout: u.Timeout} return } u.transport.MaxIdleConnsPerHost = 15 return u }