59 lines
1.2 KiB
Go
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
|
|
}
|