package io.rong.util;
import io.rong.models.SdkHttpResult;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
public class HttpUtil {
private static final String APPKEY = "RC-App-Key";
private static final String NONCE = "RC-Nonce";
private static final String TIMESTAMP = "RC-Timestamp";
private static final String SIGNATURE = "RC-Signature";
private static SSLContext sslCtx = null;
static {
try {
sslCtx = SSLContext.getInstance("TLS");
X509TrustManager tm = new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] xcs,
String string) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] xcs,
String string) throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
sslCtx.init(null, new TrustManager[] { tm }, null);
} catch (Exception e) {
e.printStackTrace();
}
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String arg0, SSLSession arg1) {
// TODO Auto-generated method stub
return true;
}
});
HttpsURLConnection
.setDefaultSSLSocketFactory(sslCtx.getSocketFactory());
}
// 设置body体
public static void setBodyParameter(StringBuilder sb, HttpURLConnection conn)
throws IOException {
DataOutputStream out = new DataOutputStream(conn.getOutputStream());
out.writeBytes(sb.toString());
out.flush();
out.close();
}
// 添加签名header
public static HttpURLConnection CreatePostHttpConnection(String appKey,
String appSecret, String uri) throws MalformedURLException,
IOException, ProtocolException {
return CreatePostHttpConnection(appKey, appSecret, uri,
"application/x-www-form-urlencoded");
}
public static HttpURLConnection CreateJsonPostHttpConnection(String appKey,
String appSecret, String uri) throws MalformedURLException,
IOException, ProtocolException {
return CreatePostHttpConnection(appKey, appSecret, uri,
"application/json");
}
public static void setBodyParameter(String str, HttpURLConnection conn)
throws IOException {
DataOutputStream out = new DataOutputStream(conn.getOutputStream());
out.write(str.getBytes("utf-8"));
out.flush();
out.close();
}
private static HttpURLConnection CreatePostHttpConnection(String appKey,
String appSecret, String uri, String contentType)
throws MalformedURLException, IOException, ProtocolException {
String nonce = String.valueOf(Math.random() * 1000000);
String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
StringBuilder toSign = new StringBuilder(appSecret).append(nonce)
.append(timestamp);
String sign = CodeUtil.hexSHA1(toSign.toString());
URL url = new URL(uri);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setUseCaches(false);
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.setInstanceFollowRedirects(true);
conn.setConnectTimeout(30000);
conn.setReadTimeout(30000);
conn.setRequestProperty(APPKEY, appKey);
conn.setRequestProperty(NONCE, nonce);
conn.setRequestProperty(TIMESTAMP, timestamp);
conn.setRequestProperty(SIGNATURE, sign);
conn.setRequestProperty("Content-Type", contentType);
return conn;
}
public static byte[] readInputStream(InputStream inStream) throws Exception {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = inStream.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
}
byte[] data = outStream.toByteArray();
outStream.close();
inStream.close();
return data;
}
public static SdkHttpResult returnResult(HttpURLConnection conn)
throws Exception, IOException {
String result;
InputStream input = null;
if (conn.getResponseCode() == 200) {
input = conn.getInputStream();
} else {
input = conn.getErrorStream();
}
result = new String(readInputStream(input), "UTF-8");
return new SdkHttpResult(conn.getResponseCode(), result);
}
}