package com.tacitknowledge.slowlight.proxyserver.handler;
import com.tacitknowledge.slowlight.proxyserver.config.HandlerConfig;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelPromise;
import io.netty.handler.traffic.ChannelTrafficShapingHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/** @author Alexandr Donciu (adonciu@tacitknowledge.com) */
public class TrafficShapingChannelHandler extends AbstractChannelHandler
{
private static final Logger LOG = LoggerFactory.getLogger(TrafficShapingChannelHandler.class);
private static final String PARAM_WRITE_LIMIT = "writeLimit";
private static final String PARAM_READ_LIMIT = "readLimit";
// TODO: netty 4 traffic shaping handler seems to not work for large data, needs to be investigated
private final ChannelTrafficShapingHandler channelTrafficShapingHandler;
public TrafficShapingChannelHandler(final HandlerConfig handlerConfig)
{
super(handlerConfig);
this.channelTrafficShapingHandler = new ChannelTrafficShapingHandler(
handlerParams.getLong(PARAM_WRITE_LIMIT),
handlerParams.getLong(PARAM_READ_LIMIT)
);
}
@Override
public void channelRead(final ChannelHandlerContext ctx, final Object msg) throws Exception
{
channelTrafficShapingHandler.channelRead(ctx, msg);
}
@Override
public void read(ChannelHandlerContext ctx) throws Exception
{
channelTrafficShapingHandler.read(ctx);
}
@Override
public void write(final ChannelHandlerContext ctx, final Object msg, final ChannelPromise promise) throws Exception
{
channelTrafficShapingHandler.write(ctx, msg, promise);
}
@Override
public void handlerAdded(final ChannelHandlerContext ctx) throws Exception
{
channelTrafficShapingHandler.handlerAdded(ctx);
}
@Override
public void handlerRemoved(final ChannelHandlerContext ctx) throws Exception
{
channelTrafficShapingHandler.handlerRemoved(ctx);
}
@Override
public String toString()
{
return channelTrafficShapingHandler.toString();
}
@Override
protected void populateHandlerParams()
{
handlerParams.setProperty(PARAM_WRITE_LIMIT, handlerConfig.getParam(PARAM_WRITE_LIMIT));
handlerParams.setProperty(PARAM_WRITE_LIMIT, handlerConfig.getParam(PARAM_READ_LIMIT));
}
@Override
protected void timerCallback()
{
final long writeLimit = handlerParams.getLong(PARAM_WRITE_LIMIT);
final long readLimit = handlerParams.getLong(PARAM_READ_LIMIT);
channelTrafficShapingHandler.configure(writeLimit, readLimit);
LOG.debug("write limit -> {}", writeLimit);
LOG.debug("read limit -> {}", readLimit);
}
}