mirror of
https://github.com/yggdrasil-network/yggdrasil-go.git
synced 2025-04-29 06:35:07 +03:00
Reusable peer lookup/dial logic
This commit is contained in:
parent
75d2080e53
commit
42873be09b
12 changed files with 193 additions and 124 deletions
|
@ -23,9 +23,6 @@ func (l *links) newLinkSOCKS() *linkSOCKS {
|
|||
}
|
||||
|
||||
func (l *linkSOCKS) dial(_ context.Context, url *url.URL, info linkInfo, options linkOptions) (net.Conn, error) {
|
||||
if url.Scheme != "sockstls" && options.tlsSNI != "" {
|
||||
return nil, ErrLinkSNINotSupported
|
||||
}
|
||||
var proxyAuth *proxy.Auth
|
||||
if url.User != nil && url.User.Username() != "" {
|
||||
proxyAuth = &proxy.Auth{
|
||||
|
@ -33,21 +30,34 @@ func (l *linkSOCKS) dial(_ context.Context, url *url.URL, info linkInfo, options
|
|||
}
|
||||
proxyAuth.Password, _ = url.User.Password()
|
||||
}
|
||||
dialer, err := proxy.SOCKS5("tcp", url.Host, proxyAuth, proxy.Direct)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to configure proxy")
|
||||
}
|
||||
pathtokens := strings.Split(strings.Trim(url.Path, "/"), "/")
|
||||
conn, err := dialer.Dial("tcp", pathtokens[0])
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to dial: %w", err)
|
||||
}
|
||||
if url.Scheme == "sockstls" {
|
||||
tlsconfig := l.tls.config.Clone()
|
||||
tlsconfig.ServerName = options.tlsSNI
|
||||
conn = tls.Client(conn, tlsconfig)
|
||||
}
|
||||
return conn, nil
|
||||
tlsconfig := l.tls.config.Clone()
|
||||
return l.links.findSuitableIP(url, func(hostname string, ip net.IP, port int) (net.Conn, error) {
|
||||
hostport := net.JoinHostPort(ip.String(), fmt.Sprintf("%d", port))
|
||||
dialer, err := l.tcp.dialerFor(&net.TCPAddr{
|
||||
IP: ip,
|
||||
Port: port,
|
||||
}, info.sintf)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
proxy, err := proxy.SOCKS5("tcp", hostport, proxyAuth, dialer)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
pathtokens := strings.Split(strings.Trim(url.Path, "/"), "/")
|
||||
conn, err := proxy.Dial("tcp", pathtokens[0])
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if url.Scheme == "sockstls" {
|
||||
tlsconfig.ServerName = hostname
|
||||
if sni := options.tlsSNI; sni != "" {
|
||||
tlsconfig.ServerName = sni
|
||||
}
|
||||
conn = tls.Client(conn, tlsconfig)
|
||||
}
|
||||
return conn, nil
|
||||
})
|
||||
}
|
||||
|
||||
func (l *linkSOCKS) listen(ctx context.Context, url *url.URL, _ string) (net.Listener, error) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue