From 5ded34a5d619cbfb7f2f30c7663d164936802c17 Mon Sep 17 00:00:00 2001 From: Chad Selph Date: Tue, 7 May 2013 19:30:15 -0700 Subject: [PATCH] fix for encoding submit_sm_resp messages with no message_id --- .../java/com/cloudhopper/smpp/pdu/BaseSmResp.java | 9 ++++++++- .../cloudhopper/smpp/transcoder/PduEncoderTest.java | 13 ++++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cloudhopper/smpp/pdu/BaseSmResp.java b/src/main/java/com/cloudhopper/smpp/pdu/BaseSmResp.java index a80561b1..b59699db 100644 --- a/src/main/java/com/cloudhopper/smpp/pdu/BaseSmResp.java +++ b/src/main/java/com/cloudhopper/smpp/pdu/BaseSmResp.java @@ -63,7 +63,14 @@ public int calculateByteSizeOfBody() { @Override public void writeBody(ChannelBuffer buffer) throws UnrecoverablePduException, RecoverablePduException { - ChannelBufferUtil.writeNullTerminatedString(buffer, this.messageId); + // when this PDU was parsed, it's possible it was missing the messageId instead + // of having a NULL messageId. If that's the case, the commandLength will be just + // enough for the headers (and theoretically any optional TLVs). Don't try to + // write the NULL byte for that case. + // See special note in 4.4.2 of SMPP 3.4 spec + if (!((buffer.writableBytes() == 0) && (this.messageId == null))) { + ChannelBufferUtil.writeNullTerminatedString(buffer, this.messageId); + } } @Override diff --git a/src/test/java/com/cloudhopper/smpp/transcoder/PduEncoderTest.java b/src/test/java/com/cloudhopper/smpp/transcoder/PduEncoderTest.java index b9c0e147..f7f9b383 100644 --- a/src/test/java/com/cloudhopper/smpp/transcoder/PduEncoderTest.java +++ b/src/test/java/com/cloudhopper/smpp/transcoder/PduEncoderTest.java @@ -82,7 +82,7 @@ public void encodeSubmitSmResp() throws Exception { } @Test - public void encodeSubmitSmRespWithNoMessageId() throws Exception { + public void encodeSubmitSmRespWithNullMessageId() throws Exception { SubmitSmResp pdu0 = new SubmitSmResp(); pdu0.setSequenceNumber(171192033); @@ -90,6 +90,17 @@ public void encodeSubmitSmRespWithNoMessageId() throws Exception { Assert.assertArrayEquals(HexUtil.toByteArray("0000001180000004000000000a342ee100"), BufferHelper.createByteArray(buffer)); } + @Test + public void encodeSubmitSmRespWithOmittedMesageId() throws Exception { + SubmitSmResp pdu0 = new SubmitSmResp(); + pdu0.setSequenceNumber(171192033); + pdu0.setCommandStatus(0x30); + pdu0.setCommandLength(16); + + ChannelBuffer buffer = transcoder.encode(pdu0); + Assert.assertArrayEquals(HexUtil.toByteArray("0000001080000004000000300a342ee1"), BufferHelper.createByteArray(buffer)); + } + @Test public void encodeDeliverSmResp() throws Exception { DeliverSmResp pdu0 = new DeliverSmResp();