From 221f3c96b5d9479a9eab94fb9df075ec5a1f2253 Mon Sep 17 00:00:00 2001 From: Mike Youngstrom Date: Wed, 21 Dec 2016 17:50:56 -0700 Subject: [PATCH] Skip structured data if it exists. --- src/main/java/netty/syslog/DecoderUtil.java | 25 +++++++++++++++++-- .../java/netty/syslog/MessageDecoder.java | 6 +++-- .../java/netty/syslog/MessageDecoderTest.java | 19 ++++++++++++++ 3 files changed, 46 insertions(+), 4 deletions(-) diff --git a/src/main/java/netty/syslog/DecoderUtil.java b/src/main/java/netty/syslog/DecoderUtil.java index e3b5c98..0b2eec1 100644 --- a/src/main/java/netty/syslog/DecoderUtil.java +++ b/src/main/java/netty/syslog/DecoderUtil.java @@ -34,11 +34,32 @@ static byte peek(ByteBuf buffer) { } static void expect(ByteBuf buffer, char c) { - if (buffer.readByte() != c) { - throw new DecoderException("Expected " + c + " at index " + buffer.readerIndex()); + byte readByte = buffer.readByte(); + if (readByte != c) { + throw new DecoderException("Expected " + c + " at index " + buffer.readerIndex() + " got "+ (char)readByte); } } + static void skipStructuredData(ByteBuf buffer, boolean checkNull) { + if (checkNull && peek(buffer) == '-') { + buffer.readByte(); + return; + } + expect(buffer, '['); + int length = -1; + for (int i = buffer.readerIndex(); i < buffer.capacity(); i++) { + if (buffer.getByte(i) == ' ' && buffer.getByte(i-1) == ']') { + length = i - buffer.readerIndex(); + break; + } + } + if (length < 0) { + length = buffer.readableBytes(); + } + buffer.skipBytes(length); + return; + } + static String readStringToSpace(ByteBuf buffer, boolean checkNull) { if (checkNull && peek(buffer) == '-') { buffer.readByte(); diff --git a/src/main/java/netty/syslog/MessageDecoder.java b/src/main/java/netty/syslog/MessageDecoder.java index bb70301..4716b11 100644 --- a/src/main/java/netty/syslog/MessageDecoder.java +++ b/src/main/java/netty/syslog/MessageDecoder.java @@ -20,6 +20,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.ByteToMessageDecoder; import io.netty.handler.codec.DecoderException; +import io.netty.util.CharsetUtil; import java.time.ZonedDateTime; import java.util.List; @@ -28,6 +29,7 @@ import static netty.syslog.DecoderUtil.peek; import static netty.syslog.DecoderUtil.readDigit; import static netty.syslog.DecoderUtil.readStringToSpace; +import static netty.syslog.DecoderUtil.skipStructuredData; public class MessageDecoder extends ByteToMessageDecoder { @@ -85,8 +87,8 @@ protected void decode(ChannelHandlerContext context, ByteBuf buffer, List messageList = new ArrayList<>(); + + decoder.decode(null, Unpooled.wrappedBuffer("<14>1 2014-03-20T20:14:14+00:00 loggregator 20d38e29-85bb-4833-81c8-99ba7d0c1b09 [App/0] - [joe=fred dude=garbage][bob=joe] SHLVL : 1".getBytes()), messageList); + assertEquals(messageList.size(), 1); + final Message message = ((Message) messageList.remove(0)); + assertEquals(message.getFacility(), Message.Facility.USER_LEVEL); + assertEquals(message.getSeverity(), Message.Severity.INFORMATION); + assertEquals(message.getTimestamp(), ZonedDateTime.parse("2014-03-20T20:14:14Z")); + assertEquals(message.getHostname(), "loggregator"); + assertEquals(message.getApplicationName(), "20d38e29-85bb-4833-81c8-99ba7d0c1b09"); + assertEquals(message.getProcessId(), "[App/0]"); + assertNull(message.getMessageId()); + assertEquals(message.getStructuredData().size(), 0); + assertEquals(message.content().toString(StandardCharsets.UTF_8), "SHLVL : 1"); + } + }