package glaze.client.async;
import glaze.client.Response;
import glaze.client.handlers.CroakErrorHandler;
import glaze.client.handlers.ErrorHandler;
import java.io.IOException;
import org.apache.http.ContentTooLongException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpException;
import org.apache.http.HttpResponse;
import org.apache.http.entity.ContentType;
import org.apache.http.nio.ContentDecoder;
import org.apache.http.nio.IOControl;
import org.apache.http.nio.entity.ContentBufferEntity;
import org.apache.http.nio.protocol.AbstractAsyncResponseConsumer;
import org.apache.http.nio.util.HeapByteBufferAllocator;
import org.apache.http.nio.util.SimpleInputBuffer;
import org.apache.http.protocol.HttpContext;
public class ResponseConsumer extends AbstractAsyncResponseConsumer<Response>
{
private static final long MAX_CONTENT_LEN = 2147483647L;
private volatile Response response;
private volatile SimpleInputBuffer buf;
private final ErrorHandler errorHandler;
public ResponseConsumer()
{
this(CroakErrorHandler.instance());
}
public ResponseConsumer(ErrorHandler errorHandler)
{
this.errorHandler = errorHandler == null ? CroakErrorHandler.instance() : errorHandler;
}
@Override
protected Response buildResult(HttpContext paramHttpContext) throws Exception
{
return response;
}
@Override
protected void onContentReceived(ContentDecoder decoder, IOControl ioctrl) throws IOException
{
if (this.buf == null) {
throw new IllegalStateException("Content buffer is null");
}
this.buf.consumeContent(decoder);
}
@Override
protected void onEntityEnclosed(HttpEntity entity, ContentType contentType) throws IOException
{
long len = entity.getContentLength();
if (len > MAX_CONTENT_LEN) {
throw new ContentTooLongException("Entity content is too long: " + len);
}
if (len < 0L) {
len = 4096L;
}
this.buf = new SimpleInputBuffer((int) len, new HeapByteBufferAllocator());
this.response.getHttpResponse().setEntity(new ContentBufferEntity(entity, this.buf));
}
@Override
protected void onResponseReceived(HttpResponse httpResponse) throws HttpException, IOException
{
this.response = new Response(httpResponse);
if (response.isError()) {
errorHandler.onError(response);
}
}
@Override
protected void releaseResources()
{
this.response = null;
this.buf = null;
}
}