package ecologylab.bigsemantics.httpclient;
import org.apache.http.client.params.ClientPNames;
import org.apache.http.client.protocol.RequestAcceptEncoding;
import org.apache.http.client.protocol.ResponseContentEncoding;
import org.apache.http.impl.client.AbstractHttpClient;
import org.apache.http.impl.conn.PoolingClientConnectionManager;
import org.apache.http.params.CoreProtocolPNames;
/**
* A factory for HttpClient objects.
*
* @author quyin
*/
public class HttpClientFactory
{
private PoolingClientConnectionManager connectionManager;
public HttpClientFactory()
{
this(20, 200);
}
public HttpClientFactory(int maxPerRoute, int maxTotal)
{
connectionManager = new PoolingClientConnectionManager();
connectionManager.setDefaultMaxPerRoute(maxPerRoute);
connectionManager.setMaxTotal(maxTotal);
}
public AbstractHttpClient create()
{
return create("");
}
public synchronized AbstractHttpClient create(String userAgent)
{
if (userAgent == null)
{
userAgent = "";
}
// From Apache HttpClient doc: "HttpClient is fully thread-safe when used
// with a thread-safe connection manager." The
// PoolingClientConnectionManager we are using is such as thread-safe one.
AbstractHttpClient client = new RedirectHttpClient(connectionManager);
prepareHttpClient(client);
if (userAgent.length() > 0)
{
client.getParams().setParameter(CoreProtocolPNames.USER_AGENT, userAgent);
}
return client;
}
private void prepareHttpClient(AbstractHttpClient client)
{
client.getParams().setParameter(ClientPNames.HANDLE_REDIRECTS, true);
client.addRequestInterceptor(new RequestAcceptEncoding());
client.addResponseInterceptor(new ResponseContentEncoding());
client.setRedirectStrategy(new BasicRedirectStrategy());
}
}