content: package com.alecgorge.minecraft.jsonapi.packets.netty;
  
  import io.netty.buffer.ByteBuf;
  import io.netty.buffer.ByteBufInputStream;
  import io.netty.buffer.ByteBufOutputStream;
  import io.netty.channel.Channel;
  import io.netty.channel.ChannelHandler;
  import io.netty.channel.ChannelHandler.Sharable;
  import io.netty.channel.ChannelHandlerContext;
  import io.netty.channel.ChannelInboundHandlerAdapter;
  import io.netty.channel.nio.NioEventLoopGroup;
  import io.netty.handler.codec.MessageToByteEncoder;
  
  import java.net.InetSocketAddress;
  import java.util.ArrayList;
  import java.util.List;
  import java.util.Map.Entry;
  
  import com.alecgorge.minecraft.jsonapi.JSONAPI;
  import com.alecgorge.minecraft.jsonapi.JSONServer;
  
  @Sharable
  public class JSONAPIChannelReadHandler extends ChannelInboundHandlerAdapter {
  	List<Entry<String, ChannelHandler>>	handlers	= new ArrayList<Entry<String, ChannelHandler>>();
  	NioEventLoopGroup					eventGroup;
  	JSONAPI								api;
  
  	public JSONAPIChannelReadHandler(JSONAPI api, final NioEventLoopGroup eventGroup) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
  		this.eventGroup = eventGroup;
  		this.api = api;
  	}
  
  	@Override
  	public void channelRead(ChannelHandlerContext ctx, Object msg) {
  		Channel child = (Channel) msg;
  
  		JSONAPI.dbug("channelRead pipeline hashcode: " + ctx.channel().pipeline().hashCode());
  
  		child.pipeline().addFirst(new JSONAPIChannelDecoder(api));
  		this.eventGroup.register(child);
  
  		ctx.fireChannelRead(msg);
  	}
  
  	public class HTTPRequest extends ByteBufInputStream {
  
  		public HTTPRequest(ByteBuf buf) {
  			super(buf);
  		}
  	}
  
  	public class JSONAPIChannelEncoder extends MessageToByteEncoder<HTTPRequest> {
  		JSONServer	server	= JSONAPI.instance.getJSONServer();
  
  		@Override
  		protected void encode(ChannelHandlerContext ctx, HTTPRequest req, ByteBuf buf) throws Exception {
  			InetSocketAddress addr = (InetSocketAddress) ctx.channel().remoteAddress();
  
  			ByteBufOutputStream oup = new ByteBufOutputStream(buf);
  			server.new HTTPSession(req, oup, addr.getAddress(), true);
  		}
  	}
  }
  