From 866a4d879c3cf5819a2ce1f9b3fedc5de4dab9a9 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 27 Jan 2017 14:10:36 +0100 Subject: [PATCH] fix udp handling --- app/proxyman/inbound/worker.go | 2 + testing/scenarios/feature_test.go | 84 +++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) diff --git a/app/proxyman/inbound/worker.go b/app/proxyman/inbound/worker.go index 892550fea..9f2f9ac7f 100644 --- a/app/proxyman/inbound/worker.go +++ b/app/proxyman/inbound/worker.go @@ -188,6 +188,7 @@ func (w *udpWorker) getConnection(src v2net.Destination) (*udpConn, bool) { Port: int(w.port), }, } + w.activeConn[src] = conn conn.updateActivity() return conn, false @@ -223,6 +224,7 @@ func (w *udpWorker) removeConn(src v2net.Destination) { } func (w *udpWorker) Start() error { + w.activeConn = make(map[v2net.Destination]*udpConn) ctx, cancel := context.WithCancel(context.Background()) w.ctx = ctx w.cancel = cancel diff --git a/testing/scenarios/feature_test.go b/testing/scenarios/feature_test.go index ffabf8aa9..58ed79c76 100644 --- a/testing/scenarios/feature_test.go +++ b/testing/scenarios/feature_test.go @@ -3,6 +3,7 @@ package scenarios import ( "net" "testing" + "time" xproxy "golang.org/x/net/proxy" "v2ray.com/core" @@ -21,6 +22,7 @@ import ( "v2ray.com/core/proxy/vmess/outbound" "v2ray.com/core/testing/assert" "v2ray.com/core/testing/servers/tcp" + "v2ray.com/core/testing/servers/udp" "v2ray.com/core/transport/internet" ) @@ -565,3 +567,85 @@ func TestForward(t *testing.T) { CloseAllServers() } + +func TestUDPConnection(t *testing.T) { + assert := assert.On(t) + + udpServer := udp.Server{ + MsgProcessor: xor, + } + dest, err := udpServer.Start() + assert.Error(err).IsNil() + defer udpServer.Close() + + clientPort := pickPort() + clientConfig := &core.Config{ + Inbound: []*proxyman.InboundHandlerConfig{ + { + ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ + PortRange: v2net.SinglePortRange(clientPort), + Listen: v2net.NewIPOrDomain(v2net.LocalHostIP), + }), + ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ + Address: v2net.NewIPOrDomain(dest.Address), + Port: uint32(dest.Port), + NetworkList: &v2net.NetworkList{ + Network: []v2net.Network{v2net.Network_UDP}, + }, + }), + }, + }, + Outbound: []*proxyman.OutboundHandlerConfig{ + { + ProxySettings: serial.ToTypedMessage(&freedom.Config{}), + }, + }, + } + + assert.Error(InitializeServerConfig(clientConfig)).IsNil() + + { + conn, err := net.DialUDP("udp", nil, &net.UDPAddr{ + IP: []byte{127, 0, 0, 1}, + Port: int(clientPort), + }) + assert.Error(err).IsNil() + + payload := "dokodemo request." + for i := 0; i < 5; i++ { + nBytes, err := conn.Write([]byte(payload)) + assert.Error(err).IsNil() + assert.Int(nBytes).Equals(len(payload)) + + response := make([]byte, 1024) + nBytes, err = conn.Read(response) + assert.Error(err).IsNil() + assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload))) + } + + assert.Error(conn.Close()).IsNil() + } + + time.Sleep(20 * time.Second) + + { + conn, err := net.DialUDP("udp", nil, &net.UDPAddr{ + IP: []byte{127, 0, 0, 1}, + Port: int(clientPort), + }) + assert.Error(err).IsNil() + + payload := "dokodemo request." + nBytes, err := conn.Write([]byte(payload)) + assert.Error(err).IsNil() + assert.Int(nBytes).Equals(len(payload)) + + response := make([]byte, 1024) + nBytes, err = conn.Read(response) + assert.Error(err).IsNil() + assert.Bytes(response[:nBytes]).Equals(xor([]byte(payload))) + assert.Error(conn.Close()).IsNil() + } + + CloseAllServers() +}