mirror of
https://github.com/ScuroNeko/mtg.git
synced 2026-09-01 06:34:02 +03:00
Merge pull request #126 from 9seconds/ipv4
Prefer ipv6 protocol on direct connections
This commit is contained in:
+24
-14
@@ -1,10 +1,12 @@
|
|||||||
package telegram
|
package telegram
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"errors"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"net"
|
"net"
|
||||||
|
|
||||||
|
"go.uber.org/zap"
|
||||||
|
|
||||||
"github.com/9seconds/mtg/conntypes"
|
"github.com/9seconds/mtg/conntypes"
|
||||||
"github.com/9seconds/mtg/utils"
|
"github.com/9seconds/mtg/utils"
|
||||||
"github.com/9seconds/mtg/wrappers/stream"
|
"github.com/9seconds/mtg/wrappers/stream"
|
||||||
@@ -12,10 +14,11 @@ import (
|
|||||||
|
|
||||||
type baseTelegram struct {
|
type baseTelegram struct {
|
||||||
dialer net.Dialer
|
dialer net.Dialer
|
||||||
|
logger *zap.SugaredLogger
|
||||||
|
|
||||||
secret []byte
|
secret []byte
|
||||||
v4DefaultDC conntypes.DC
|
v4DefaultDC conntypes.DC
|
||||||
V6DefaultDC conntypes.DC
|
v6DefaultDC conntypes.DC
|
||||||
v4Addresses map[conntypes.DC][]string
|
v4Addresses map[conntypes.DC][]string
|
||||||
v6Addresses map[conntypes.DC][]string
|
v6Addresses map[conntypes.DC][]string
|
||||||
}
|
}
|
||||||
@@ -26,25 +29,32 @@ func (b *baseTelegram) Secret() []byte {
|
|||||||
|
|
||||||
func (b *baseTelegram) dial(dc conntypes.DC,
|
func (b *baseTelegram) dial(dc conntypes.DC,
|
||||||
protocol conntypes.ConnectionProtocol) (conntypes.StreamReadWriteCloser, error) {
|
protocol conntypes.ConnectionProtocol) (conntypes.StreamReadWriteCloser, error) {
|
||||||
addr := ""
|
addresses := make([]string, 0, 2)
|
||||||
|
|
||||||
switch protocol {
|
if protocol&conntypes.ConnectionProtocolIPv6 != 0 {
|
||||||
case conntypes.ConnectionProtocolIPv4:
|
addresses = append(addresses, b.chooseAddress(b.v6Addresses, dc, b.v6DefaultDC))
|
||||||
addr = b.chooseAddress(b.v4Addresses, dc, b.v4DefaultDC)
|
|
||||||
default:
|
|
||||||
addr = b.chooseAddress(b.v6Addresses, dc, b.V6DefaultDC)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
conn, err := b.dialer.Dial("tcp", addr)
|
if protocol&conntypes.ConnectionProtocolIPv4 != 0 {
|
||||||
if err != nil {
|
addresses = append(addresses, b.chooseAddress(b.v4Addresses, dc, b.v4DefaultDC))
|
||||||
return nil, fmt.Errorf("dial has failed: %w", err)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := utils.InitTCP(conn); err != nil {
|
for _, addr := range addresses {
|
||||||
return nil, fmt.Errorf("cannot initialize tcp socket: %w", err)
|
conn, err := b.dialer.Dial("tcp", addr)
|
||||||
|
if err != nil {
|
||||||
|
b.logger.Infow("Cannot dial to Telegram", "address", addr, "error", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := utils.InitTCP(conn); err != nil {
|
||||||
|
b.logger.Infow("Cannot initialize TCP socket", "address", addr, "error", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
return stream.NewTelegramConn(dc, conn), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return stream.NewTelegramConn(dc, conn), nil
|
return nil, errors.New("cannot dial to the chosen DC")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *baseTelegram) chooseAddress(addresses map[conntypes.DC][]string,
|
func (b *baseTelegram) chooseAddress(addresses map[conntypes.DC][]string,
|
||||||
|
|||||||
+1
-1
@@ -37,5 +37,5 @@ func (d *directTelegram) Dial(dc conntypes.DC,
|
|||||||
dc = conntypes.DCDefaultIdx
|
dc = conntypes.DCDefaultIdx
|
||||||
}
|
}
|
||||||
|
|
||||||
return d.baseTelegram.dial(dc-1, protocol)
|
return d.baseTelegram.dial(dc-1, conntypes.ConnectionProtocolAny)
|
||||||
}
|
}
|
||||||
|
|||||||
+7
-1
@@ -4,6 +4,8 @@ import (
|
|||||||
"net"
|
"net"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"go.uber.org/zap"
|
||||||
)
|
)
|
||||||
|
|
||||||
const telegramDialTimeout = 10 * time.Second
|
const telegramDialTimeout = 10 * time.Second
|
||||||
@@ -17,11 +19,14 @@ var (
|
|||||||
|
|
||||||
func Init() {
|
func Init() {
|
||||||
initOnce.Do(func() {
|
initOnce.Do(func() {
|
||||||
|
logger := zap.S().Named("telegram")
|
||||||
|
|
||||||
Direct = &directTelegram{
|
Direct = &directTelegram{
|
||||||
baseTelegram: baseTelegram{
|
baseTelegram: baseTelegram{
|
||||||
dialer: net.Dialer{Timeout: telegramDialTimeout},
|
dialer: net.Dialer{Timeout: telegramDialTimeout},
|
||||||
|
logger: logger.Named("direct"),
|
||||||
v4DefaultDC: directV4DefaultIdx,
|
v4DefaultDC: directV4DefaultIdx,
|
||||||
V6DefaultDC: directV6DefaultIdx,
|
v6DefaultDC: directV6DefaultIdx,
|
||||||
v4Addresses: directV4Addresses,
|
v4Addresses: directV4Addresses,
|
||||||
v6Addresses: directV6Addresses,
|
v6Addresses: directV6Addresses,
|
||||||
},
|
},
|
||||||
@@ -30,6 +35,7 @@ func Init() {
|
|||||||
tg := &middleTelegram{
|
tg := &middleTelegram{
|
||||||
baseTelegram: baseTelegram{
|
baseTelegram: baseTelegram{
|
||||||
dialer: net.Dialer{Timeout: telegramDialTimeout},
|
dialer: net.Dialer{Timeout: telegramDialTimeout},
|
||||||
|
logger: logger.Named("middle"),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
if err := tg.update(); err != nil {
|
if err := tg.update(); err != nil {
|
||||||
|
|||||||
+1
-1
@@ -45,7 +45,7 @@ func (m *middleTelegram) update() error {
|
|||||||
m.mutex.Lock()
|
m.mutex.Lock()
|
||||||
m.secret = secret
|
m.secret = secret
|
||||||
m.v4DefaultDC = v4DefaultDC
|
m.v4DefaultDC = v4DefaultDC
|
||||||
m.V6DefaultDC = v6DefaultDC
|
m.v6DefaultDC = v6DefaultDC
|
||||||
m.v4Addresses = v4Addresses
|
m.v4Addresses = v4Addresses
|
||||||
m.v6Addresses = v6Addresses
|
m.v6Addresses = v6Addresses
|
||||||
m.mutex.Unlock()
|
m.mutex.Unlock()
|
||||||
|
|||||||
Reference in New Issue
Block a user