Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ulixee
GitHub Repository: ulixee/secret-agent
Path: blob/main/mitm-socket/go/dialer_proxy_socks5.go
1029 views
1
package main
2
3
import (
4
"errors"
5
"fmt"
6
"net"
7
"net/url"
8
"strings"
9
10
"golang.org/x/net/proxy"
11
)
12
13
func DialAddrViaSock5Proxy(dialer net.Dialer, addr string, proxyUrl *url.URL) (net.Conn, error) {
14
var socksAuth *proxy.Auth = nil
15
16
proxyHost := proxyUrl.Host
17
18
if strings.IndexRune(proxyHost, ':') == -1 {
19
proxyHost += ":1080"
20
}
21
22
if proxyUrl.User != nil {
23
password, _ := proxyUrl.User.Password()
24
socksAuth = &proxy.Auth{
25
User: proxyUrl.User.Username(),
26
Password: password,
27
}
28
}
29
30
fmt.Printf("Connecting via socks5 proxy %s to %s\n", proxyHost, addr)
31
32
socksDialer, err := proxy.SOCKS5("tcp", proxyHost, socksAuth, proxy.Direct)
33
if err != nil {
34
responseMessage := fmt.Sprintf("SOCKS5_PROXY_ERR connection failed (%s)", err)
35
return nil, errors.New(responseMessage)
36
}
37
fmt.Printf("Got socks5 dialer %s to %s\n", proxyHost, addr)
38
39
conn, err := socksDialer.Dial("tcp", addr)
40
if err != nil {
41
responseMessage := fmt.Sprintf("SOCKS5_PROXY_ERR dial failed (%s)", err)
42
return nil, errors.New(responseMessage)
43
}
44
45
return conn, nil
46
}
47
48