Skip to content

Commit

Permalink
[fix]修正PPv2协议解析
Browse files Browse the repository at this point in the history
  • Loading branch information
nnhy committed Nov 4, 2024
1 parent df2f5ad commit 595ebe2
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 18 deletions.
8 changes: 3 additions & 5 deletions NewLife.MQTT/ProxyProtocol/ProxyMessage.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
using System.Net;
using System.Text;
using System.Text;
using NewLife.Collections;
using NewLife.Data;
using NewLife.Net;

namespace NewLife.MQTT.ProxyProtocol;
Expand All @@ -27,8 +25,8 @@ public class ProxyMessage
#endregion

#region 核心读写方法
private static readonly Byte[] _Magic = [(Byte)'P', (Byte)'R', (Byte)'O', (Byte)'X', (Byte)'Y', (Byte)' '];
private static readonly Byte[] _NewLine = [(Byte)'\r', (Byte)'\n'];
private static readonly Byte[] _Magic = "PROXY ".GetBytes();
private static readonly Byte[] _NewLine = "\r\n".GetBytes();

/// <summary>快速验证协议头</summary>
/// <param name="data"></param>
Expand Down
22 changes: 11 additions & 11 deletions NewLife.MQTT/ProxyProtocol/ProxyMessageV2.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ public class ProxyMessageV2
#endregion

#region 核心读写方法
private static readonly Byte[] _Magic = [(Byte)'\r', (Byte)'\n', (Byte)'\r', (Byte)'\n', 0, (Byte)'\r', (Byte)'\n', (Byte)'Q', (Byte)'U', (Byte)'I', (Byte)'T', (Byte)'\n'];
private static readonly Byte[] _NewLine = [(Byte)'\r', (Byte)'\n'];
private static readonly Byte[] _Magic = "\r\n\r\n\0\r\nQUIT\n".GetBytes();
private static readonly Byte[] _NewLine = "\r\n".GetBytes();

/// <summary>快速验证协议头</summary>
/// <param name="data"></param>
Expand All @@ -39,15 +39,15 @@ public Int32 Read(ReadOnlySpan<Byte> data)
{
if (!data.StartsWith(_Magic)) return -1;

var reader = new SpanReader(data);
var reader = new SpanReader(data) { IsLittleEndian = false };
reader.Advance(_Magic.Length);

var flag = reader.ReadByte();
Version = (Byte)(flag >> 4);
Command = (Byte)(flag & 0x0F);

flag = reader.ReadByte();
var len = reader.ReadUInt16();
var len = (Int32)reader.ReadUInt16();

var family = (flag >> 4) switch
{
Expand All @@ -69,8 +69,8 @@ public Int32 Read(ReadOnlySpan<Byte> data)
{
case AddressFamily.InterNetwork:
{
var src_addr = reader.ReadInt32();
var dst_addr = reader.ReadInt32();
var src_addr = reader.ReadBytes(4).ToArray();
var dst_addr = reader.ReadBytes(4).ToArray();
var src_port = reader.ReadUInt16();
var dst_port = reader.ReadUInt16();

Expand All @@ -80,13 +80,13 @@ public Int32 Read(ReadOnlySpan<Byte> data)
break;
case AddressFamily.InterNetworkV6:
{
var src_addr = reader.ReadBytes(16);
var dst_addr = reader.ReadBytes(16);
var src_addr = reader.ReadBytes(16).ToArray();
var dst_addr = reader.ReadBytes(16).ToArray();
var src_port = reader.ReadUInt16();
var dst_port = reader.ReadUInt16();

Client = new NetUri(protocol, new IPAddress(src_addr.ToArray()), src_port);
Proxy = new NetUri(protocol, new IPAddress(dst_addr.ToArray()), dst_port);
Client = new NetUri(protocol, new IPAddress(src_addr), src_port);
Proxy = new NetUri(protocol, new IPAddress(dst_addr), dst_port);
}
break;
case AddressFamily.Unix:
Expand All @@ -100,7 +100,7 @@ public Int32 Read(ReadOnlySpan<Byte> data)
}

// 后续TLV数据
len = (UInt16)(_Magic.Length + len - reader.Position);
len = _Magic.Length + 1 + 1 + 2 + len - reader.Position;
if (len > 0)
{
var vs = reader.ReadBytes(len);
Expand Down
19 changes: 17 additions & 2 deletions XUnitTestClient/ProxyProtocolTests.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using System;
using System.Runtime.Serialization;
using System.Threading.Tasks;
using NewLife;
using NewLife.Data;
Expand All @@ -15,7 +14,7 @@ namespace XUnitTestClient;
public class ProxyProtocolTests
{
[Fact]
public void Test1()
public void TestPPv1()
{
var str = "PROXY TCP4 10.10.10.10 192.168.0.1 12345 80\r\n";
var msg = new ProxyMessage();
Expand All @@ -30,6 +29,22 @@ public void Test1()
Assert.Equal(80, msg.ProxyPort);
}

[Fact]
public void TestPPv2()
{
var str = "0D0A0D0A000D0A515549540A2111000CC0A801B4C0A80118F74C075B102E0006";
var buf = str.ToHex();
var msg = new ProxyMessageV2();
var rs = msg.Read(buf);

Assert.True(rs > 0);
Assert.Equal(28, rs);
Assert.Equal(0x02, msg.Version);
Assert.Equal(0x01, msg.Command);
Assert.Equal("tcp://192.168.1.180:63308", msg.Client + "");
Assert.Equal("tcp://192.168.1.24:1883", msg.Proxy + "");
}

[Fact]
public async Task TestProxyProtocol()
{
Expand Down

0 comments on commit 595ebe2

Please sign in to comment.