Skip to content

Commit fbe8ffb

Browse files
committed
move hysteria2 server address fetch outside
1 parent 4dd8042 commit fbe8ffb

File tree

2 files changed

+22
-19
lines changed

2 files changed

+22
-19
lines changed

hysteria2/client.go

+20-17
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"context"
55
"crypto/tls"
66
"io"
7-
"math/rand"
87
"net"
98
"net/http"
109
"net/url"
@@ -18,7 +17,6 @@ import (
1817
qtls "github.com/metacubex/sing-quic"
1918
hyCC "github.com/metacubex/sing-quic/hysteria2/congestion"
2019
"github.com/metacubex/sing-quic/hysteria2/internal/protocol"
21-
"github.com/sagernet/sing/common/atomic"
2220
"github.com/sagernet/sing/common/baderror"
2321
E "github.com/sagernet/sing/common/exceptions"
2422
"github.com/sagernet/sing/common/logger"
@@ -31,8 +29,7 @@ type ClientOptions struct {
3129
Dialer N.Dialer
3230
Logger logger.Logger
3331
BrutalDebug bool
34-
ServerAddress M.Socksaddr
35-
ServerAddresses []M.Socksaddr
32+
ServerAddress func(ctx context.Context) (*net.UDPAddr, error)
3633
HopInterval time.Duration
3734
SendBPS uint64
3835
ReceiveBPS uint64
@@ -49,8 +46,7 @@ type Client struct {
4946
dialer N.Dialer
5047
logger logger.Logger
5148
brutalDebug bool
52-
serverAddr atomic.TypedValue[M.Socksaddr]
53-
serverAddrs []M.Socksaddr
49+
serverAddress func(ctx context.Context) (*net.UDPAddr, error)
5450
hopInterval time.Duration
5551
sendBPS uint64
5652
receiveBPS uint64
@@ -85,7 +81,7 @@ func NewClient(options ClientOptions) (*Client, error) {
8581
dialer: options.Dialer,
8682
logger: options.Logger,
8783
brutalDebug: options.BrutalDebug,
88-
serverAddrs: options.ServerAddresses,
84+
serverAddress: options.ServerAddress,
8985
hopInterval: options.HopInterval,
9086
sendBPS: options.SendBPS,
9187
receiveBPS: options.ReceiveBPS,
@@ -97,27 +93,31 @@ func NewClient(options ClientOptions) (*Client, error) {
9793
cwnd: options.CWND,
9894
udpMTU: options.UdpMTU,
9995
}
100-
client.serverAddr.Store(options.ServerAddress)
10196
return client, nil
10297
}
10398

10499
func (c *Client) hopLoop(conn *clientQUICConnection) {
105100
ticker := time.NewTicker(c.hopInterval)
106101
defer ticker.Stop()
107-
c.logger.Info("Entering hop loop ...")
102+
c.logger.Debug("Entering hop loop ...")
108103
for {
109104
select {
110105
case <-ticker.C:
111-
serverAddr := c.serverAddrs[rand.Intn(len(c.serverAddrs))]
112-
c.serverAddr.Store(serverAddr)
113-
conn.quicConn.SetRemoteAddr(serverAddr.UDPAddr())
114-
c.logger.Info("Hopped to ", serverAddr)
106+
ctx, cancel := context.WithTimeout(context.Background(), c.hopInterval)
107+
serverAddr, err := c.serverAddress(ctx)
108+
cancel()
109+
if err != nil {
110+
c.logger.Warn("Hop loop fetch serverAddress error: '%s', ignored", err)
111+
break
112+
}
113+
conn.quicConn.SetRemoteAddr(serverAddr)
114+
c.logger.Debug("Hopped to ", serverAddr)
115115
continue
116116
case <-c.ctx.Done():
117117
case <-conn.quicConn.Context().Done():
118118
case <-conn.connDone:
119119
}
120-
c.logger.Info("Exiting hop loop ...")
120+
c.logger.Debug("Exiting hop loop ...")
121121
return
122122
}
123123
}
@@ -141,8 +141,11 @@ func (c *Client) offer(ctx context.Context) (*clientQUICConnection, error) {
141141
}
142142

143143
func (c *Client) offerNew(ctx context.Context) (*clientQUICConnection, error) {
144-
serverAddr := c.serverAddr.Load()
145-
packetConn, err := c.dialer.ListenPacket(ctx, serverAddr)
144+
serverAddr, err := c.serverAddress(ctx)
145+
if err == nil {
146+
return nil, err
147+
}
148+
packetConn, err := c.dialer.ListenPacket(ctx, M.SocksaddrFromNet(serverAddr))
146149
if err != nil {
147150
return nil, err
148151
}
@@ -202,7 +205,7 @@ func (c *Client) offerNew(ctx context.Context) (*clientQUICConnection, error) {
202205
go c.loopMessages(conn)
203206
}
204207
c.conn = conn
205-
if len(c.serverAddrs) > 0 {
208+
if c.hopInterval > 0 {
206209
go c.hopLoop(conn)
207210
}
208211
return conn, nil

quic.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,13 @@ func DialEarly(ctx context.Context, conn net.PacketConn, addr net.Addr, tlsConfi
4343
return quic.DialEarly(ctx, conn, addr, tlsConfig, quicConfig)
4444
}
4545

46-
func CreateTransport(conn net.PacketConn, quicConnPtr *quic.EarlyConnection, serverAddr M.Socksaddr, tlsConfig *tls.Config, quicConfig *quic.Config, enableDatagrams bool) (http.RoundTripper, error) {
46+
func CreateTransport(conn net.PacketConn, quicConnPtr *quic.EarlyConnection, serverAddr *net.UDPAddr, tlsConfig *tls.Config, quicConfig *quic.Config, enableDatagrams bool) (http.RoundTripper, error) {
4747
return &http3.RoundTripper{
4848
TLSClientConfig: tlsConfig,
4949
QuicConfig: quicConfig,
5050
EnableDatagrams: enableDatagrams,
5151
Dial: func(ctx context.Context, addr string, tlsCfg *tls.Config, cfg *quic.Config) (quic.EarlyConnection, error) {
52-
quicConn, err := quic.DialEarly(ctx, conn, serverAddr.UDPAddr(), tlsCfg, cfg)
52+
quicConn, err := quic.DialEarly(ctx, conn, serverAddr, tlsCfg, cfg)
5353
if err != nil {
5454
return nil, err
5555
}

0 commit comments

Comments
 (0)