mirror of
https://github.com/dotnet/MQTTnet.git
synced 2026-11-05 14:02:55 +08:00
Add PayloadSegmentable feature (#1585)
This commit is contained in:
@@ -54,12 +54,12 @@ namespace MQTTnet.Formatter.V3
|
||||
return DecodePubRelPacket(receivedMqttPacket.Body);
|
||||
case MqttControlPacketType.PubComp:
|
||||
return DecodePubCompPacket(receivedMqttPacket.Body);
|
||||
|
||||
|
||||
case MqttControlPacketType.PingReq:
|
||||
return MqttPingReqPacket.Instance;
|
||||
case MqttControlPacketType.PingResp:
|
||||
return MqttPingRespPacket.Instance;
|
||||
|
||||
|
||||
case MqttControlPacketType.Connect:
|
||||
return DecodeConnectPacket(receivedMqttPacket.Body);
|
||||
case MqttControlPacketType.ConnAck:
|
||||
@@ -73,7 +73,7 @@ namespace MQTTnet.Formatter.V3
|
||||
}
|
||||
case MqttControlPacketType.Disconnect:
|
||||
return DisconnectPacket;
|
||||
|
||||
|
||||
case MqttControlPacketType.Subscribe:
|
||||
return DecodeSubscribePacket(receivedMqttPacket.Body);
|
||||
case MqttControlPacketType.SubAck:
|
||||
@@ -103,9 +103,10 @@ namespace MQTTnet.Formatter.V3
|
||||
var remainingLength = (uint)(_bufferWriter.Length - 5);
|
||||
|
||||
var publishPacket = packet as MqttPublishPacket;
|
||||
if (publishPacket?.Payload != null)
|
||||
var payloadSegment = publishPacket?.PayloadSegment;
|
||||
if (payloadSegment != null)
|
||||
{
|
||||
remainingLength += (uint)publishPacket.Payload.Length;
|
||||
remainingLength += (uint)payloadSegment.Value.Count;
|
||||
}
|
||||
|
||||
var remainingLengthSize = MqttBufferWriter.GetVariableByteIntegerSize(remainingLength);
|
||||
@@ -119,18 +120,13 @@ namespace MQTTnet.Formatter.V3
|
||||
_bufferWriter.WriteVariableByteInteger(remainingLength);
|
||||
|
||||
var buffer = _bufferWriter.GetBuffer();
|
||||
|
||||
var firstSegment = new ArraySegment<byte>(buffer, headerOffset, _bufferWriter.Length - headerOffset);
|
||||
|
||||
if (publishPacket?.Payload != null)
|
||||
{
|
||||
var payloadSegment = new ArraySegment<byte>(publishPacket.Payload, 0, publishPacket.Payload.Length);
|
||||
return new MqttPacketBuffer(firstSegment, payloadSegment);
|
||||
}
|
||||
|
||||
return new MqttPacketBuffer(firstSegment);
|
||||
return payloadSegment == null
|
||||
? new MqttPacketBuffer(firstSegment)
|
||||
: new MqttPacketBuffer(firstSegment, payloadSegment.Value);
|
||||
}
|
||||
|
||||
|
||||
MqttPacket DecodeConnAckPacket(ArraySegment<byte> body)
|
||||
{
|
||||
ThrowIfBodyIsEmpty(body);
|
||||
@@ -177,7 +173,7 @@ namespace MQTTnet.Formatter.V3
|
||||
|
||||
var tryPrivate = (protocolVersion & 0x80) > 0;
|
||||
protocolVersion &= 0x7F;
|
||||
|
||||
|
||||
if (protocolVersion != 3 && protocolVersion != 4)
|
||||
{
|
||||
throw new MqttProtocolViolationException("MQTT protocol version do not match MQTT v3.");
|
||||
@@ -282,7 +278,7 @@ namespace MQTTnet.Formatter.V3
|
||||
|
||||
if (!_bufferReader.EndOfStream)
|
||||
{
|
||||
packet.Payload = _bufferReader.ReadRemainingData();
|
||||
packet.PayloadSegment = new ArraySegment<byte>(_bufferReader.ReadRemainingData());
|
||||
}
|
||||
|
||||
return packet;
|
||||
@@ -421,7 +417,7 @@ namespace MQTTnet.Formatter.V3
|
||||
{
|
||||
protocolVersion |= 0x80;
|
||||
}
|
||||
|
||||
|
||||
bufferWriter.WriteByte((byte)protocolVersion);
|
||||
|
||||
byte connectFlags = 0x0;
|
||||
|
||||
Reference in New Issue
Block a user