Fix dependency cycle caused by core import in internet package

This commit is contained in:
Shelikhoo 2021-02-28 19:10:38 +00:00
parent dd51d32250
commit 5f3851df39
No known key found for this signature in database
GPG Key ID: C4D5E79D22B25316
5 changed files with 60 additions and 25 deletions

View File

@ -23,6 +23,8 @@ import (
_ "github.com/v2fly/v2ray-core/v4/app/router"
_ "github.com/v2fly/v2ray-core/v4/app/stats"
_ "github.com/v2fly/v2ray-core/v4/transport/internet/tagged/taggedimpl"
// Inbound and outbound proxies.
_ "github.com/v2fly/v2ray-core/v4/proxy/blackhole"
_ "github.com/v2fly/v2ray-core/v4/proxy/dns"

View File

@ -2,8 +2,7 @@ package internet
import (
"context"
core "github.com/v2fly/v2ray-core/v4"
"github.com/v2fly/v2ray-core/v4/features/routing"
"github.com/v2fly/v2ray-core/v4/transport/internet/tagged"
"github.com/v2fly/v2ray-core/v4/common/net"
"github.com/v2fly/v2ray-core/v4/common/session"
@ -79,28 +78,8 @@ func DialSystem(ctx context.Context, dest net.Destination, sockopt *SocketConfig
}
func DialTaggedOutbound(ctx context.Context, dest net.Destination, tag string) (net.Conn, error) {
var dispatcher routing.Dispatcher
if err := core.RequireFeatures(ctx, func(dispatcherInstance routing.Dispatcher) {
dispatcher = dispatcherInstance
}); err != nil {
return nil, newError("Required Feature dispatcher not resolved").Base(err)
if tagged.Dialer == nil {
return nil, newError("tagged dial not enabled")
}
content := new(session.Content)
content.SkipDNSResolve = true
session.SetForcedOutboundTagToContext(ctx, tag)
ctx = session.ContextWithContent(ctx, content)
r, err := dispatcher.Dispatch(ctx, dest)
if err != nil {
return nil, err
}
var readerOpt net.ConnectionOption
if dest.Network == net.Network_TCP {
readerOpt = net.ConnectionOutputMulti(r.Reader)
} else {
readerOpt = net.ConnectionOutputMultiUDP(r.Reader)
}
return net.NewConnection(net.ConnectionInputMulti(r.Writer), readerOpt), nil
return tagged.Dialer(ctx, dest, tag)
}

View File

@ -0,0 +1,10 @@
package tagged
import (
"context"
"github.com/v2fly/v2ray-core/v4/common/net"
)
type DialFunc func(ctx context.Context, dest net.Destination, tag string) (net.Conn, error)
var Dialer DialFunc

View File

@ -0,0 +1,41 @@
package taggedimpl
import (
"context"
core "github.com/v2fly/v2ray-core/v4"
"github.com/v2fly/v2ray-core/v4/common/net"
"github.com/v2fly/v2ray-core/v4/common/session"
"github.com/v2fly/v2ray-core/v4/features/routing"
"github.com/v2fly/v2ray-core/v4/transport/internet/tagged"
)
func DialTaggedOutbound(ctx context.Context, dest net.Destination, tag string) (net.Conn, error) {
var dispatcher routing.Dispatcher
if err := core.RequireFeatures(ctx, func(dispatcherInstance routing.Dispatcher) {
dispatcher = dispatcherInstance
}); err != nil {
return nil, newError("Required Feature dispatcher not resolved").Base(err)
}
content := new(session.Content)
content.SkipDNSResolve = true
session.SetForcedOutboundTagToContext(ctx, tag)
ctx = session.ContextWithContent(ctx, content)
r, err := dispatcher.Dispatch(ctx, dest)
if err != nil {
return nil, err
}
var readerOpt net.ConnectionOption
if dest.Network == net.Network_TCP {
readerOpt = net.ConnectionOutputMulti(r.Reader)
} else {
readerOpt = net.ConnectionOutputMultiUDP(r.Reader)
}
return net.NewConnection(net.ConnectionInputMulti(r.Writer), readerOpt), nil
}
func init() {
tagged.Dialer = DialTaggedOutbound
}

View File

@ -0,0 +1,3 @@
package taggedimpl
//go:generate go run github.com/v2fly/v2ray-core/v4/common/errors/errorgen