gost_software/gost/chain.go
2017-07-22 14:02:41 +08:00

60 lines
890 B
Go

package gost
import (
"net"
)
type Chain struct {
Nodes []Node
}
func NewChain(nodes ...Node) *Chain {
return &Chain{
Nodes: nodes,
}
}
func (c *Chain) Dial(addr string) (net.Conn, error) {
if len(c.Nodes) == 0 {
return net.Dial("tcp", addr)
}
nodes := c.Nodes
conn, err := nodes[0].Client.Dial(nodes[0].Addr)
if err != nil {
return nil, err
}
conn, err = nodes[0].Client.Handshake(conn)
if err != nil {
return nil, err
}
for i, node := range nodes {
if i == len(nodes)-1 {
break
}
next := nodes[i+1]
cc, err := node.Client.Connect(conn, next.Addr)
if err != nil {
conn.Close()
return nil, err
}
cc, err = next.Client.Handshake(cc)
if err != nil {
conn.Close()
return nil, err
}
conn = cc
}
cc, err := nodes[len(nodes)-1].Client.Connect( conn, addr)
if err != nil {
conn.Close()
return nil, err
}
return cc, nil
}