@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
RequestContext context = ctx.channel().attr(client.requestKey).getAndSet(null);
try {
if (context != null && context.tryDone()) {
LOGGER.debug("receive server response, request={}, response={}", context, msg);
HttpResponse response = (HttpResponse) msg;
if (isRedirect(response)) {
if (context.onRedirect(response)) {
String location = getRedirectLocation(context.request, response);
if (location != null && location.length() > 0) {
context.cancelled.set(false);
context.request.setUri(location);
client.request(context);
return;
}
}
}
context.onResponse(response);
} else {
LOGGER.warn("receive server response but timeout, request={}, response={}", context, msg);
}
} finally {
client.pool.tryRelease(ctx.channel());
ReferenceCountUtil.release(msg);
}
}