Просмотр исходного кода

Merge pull request #126 from 9seconds/ipv4

Prefer ipv6 protocol on direct connections
tags/v1.0.2^2
Sergey Arkhipov 6 лет назад
Родитель
Сommit
ba2143a6ae
Аккаунт пользователя с таким Email не найден
4 измененных файлов: 33 добавлений и 17 удалений
  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 Просмотреть файл

1
 package telegram
1
 package telegram
2
 
2
 
3
 import (
3
 import (
4
-	"fmt"
4
+	"errors"
5
 	"math/rand"
5
 	"math/rand"
6
 	"net"
6
 	"net"
7
 
7
 
8
+	"go.uber.org/zap"
9
+
8
 	"github.com/9seconds/mtg/conntypes"
10
 	"github.com/9seconds/mtg/conntypes"
9
 	"github.com/9seconds/mtg/utils"
11
 	"github.com/9seconds/mtg/utils"
10
 	"github.com/9seconds/mtg/wrappers/stream"
12
 	"github.com/9seconds/mtg/wrappers/stream"
12
 
14
 
13
 type baseTelegram struct {
15
 type baseTelegram struct {
14
 	dialer net.Dialer
16
 	dialer net.Dialer
17
+	logger *zap.SugaredLogger
15
 
18
 
16
 	secret      []byte
19
 	secret      []byte
17
 	v4DefaultDC conntypes.DC
20
 	v4DefaultDC conntypes.DC
18
-	V6DefaultDC conntypes.DC
21
+	v6DefaultDC conntypes.DC
19
 	v4Addresses map[conntypes.DC][]string
22
 	v4Addresses map[conntypes.DC][]string
20
 	v6Addresses map[conntypes.DC][]string
23
 	v6Addresses map[conntypes.DC][]string
21
 }
24
 }
26
 
29
 
27
 func (b *baseTelegram) dial(dc conntypes.DC,
30
 func (b *baseTelegram) dial(dc conntypes.DC,
28
 	protocol conntypes.ConnectionProtocol) (conntypes.StreamReadWriteCloser, error) {
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
 func (b *baseTelegram) chooseAddress(addresses map[conntypes.DC][]string,
60
 func (b *baseTelegram) chooseAddress(addresses map[conntypes.DC][]string,

+ 1
- 1
telegram/direct.go Просмотреть файл

37
 		dc = conntypes.DCDefaultIdx
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 Просмотреть файл

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

+ 1
- 1
telegram/middle.go Просмотреть файл

45
 	m.mutex.Lock()
45
 	m.mutex.Lock()
46
 	m.secret = secret
46
 	m.secret = secret
47
 	m.v4DefaultDC = v4DefaultDC
47
 	m.v4DefaultDC = v4DefaultDC
48
-	m.V6DefaultDC = v6DefaultDC
48
+	m.v6DefaultDC = v6DefaultDC
49
 	m.v4Addresses = v4Addresses
49
 	m.v4Addresses = v4Addresses
50
 	m.v6Addresses = v6Addresses
50
 	m.v6Addresses = v6Addresses
51
 	m.mutex.Unlock()
51
 	m.mutex.Unlock()

Загрузка…
Отмена
Сохранить