예제 #1
0
파일: forward.go 프로젝트: juju2013/gsnova
func (conn *ForwardConnection) initForwardConn(proxyAddr string, isHttps bool) error {
	if !strings.Contains(proxyAddr, ":") {
		proxyAddr = proxyAddr + ":80"
	}

	if nil != conn.forward_conn && conn.proxyAddr == proxyAddr {
		if !util.IsDeadConnection(conn.forward_conn) {
			return nil
		}
	}
	conn.Close()
	var err error
	conn.conn_url, err = url.Parse(conn.manager.target)
	if nil != err {
		return err
	}

	addr := conn.conn_url.Host
	lookup_trusted_dns := false
	if !conn.manager.overProxy {
		if isHttps || (conn.manager.inject_crlf) {
			lookup_trusted_dns = true
		}
	}

	if conn.use_sys_dns {
		lookup_trusted_dns = false
	}

	isSocks := strings.HasPrefix(strings.ToLower(conn.conn_url.Scheme), "socks")
	if !isSocks {
		conn.forward_conn, err = conn.dialRemote(addr, lookup_trusted_dns)
	} else {
		proxy := &socks.Proxy{Addr: conn.conn_url.Host}
		if nil != conn.conn_url.User {
			proxy.Username = conn.conn_url.User.Username()
			proxy.Password, _ = conn.conn_url.User.Password()
		}
		conn.forward_conn, err = proxy.Dial("tcp", proxyAddr)
	}
	if nil != err {
		log.Printf("Failed to dial address:%s for reason:%s\n", addr, err.Error())
		conn.Close()
		return err
	} else {
		conn.proxyAddr = proxyAddr
	}
	if nil == conn.forwardChan {
		conn.forwardChan = make(chan int, 2)
	}
	conn.buf_forward_conn = bufio.NewReader(conn.forward_conn)
	conn.closed = false
	return nil
}
예제 #2
0
파일: forward.go 프로젝트: juju2013/gsnova
func (conn *ForwardConnection) IsClosed() bool {
	if nil != conn.forward_conn && !conn.closed {
		return util.IsDeadConnection(conn.forward_conn)
	}
	return true
}