Skip to content

Commit f9dd3ae

Browse files
authored
Refactor WrapLink logic (#5288)
#5133 #5286
1 parent b24ef88 commit f9dd3ae

File tree

4 files changed

+22
-8
lines changed

4 files changed

+22
-8
lines changed

app/reverse/bridge.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"context"
55
"time"
66

7-
"github.com/xtls/xray-core/app/dispatcher"
87
"github.com/xtls/xray-core/common/errors"
98
"github.com/xtls/xray-core/common/mux"
109
"github.com/xtls/xray-core/common/net"
@@ -231,7 +230,9 @@ func (w *BridgeWorker) DispatchLink(ctx context.Context, dest net.Destination, l
231230
return w.Dispatcher.DispatchLink(ctx, dest, link)
232231
}
233232

234-
link = w.Dispatcher.(*dispatcher.DefaultDispatcher).WrapLink(ctx, link)
233+
if d, ok := w.Dispatcher.(routing.WrapLinkDispatcher); ok {
234+
link = d.WrapLink(ctx, link)
235+
}
235236
w.handleInternalConn(link)
236237

237238
return nil

common/mux/server.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"io"
66
"time"
77

8-
"github.com/xtls/xray-core/app/dispatcher"
98
"github.com/xtls/xray-core/common"
109
"github.com/xtls/xray-core/common/buf"
1110
"github.com/xtls/xray-core/common/errors"
@@ -64,7 +63,9 @@ func (s *Server) DispatchLink(ctx context.Context, dest net.Destination, link *t
6463
if dest.Address != muxCoolAddress {
6564
return s.dispatcher.DispatchLink(ctx, dest, link)
6665
}
67-
link = s.dispatcher.(*dispatcher.DefaultDispatcher).WrapLink(ctx, link)
66+
if d, ok := s.dispatcher.(routing.WrapLinkDispatcher); ok {
67+
link = d.WrapLink(ctx, link)
68+
}
6869
worker, err := NewServerWorker(ctx, s.dispatcher, link)
6970
if err != nil {
7071
return err

features/routing/dispatcher.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,9 @@ type Dispatcher interface {
2626
func DispatcherType() interface{} {
2727
return (*Dispatcher)(nil)
2828
}
29+
30+
// Just for type assertion
31+
type WrapLinkDispatcher interface {
32+
Dispatcher
33+
WrapLink(ctx context.Context, link *transport.Link) *transport.Link
34+
}

proxy/vless/inbound/inbound.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import (
1212
"time"
1313
"unsafe"
1414

15-
"github.com/xtls/xray-core/app/dispatcher"
1615
"github.com/xtls/xray-core/app/reverse"
1716
"github.com/xtls/xray-core/common"
1817
"github.com/xtls/xray-core/common/buf"
@@ -76,7 +75,7 @@ type Handler struct {
7675
validator vless.Validator
7776
decryption *encryption.ServerInstance
7877
outboundHandlerManager outbound.Manager
79-
defaultDispatcher *dispatcher.DefaultDispatcher
78+
wrapLink func(ctx context.Context, link *transport.Link) *transport.Link
8079
ctx context.Context
8180
fallbacks map[string]map[string]map[string]*Fallback // or nil
8281
// regexps map[string]*regexp.Regexp // or nil
@@ -85,12 +84,16 @@ type Handler struct {
8584
// New creates a new VLess inbound handler.
8685
func New(ctx context.Context, config *Config, dc dns.Client, validator vless.Validator) (*Handler, error) {
8786
v := core.MustFromContext(ctx)
87+
var wrapLinkFunc func(ctx context.Context, link *transport.Link) *transport.Link
88+
if dispatcher, ok := v.GetFeature(routing.DispatcherType()).(routing.WrapLinkDispatcher); ok {
89+
wrapLinkFunc = dispatcher.WrapLink
90+
}
8891
handler := &Handler{
8992
inboundHandlerManager: v.GetFeature(feature_inbound.ManagerType()).(feature_inbound.Manager),
9093
policyManager: v.GetFeature(policy.ManagerType()).(policy.Manager),
9194
validator: validator,
9295
outboundHandlerManager: v.GetFeature(outbound.ManagerType()).(outbound.Manager),
93-
defaultDispatcher: v.GetFeature(routing.DispatcherType()).(*dispatcher.DefaultDispatcher),
96+
wrapLink: wrapLinkFunc,
9497
ctx: ctx,
9598
}
9699

@@ -619,7 +622,10 @@ func (h *Handler) Process(ctx context.Context, network net.Network, connection s
619622
if err != nil {
620623
return err
621624
}
622-
return r.NewMux(ctx, h.defaultDispatcher.WrapLink(ctx, &transport.Link{Reader: clientReader, Writer: clientWriter}))
625+
if h.wrapLink == nil {
626+
return errors.New("VLESS reverse must have a dispatcher that implemented routing.WrapLinkDispatcher")
627+
}
628+
return r.NewMux(ctx, h.wrapLink(ctx, &transport.Link{Reader: clientReader, Writer: clientWriter}))
623629
}
624630

625631
if err := dispatcher.DispatchLink(ctx, request.Destination(), &transport.Link{

0 commit comments

Comments
 (0)