@@ -23,31 +23,41 @@ func (l *links) newLinkSOCKS() *linkSOCKS {
2323}
2424
2525func (l * linkSOCKS ) dial (_ context.Context , url * url.URL , info linkInfo , options linkOptions ) (net.Conn , error ) {
26- if url .Scheme != "sockstls" && options .tlsSNI != "" {
27- return nil , ErrLinkSNINotSupported
28- }
2926 var proxyAuth * proxy.Auth
3027 if url .User != nil && url .User .Username () != "" {
3128 proxyAuth = & proxy.Auth {
3229 User : url .User .Username (),
3330 }
3431 proxyAuth .Password , _ = url .User .Password ()
3532 }
36- dialer , err := proxy .SOCKS5 ("tcp" , url .Host , proxyAuth , proxy .Direct )
37- if err != nil {
38- return nil , fmt .Errorf ("failed to configure proxy" )
39- }
40- pathtokens := strings .Split (strings .Trim (url .Path , "/" ), "/" )
41- conn , err := dialer .Dial ("tcp" , pathtokens [0 ])
42- if err != nil {
43- return nil , fmt .Errorf ("failed to dial: %w" , err )
44- }
45- if url .Scheme == "sockstls" {
46- tlsconfig := l .tls .config .Clone ()
47- tlsconfig .ServerName = options .tlsSNI
48- conn = tls .Client (conn , tlsconfig )
49- }
50- return conn , nil
33+ tlsconfig := l .tls .config .Clone ()
34+ return l .links .findSuitableIP (url , func (hostname string , ip net.IP , port int ) (net.Conn , error ) {
35+ hostport := net .JoinHostPort (ip .String (), fmt .Sprintf ("%d" , port ))
36+ dialer , err := l .tcp .dialerFor (& net.TCPAddr {
37+ IP : ip ,
38+ Port : port ,
39+ }, info .sintf )
40+ if err != nil {
41+ return nil , err
42+ }
43+ proxy , err := proxy .SOCKS5 ("tcp" , hostport , proxyAuth , dialer )
44+ if err != nil {
45+ return nil , err
46+ }
47+ pathtokens := strings .Split (strings .Trim (url .Path , "/" ), "/" )
48+ conn , err := proxy .Dial ("tcp" , pathtokens [0 ])
49+ if err != nil {
50+ return nil , err
51+ }
52+ if url .Scheme == "sockstls" {
53+ tlsconfig .ServerName = hostname
54+ if sni := options .tlsSNI ; sni != "" {
55+ tlsconfig .ServerName = sni
56+ }
57+ conn = tls .Client (conn , tlsconfig )
58+ }
59+ return conn , nil
60+ })
5161}
5262
5363func (l * linkSOCKS ) listen (ctx context.Context , url * url.URL , _ string ) (net.Listener , error ) {
0 commit comments