Quellcode durchsuchen

Add option to use telegram test dcs

tags/v2.0.0
9seconds vor 5 Jahren
Ursprung
Commit
115510985a

+ 33
- 0
mtglib/internal/telegram/address_pool.go Datei anzeigen

1
+package telegram
2
+
3
+import "math/rand"
4
+
5
+type addressPool struct {
6
+	v4 [][]tgAddr
7
+	v6 [][]tgAddr
8
+}
9
+
10
+func (a addressPool) getV4(dc int) []tgAddr {
11
+	return a.get(a.v4, dc-1)
12
+}
13
+
14
+func (a addressPool) getV6(dc int) []tgAddr {
15
+	return a.get(a.v6, dc-1)
16
+}
17
+
18
+func (a addressPool) get(addresses [][]tgAddr, dc int) []tgAddr {
19
+	if dc < 0 || dc >= len(addresses) {
20
+		return nil
21
+	}
22
+
23
+	rv := make([]tgAddr, len(addresses[dc]))
24
+	copy(rv, addresses[dc])
25
+
26
+	if len(rv) > 1 {
27
+		rand.Shuffle(len(rv), func(i, j int) {
28
+			rv[i], rv[j] = rv[j], rv[i]
29
+		})
30
+	}
31
+
32
+	return rv
33
+}

+ 45
- 12
mtglib/internal/telegram/init.go Datei anzeigen

21
 
21
 
22
 // https://github.com/telegramdesktop/tdesktop/blob/master/Telegram/SourceFiles/mtproto/mtproto_dc_options.cpp#L30
22
 // https://github.com/telegramdesktop/tdesktop/blob/master/Telegram/SourceFiles/mtproto/mtproto_dc_options.cpp#L30
23
 var (
23
 var (
24
-	v4Addresses = [5][]tgAddr{
25
-		{
24
+	productionV4Addresses = [][]tgAddr{
25
+		{ // dc1
26
 			{network: "tcp4", address: "149.154.175.50:443"},
26
 			{network: "tcp4", address: "149.154.175.50:443"},
27
 		},
27
 		},
28
-		{
28
+		{ // dc2
29
 			{network: "tcp4", address: "149.154.167.51:443"},
29
 			{network: "tcp4", address: "149.154.167.51:443"},
30
 			{network: "tcp4", address: "95.161.76.100:443"},
30
 			{network: "tcp4", address: "95.161.76.100:443"},
31
 		},
31
 		},
32
-		{
32
+		{ // dc3
33
 			{network: "tcp4", address: "149.154.175.100:443"},
33
 			{network: "tcp4", address: "149.154.175.100:443"},
34
 		},
34
 		},
35
-		{
35
+		{ // dc4
36
 			{network: "tcp4", address: "149.154.167.91:443"},
36
 			{network: "tcp4", address: "149.154.167.91:443"},
37
 		},
37
 		},
38
-		{
38
+		{ // dc5
39
 			{network: "tcp4", address: "149.154.171.5:443"},
39
 			{network: "tcp4", address: "149.154.171.5:443"},
40
 		},
40
 		},
41
 	}
41
 	}
42
-	v6Addresses = [5]tgAddr{
43
-		{network: "tcp6", address: "[2001:b28:f23d:f001::a]:443"},
44
-		{network: "tcp6", address: "[2001:67c:04e8:f002::a]:443"},
45
-		{network: "tcp6", address: "[2001:b28:f23d:f003::a]:443"},
46
-		{network: "tcp6", address: "[2001:67c:04e8:f004::a]:443"},
47
-		{network: "tcp6", address: "[2001:b28:f23f:f005::a]:443"},
42
+	productionV6Addresses = [][]tgAddr{
43
+		{ // dc1
44
+			{network: "tcp6", address: "[2001:b28:f23d:f001::a]:443"},
45
+		},
46
+		{ // dc2
47
+			{network: "tcp6", address: "[2001:67c:04e8:f002::a]:443"},
48
+		},
49
+		{ // dc3
50
+			{network: "tcp6", address: "[2001:b28:f23d:f003::a]:443"},
51
+		},
52
+		{ // dc4
53
+			{network: "tcp6", address: "[2001:67c:04e8:f004::a]:443"},
54
+		},
55
+		{ // dc5
56
+			{network: "tcp6", address: "[2001:b28:f23f:f005::a]:443"},
57
+		},
58
+	}
59
+
60
+	testV4Addresses = [][]tgAddr{
61
+		{ // dc1
62
+			{network: "tcp4", address: "149.154.175.10:443"},
63
+		},
64
+		{ // dc2
65
+			{network: "tcp4", address: "149.154.167.40:443"},
66
+		},
67
+		{ // dc3
68
+			{network: "tcp4", address: "149.154.175.117:443"},
69
+		},
70
+	}
71
+	testV6Addresses = [][]tgAddr{
72
+		{ // dc1
73
+			{network: "tcp6", address: "[2001:b28:f23d:f001::e]:443"},
74
+		},
75
+		{ // dc2
76
+			{network: "tcp6", address: "[2001:67c:04e8:f002::e]:443"},
77
+		},
78
+		{ // dc3
79
+			{network: "tcp6", address: "[2001:b28:f23d:f003::e]:443"},
80
+		},
48
 	}
81
 	}
49
 )
82
 )
50
 
83
 

+ 18
- 18
mtglib/internal/telegram/telegram.go Datei anzeigen

3
 import (
3
 import (
4
 	"context"
4
 	"context"
5
 	"fmt"
5
 	"fmt"
6
-	"math/rand"
7
 	"net"
6
 	"net"
8
 	"strings"
7
 	"strings"
9
 )
8
 )
11
 type Telegram struct {
10
 type Telegram struct {
12
 	dialer   Dialer
11
 	dialer   Dialer
13
 	preferIP preferIP
12
 	preferIP preferIP
13
+	pool     addressPool
14
 }
14
 }
15
 
15
 
16
 func (t Telegram) Dial(ctx context.Context, dc int) (net.Conn, error) {
16
 func (t Telegram) Dial(ctx context.Context, dc int) (net.Conn, error) {
17
-	if dc <= 0 || dc > 5 {
18
-		return nil, fmt.Errorf("do not know how to dial to %d", dc)
19
-	}
20
-
21
 	var addresses []tgAddr
17
 	var addresses []tgAddr
22
 
18
 
23
-	if t.preferIP == preferIPOnlyIPv6 {
24
-		addresses = []tgAddr{v6Addresses[dc-1]}
25
-	} else {
26
-		addresses = append(addresses, v4Addresses[dc-1]...)
27
-		rand.Shuffle(len(addresses), func(i, j int) {
28
-			addresses[i], addresses[j] = addresses[j], addresses[i]
29
-		})
30
-	}
31
-
32
 	switch t.preferIP {
19
 	switch t.preferIP {
20
+	case preferIPOnlyIPv4:
21
+		addresses = t.pool.getV4(dc)
22
+	case preferIPOnlyIPv6:
23
+		addresses = t.pool.getV6(dc)
33
 	case preferIPPreferIPv4:
24
 	case preferIPPreferIPv4:
34
-		addresses = append(addresses, v6Addresses[dc-1])
25
+		addresses = append(t.pool.getV4(dc), t.pool.getV6(dc)...)
35
 	case preferIPPreferIPv6:
26
 	case preferIPPreferIPv6:
36
-		addresses = append([]tgAddr{v6Addresses[dc-1]}, addresses...)
37
-	case preferIPOnlyIPv4, preferIPOnlyIPv6:
27
+		addresses = append(t.pool.getV6(dc), t.pool.getV4(dc)...)
38
 	}
28
 	}
39
 
29
 
40
 	var (
30
 	var (
52
 	return nil, fmt.Errorf("cannot dial to %d dc: %w", dc, err)
42
 	return nil, fmt.Errorf("cannot dial to %d dc: %w", dc, err)
53
 }
43
 }
54
 
44
 
55
-func New(dialer Dialer, ipPreference string) (*Telegram, error) {
45
+func New(dialer Dialer, ipPreference string, useTestDCs bool) (*Telegram, error) {
56
 	var pref preferIP
46
 	var pref preferIP
57
 
47
 
58
 	switch strings.ToLower(ipPreference) {
48
 	switch strings.ToLower(ipPreference) {
68
 		return nil, fmt.Errorf("unknown ip preference %s", ipPreference)
58
 		return nil, fmt.Errorf("unknown ip preference %s", ipPreference)
69
 	}
59
 	}
70
 
60
 
61
+	pool := addressPool{
62
+		v4: productionV4Addresses,
63
+		v6: productionV6Addresses,
64
+	}
65
+	if useTestDCs {
66
+		pool.v4 = testV4Addresses
67
+		pool.v6 = testV6Addresses
68
+	}
69
+
71
 	return &Telegram{
70
 	return &Telegram{
72
 		dialer:   dialer,
71
 		dialer:   dialer,
73
 		preferIP: pref,
72
 		preferIP: pref,
73
+		pool:     pool,
74
 	}, nil
74
 	}, nil
75
 }
75
 }

+ 12
- 12
mtglib/internal/telegram/telegram_internal_test.go Datei anzeigen

23
 
23
 
24
 func (suite *TelegramTestSuite) SetupTest() {
24
 func (suite *TelegramTestSuite) SetupTest() {
25
 	suite.dialerMock = &testlib.MtglibNetworkMock{}
25
 	suite.dialerMock = &testlib.MtglibNetworkMock{}
26
-	suite.t, _ = New(suite.dialerMock, "prefer-ipv4")
26
+	suite.t, _ = New(suite.dialerMock, "prefer-ipv4", false)
27
 }
27
 }
28
 
28
 
29
 func (suite *TelegramTestSuite) TearDownTest() {
29
 func (suite *TelegramTestSuite) TearDownTest() {
53
 
53
 
54
 	for i := 1; i <= 5; i++ {
54
 	for i := 1; i <= 5; i++ {
55
 		testData[i] = []tgAddr{}
55
 		testData[i] = []tgAddr{}
56
-		testData[i] = append(testData[i], v4Addresses[i-1]...)
57
-		testData[i] = append(testData[i], v6Addresses[i-1])
56
+		testData[i] = append(testData[i], productionV4Addresses[i-1]...)
57
+		testData[i] = append(testData[i], productionV6Addresses[i-1]...)
58
 	}
58
 	}
59
 
59
 
60
 	for i, v := range testData {
60
 	for i, v := range testData {
77
 
77
 
78
 func (suite *TelegramTestSuite) TestDialPreferIPRange() {
78
 func (suite *TelegramTestSuite) TestDialPreferIPRange() {
79
 	testData := map[string][]tgAddr{
79
 	testData := map[string][]tgAddr{
80
-		"prefer-ipv4": {v4Addresses[0][0], v6Addresses[0]},
81
-		"prefer-ipv6": {v6Addresses[0], v4Addresses[0][0]},
82
-		"only-ipv4":   {v4Addresses[0][0]},
83
-		"only-ipv6":   {v6Addresses[0]},
80
+		"prefer-ipv4": {testV4Addresses[0][0], testV6Addresses[0][0]},
81
+		"prefer-ipv6": {testV6Addresses[0][0], testV4Addresses[0][0]},
82
+		"only-ipv4":   {testV4Addresses[0][0]},
83
+		"only-ipv6":   {testV6Addresses[0][0]},
84
 	}
84
 	}
85
 
85
 
86
 	for k, v := range testData {
86
 	for k, v := range testData {
95
 					Return((*net.TCPConn)(nil), io.EOF)
95
 					Return((*net.TCPConn)(nil), io.EOF)
96
 			}
96
 			}
97
 
97
 
98
-			tg, _ := New(suite.dialerMock, name)
98
+			tg, _ := New(suite.dialerMock, name, true)
99
 			_, err := tg.Dial(context.Background(), 1)
99
 			_, err := tg.Dial(context.Background(), 1)
100
 
100
 
101
 			assert.True(t, errors.Is(err, io.EOF))
101
 			assert.True(t, errors.Is(err, io.EOF))
105
 
105
 
106
 func (suite *TelegramTestSuite) TestDialPreferIPPriority() {
106
 func (suite *TelegramTestSuite) TestDialPreferIPPriority() {
107
 	testData := map[string]tgAddr{
107
 	testData := map[string]tgAddr{
108
-		"prefer-ipv4": v4Addresses[0][0],
109
-		"prefer-ipv6": v6Addresses[0],
108
+		"prefer-ipv4": productionV4Addresses[0][0],
109
+		"prefer-ipv6": productionV6Addresses[0][0],
110
 	}
110
 	}
111
 
111
 
112
 	for k, v := range testData {
112
 	for k, v := range testData {
121
 				Once().
121
 				Once().
122
 				Return(conn, nil)
122
 				Return(conn, nil)
123
 
123
 
124
-			tg, _ := New(suite.dialerMock, name)
124
+			tg, _ := New(suite.dialerMock, name, false)
125
 
125
 
126
 			res, err := tg.Dial(context.Background(), 1)
126
 			res, err := tg.Dial(context.Background(), 1)
127
 			assert.NoError(t, err)
127
 			assert.NoError(t, err)
131
 }
131
 }
132
 
132
 
133
 func (suite *TelegramTestSuite) TestUnknownPreferIP() {
133
 func (suite *TelegramTestSuite) TestUnknownPreferIP() {
134
-	_, err := New(suite.dialerMock, "xxx")
134
+	_, err := New(suite.dialerMock, "xxx", false)
135
 	suite.Error(err)
135
 	suite.Error(err)
136
 }
136
 }
137
 
137
 

+ 1
- 1
mtglib/proxy.go Datei anzeigen

270
 		return nil, fmt.Errorf("invalid settings: %w", err)
270
 		return nil, fmt.Errorf("invalid settings: %w", err)
271
 	}
271
 	}
272
 
272
 
273
-	tg, err := telegram.New(opts.Network, opts.getPreferIP())
273
+	tg, err := telegram.New(opts.Network, opts.getPreferIP(), opts.UseTestDCs)
274
 	if err != nil {
274
 	if err != nil {
275
 		return nil, fmt.Errorf("cannot build telegram dialer: %w", err)
275
 		return nil, fmt.Errorf("cannot build telegram dialer: %w", err)
276
 	}
276
 	}

+ 9
- 0
mtglib/proxy_opts.go Datei anzeigen

89
 	//
89
 	//
90
 	// This is an optional setting.
90
 	// This is an optional setting.
91
 	PreferIP string
91
 	PreferIP string
92
+
93
+	// UseTestDCs defines if we have to connect to production or to staging
94
+	// DCs of Telegram.
95
+	//
96
+	// This is required if you use mtglib as an integration library for
97
+	// your Telegram-related projects.
98
+	//
99
+	// This is an optional setting.
100
+	UseTestDCs bool
92
 }
101
 }
93
 
102
 
94
 func (p ProxyOpts) valid() error {
103
 func (p ProxyOpts) valid() error {

Laden…
Abbrechen
Speichern