diff --git a/app/proxyman/inbound/worker.go b/app/proxyman/inbound/worker.go index 3dc59c4d..6ff80926 100644 --- a/app/proxyman/inbound/worker.go +++ b/app/proxyman/inbound/worker.go @@ -78,8 +78,10 @@ func (w *tcpWorker) Start() error { } func (w *tcpWorker) Close() { - w.hub.Close() - w.cancel() + if w.hub != nil { + w.hub.Close() + w.cancel() + } } func (w *tcpWorker) Port() v2net.Port { diff --git a/v2ray_test.go b/v2ray_test.go new file mode 100644 index 00000000..8a1d79d2 --- /dev/null +++ b/v2ray_test.go @@ -0,0 +1,65 @@ +package core_test + +import ( + "testing" + + . "v2ray.com/core" + "v2ray.com/core/app/proxyman" + "v2ray.com/core/common/dice" + v2net "v2ray.com/core/common/net" + "v2ray.com/core/common/protocol" + "v2ray.com/core/common/serial" + "v2ray.com/core/common/uuid" + _ "v2ray.com/core/main/distro/all" + "v2ray.com/core/proxy/dokodemo" + "v2ray.com/core/proxy/vmess" + "v2ray.com/core/proxy/vmess/outbound" + "v2ray.com/core/testing/assert" +) + +func TestV2RayClose(t *testing.T) { + assert := assert.On(t) + + port := v2net.Port(dice.Roll(65535)) + config := &Config{ + Inbound: []*proxyman.InboundHandlerConfig{ + { + ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ + PortRange: v2net.SinglePortRange(port), + Listen: v2net.NewIPOrDomain(v2net.LocalHostIP), + }), + ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ + Address: v2net.NewIPOrDomain(v2net.LocalHostIP), + Port: uint32(0), + NetworkList: &v2net.NetworkList{ + Network: []v2net.Network{v2net.Network_TCP, v2net.Network_UDP}, + }, + }), + }, + }, + Outbound: []*proxyman.OutboundHandlerConfig{ + { + ProxySettings: serial.ToTypedMessage(&outbound.Config{ + Receiver: []*protocol.ServerEndpoint{ + { + Address: v2net.NewIPOrDomain(v2net.LocalHostIP), + Port: uint32(0), + User: []*protocol.User{ + { + Account: serial.ToTypedMessage(&vmess.Account{ + Id: uuid.New().String(), + }), + }, + }, + }, + }, + }), + }, + }, + } + + point, err := NewPoint(config) + assert.Error(err).IsNil() + + point.Close() +}