From 758301149a6ff72bbe2690cb8e5e8a98e300c6e8 Mon Sep 17 00:00:00 2001 From: andrea Date: Sun, 26 Aug 2012 13:38:11 +0200 Subject: [PATCH] Changed decodable message method to force loading the complete size of a message, before starting the real decode phase --- .../java/org/dna/mqtt/moquette/proto/Utils.java | 13 ++++++++++++- .../dna/mqtt/moquette/proto/ConnAckDecoderTest.java | 8 ++++++-- .../dna/mqtt/moquette/proto/ConnectDecoderTest.java | 8 ++++++-- .../dna/mqtt/moquette/proto/PublishDecoderTest.java | 4 +++- 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/parser/src/main/java/org/dna/mqtt/moquette/proto/Utils.java b/parser/src/main/java/org/dna/mqtt/moquette/proto/Utils.java index fcfc5f84..83058737 100644 --- a/parser/src/main/java/org/dna/mqtt/moquette/proto/Utils.java +++ b/parser/src/main/java/org/dna/mqtt/moquette/proto/Utils.java @@ -37,7 +37,7 @@ public class Utils { * Decode the variable remaining lenght as defined in MQTT v3.1 specification * (section 2.1). * - * @return the decoded length or -1 if needed more data to decode. + * @return the decoded length or -1 if needed more data to decode the length field. */ static int decodeRemainingLenght(IoBuffer in) { int multiplier = 1; @@ -87,6 +87,17 @@ public class Utils { } byte h1 = in.get(); byte messageType = (byte) ((h1 & 0x00F0) >> 4); + + int remainingLength = Utils.decodeRemainingLenght(in); + if (remainingLength == -1) { + return MessageDecoderResult.NEED_DATA; + } + + //check remaining length + if (in.remaining() < remainingLength) { + return MessageDecoderResult.NEED_DATA; + } + return messageType == type ? MessageDecoderResult.OK : MessageDecoderResult.NOT_OK; } diff --git a/parser/src/test/java/org/dna/mqtt/moquette/proto/ConnAckDecoderTest.java b/parser/src/test/java/org/dna/mqtt/moquette/proto/ConnAckDecoderTest.java index 43a8a27a..b6c4310e 100644 --- a/parser/src/test/java/org/dna/mqtt/moquette/proto/ConnAckDecoderTest.java +++ b/parser/src/test/java/org/dna/mqtt/moquette/proto/ConnAckDecoderTest.java @@ -27,13 +27,17 @@ public class ConnAckDecoderTest { @Test public void testDecodable_OK() { - m_buff.put((byte)(AbstractMessage.CONNACK << 4)).flip(); + m_buff.put((byte)(AbstractMessage.CONNACK << 4)) + .put((byte)0) //0 length + .flip(); assertEquals(MessageDecoder.OK , m_msgdec.decodable(null, m_buff)); } @Test public void testDecodable_NOT_OK() { - m_buff.put((byte)(AbstractMessage.CONNECT << 4)).flip(); + m_buff.put((byte)(AbstractMessage.CONNECT << 4)) + .put((byte)0) //0 length + .flip(); assertEquals(MessageDecoder.NOT_OK , m_msgdec.decodable(null, m_buff)); } diff --git a/parser/src/test/java/org/dna/mqtt/moquette/proto/ConnectDecoderTest.java b/parser/src/test/java/org/dna/mqtt/moquette/proto/ConnectDecoderTest.java index b24816d9..63b8b83a 100644 --- a/parser/src/test/java/org/dna/mqtt/moquette/proto/ConnectDecoderTest.java +++ b/parser/src/test/java/org/dna/mqtt/moquette/proto/ConnectDecoderTest.java @@ -26,13 +26,17 @@ public class ConnectDecoderTest { @Test public void testDecodable_OK() { - m_buff.put((byte)(AbstractMessage.CONNECT << 4)).flip(); + m_buff.put((byte)(AbstractMessage.CONNECT << 4)) + .put((byte)0) //0 length + .flip(); assertEquals(MessageDecoder.OK , m_msgdec.decodable(null, m_buff)); } @Test public void testDecodable_NOT_OK() { - m_buff.put((byte)(AbstractMessage.CONNACK << 4)).flip(); + m_buff.put((byte)(AbstractMessage.CONNACK << 4)) + .put((byte)0) //0 length + .flip(); assertEquals(MessageDecoder.NOT_OK , m_msgdec.decodable(null, m_buff)); } diff --git a/parser/src/test/java/org/dna/mqtt/moquette/proto/PublishDecoderTest.java b/parser/src/test/java/org/dna/mqtt/moquette/proto/PublishDecoderTest.java index bce0df78..7fcf0be5 100644 --- a/parser/src/test/java/org/dna/mqtt/moquette/proto/PublishDecoderTest.java +++ b/parser/src/test/java/org/dna/mqtt/moquette/proto/PublishDecoderTest.java @@ -29,7 +29,9 @@ public class PublishDecoderTest { @Test public void testDecodable_OK() { - m_buff.put((byte) (AbstractMessage.PUBLISH << 4)).flip(); + m_buff.put((byte) (AbstractMessage.PUBLISH << 4)) + .put((byte)0) //0 length + .flip(); assertEquals(MessageDecoder.OK, m_msgdec.decodable(null, m_buff)); }