mirror of https://github.com/v2ray/v2ray-core
fix udp handling in dokodemo and mux
parent
d5ef224ac0
commit
d5f931ae8b
|
@ -133,11 +133,12 @@ func (m *Client) monitor() {
|
||||||
|
|
||||||
func fetchInput(ctx context.Context, s *Session, output buf.Writer) {
|
func fetchInput(ctx context.Context, s *Session, output buf.Writer) {
|
||||||
dest, _ := proxy.TargetFromContext(ctx)
|
dest, _ := proxy.TargetFromContext(ctx)
|
||||||
writer := &Writer{
|
transferType := protocol.TransferTypeStream
|
||||||
dest: dest,
|
if dest.Network == net.Network_UDP {
|
||||||
id: s.ID,
|
transferType = protocol.TransferTypePacket
|
||||||
writer: output,
|
|
||||||
}
|
}
|
||||||
|
s.transferType = transferType
|
||||||
|
writer := NewWriter(s.ID, dest, output, transferType)
|
||||||
defer writer.Close()
|
defer writer.Close()
|
||||||
defer s.CloseUplink()
|
defer s.CloseUplink()
|
||||||
|
|
||||||
|
|
|
@ -84,9 +84,14 @@ func (d *DokodemoDoor) Process(ctx context.Context, network net.Network, conn in
|
||||||
})
|
})
|
||||||
|
|
||||||
responseDone := signal.ExecuteAsync(func() error {
|
responseDone := signal.ExecuteAsync(func() error {
|
||||||
v2writer := buf.NewWriter(conn)
|
var writer buf.Writer
|
||||||
|
if network == net.Network_TCP {
|
||||||
|
writer = buf.NewWriter(conn)
|
||||||
|
} else {
|
||||||
|
writer = buf.NewSequentialWriter(conn)
|
||||||
|
}
|
||||||
|
|
||||||
if err := buf.Copy(inboundRay.InboundOutput(), v2writer, buf.UpdateActivity(timer)); err != nil {
|
if err := buf.Copy(inboundRay.InboundOutput(), writer, buf.UpdateActivity(timer)); err != nil {
|
||||||
return newError("failed to transport response").Base(err)
|
return newError("failed to transport response").Base(err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -1198,15 +1198,26 @@ func TestVMessGCMMuxUDP(t *testing.T) {
|
||||||
})
|
})
|
||||||
assert.Error(err).IsNil()
|
assert.Error(err).IsNil()
|
||||||
|
|
||||||
|
conn.SetDeadline(time.Now().Add(time.Second * 10))
|
||||||
|
|
||||||
payload := make([]byte, 1024)
|
payload := make([]byte, 1024)
|
||||||
rand.Read(payload)
|
rand.Read(payload)
|
||||||
|
|
||||||
nBytes, err := conn.Write(payload)
|
for j := 0; j < 10; j++ {
|
||||||
|
nBytes, _, err := conn.WriteMsgUDP(payload, nil, nil)
|
||||||
assert.Error(err).IsNil()
|
assert.Error(err).IsNil()
|
||||||
assert.Int(nBytes).Equals(len(payload))
|
assert.Int(nBytes).Equals(len(payload))
|
||||||
|
}
|
||||||
|
|
||||||
response := readFrom(conn, time.Second*5, 1024)
|
response := make([]byte, 1024)
|
||||||
|
oob := make([]byte, 16)
|
||||||
|
for j := 0; j < 10; j++ {
|
||||||
|
nBytes, _, _, _, err := conn.ReadMsgUDP(response, oob)
|
||||||
|
assert.Error(err).IsNil()
|
||||||
|
assert.Int(nBytes).Equals(1024)
|
||||||
assert.Bytes(response).Equals(xor(payload))
|
assert.Bytes(response).Equals(xor(payload))
|
||||||
|
}
|
||||||
|
|
||||||
assert.Error(conn.Close()).IsNil()
|
assert.Error(conn.Close()).IsNil()
|
||||||
wg.Done()
|
wg.Done()
|
||||||
}()
|
}()
|
||||||
|
|
Loading…
Reference in New Issue