sing-box/common/dialer/override.go

70 lines
1.6 KiB
Go
Raw Normal View History

package dialer
import (
"context"
"crypto/tls"
"net"
2022-07-08 23:03:57 +08:00
C "github.com/sagernet/sing-box/constant"
"github.com/sagernet/sing-box/option"
M "github.com/sagernet/sing/common/metadata"
N "github.com/sagernet/sing/common/network"
"github.com/sagernet/sing/common/uot"
)
2022-07-07 21:47:21 +08:00
var _ N.Dialer = (*OverrideDialer)(nil)
2022-07-07 21:47:21 +08:00
type OverrideDialer struct {
upstream N.Dialer
tlsEnabled bool
tlsConfig tls.Config
uotEnabled bool
}
2022-07-06 23:11:48 +08:00
func NewOverride(upstream N.Dialer, options option.OverrideStreamOptions) N.Dialer {
2022-07-07 21:47:21 +08:00
return &OverrideDialer{
upstream,
options.TLS,
tls.Config{
ServerName: options.TLSServerName,
InsecureSkipVerify: options.TLSInsecure,
},
options.UDPOverTCP,
}
}
2022-07-07 21:47:21 +08:00
func (d *OverrideDialer) DialContext(ctx context.Context, network string, destination M.Socksaddr) (net.Conn, error) {
switch network {
case C.NetworkTCP:
conn, err := d.upstream.DialContext(ctx, C.NetworkTCP, destination)
if err != nil {
return nil, err
}
return tls.Client(conn, &d.tlsConfig), nil
case C.NetworkUDP:
if d.uotEnabled {
tcpConn, err := d.upstream.DialContext(ctx, C.NetworkTCP, destination)
if err != nil {
return nil, err
}
return uot.NewClientConn(tcpConn), nil
}
}
return d.upstream.DialContext(ctx, network, destination)
}
2022-07-07 21:47:21 +08:00
func (d *OverrideDialer) ListenPacket(ctx context.Context, destination M.Socksaddr) (net.PacketConn, error) {
if d.uotEnabled {
tcpConn, err := d.upstream.DialContext(ctx, C.NetworkTCP, destination)
if err != nil {
return nil, err
}
return uot.NewClientConn(tcpConn), nil
}
return d.upstream.ListenPacket(ctx, destination)
}
2022-07-07 21:47:21 +08:00
func (d *OverrideDialer) Upstream() any {
return d.upstream
}