Bläddra i källkod

Add option to use telegram test dcs

tags/v2.0.0
9seconds 5 år sedan
förälder
incheckning
115510985a

+ 33
- 0
mtglib/internal/telegram/address_pool.go Visa fil

@@ -0,0 +1,33 @@
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 Visa fil

@@ -21,30 +21,63 @@ type tgAddr struct {
21 21
 
22 22
 // https://github.com/telegramdesktop/tdesktop/blob/master/Telegram/SourceFiles/mtproto/mtproto_dc_options.cpp#L30
23 23
 var (
24
-	v4Addresses = [5][]tgAddr{
25
-		{
24
+	productionV4Addresses = [][]tgAddr{
25
+		{ // dc1
26 26
 			{network: "tcp4", address: "149.154.175.50:443"},
27 27
 		},
28
-		{
28
+		{ // dc2
29 29
 			{network: "tcp4", address: "149.154.167.51:443"},
30 30
 			{network: "tcp4", address: "95.161.76.100:443"},
31 31
 		},
32
-		{
32
+		{ // dc3
33 33
 			{network: "tcp4", address: "149.154.175.100:443"},
34 34
 		},
35
-		{
35
+		{ // dc4
36 36
 			{network: "tcp4", address: "149.154.167.91:443"},
37 37
 		},
38
-		{
38
+		{ // dc5
39 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 Visa fil

@@ -3,7 +3,6 @@ package telegram
3 3
 import (
4 4
 	"context"
5 5
 	"fmt"
6
-	"math/rand"
7 6
 	"net"
8 7
 	"strings"
9 8
 )
@@ -11,30 +10,21 @@ import (
11 10
 type Telegram struct {
12 11
 	dialer   Dialer
13 12
 	preferIP preferIP
13
+	pool     addressPool
14 14
 }
15 15
 
16 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 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 19
 	switch t.preferIP {
20
+	case preferIPOnlyIPv4:
21
+		addresses = t.pool.getV4(dc)
22
+	case preferIPOnlyIPv6:
23
+		addresses = t.pool.getV6(dc)
33 24
 	case preferIPPreferIPv4:
34
-		addresses = append(addresses, v6Addresses[dc-1])
25
+		addresses = append(t.pool.getV4(dc), t.pool.getV6(dc)...)
35 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 30
 	var (
@@ -52,7 +42,7 @@ func (t Telegram) Dial(ctx context.Context, dc int) (net.Conn, error) {
52 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 46
 	var pref preferIP
57 47
 
58 48
 	switch strings.ToLower(ipPreference) {
@@ -68,8 +58,18 @@ func New(dialer Dialer, ipPreference string) (*Telegram, error) {
68 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 70
 	return &Telegram{
72 71
 		dialer:   dialer,
73 72
 		preferIP: pref,
73
+		pool:     pool,
74 74
 	}, nil
75 75
 }

+ 12
- 12
mtglib/internal/telegram/telegram_internal_test.go Visa fil

@@ -23,7 +23,7 @@ type TelegramTestSuite struct {
23 23
 
24 24
 func (suite *TelegramTestSuite) SetupTest() {
25 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 29
 func (suite *TelegramTestSuite) TearDownTest() {
@@ -53,8 +53,8 @@ func (suite *TelegramTestSuite) TestDialToCorrectIPs() {
53 53
 
54 54
 	for i := 1; i <= 5; i++ {
55 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 60
 	for i, v := range testData {
@@ -77,10 +77,10 @@ func (suite *TelegramTestSuite) TestDialToCorrectIPs() {
77 77
 
78 78
 func (suite *TelegramTestSuite) TestDialPreferIPRange() {
79 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 86
 	for k, v := range testData {
@@ -95,7 +95,7 @@ func (suite *TelegramTestSuite) TestDialPreferIPRange() {
95 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 99
 			_, err := tg.Dial(context.Background(), 1)
100 100
 
101 101
 			assert.True(t, errors.Is(err, io.EOF))
@@ -105,8 +105,8 @@ func (suite *TelegramTestSuite) TestDialPreferIPRange() {
105 105
 
106 106
 func (suite *TelegramTestSuite) TestDialPreferIPPriority() {
107 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 112
 	for k, v := range testData {
@@ -121,7 +121,7 @@ func (suite *TelegramTestSuite) TestDialPreferIPPriority() {
121 121
 				Once().
122 122
 				Return(conn, nil)
123 123
 
124
-			tg, _ := New(suite.dialerMock, name)
124
+			tg, _ := New(suite.dialerMock, name, false)
125 125
 
126 126
 			res, err := tg.Dial(context.Background(), 1)
127 127
 			assert.NoError(t, err)
@@ -131,7 +131,7 @@ func (suite *TelegramTestSuite) TestDialPreferIPPriority() {
131 131
 }
132 132
 
133 133
 func (suite *TelegramTestSuite) TestUnknownPreferIP() {
134
-	_, err := New(suite.dialerMock, "xxx")
134
+	_, err := New(suite.dialerMock, "xxx", false)
135 135
 	suite.Error(err)
136 136
 }
137 137
 

+ 1
- 1
mtglib/proxy.go Visa fil

@@ -270,7 +270,7 @@ func NewProxy(opts ProxyOpts) (*Proxy, error) {
270 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 274
 	if err != nil {
275 275
 		return nil, fmt.Errorf("cannot build telegram dialer: %w", err)
276 276
 	}

+ 9
- 0
mtglib/proxy_opts.go Visa fil

@@ -89,6 +89,15 @@ type ProxyOpts struct {
89 89
 	//
90 90
 	// This is an optional setting.
91 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 103
 func (p ProxyOpts) valid() error {

Laddar…
Avbryt
Spara