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

70 lines
1.4 KiB
Go

package gost
import (
"net"
)
type Client struct {
Connector Connector
Transporter Transporter
}
func NewClient(c Connector, tr Transporter) *Client {
return &Client{
Connector: c,
Transporter: tr,
}
}
// Dial connects to the target address
func (c *Client) Dial(addr string) (net.Conn, error) {
return net.Dial(c.Transporter.Network(), addr)
}
func (c *Client) Handshake(conn net.Conn) (net.Conn, error) {
return c.Transporter.Handshake(conn)
}
func (c *Client) Connect(conn net.Conn, addr string) (net.Conn, error) {
return c.Connector.Connect(conn, addr)
}
// DefaultClient is a standard HTTP proxy client
var DefaultClient = NewClient(HTTPConnector(nil), TCPTransporter())
func Dial(addr string) (net.Conn, error) {
return DefaultClient.Dial(addr)
}
func Handshake(conn net.Conn) (net.Conn, error) {
return DefaultClient.Handshake(conn)
}
func Connect(conn net.Conn, addr string) (net.Conn, error) {
return DefaultClient.Connect(conn, addr)
}
type Connector interface {
Connect(conn net.Conn, addr string) (net.Conn, error)
}
type Transporter interface {
Network() string
Handshake(conn net.Conn) (net.Conn, error)
}
type tcpTransporter struct {
}
func TCPTransporter() Transporter {
return &tcpTransporter{}
}
func (tr *tcpTransporter) Network() string {
return "tcp"
}
func (tr *tcpTransporter) Handshake(conn net.Conn) (net.Conn, error) {
return conn, nil
}