package JsonClient.Java.httpstuff;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.GZIPInputStream;
import org.apache.http.Header;
import org.apache.http.HeaderElement;
import org.apache.http.HttpEntity;
import org.apache.http.HttpException;
import org.apache.http.HttpRequest;
import org.apache.http.HttpRequestInterceptor;
import org.apache.http.HttpResponse;
import org.apache.http.HttpResponseInterceptor;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.entity.HttpEntityWrapper;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.HttpContext;
import CIAPI.Java.logging.Log;
/**
* Class representing a request to a given url
*
* @author justin nelson
*
*/
public abstract class AbstractHttpRequestItem implements HttpRequestItem {
protected DefaultHttpClient client;
protected HttpRequestBase method;
private String url;
/**
* Creates a new Request item.
*
* @param url
* the url to request
*/
public AbstractHttpRequestItem(String url) {
if (url == null)
throw new NullPointerException("The url cannot be null");
this.url = url;
client = new DefaultHttpClient();
prepareClient(client);
method = getRequestItem(url);
method.addHeader("Content-Type", "application/json");
}
protected abstract HttpRequestBase getRequestItem(String url);
private InputStream result;
private boolean complete = false;
/* (non-Javadoc)
* @see CIAPI.Java.httpstuff.HttpRequestItem#makeRequest()
*/
@Override
public InputStream makeRequest() throws ClientProtocolException, IOException {
Log.trace("Executing request:" + url);
beforeRequest(method, client);
HttpResponse response = client.execute(method);
HttpEntity entity = response.getEntity();
result = entity.getContent();
complete = true;
return result;
}
/**
* This runs right before the request is made. The default implementation does nothing.
*/
protected void beforeRequest(HttpRequestBase requestMethod, DefaultHttpClient httpClient){
}
/* (non-Javadoc)
* @see CIAPI.Java.httpstuff.HttpRequestItem#isComplete()
*/
@Override
public boolean isComplete() {
return complete;
}
/* (non-Javadoc)
* @see CIAPI.Java.httpstuff.HttpRequestItem#getResult()
*/
@Override
public InputStream getResult() {
return result;
}
private static void prepareClient(DefaultHttpClient client) {
client.addRequestInterceptor(new HttpRequestInterceptor() {
public void process(final HttpRequest request, final HttpContext context) throws HttpException, IOException {
if (!request.containsHeader("Accept-Encoding")) {
request.addHeader("Accept-Encoding", "gzip");
}
}
});
client.addResponseInterceptor(new HttpResponseInterceptor() {
@Override
public void process(HttpResponse response, HttpContext context) throws HttpException, IOException {
HttpEntity entity = response.getEntity();
Header ceheader = entity.getContentEncoding();
if (ceheader != null) {
HeaderElement[] codecs = ceheader.getElements();
for (int i = 0; i < codecs.length; i++) {
if (codecs[i].getName().equalsIgnoreCase("gzip")) {
response.setEntity(new GzipDecompressingEntity(response.getEntity()));
return;
}
}
}
}
});
}
static class GzipDecompressingEntity extends HttpEntityWrapper {
public GzipDecompressingEntity(final HttpEntity entity) {
super(entity);
}
@Override
public InputStream getContent() throws IOException, IllegalStateException {
// the wrapped entity's getContent() decides about repeatability
InputStream wrappedin = wrappedEntity.getContent();
return new GZIPInputStream(wrappedin);
}
@Override
public long getContentLength() {
// length of ungzipped content is not known
return -1;
}
}
}