package org.handwerkszeug.riak.transport.internal;
import org.handwerkszeug.riak.util.NettyUtil;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
import org.jboss.netty.handler.codec.http.HttpChunk;
import org.jboss.netty.handler.codec.http.HttpResponse;
/**
* @author taichi
*/
public class ChunkedMessageAggregator implements MessageHandler {
ChannelBuffer chunkedBuffer;
HttpResponse chunkedResponse;
final String procedure;
final MessageHandler handler;
public ChunkedMessageAggregator(String procedure, MessageHandler handler) {
this.procedure = procedure;
this.handler = handler;
}
@Override
public boolean handle(Object receive, CountDownRiakFuture future)
throws Exception {
if (receive instanceof HttpResponse) {
HttpResponse response = (HttpResponse) receive;
if (NettyUtil.isSuccessful(response.getStatus())) {
if (response.isChunked()) {
this.chunkedBuffer = response.getContent();
this.chunkedResponse = response;
} else {
this.handler.handle(response, future);
return true;
}
}
} else if (receive instanceof HttpChunk) {
HttpChunk chunk = (HttpChunk) receive;
boolean done = chunk.isLast();
if (done) {
this.chunkedResponse.setChunked(false);
this.chunkedResponse.setContent(this.chunkedBuffer);
this.handler.handle(this.chunkedResponse, future);
} else {
this.chunkedBuffer = ChannelBuffers.wrappedBuffer(
this.chunkedBuffer, chunk.getContent());
}
return done;
}
return false;
}
}