mirror of
https://github.com/rclone/rclone.git
synced 2024-11-22 15:30:06 +08:00
42 lines
1.1 KiB
Go
42 lines
1.1 KiB
Go
|
package proxy
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"net"
|
||
|
"strings"
|
||
|
|
||
|
"golang.org/x/net/proxy"
|
||
|
)
|
||
|
|
||
|
// SOCKS5Dial dials a net.Conn using a SOCKS5 proxy server.
|
||
|
// The socks5Proxy address can be in the form of [user:password@]host:port, [user@]host:port or just host:port if no auth is required.
|
||
|
// It will optionally take a proxyDialer to dial the SOCKS5 proxy server. If nil is passed, it will use the default net.Dialer.
|
||
|
func SOCKS5Dial(network, addr, socks5Proxy string, proxyDialer proxy.Dialer) (net.Conn, error) {
|
||
|
|
||
|
if proxyDialer == nil {
|
||
|
proxyDialer = &net.Dialer{}
|
||
|
}
|
||
|
var (
|
||
|
proxyAddress string
|
||
|
proxyAuth *proxy.Auth
|
||
|
)
|
||
|
if credsAndHost := strings.SplitN(socks5Proxy, "@", 2); len(credsAndHost) == 2 {
|
||
|
proxyCreds := strings.SplitN(credsAndHost[0], ":", 2)
|
||
|
proxyAuth = &proxy.Auth{
|
||
|
User: proxyCreds[0],
|
||
|
}
|
||
|
if len(proxyCreds) == 2 {
|
||
|
proxyAuth.Password = proxyCreds[1]
|
||
|
}
|
||
|
proxyAddress = credsAndHost[1]
|
||
|
} else {
|
||
|
proxyAddress = credsAndHost[0]
|
||
|
}
|
||
|
proxyDialer, err := proxy.SOCKS5("tcp", proxyAddress, proxyAuth, proxyDialer)
|
||
|
if err != nil {
|
||
|
return nil, fmt.Errorf("failed to create proxy dialer: %w", err)
|
||
|
}
|
||
|
return proxyDialer.Dial(network, addr)
|
||
|
|
||
|
}
|