Преглед на файлове

Implement IP preferences

tags/v1.0.3^2
9seconds преди 6 години
родител
ревизия
720158f15c
променени са 1 файла, в които са добавени 26 реда и са изтрити 11 реда
  1. 26
    11
      telegram/base.go

+ 26
- 11
telegram/base.go Целия файл

7
 
7
 
8
 	"go.uber.org/zap"
8
 	"go.uber.org/zap"
9
 
9
 
10
+	"github.com/9seconds/mtg/config"
10
 	"github.com/9seconds/mtg/conntypes"
11
 	"github.com/9seconds/mtg/conntypes"
11
 	"github.com/9seconds/mtg/utils"
12
 	"github.com/9seconds/mtg/utils"
12
 	"github.com/9seconds/mtg/wrappers/stream"
13
 	"github.com/9seconds/mtg/wrappers/stream"
29
 
30
 
30
 func (b *baseTelegram) dial(dc conntypes.DC,
31
 func (b *baseTelegram) dial(dc conntypes.DC,
31
 	protocol conntypes.ConnectionProtocol) (conntypes.StreamReadWriteCloser, error) {
32
 	protocol conntypes.ConnectionProtocol) (conntypes.StreamReadWriteCloser, error) {
32
-	addresses := make([]string, 0, 2)
33
-
34
-	if protocol&conntypes.ConnectionProtocolIPv6 != 0 {
35
-		addresses = append(addresses, b.chooseAddress(b.v6Addresses, dc, b.v6DefaultDC))
36
-	}
37
-
38
-	if protocol&conntypes.ConnectionProtocolIPv4 != 0 {
39
-		addresses = append(addresses, b.chooseAddress(b.v4Addresses, dc, b.v4DefaultDC))
40
-	}
41
-
42
-	for _, addr := range addresses {
33
+	for _, addr := range b.getAddresses(dc, protocol) {
43
 		conn, err := b.dialer.Dial("tcp", addr)
34
 		conn, err := b.dialer.Dial("tcp", addr)
44
 		if err != nil {
35
 		if err != nil {
45
 			b.logger.Infow("Cannot dial to Telegram", "address", addr, "error", err)
36
 			b.logger.Infow("Cannot dial to Telegram", "address", addr, "error", err)
57
 	return nil, errors.New("cannot dial to the chosen DC")
48
 	return nil, errors.New("cannot dial to the chosen DC")
58
 }
49
 }
59
 
50
 
51
+func (b *baseTelegram) getAddresses(dc conntypes.DC, protocol conntypes.ConnectionProtocol) []string {
52
+	addresses := make([]string, 0, 2)
53
+	protos := []conntypes.ConnectionProtocol{
54
+		conntypes.ConnectionProtocolIPv6,
55
+		conntypes.ConnectionProtocolIPv4,
56
+	}
57
+
58
+	if config.C.PreferIP == config.PreferIPv4 {
59
+		protos[0], protos[1] = protos[1], protos[0]
60
+	}
61
+
62
+	for _, proto := range protos {
63
+		switch {
64
+		case proto&protocol == 0:
65
+		case proto&conntypes.ConnectionProtocolIPv6 != 0:
66
+			addresses = append(addresses, b.chooseAddress(b.v6Addresses, dc, b.v6DefaultDC))
67
+		case proto&conntypes.ConnectionProtocolIPv4 != 0:
68
+			addresses = append(addresses, b.chooseAddress(b.v4Addresses, dc, b.v4DefaultDC))
69
+		}
70
+	}
71
+
72
+	return addresses
73
+}
74
+
60
 func (b *baseTelegram) chooseAddress(addresses map[conntypes.DC][]string,
75
 func (b *baseTelegram) chooseAddress(addresses map[conntypes.DC][]string,
61
 	dc, defaultDC conntypes.DC) string {
76
 	dc, defaultDC conntypes.DC) string {
62
 	addrs, ok := addresses[dc]
77
 	addrs, ok := addresses[dc]

Loading…
Отказ
Запис