diff --git a/Source/MQTTnet.AspnetCore/SpanBasedMqttPacketBodyReader.cs b/Source/MQTTnet.AspnetCore/SpanBasedMqttPacketBodyReader.cs index 9e16dacf..63e0ab81 100644 --- a/Source/MQTTnet.AspnetCore/SpanBasedMqttPacketBodyReader.cs +++ b/Source/MQTTnet.AspnetCore/SpanBasedMqttPacketBodyReader.cs @@ -24,7 +24,6 @@ namespace MQTTnet.AspNetCore public byte ReadByte() { - ValidateReceiveBuffer(1); return _buffer.Span[_offset++]; } @@ -35,9 +34,7 @@ namespace MQTTnet.AspNetCore public ushort ReadUInt16() { - ValidateReceiveBuffer(2); - - var result = BinaryPrimitives.ReadUInt16BigEndian(_buffer.Span); + var result = BinaryPrimitives.ReadUInt16BigEndian(_buffer.Span.Slice(_offset)); _offset += 2; return result; } @@ -49,23 +46,14 @@ namespace MQTTnet.AspNetCore private ReadOnlySpan ReadSegmentWithLengthPrefix() { - var length = ReadUInt16(); + var span = _buffer.Span; + var length = BinaryPrimitives.ReadUInt16BigEndian(span.Slice(_offset)); - ValidateReceiveBuffer(length); - - var result = _buffer.Slice(_offset, length).Span; - _offset += length; + var result = span.Slice(_offset+2, length); + _offset += 2 + length; return result; } - - private void ValidateReceiveBuffer(ushort length) - { - if (_buffer.Length < _offset + length) - { - throw new ArgumentOutOfRangeException(nameof(_buffer), $"expected at least {_offset + length} bytes but there are only {_buffer.Length} bytes"); - } - } - + public unsafe string ReadStringWithLengthPrefix() { var buffer = ReadSegmentWithLengthPrefix(); diff --git a/Tests/MQTTnet.AspNetCore.Tests/MqttPacketSerializerTests.cs b/Tests/MQTTnet.AspNetCore.Tests/MqttPacketSerializerTests.cs new file mode 100644 index 00000000..f0920d54 --- /dev/null +++ b/Tests/MQTTnet.AspNetCore.Tests/MqttPacketSerializerTests.cs @@ -0,0 +1,17 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using MQTTnet.Core.Tests; +using MQTTnet.Serializer; + +namespace MQTTnet.AspNetCore.Tests +{ + [TestClass] + public class MqttPacketSerializerTestsWithSpanBasedReader : MqttPacketSerializerTests + { + protected override IPacketBodyReader ReaderFactory(byte[] data) + { + var result = new SpanBasedMqttPacketBodyReader(); + result.SetBuffer(data); + return result; + } + } +} diff --git a/Tests/MQTTnet.Core.Tests/MqttPacketSerializer_Tests.cs b/Tests/MQTTnet.Core.Tests/MqttPacketSerializer_Tests.cs index a1aad718..cb1b0695 100644 --- a/Tests/MQTTnet.Core.Tests/MqttPacketSerializer_Tests.cs +++ b/Tests/MQTTnet.Core.Tests/MqttPacketSerializer_Tests.cs @@ -528,7 +528,12 @@ namespace MQTTnet.Tests Assert.AreEqual(expectedBase64Value, Convert.ToBase64String(Join(data))); } - private static void DeserializeAndCompare(MqttBasePacket packet, string expectedBase64Value, MqttProtocolVersion protocolVersion = MqttProtocolVersion.V311) + protected virtual IMqttPacketBodyReader ReaderFactory(byte[] data) + { + return new MqttPacketBodyReader(data, 0, data.Length); + } + + private void DeserializeAndCompare(MqttBasePacket packet, string expectedBase64Value, MqttProtocolVersion protocolVersion = MqttProtocolVersion.V311) { IMqttPacketFormatter serializer; if (protocolVersion == MqttProtocolVersion.V311)