From ec610494eac613d0a2d413761c54a6f41b54bf62 Mon Sep 17 00:00:00 2001 From: v2ray Date: Sun, 22 May 2016 19:32:37 +0200 Subject: [PATCH] Fix dokodemo for space --- proxy/dokodemo/dokodemo.go | 29 +++++++--- proxy/dokodemo/dokodemo_factory.go | 21 -------- proxy/dokodemo/dokodemo_test.go | 85 ++++++++++++++++++++++-------- 3 files changed, 86 insertions(+), 49 deletions(-) delete mode 100644 proxy/dokodemo/dokodemo_factory.go diff --git a/proxy/dokodemo/dokodemo.go b/proxy/dokodemo/dokodemo.go index 7898fe997..121a2fa2c 100644 --- a/proxy/dokodemo/dokodemo.go +++ b/proxy/dokodemo/dokodemo.go @@ -3,12 +3,14 @@ package dokodemo import ( "sync" + "github.com/v2ray/v2ray-core/app" "github.com/v2ray/v2ray-core/app/dispatcher" "github.com/v2ray/v2ray-core/common/alloc" v2io "github.com/v2ray/v2ray-core/common/io" "github.com/v2ray/v2ray-core/common/log" v2net "github.com/v2ray/v2ray-core/common/net" "github.com/v2ray/v2ray-core/proxy" + "github.com/v2ray/v2ray-core/proxy/internal" "github.com/v2ray/v2ray-core/transport/hub" ) @@ -26,13 +28,21 @@ type DokodemoDoor struct { listeningPort v2net.Port } -func NewDokodemoDoor(config *Config, packetDispatcher dispatcher.PacketDispatcher) *DokodemoDoor { - return &DokodemoDoor{ - config: config, - packetDispatcher: packetDispatcher, - address: config.Address, - port: config.Port, +func NewDokodemoDoor(config *Config, space app.Space) *DokodemoDoor { + d := &DokodemoDoor{ + config: config, + address: config.Address, + port: config.Port, } + space.InitializeApplication(func() error { + if !space.HasApp(dispatcher.APP_ID) { + log.Error("Dokodemo: Dispatcher is not found in the space.") + return app.ErrorMissingApplication + } + d.packetDispatcher = space.GetApp(dispatcher.APP_ID).(dispatcher.PacketDispatcher) + return nil + }) + return d } func (this *DokodemoDoor) Port() v2net.Port { @@ -153,3 +163,10 @@ func (this *DokodemoDoor) HandleTCPConnection(conn *hub.Connection) { outputFinish.Lock() inputFinish.Lock() } + +func init() { + internal.MustRegisterInboundHandlerCreator("dokodemo-door", + func(space app.Space, rawConfig interface{}) (proxy.InboundHandler, error) { + return NewDokodemoDoor(rawConfig.(*Config), space), nil + }) +} diff --git a/proxy/dokodemo/dokodemo_factory.go b/proxy/dokodemo/dokodemo_factory.go deleted file mode 100644 index 83cec68a1..000000000 --- a/proxy/dokodemo/dokodemo_factory.go +++ /dev/null @@ -1,21 +0,0 @@ -package dokodemo - -import ( - "github.com/v2ray/v2ray-core/app" - "github.com/v2ray/v2ray-core/app/dispatcher" - "github.com/v2ray/v2ray-core/proxy" - "github.com/v2ray/v2ray-core/proxy/internal" -) - -func init() { - internal.MustRegisterInboundHandlerCreator("dokodemo-door", - func(space app.Space, rawConfig interface{}) (proxy.InboundHandler, error) { - config := rawConfig.(*Config) - if !space.HasApp(dispatcher.APP_ID) { - return nil, internal.ErrorBadConfiguration - } - return NewDokodemoDoor( - config, - space.GetApp(dispatcher.APP_ID).(dispatcher.PacketDispatcher)), nil - }) -} diff --git a/proxy/dokodemo/dokodemo_test.go b/proxy/dokodemo/dokodemo_test.go index bbb6f448c..fa9ef3380 100644 --- a/proxy/dokodemo/dokodemo_test.go +++ b/proxy/dokodemo/dokodemo_test.go @@ -4,32 +4,58 @@ import ( "net" "testing" - testdispatcher "github.com/v2ray/v2ray-core/app/dispatcher/testing" + "github.com/v2ray/v2ray-core/app" + "github.com/v2ray/v2ray-core/app/dispatcher" + dispatchers "github.com/v2ray/v2ray-core/app/dispatcher/impl" + "github.com/v2ray/v2ray-core/app/proxyman" v2net "github.com/v2ray/v2ray-core/common/net" v2nettesting "github.com/v2ray/v2ray-core/common/net/testing" netassert "github.com/v2ray/v2ray-core/common/net/testing/assert" . "github.com/v2ray/v2ray-core/proxy/dokodemo" + "github.com/v2ray/v2ray-core/proxy/freedom" v2testing "github.com/v2ray/v2ray-core/testing" "github.com/v2ray/v2ray-core/testing/assert" + "github.com/v2ray/v2ray-core/testing/servers/tcp" + "github.com/v2ray/v2ray-core/testing/servers/udp" ) func TestDokodemoTCP(t *testing.T) { v2testing.Current(t) - testPacketDispatcher := testdispatcher.NewTestPacketDispatcher(nil) + tcpServer := &tcp.Server{ + Port: v2nettesting.PickPort(), + MsgProcessor: func(data []byte) []byte { + buffer := make([]byte, 0, 2048) + buffer = append(buffer, []byte("Processed: ")...) + buffer = append(buffer, data...) + return buffer + }, + } + _, err := tcpServer.Start() + assert.Error(err).IsNil() + + defer tcpServer.Close() + + space := app.NewSpace() + space.BindApp(dispatcher.APP_ID, dispatchers.NewDefaultDispatcher(space)) + ohm := proxyman.NewDefaultOutboundHandlerManager() + ohm.SetDefaultHandler(&freedom.FreedomConnection{}) + space.BindApp(proxyman.APP_ID_OUTBOUND_MANAGER, ohm) data2Send := "Data to be sent to remote." dokodemo := NewDokodemoDoor(&Config{ - Address: v2net.IPAddress([]byte{1, 2, 3, 4}), - Port: 128, + Address: v2net.LocalHostIP, + Port: tcpServer.Port, Network: v2net.TCPNetwork.AsList(), Timeout: 600, - }, testPacketDispatcher) + }, space) defer dokodemo.Close() + assert.Error(space.Initialize()).IsNil() + port := v2nettesting.PickPort() - err := dokodemo.Listen(port) + err = dokodemo.Listen(port) assert.Error(err).IsNil() netassert.Port(port).Equals(dokodemo.Port()) @@ -43,36 +69,51 @@ func TestDokodemoTCP(t *testing.T) { tcpClient.Write([]byte(data2Send)) tcpClient.CloseWrite() - destination := <-testPacketDispatcher.Destination - response := make([]byte, 1024) nBytes, err := tcpClient.Read(response) assert.Error(err).IsNil() tcpClient.Close() assert.StringLiteral("Processed: " + data2Send).Equals(string(response[:nBytes])) - assert.Bool(destination.IsTCP()).IsTrue() - netassert.Address(destination.Address()).Equals(v2net.IPAddress([]byte{1, 2, 3, 4})) - netassert.Port(destination.Port()).Equals(128) } func TestDokodemoUDP(t *testing.T) { v2testing.Current(t) - testPacketDispatcher := testdispatcher.NewTestPacketDispatcher(nil) + udpServer := &udp.Server{ + Port: v2nettesting.PickPort(), + MsgProcessor: func(data []byte) []byte { + buffer := make([]byte, 0, 2048) + buffer = append(buffer, []byte("Processed: ")...) + buffer = append(buffer, data...) + return buffer + }, + } + _, err := udpServer.Start() + assert.Error(err).IsNil() + + defer udpServer.Close() + + space := app.NewSpace() + space.BindApp(dispatcher.APP_ID, dispatchers.NewDefaultDispatcher(space)) + ohm := proxyman.NewDefaultOutboundHandlerManager() + ohm.SetDefaultHandler(&freedom.FreedomConnection{}) + space.BindApp(proxyman.APP_ID_OUTBOUND_MANAGER, ohm) data2Send := "Data to be sent to remote." dokodemo := NewDokodemoDoor(&Config{ - Address: v2net.IPAddress([]byte{5, 6, 7, 8}), - Port: 256, + Address: v2net.LocalHostIP, + Port: udpServer.Port, Network: v2net.UDPNetwork.AsList(), Timeout: 600, - }, testPacketDispatcher) + }, space) defer dokodemo.Close() + assert.Error(space.Initialize()).IsNil() + port := v2nettesting.PickPort() - err := dokodemo.Listen(port) + err = dokodemo.Listen(port) assert.Error(err).IsNil() netassert.Port(port).Equals(dokodemo.Port()) @@ -82,13 +123,13 @@ func TestDokodemoUDP(t *testing.T) { Zone: "", }) assert.Error(err).IsNil() + defer udpClient.Close() udpClient.Write([]byte(data2Send)) - udpClient.Close() - destination := <-testPacketDispatcher.Destination - - assert.Bool(destination.IsUDP()).IsTrue() - netassert.Address(destination.Address()).Equals(v2net.IPAddress([]byte{5, 6, 7, 8})) - netassert.Port(destination.Port()).Equals(256) + response := make([]byte, 1024) + nBytes, addr, err := udpClient.ReadFromUDP(response) + assert.Error(err).IsNil() + netassert.IP(addr.IP).Equals(v2net.LocalHostIP.IP()) + assert.Bytes(response[:nBytes]).Equals([]byte("Processed: " + data2Send)) }