package biz.paluch.logging.gelf.netty; import java.util.ArrayList; import java.util.List; import biz.paluch.logging.gelf.JsonUtil; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.handler.codec.http.*; import io.netty.util.CharsetUtil; /** * @author Aleksandar Stojadinovic */ public class GelfInboundHTTPHandler extends SimpleChannelInboundHandler<Object> { private List<Object> values = new ArrayList<Object>(); private HttpRequest httpRequest; private HttpContent httpContent; private HttpResponseStatus responseStatus = HttpResponseStatus.ACCEPTED; private final StringBuilder contentBuffer = new StringBuilder(); @Override protected void channelRead0(ChannelHandlerContext channelHandlerContext, Object message) throws Exception { resetState(); if (message instanceof HttpRequest) { httpRequest = (HttpRequest) message; } if (message instanceof HttpContent) { httpContent = (HttpContent) message; contentBuffer.append(httpContent.content().toString(CharsetUtil.UTF_8)); if (message instanceof LastHttpContent) { Object parsedContent = JsonUtil.parseToMap(contentBuffer.toString()); synchronized (values) { values.add(parsedContent); } writeResponse(channelHandlerContext); closeConnection(channelHandlerContext); } } } private void resetState() { this.values.clear(); this.httpContent = null; this.httpRequest = null; } private void closeConnection(ChannelHandlerContext channelHandlerContext) { channelHandlerContext.writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE); } private void writeResponse(ChannelHandlerContext ctx) { FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, responseStatus); ctx.write(response); } public List<Object> getValues() { return values; } public String getUri() { return httpRequest.getUri(); } public HttpRequest getHttpRequest() { return httpRequest; } public void setReturnStatus(HttpResponseStatus status) { this.responseStatus = status; } }