package com.tacitknowledge.slowlight.proxyserver.systest.util.client; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelDuplexHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelPromise; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; /** * @author Alexandr Donciu (adonciu@tacitknowledge.com) */ class ClientChannelHandler extends ChannelDuplexHandler { private Lock lock; private Condition responseReady; private int responseSize; private ServerResponse response; public ClientChannelHandler(final Lock lock, final Condition responseReady, final ServerResponse response, final int responseSize) { this.lock = lock; this.responseReady = responseReady; this.responseSize = responseSize; this.response = response; } @Override public void channelActive(final ChannelHandlerContext ctx) throws Exception { ctx.read(); } @Override public void channelRead(final ChannelHandlerContext ctx, final Object msg) throws Exception { final ByteBuf msgByteBuf = (ByteBuf) msg; final byte[] msgBytes = new byte[msgByteBuf.readableBytes()]; msgByteBuf.readBytes(msgBytes); setResponse(msgBytes); ctx.read(); } private void setResponse(final byte[] bytes) { lock.lock(); try { response.set(bytes); if (response.size() == responseSize) { responseReady.signal(); } } finally { lock.unlock(); } } @Override public void write(final ChannelHandlerContext ctx, final Object msg, final ChannelPromise promise) throws Exception { ctx.write(msg, promise); } }