mirror of
https://github.com/v2fly/v2ray-core.git
synced 2025-12-26 20:15:26 -05:00
leverage global object creator in proxies.
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package dokodemo
|
||||
|
||||
import (
|
||||
"context"
|
||||
"sync"
|
||||
|
||||
"v2ray.com/core/app"
|
||||
@@ -10,7 +11,6 @@ import (
|
||||
"v2ray.com/core/common/errors"
|
||||
"v2ray.com/core/common/log"
|
||||
v2net "v2ray.com/core/common/net"
|
||||
"v2ray.com/core/common/serial"
|
||||
"v2ray.com/core/common/signal"
|
||||
"v2ray.com/core/proxy"
|
||||
"v2ray.com/core/transport/internet"
|
||||
@@ -31,7 +31,15 @@ type DokodemoDoor struct {
|
||||
meta *proxy.InboundHandlerMeta
|
||||
}
|
||||
|
||||
func NewDokodemoDoor(config *Config, space app.Space, meta *proxy.InboundHandlerMeta) *DokodemoDoor {
|
||||
func NewDokodemoDoor(ctx context.Context, config *Config) (*DokodemoDoor, error) {
|
||||
space := app.SpaceFromContext(ctx)
|
||||
if space == nil {
|
||||
return nil, errors.New("Dokodemo: No space in context.")
|
||||
}
|
||||
meta := proxy.InboundMetaFromContext(ctx)
|
||||
if meta == nil {
|
||||
return nil, errors.New("Dokodemo: No outbound meta in context.")
|
||||
}
|
||||
d := &DokodemoDoor{
|
||||
config: config,
|
||||
address: config.GetPredefinedAddress(),
|
||||
@@ -45,7 +53,7 @@ func NewDokodemoDoor(config *Config, space app.Space, meta *proxy.InboundHandler
|
||||
}
|
||||
return nil
|
||||
})
|
||||
return d
|
||||
return d, nil
|
||||
}
|
||||
|
||||
func (v *DokodemoDoor) Port() v2net.Port {
|
||||
@@ -205,12 +213,8 @@ func (v *DokodemoDoor) HandleTCPConnection(conn internet.Connection) {
|
||||
}
|
||||
}
|
||||
|
||||
type Factory struct{}
|
||||
|
||||
func (v *Factory) Create(space app.Space, rawConfig interface{}, meta *proxy.InboundHandlerMeta) (proxy.InboundHandler, error) {
|
||||
return NewDokodemoDoor(rawConfig.(*Config), space, meta), nil
|
||||
}
|
||||
|
||||
func init() {
|
||||
common.Must(proxy.RegisterInboundHandlerCreator(serial.GetMessageType(new(Config)), new(Factory)))
|
||||
common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, config interface{}) (interface{}, error) {
|
||||
return NewDokodemoDoor(ctx, config.(*Config))
|
||||
}))
|
||||
}
|
||||
|
||||
@@ -4,6 +4,8 @@ import (
|
||||
"net"
|
||||
"testing"
|
||||
|
||||
"context"
|
||||
|
||||
"v2ray.com/core/app"
|
||||
"v2ray.com/core/app/dispatcher"
|
||||
_ "v2ray.com/core/app/dispatcher/impl"
|
||||
@@ -42,31 +44,36 @@ func TestDokodemoTCP(t *testing.T) {
|
||||
space.AddApp(new(proxyman.OutboundConfig))
|
||||
|
||||
ohm := proxyman.OutboundHandlerManagerFromSpace(space)
|
||||
ohm.SetDefaultHandler(
|
||||
freedom.New(
|
||||
&freedom.Config{},
|
||||
space,
|
||||
&proxy.OutboundHandlerMeta{
|
||||
Address: v2net.LocalHostIP,
|
||||
StreamSettings: &internet.StreamConfig{
|
||||
Protocol: internet.TransportProtocol_TCP,
|
||||
},
|
||||
}))
|
||||
ctx := context.Background()
|
||||
ctx = app.ContextWithSpace(ctx, space)
|
||||
|
||||
freedom, err := freedom.New(proxy.ContextWithOutboundMeta(ctx, &proxy.OutboundHandlerMeta{
|
||||
Address: v2net.LocalHostIP,
|
||||
StreamSettings: &internet.StreamConfig{
|
||||
Protocol: internet.TransportProtocol_TCP,
|
||||
},
|
||||
}), &freedom.Config{})
|
||||
assert.Error(err).IsNil()
|
||||
ohm.SetDefaultHandler(freedom)
|
||||
|
||||
data2Send := "Data to be sent to remote."
|
||||
|
||||
port := v2net.Port(dice.Roll(20000) + 10000)
|
||||
dokodemo := NewDokodemoDoor(&Config{
|
||||
Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
|
||||
Port: uint32(tcpServer.Port),
|
||||
NetworkList: v2net.Network_TCP.AsList(),
|
||||
Timeout: 600,
|
||||
}, space, &proxy.InboundHandlerMeta{
|
||||
|
||||
ctx = proxy.ContextWithInboundMeta(ctx, &proxy.InboundHandlerMeta{
|
||||
Address: v2net.LocalHostIP,
|
||||
Port: port,
|
||||
StreamSettings: &internet.StreamConfig{
|
||||
Protocol: internet.TransportProtocol_TCP,
|
||||
}})
|
||||
|
||||
dokodemo, err := NewDokodemoDoor(ctx, &Config{
|
||||
Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
|
||||
Port: uint32(tcpServer.Port),
|
||||
NetworkList: v2net.Network_TCP.AsList(),
|
||||
Timeout: 600,
|
||||
})
|
||||
assert.Error(err).IsNil()
|
||||
defer dokodemo.Close()
|
||||
|
||||
assert.Error(space.Initialize()).IsNil()
|
||||
@@ -114,30 +121,36 @@ func TestDokodemoUDP(t *testing.T) {
|
||||
space.AddApp(new(proxyman.OutboundConfig))
|
||||
|
||||
ohm := proxyman.OutboundHandlerManagerFromSpace(space)
|
||||
ohm.SetDefaultHandler(
|
||||
freedom.New(
|
||||
&freedom.Config{},
|
||||
space,
|
||||
&proxy.OutboundHandlerMeta{
|
||||
Address: v2net.AnyIP,
|
||||
StreamSettings: &internet.StreamConfig{
|
||||
Protocol: internet.TransportProtocol_TCP,
|
||||
}}))
|
||||
|
||||
ctx := context.Background()
|
||||
ctx = app.ContextWithSpace(ctx, space)
|
||||
freedom, err := freedom.New(proxy.ContextWithOutboundMeta(ctx, &proxy.OutboundHandlerMeta{
|
||||
Address: v2net.AnyIP,
|
||||
StreamSettings: &internet.StreamConfig{
|
||||
Protocol: internet.TransportProtocol_TCP,
|
||||
},
|
||||
}), &freedom.Config{})
|
||||
assert.Error(err).IsNil()
|
||||
ohm.SetDefaultHandler(freedom)
|
||||
|
||||
data2Send := "Data to be sent to remote."
|
||||
|
||||
port := v2net.Port(dice.Roll(20000) + 10000)
|
||||
dokodemo := NewDokodemoDoor(&Config{
|
||||
Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
|
||||
Port: uint32(udpServer.Port),
|
||||
NetworkList: v2net.Network_UDP.AsList(),
|
||||
Timeout: 600,
|
||||
}, space, &proxy.InboundHandlerMeta{
|
||||
|
||||
ctx = proxy.ContextWithInboundMeta(ctx, &proxy.InboundHandlerMeta{
|
||||
Address: v2net.LocalHostIP,
|
||||
Port: port,
|
||||
StreamSettings: &internet.StreamConfig{
|
||||
Protocol: internet.TransportProtocol_TCP,
|
||||
}})
|
||||
|
||||
dokodemo, err := NewDokodemoDoor(ctx, &Config{
|
||||
Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
|
||||
Port: uint32(udpServer.Port),
|
||||
NetworkList: v2net.Network_UDP.AsList(),
|
||||
Timeout: 600,
|
||||
})
|
||||
assert.Error(err).IsNil()
|
||||
defer dokodemo.Close()
|
||||
|
||||
assert.Error(space.Initialize()).IsNil()
|
||||
|
||||
Reference in New Issue
Block a user