package com.letv.datastatistics.http;
import java.io.IOException;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.HttpVersion;
import org.apache.http.NoHttpResponseException;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpRequestRetryHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.params.HttpClientParams;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.params.ConnManagerParams;
import org.apache.http.conn.params.ConnPerRouteBean;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HTTP;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;
import android.content.Context;
import android.util.Log;
import com.letv.datastatistics.DataStatistics;
import com.letv.datastatistics.dao.StatisCacheBean;
import com.letv.datastatistics.db.StatisDBHandler;
import com.letv.datastatistics.exception.HttpDataConnectionException;
import com.letv.datastatistics.exception.HttpDataParserException;
public class HttpEngine {
private static HttpEngine mInstance = null;
private static final Object mInstanceSync = new Object();
private DefaultHttpClient mDefaultHttpClient = null;
private HttpEngine() {
mDefaultHttpClient = createHttpClient();
mDefaultHttpClient.setHttpRequestRetryHandler(new HttpRequestRetryHandler() {
@Override
public boolean retryRequest(IOException exception, int executionCount, HttpContext context) {
if(DataStatistics.getInstance().isDebug()) {
Log.d(DataStatistics.TAG, exception.getClass() + ":" + exception.getMessage() + ",executionCount:" + executionCount);
}
if(executionCount >= 3) {
return false;
}
if(exception instanceof NoHttpResponseException) {
return true;
} else if(exception instanceof ClientProtocolException) {
return true;
}
return false;
}
});
}
public static HttpEngine getInstance() {
synchronized (mInstanceSync) {
if (mInstance != null) {
return mInstance;
}
mInstance = new HttpEngine();
}
return mInstance;
}
public static final int CON_TIME_OUT_MS = 10000;
public static final int SO_TIME_OUT_MS = 10000;
public static final int SOCKET_BUFFER_SIZE = 8 * 1024;
public static final int MAX_CONNECTIONS_PER_HOST = 3;
public static final int MAX_TOTAL_CONNECTIONS = 3;
public static final int GET_CONNECTION_TIMEOUT = 1000;
public DefaultHttpClient createHttpClient() {
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
registry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
HttpParams params = createHttpParams();
ClientConnectionManager connManager = new ThreadSafeClientConnManager(params, registry);
//SingleClientConnManager connManager = new SingleClientConnManager(params,registry);
//ThreadSafeClientConnManager connManager = new ThreadSafeClientConnManager(params, registry);
return new DefaultHttpClient(connManager, params);
}
private HttpParams createHttpParams() {
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
HttpProtocolParams.setUseExpectContinue(params, false);
ConnPerRouteBean connPerRoute = new ConnPerRouteBean(MAX_CONNECTIONS_PER_HOST);
ConnManagerParams.setMaxConnectionsPerRoute(params, connPerRoute);
ConnManagerParams.setMaxTotalConnections(params, MAX_TOTAL_CONNECTIONS);
ConnManagerParams.setTimeout(params, GET_CONNECTION_TIMEOUT);
HttpConnectionParams.setConnectionTimeout(params, CON_TIME_OUT_MS);
HttpConnectionParams.setSoTimeout(params, SO_TIME_OUT_MS);
HttpConnectionParams.setStaleCheckingEnabled(params, false);
HttpConnectionParams.setTcpNoDelay(params, true);
HttpConnectionParams.setSocketBufferSize(params, SOCKET_BUFFER_SIZE);
HttpClientParams.setRedirecting(params, false);
//HttpClientParams.setCookiePolicy(params, CookiePolicy.BROWSER_COMPATIBILITY);
return params;
}
public String doHttpGet(Context context, StatisCacheBean mStatisCacheBean) throws HttpDataConnectionException, HttpDataParserException {
// if(DataStatistics.getInstance().isDebug()) {
Log.d(DataStatistics.TAG, "url:" + mStatisCacheBean.getCacheData());
// }
if(mStatisCacheBean==null){
return null;
}
StatisDBHandler.saveLocalCache(context, mStatisCacheBean);
HttpGet httpGet = new HttpGet(mStatisCacheBean.getCacheData());
try {
HttpResponse httpResponse = mDefaultHttpClient.execute(httpGet);
int responseCode = httpResponse.getStatusLine().getStatusCode();
// if(DataStatistics.getInstance().isDebug()) {
Log.d(DataStatistics.TAG, "responseCode:" + responseCode);
// }
switch (responseCode) {
case HttpStatus.SC_OK:
String result = EntityUtils.toString(httpResponse.getEntity(),HTTP.UTF_8);
if(DataStatistics.getInstance().isDebug()) {
Log.d(DataStatistics.TAG, "result:" + result);
}
StatisDBHandler.deleteByCacheId(context, mStatisCacheBean.getCacheId());
return result;
default:
throw new HttpDataConnectionException(httpResponse.getStatusLine().toString());
}
} catch (ParseException e) {
e.printStackTrace();
throw new HttpDataParserException(e);
} catch (ClientProtocolException e) {
e.printStackTrace();
throw new HttpDataConnectionException(e);
} catch (IOException e) {
e.printStackTrace();
throw new HttpDataConnectionException(e);
} finally {
httpGet.abort();
mDefaultHttpClient.getConnectionManager().closeExpiredConnections();
}
}
public String doHttpGet(String url) throws HttpDataConnectionException, HttpDataParserException {
if(DataStatistics.getInstance().isDebug()) {
Log.d(DataStatistics.TAG, "url:" + url);
}
if(url==null){
return null;
}
HttpGet httpGet = new HttpGet(url);
try {
HttpResponse httpResponse = mDefaultHttpClient.execute(httpGet);
int responseCode = httpResponse.getStatusLine().getStatusCode();
if(DataStatistics.getInstance().isDebug()) {
Log.d(DataStatistics.TAG, "responseCode:" + responseCode);
}
switch (responseCode) {
case HttpStatus.SC_OK:
String result = EntityUtils.toString(httpResponse.getEntity(),HTTP.UTF_8);
if(DataStatistics.getInstance().isDebug()) {
Log.d(DataStatistics.TAG, "result:" + result);
}
return result;
default:
throw new HttpDataConnectionException(httpResponse.getStatusLine().toString());
}
} catch (ParseException e) {
e.printStackTrace();
throw new HttpDataParserException(e);
} catch (ClientProtocolException e) {
e.printStackTrace();
throw new HttpDataConnectionException(e);
} catch (IOException e) {
e.printStackTrace();
throw new HttpDataConnectionException(e);
} finally {
httpGet.abort();
mDefaultHttpClient.getConnectionManager().closeExpiredConnections();
}
}
public void closeHttpEngine() {
if(mDefaultHttpClient != null && mDefaultHttpClient.getConnectionManager() != null) {
mDefaultHttpClient.getConnectionManager().shutdown();
}
if(mInstance != null) {
mInstance = null;
}
}
}