70 lines
1.4 KiB
Go
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
|
|
}
|