package cheng.app.cnbeta.util;
import android.util.Log;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.HttpVersion;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
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.message.BasicNameValuePair;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class HttpUtil {
private static final String TAG = "HttpUtil";
private static final boolean DEBUG = true;
private static final int REQUEST_TIMEOUT = 20 * 1000;
private static final int SO_TIMEOUT = 20 * 1000;
private static final int MAX_CONNECTION = 10;
private DefaultHttpClient mClient;
private static HttpUtil sInstance;
public synchronized static HttpUtil getInstance() {
if (sInstance == null) {
sInstance = new HttpUtil();
}
return sInstance;
}
private HttpUtil() {
mClient = init();
}
private DefaultHttpClient init() {
BasicHttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, REQUEST_TIMEOUT);
HttpConnectionParams.setSoTimeout(httpParams, SO_TIMEOUT);
ConnManagerParams.setMaxConnectionsPerRoute(httpParams,
new ConnPerRouteBean(MAX_CONNECTION));
ConnManagerParams.setMaxTotalConnections(httpParams, MAX_CONNECTION);
HttpConnectionParams.setTcpNoDelay(httpParams, true);
HttpConnectionParams.setSocketBufferSize(httpParams, 8192);
HttpProtocolParams.setVersion(httpParams, HttpVersion.HTTP_1_1);
HttpProtocolParams.setUserAgent(httpParams,
String.format("Mozilla/5.0 (Android;async-http/%s)", "1.4.1"));
SchemeRegistry sr = new SchemeRegistry();
sr.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
sr.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
ClientConnectionManager c = new ThreadSafeClientConnManager(httpParams, sr);
return new DefaultHttpClient(c, httpParams);
}
public void reset() {
if (mClient != null) {
mClient.getConnectionManager().shutdown();
}
mClient = init();
}
public byte[] httpGetByte(String url) {
if (DEBUG)
Log.d(TAG, "httpGet:" + url);
HttpGet get = new HttpGet(url);
// BasicHttpParams httpParams = new BasicHttpParams();
// HttpConnectionParams.setConnectionTimeout(httpParams,
// REQUEST_TIMEOUT);
// HttpConnectionParams.setSoTimeout(httpParams, SO_TIMEOUT);
// HttpClient client = new DefaultHttpClient(httpParams);
byte[] result = null;
try {
HttpResponse response = mClient.execute(get);
int status = response.getStatusLine().getStatusCode();
if (DEBUG)
Log.d(TAG, "StatusCode:" + status);
if (status == HttpStatus.SC_OK) {
HttpEntity entity = response.getEntity();
if (entity != null) {
// result = EntityUtils.toString(entity, "UTF-8");
result = EntityUtils.toByteArray(entity);
// result = new String(result.getBytes("ISO-8859-1"),
// "UTF-8");
}
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// mClient.getConnectionManager().shutdown();
}
return result;
}
public String httpGet(String url) {
byte[] result = httpGetByte(url);
if (result != null) {
try {
return new String(result, "UTF-8");
} catch (UnsupportedEncodingException e) {
Log.e(TAG, "UnsupportedEncodingException", e);
}
}
return null;
}
public String httpPost(String url, HashMap<String, String> param, String encoding) {
HttpPost httpRequest = new HttpPost(url);
httpRequest.addHeader("Content-Type", "application/x-www-form-urlencoded");
// httpRequest.addHeader("charset", "gb2312");
// BasicHttpParams httpParams = new BasicHttpParams();
// HttpConnectionParams.setConnectionTimeout(httpParams,
// REQUEST_TIMEOUT);
// HttpConnectionParams.setSoTimeout(httpParams, SO_TIMEOUT);
// HttpProtocolParams.setVersion(httpParams, HttpVersion.HTTP_1_1);
// HttpProtocolParams.setUserAgent(httpParams,
// String.format("Mozilla/5.0 (Android;async-http/%s)", "1.4.1"));
// HttpClient client = new DefaultHttpClient();
if (param != null && param.size() > 0) {
List<NameValuePair> params = new ArrayList<NameValuePair>();
Iterator<Entry<String, String>> iterator = param.entrySet().iterator();
while (iterator.hasNext()) {
Entry<String, String> entry = (Entry<String, String>) iterator.next();
String key = (String) entry.getKey();
String value = (String) entry.getValue();
if (DEBUG)
Log.d(TAG, "param[" + key + "," + value + "]");
params.add(new BasicNameValuePair(key, value));
}
try {
HttpEntity httpentity = new UrlEncodedFormEntity(params, HTTP.UTF_8);
httpRequest.setEntity(httpentity);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
String result = null;
try {
HttpResponse response = mClient.execute(httpRequest);
int status = response.getStatusLine().getStatusCode();
if (DEBUG)
Log.d(TAG, "StatusCode:" + status);
if (status == HttpStatus.SC_OK) {
HttpEntity entity = response.getEntity();
if (entity != null) {
result = EntityUtils.toString(entity, encoding);
}
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// mClient.getConnectionManager().shutdown();
}
return result;
}
public static String encode(String s) {
if (s == null) {
return "";
}
try {
return URLEncoder.encode(s, "UTF-8").replace("+", "%20").replace("*", "%2A")
.replace("~", "%7E").replace("#", "%23");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e.getMessage(), e);
}
}
public static String escape(String src) {
int i;
char j;
StringBuilder tmp = new StringBuilder(20);
tmp.ensureCapacity(src.length() * 6);
for (i = 0; i < src.length(); i++) {
j = src.charAt(i);
if (Character.isDigit(j) || Character.isLowerCase(j) || Character.isUpperCase(j))
tmp.append(j);
else if (j < 256) {
tmp.append("%");
if (j < 16)
tmp.append("0");
tmp.append(Integer.toString(j, 16));
} else {
tmp.append("%u");
tmp.append(Integer.toString(j, 16));
}
}
return tmp.toString();
}
public static String unescape(String src) {
StringBuffer tmp = new StringBuffer();
tmp.ensureCapacity(src.length());
int lastPos = 0, pos = 0;
char ch;
while (lastPos < src.length()) {
pos = src.indexOf("%", lastPos);
if (pos == lastPos) {
if (src.charAt(pos + 1) == 'u') {
ch = (char) Integer.parseInt(src.substring(pos + 2, pos + 6), 16);
tmp.append(ch);
lastPos = pos + 6;
} else {
ch = (char) Integer.parseInt(src.substring(pos + 1, pos + 3), 16);
tmp.append(ch);
lastPos = pos + 3;
}
} else {
if (pos == -1) {
tmp.append(src.substring(lastPos));
lastPos = src.length();
} else {
tmp.append(src.substring(lastPos, pos));
lastPos = pos;
}
}
}
return tmp.toString();
}
public static String filterEntities(String src) {
StringBuffer sb = new StringBuffer();
Pattern p = Pattern.compile("&[a-zA-Z]*;|[0-9]*;");
Matcher m = p.matcher(src);
int pos1 = 0;
while (m.find(pos1)) {
int pos2 = m.start();
sb.append(src.substring(pos1, pos2));
String entity = m.group().toLowerCase();
if (" ".equals(entity) || " ".equals(entity)) {
sb.append((char)160);
} else if ("<".equals(entity) || "<".equals(entity)) {
sb.append((char)60);
} else if (">".equals(entity) || ">".equals(entity)) {
sb.append((char)62);
} else if ("&".equals(entity) || "&".equals(entity)) {
sb.append((char)38);
} else if (""".equals(entity) || """.equals(entity)) {
sb.append((char)34);
} else if ("'".equals(entity) || "'".equals(entity)) {
sb.append((char)39);
} else if ("¢".equals(entity) || "¢".equals(entity)) {
sb.append((char)0xa2);
} else if ("£".equals(entity) || "£".equals(entity)) {
sb.append((char)0xa3);
} else if ("¥".equals(entity) || "¥".equals(entity)) {
sb.append((char)0xa5);
} else if ("§".equals(entity) || "§".equals(entity)) {
sb.append((char)0xa7);
} else if ("©".equals(entity) || "©".equals(entity)) {
sb.append((char)0xa9);
} else if ("®".equals(entity) || "®".equals(entity)) {
sb.append((char)0xae);
} else if ("×".equals(entity) || "×".equals(entity)) {
sb.append((char)215);
} else if ("÷".equals(entity) || "÷".equals(entity)) {
sb.append((char)247);
}
pos1 = m.end();
}
sb.append(src.substring(pos1));
return sb.toString();
}
public String getLocalIPAddress() {
try {
for (Enumeration<NetworkInterface> mEnumeration = NetworkInterface
.getNetworkInterfaces(); mEnumeration.hasMoreElements();) {
NetworkInterface intf = mEnumeration.nextElement();
for (Enumeration<InetAddress> enumIPAddr = intf.getInetAddresses(); enumIPAddr
.hasMoreElements();) {
InetAddress inetAddress = enumIPAddr.nextElement();
if (!inetAddress.isLoopbackAddress()) {
return inetAddress.getHostAddress().toString();
}
}
}
} catch (SocketException ex) {
Log.e("Error", ex.toString());
}
return null;
}
}