Selaa lähdekoodia

Prefer ipv6 protocol on direct connections

tags/v1.0.2^2
9seconds 6 vuotta sitten
vanhempi
commit
422ed5b071
4 muutettua tiedostoa jossa 33 lisäystä ja 17 poistoa
  1. 24
    14
      telegram/base.go
  2. 1
    1
      telegram/direct.go
  3. 7
    1
      telegram/init.go
  4. 1
    1
      telegram/middle.go

+ 24
- 14
telegram/base.go Näytä tiedosto

@@ -1,10 +1,12 @@
1 1
 package telegram
2 2
 
3 3
 import (
4
-	"fmt"
4
+	"errors"
5 5
 	"math/rand"
6 6
 	"net"
7 7
 
8
+	"go.uber.org/zap"
9
+
8 10
 	"github.com/9seconds/mtg/conntypes"
9 11
 	"github.com/9seconds/mtg/utils"
10 12
 	"github.com/9seconds/mtg/wrappers/stream"
@@ -12,10 +14,11 @@ import (
12 14
 
13 15
 type baseTelegram struct {
14 16
 	dialer net.Dialer
17
+	logger *zap.SugaredLogger
15 18
 
16 19
 	secret      []byte
17 20
 	v4DefaultDC conntypes.DC
18
-	V6DefaultDC conntypes.DC
21
+	v6DefaultDC conntypes.DC
19 22
 	v4Addresses map[conntypes.DC][]string
20 23
 	v6Addresses map[conntypes.DC][]string
21 24
 }
@@ -26,25 +29,32 @@ func (b *baseTelegram) Secret() []byte {
26 29
 
27 30
 func (b *baseTelegram) dial(dc conntypes.DC,
28 31
 	protocol conntypes.ConnectionProtocol) (conntypes.StreamReadWriteCloser, error) {
29
-	addr := ""
32
+	addresses := make([]string, 0, 2)
30 33
 
31
-	switch protocol {
32
-	case conntypes.ConnectionProtocolIPv4:
33
-		addr = b.chooseAddress(b.v4Addresses, dc, b.v4DefaultDC)
34
-	default:
35
-		addr = b.chooseAddress(b.v6Addresses, dc, b.V6DefaultDC)
34
+	if protocol&conntypes.ConnectionProtocolIPv6 != 0 {
35
+		addresses = append(addresses, b.chooseAddress(b.v6Addresses, dc, b.v6DefaultDC))
36 36
 	}
37 37
 
38
-	conn, err := b.dialer.Dial("tcp", addr)
39
-	if err != nil {
40
-		return nil, fmt.Errorf("dial has failed: %w", err)
38
+	if protocol&conntypes.ConnectionProtocolIPv4 != 0 {
39
+		addresses = append(addresses, b.chooseAddress(b.v4Addresses, dc, b.v4DefaultDC))
41 40
 	}
42 41
 
43
-	if err := utils.InitTCP(conn); err != nil {
44
-		return nil, fmt.Errorf("cannot initialize tcp socket: %w", err)
42
+	for _, addr := range addresses {
43
+		conn, err := b.dialer.Dial("tcp", addr)
44
+		if err != nil {
45
+			b.logger.Infow("Cannot dial to Telegram", "address", addr, "error", err)
46
+			continue
47
+		}
48
+
49
+		if err := utils.InitTCP(conn); err != nil {
50
+			b.logger.Infow("Cannot initialize TCP socket", "address", addr, "error", err)
51
+			continue
52
+		}
53
+
54
+		return stream.NewTelegramConn(dc, conn), nil
45 55
 	}
46 56
 
47
-	return stream.NewTelegramConn(dc, conn), nil
57
+	return nil, errors.New("cannot dial to the chosen DC")
48 58
 }
49 59
 
50 60
 func (b *baseTelegram) chooseAddress(addresses map[conntypes.DC][]string,

+ 1
- 1
telegram/direct.go Näytä tiedosto

@@ -37,5 +37,5 @@ func (d *directTelegram) Dial(dc conntypes.DC,
37 37
 		dc = conntypes.DCDefaultIdx
38 38
 	}
39 39
 
40
-	return d.baseTelegram.dial(dc-1, protocol)
40
+	return d.baseTelegram.dial(dc-1, conntypes.ConnectionProtocolAny)
41 41
 }

+ 7
- 1
telegram/init.go Näytä tiedosto

@@ -4,6 +4,8 @@ import (
4 4
 	"net"
5 5
 	"sync"
6 6
 	"time"
7
+
8
+	"go.uber.org/zap"
7 9
 )
8 10
 
9 11
 const telegramDialTimeout = 10 * time.Second
@@ -17,11 +19,14 @@ var (
17 19
 
18 20
 func Init() {
19 21
 	initOnce.Do(func() {
22
+		logger := zap.S().Named("telegram")
23
+
20 24
 		Direct = &directTelegram{
21 25
 			baseTelegram: baseTelegram{
22 26
 				dialer:      net.Dialer{Timeout: telegramDialTimeout},
27
+				logger:      logger.Named("direct"),
23 28
 				v4DefaultDC: directV4DefaultIdx,
24
-				V6DefaultDC: directV6DefaultIdx,
29
+				v6DefaultDC: directV6DefaultIdx,
25 30
 				v4Addresses: directV4Addresses,
26 31
 				v6Addresses: directV6Addresses,
27 32
 			},
@@ -30,6 +35,7 @@ func Init() {
30 35
 		tg := &middleTelegram{
31 36
 			baseTelegram: baseTelegram{
32 37
 				dialer: net.Dialer{Timeout: telegramDialTimeout},
38
+				logger: logger.Named("middle"),
33 39
 			},
34 40
 		}
35 41
 		if err := tg.update(); err != nil {

+ 1
- 1
telegram/middle.go Näytä tiedosto

@@ -45,7 +45,7 @@ func (m *middleTelegram) update() error {
45 45
 	m.mutex.Lock()
46 46
 	m.secret = secret
47 47
 	m.v4DefaultDC = v4DefaultDC
48
-	m.V6DefaultDC = v6DefaultDC
48
+	m.v6DefaultDC = v6DefaultDC
49 49
 	m.v4Addresses = v4Addresses
50 50
 	m.v6Addresses = v6Addresses
51 51
 	m.mutex.Unlock()

Loading…
Peruuta
Tallenna