001package org.xbib.elasticsearch.http.netty;
002
003import org.jboss.netty.channel.ChannelPipeline;
004import org.jboss.netty.channel.ChannelPipelineFactory;
005import org.jboss.netty.channel.Channels;
006import org.jboss.netty.handler.codec.http.HttpChunkAggregator;
007import org.jboss.netty.handler.codec.http.HttpContentCompressor;
008import org.jboss.netty.handler.codec.http.HttpContentDecompressor;
009import org.jboss.netty.handler.codec.http.HttpRequestDecoder;
010import org.jboss.netty.handler.codec.http.HttpResponseEncoder;
011
012public class NettyHttpServerPipelineFactory implements ChannelPipelineFactory {
013
014    protected final NettyWebSocketServerTransport transport;
015
016    private final NettyHttpRequestHandler requestHandler;
017
018    NettyHttpServerPipelineFactory(NettyWebSocketServerTransport transport) {
019        this.transport = transport;
020        this.requestHandler = new NettyHttpRequestHandler(transport);
021    }
022
023    @Override
024    public ChannelPipeline getPipeline() throws Exception {
025        ChannelPipeline pipeline = Channels.pipeline();
026        pipeline.addLast("openChannels", transport.serverOpenChannels);
027        HttpRequestDecoder requestDecoder = new HttpRequestDecoder(
028                (int) transport.maxInitialLineLength.bytes(),
029                (int) transport.maxHeaderSize.bytes(),
030                (int) transport.maxChunkSize.bytes());
031        if (transport.maxCumulationBufferCapacity != null) {
032            if (transport.maxCumulationBufferCapacity.bytes() > Integer.MAX_VALUE) {
033                requestDecoder.setMaxCumulationBufferCapacity(Integer.MAX_VALUE);
034            } else {
035                requestDecoder.setMaxCumulationBufferCapacity((int) transport.maxCumulationBufferCapacity.bytes());
036            }
037        }
038        if (transport.maxCompositeBufferComponents != -1) {
039            requestDecoder.setMaxCumulationBufferComponents(transport.maxCompositeBufferComponents);
040        }
041        pipeline.addLast("decoder", requestDecoder);
042        if (transport.compression) {
043            pipeline.addLast("decoder_compress", new HttpContentDecompressor());
044        }
045        HttpChunkAggregator httpChunkAggregator = new HttpChunkAggregator((int) transport.maxContentLength.bytes());
046        if (transport.maxCompositeBufferComponents != -1) {
047            httpChunkAggregator.setMaxCumulationBufferComponents(transport.maxCompositeBufferComponents);
048        }
049        pipeline.addLast("aggregator", httpChunkAggregator);
050        pipeline.addLast("encoder", new HttpResponseEncoder());
051        if (transport.compression) {
052            pipeline.addLast("encoder_compress", new HttpContentCompressor(transport.compressionLevel));
053        }
054        pipeline.addLast("handler", requestHandler);
055        return pipeline;
056    }
057}