package ddth.dasp.servlet.netty; import java.util.concurrent.atomic.AtomicLong; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.buffer.ChannelBuffers; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelFuture; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.channel.ChannelStateEvent; import org.jboss.netty.channel.ExceptionEvent; import org.jboss.netty.channel.MessageEvent; import org.jboss.netty.channel.group.ChannelGroup; import org.jboss.netty.channel.group.DefaultChannelGroup; import org.jboss.netty.handler.codec.http.HttpChunk; import org.jboss.netty.handler.codec.http.HttpRequest; import org.jboss.netty.handler.timeout.IdleStateAwareChannelHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public abstract class AbstractHttpHandler extends IdleStateAwareChannelHandler { public static ChannelGroup ALL_CHANNELS = new DefaultChannelGroup("NettyHttpServer"); public static AtomicLong COUNTER = new AtomicLong(); private static Logger LOGGER = LoggerFactory.getLogger(AbstractHttpHandler.class); private HttpRequest currentRequest; /** * {@inheritDoc} */ @Override public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { COUNTER.incrementAndGet(); try { Object message = e.getMessage(); Channel userChannel = e.getChannel(); boolean processMessage = false; if (message instanceof HttpChunk) { if (currentRequest == null) { throw new IllegalStateException("No chunk started!"); } ChannelBuffer channelBuffer = currentRequest.getContent(); if (channelBuffer == null) { throw new IllegalStateException("No chunk started!"); } HttpChunk httpChunk = (HttpChunk) message; ChannelBuffer compositeBuffer = ChannelBuffers.wrappedBuffer(channelBuffer, httpChunk.getContent()); currentRequest.setContent(compositeBuffer); processMessage = httpChunk.isLast(); } else if (message instanceof HttpRequest) { currentRequest = (HttpRequest) message; processMessage = !currentRequest.isChunked(); } if (processMessage) { handleRequest(currentRequest, userChannel); } } finally { COUNTER.decrementAndGet(); } } protected abstract void handleRequest(HttpRequest request, Channel userChannel) throws Exception; /** * {@inheritDoc} */ @Override public void channelOpen(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { ALL_CHANNELS.add(e.getChannel()); } /** * {@inheritDoc} */ @Override public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception { Throwable t = e.getCause(); LOGGER.error(t.getMessage(), t); ChannelFuture future = e.getFuture(); if (future != null) { e.getFuture().cancel(); } e.getChannel().close(); } }