package com.facebook.presto.jdbc.internal.airlift.http.client.netty;
import com.facebook.presto.jdbc.internal.guava.base.Preconditions;
import com.facebook.presto.jdbc.internal.guava.primitives.Ints;
import com.facebook.presto.jdbc.internal.airlift.units.DataSize;
import com.facebook.presto.jdbc.internal.airlift.units.Duration;
import com.facebook.presto.jdbc.internal.netty.channel.ChannelPipeline;
import com.facebook.presto.jdbc.internal.netty.channel.ChannelPipelineFactory;
import com.facebook.presto.jdbc.internal.netty.handler.codec.http.HttpChunkAggregator;
import com.facebook.presto.jdbc.internal.netty.handler.codec.http.HttpClientCodec;
import com.facebook.presto.jdbc.internal.netty.handler.codec.http.HttpContentDecompressor;
import com.facebook.presto.jdbc.internal.netty.handler.execution.ExecutionHandler;
import com.facebook.presto.jdbc.internal.netty.handler.execution.OrderedMemoryAwareThreadPoolExecutor;
import com.facebook.presto.jdbc.internal.netty.handler.timeout.ReadTimeoutHandler;
import com.facebook.presto.jdbc.internal.netty.util.Timer;
import java.util.concurrent.TimeUnit;
import static com.facebook.presto.jdbc.internal.netty.channel.Channels.pipeline;
public class HttpClientPipelineFactory
implements ChannelPipelineFactory
{
private final Timer timer;
private final OrderedMemoryAwareThreadPoolExecutor executor;
private final ReadTimeoutHandler timeoutHandler;
private final NettyConnectionPool nettyConnectionPool;
private final int maxContentLength;
public HttpClientPipelineFactory(NettyConnectionPool nettyConnectionPool,
Timer timer,
OrderedMemoryAwareThreadPoolExecutor executor,
Duration readTimeout,
DataSize maxContentLength)
{
this.timer = timer;
Preconditions.checkNotNull(nettyConnectionPool, "nettyConnectionPool is null");
Preconditions.checkNotNull(executor, "executor is null");
Preconditions.checkNotNull(readTimeout, "readTimeout is null");
Preconditions.checkNotNull(maxContentLength, "maxContentLength is null");
this.nettyConnectionPool = nettyConnectionPool;
this.executor = executor;
this.timeoutHandler = new ReadTimeoutHandler(this.timer, readTimeout.toMillis(), TimeUnit.MILLISECONDS);
this.maxContentLength = Ints.checkedCast(maxContentLength.toBytes());
}
public ChannelPipeline getPipeline()
throws Exception
{
// Create a default pipeline implementation.
ChannelPipeline pipeline = pipeline();
// timeout read requests
pipeline.addLast("timeout", timeoutHandler);
// read and write http messages
pipeline.addLast("codec", new HttpClientCodec());
// decompress gzip responses
pipeline.addLast("inflater", new HttpContentDecompressor());
// gather all chunks into a single http message
pipeline.addLast("aggregator", new HttpChunkAggregator(maxContentLength));
// move response handler to user worker pool
pipeline.addLast("pipelineExecutor", new ExecutionHandler(executor));
// response handler
pipeline.addLast("handler", new NettyHttpResponseChannelHandler(nettyConnectionPool));
return pipeline;
}
}