package org.eck; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.handler.codec.http.HttpContent; import io.netty.handler.codec.http.HttpRequest; import io.netty.handler.codec.http.LastHttpContent; import io.netty.util.CharsetUtil; import org.eck.exceptions.LocomotiveException; import org.eck.middlewares.LocomotiveMiddleware; public class LocomotiveHandler extends SimpleChannelInboundHandler<Object> { private HttpRequest request; private Locomotive locomotive; private LocomotiveRequestWrapper requestWrapper; public LocomotiveHandler(Locomotive locomotive) { this.locomotive = locomotive; } @Override public void channelReadComplete(ChannelHandlerContext ctx) { ctx.flush(); } @Override protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception { if (msg instanceof HttpRequest) { // Deal with request, parse url and other things HttpRequest request = this.request = (HttpRequest) msg; String uri = request.getUri(); if (uri.contains("?")) { uri = uri.substring(0, uri.indexOf("?")); } String pattern = locomotive.getUriPattern(uri); this.requestWrapper = new LocomotiveRequestWrapper(this.request, uri, pattern); } if (msg instanceof HttpContent) { HttpContent httpContent = (HttpContent) msg; ByteBuf content = httpContent.content(); if (content.isReadable()) { requestWrapper.body(content.toString(CharsetUtil.UTF_8)); } if (msg instanceof LastHttpContent) { LocomotiveResponseWrapper resp = new LocomotiveResponseWrapper( httpContent, ctx); try { for (LocomotiveMiddleware middleware : locomotive .middlewares()) { middleware.execute(requestWrapper, resp); if (requestWrapper.isProcessed()) { break; } } } catch (LocomotiveException e) { requestWrapper.processed(); resp.status(e.code()); resp.send(e.getMessage()); } catch (Exception e) { requestWrapper.processed(); resp.status(500); resp.send(e.getMessage()); e.printStackTrace(); } if (!requestWrapper.isProcessed()) { resp.status(404); resp.send(); } } } } }