File: socks.go

package info (click to toggle)
rclone 1.69.3%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 45,712 kB
  • sloc: sh: 1,115; xml: 857; python: 754; javascript: 612; makefile: 299; ansic: 101; php: 74
file content (42 lines) | stat: -rw-r--r-- 1,215 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// 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)

}