12345678910111213141516171819202122232425262728293031323334353637383940414243 |
- // Package proxy enables SOCKS5 proxy dialling
- 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)
- }
|