/
client.go
61 lines (53 loc) · 1.39 KB
/
client.go
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package shadowsocksr
import (
"errors"
"net"
"net/url"
"strconv"
"strings"
"time"
"github.com/sun8911879/shadowsocksR/obfs"
"github.com/sun8911879/shadowsocksR/protocol"
"github.com/sun8911879/shadowsocksR/ssr"
)
func NewSSRClient(u *url.URL) (*SSTCPConn, error) {
query := u.Query()
encryptMethod := query.Get("encrypt-method")
encryptKey := query.Get("encrypt-key")
cipher, err := NewStreamCipher(encryptMethod, encryptKey)
if err != nil {
return nil, err
}
dialer := net.Dialer{
Timeout: time.Millisecond * 500,
DualStack: true,
}
conn, err := dialer.Dial("tcp", u.Host)
if err != nil {
return nil, err
}
ssconn := NewSSTCPConn(conn, cipher)
if ssconn.Conn == nil || ssconn.RemoteAddr() == nil {
return nil, errors.New("nil connection")
}
// should initialize obfs/protocol now
rs := strings.Split(ssconn.RemoteAddr().String(), ":")
port, _ := strconv.Atoi(rs[1])
ssconn.IObfs = obfs.NewObfs(query.Get("obfs"))
obfsServerInfo := &ssr.ServerInfoForObfs{
Host: rs[0],
Port: uint16(port),
TcpMss: 1460,
Param: query.Get("obfs-param"),
}
ssconn.IObfs.SetServerInfo(obfsServerInfo)
ssconn.IProtocol = protocol.NewProtocol(query.Get("protocol"))
protocolServerInfo := &ssr.ServerInfoForObfs{
Host: rs[0],
Port: uint16(port),
TcpMss: 1460,
Param: query.Get("protocol-param"),
}
ssconn.IProtocol.SetServerInfo(protocolServerInfo)
return ssconn, nil
}