gost_software/gost/client.go
2017-07-21 18:14:31 +08:00

59 lines
1.2 KiB
Go

package gost
import (
"context"
"net"
)
type Client struct {
Connector Connector
Transporter Transporter
}
// DefaultClient is a standard HTTP proxy
var DefaultClient = NewClient(HTTPConnector(nil), TCPTransporter())
func NewClient(c Connector, tr Transporter) *Client {
return &Client{
Connector: c,
Transporter: tr,
}
}
// Dial connects to the target address
func (c *Client) Dial(ctx context.Context, addr string) (net.Conn, error) {
return net.Dial(c.Transporter.Network(), addr)
}
func (c *Client) Handshake(ctx context.Context, conn net.Conn) (net.Conn, error) {
return c.Transporter.Handshake(ctx, conn)
}
func (c *Client) Connect(ctx context.Context, conn net.Conn, addr string) (net.Conn, error) {
return c.Connector.Connect(ctx, conn, addr)
}
type Connector interface {
Connect(ctx context.Context, conn net.Conn, addr string) (net.Conn, error)
}
type Transporter interface {
Network() string
Handshake(ctx context.Context, 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(ctx context.Context, conn net.Conn) (net.Conn, error) {
return conn, nil
}