package com.fancl.iloyalty.util;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.util.List;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.CoreProtocolPNames;
import org.apache.http.params.HttpParams;
import org.apache.http.util.EntityUtils;
import com.fancl.iloyalty.Constants;
import com.fancl.iloyalty.service.callback.HttpDownloadFileCallback;
import com.google.gson.JsonObject;
public class HttpUtil {
private static final String SUB_TAG = "HttpUtil";
private static void log(String message)
{
LogController.log(SUB_TAG + " >>> " + message);
}
public static byte[] downloadXMLFromGet(String url, String[] keys, String[] values) throws ClientProtocolException, ConnectTimeoutException, Exception{
return HttpUtil.downloadXMLFromGet(url, keys, values, Constants.GENERAL_HTTP_REQUEST_TIMEOUT);
}
public static byte[] downloadXMLFromGet(String url, String[] keys, String[] values, int timeout) throws ClientProtocolException, ConnectTimeoutException, Exception {
String getURL = url;
if (keys != null && values != null)
{
if (keys.length != values.length)
{
throw new Exception("keys length and values length not equal.");
}
HttpUtil.log("url : " + url);
int i;
for (i = 0; i < keys.length; i++)
{
if (i == 0)
{
getURL += "?" + keys[i] + "=" + URLEncoder.encode(values[i], "utf-8");
}
else
{
getURL += "&" + keys[i] + "=" + URLEncoder.encode(values[i], "utf-8");
}
}
}
URL getUrl = new URL(getURL);
HttpURLConnection connection = (HttpURLConnection) getUrl.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(timeout);
connection.setReadTimeout(timeout);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try
{
connection.connect();
if (connection.getResponseCode() == 200)
{
InputStream inputStream = connection.getInputStream();
int size = 0;
byte[] buf = new byte[1024];
while ((size = inputStream.read(buf)) > 0)
{
byteArrayOutputStream.write(buf, 0, size);
}
}
connection.disconnect();
return byteArrayOutputStream.toByteArray();
}
catch (ClientProtocolException e) {
if(connection != null)
{
connection.disconnect();
}
throw e;
}
catch (ConnectTimeoutException e) {
if(connection != null)
{
connection.disconnect();
}
throw e;
}
catch (Exception e) {
if(connection != null)
{
connection.disconnect();
}
throw e;
}
}
public static byte[] downloadXMLFromPost(String url, String[] keys, String[] values) throws ClientProtocolException, ConnectTimeoutException, Exception{
return HttpUtil.downloadXMLFromPost(url, keys, values, Constants.GENERAL_HTTP_REQUEST_TIMEOUT);
}
public static byte[] downloadXMLFromPost(String url, String[] keys, String[] values, int timeout) throws ClientProtocolException, ConnectTimeoutException, Exception {
String urlParameters = "";
if (keys != null && values != null)
{
if (keys.length != values.length)
{
throw new Exception("keys length and values length not equal.");
}
HttpUtil.log("url : " + url);
int i;
for (i = 0; i < keys.length; i++)
{
if (i == 0)
{
urlParameters += keys[i] + "=" + URLEncoder.encode(values[i], "utf-8");
}
else
{
urlParameters += "&" + keys[i] + "=" + URLEncoder.encode(values[i], "utf-8");
}
}
}
HttpUtil.log("urlParameters >>> " + urlParameters);
URL getUrl = new URL(url);
HttpURLConnection connection = (HttpURLConnection) getUrl.openConnection();
connection.setRequestMethod("POST");
connection.setConnectTimeout(timeout);
connection.setReadTimeout(timeout);
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setInstanceFollowRedirects(false);
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("charset", "utf-8");
connection.setRequestProperty("Content-Length", "" + Integer.toString(urlParameters.getBytes().length));
connection.setUseCaches (false);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try
{
connection.connect();
DataOutputStream wr = new DataOutputStream(connection.getOutputStream ());
wr.writeBytes(urlParameters);
wr.flush();
wr.close();
if (connection.getResponseCode() == 200)
{
InputStream inputStream = connection.getInputStream();
int size = 0;
byte[] buf = new byte[1024];
while ((size = inputStream.read(buf)) > 0)
{
byteArrayOutputStream.write(buf, 0, size);
}
}
connection.disconnect();
return byteArrayOutputStream.toByteArray();
}
catch (ClientProtocolException e) {
if(connection != null)
{
connection.disconnect();
}
throw e;
}
catch (ConnectTimeoutException e) {
if(connection != null)
{
connection.disconnect();
}
throw e;
}
catch (Exception e) {
if(connection != null)
{
connection.disconnect();
}
throw e;
}
}
public static String convertStreamToString(InputStream is) throws Exception {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null)
{
sb.append(line + "\n");
}
is.close();
return sb.toString();
}
public static boolean uploadFile(String url, String fileKey, File file) throws Exception
{
DefaultHttpClient mHttpClient = new DefaultHttpClient();
HttpParams params = new BasicHttpParams();
params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
try {
HttpUtil.log("strart upload file");
HttpPost httppost = new HttpPost(url);
MultipartEntity multipartEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
multipartEntity.addPart(fileKey, new FileBody(file));
httppost.setEntity(multipartEntity);
httppost.setParams(params);
HttpUtil.log("strart...");
HttpResponse httpResponse = mHttpClient.execute(httppost);
String result = null;
int statusCode = httpResponse.getStatusLine().getStatusCode();
HttpUtil.log("file upload statusCode >>> " + statusCode);
if(statusCode == HttpURLConnection.HTTP_OK)
{
result = EntityUtils.toString(httpResponse.getEntity());
}
HttpUtil.log("file upload result >>> " + result);
if(result != null)
{
if(result.indexOf("error_response") >= 0)
{
throw new Exception("File upload failed.");
}
}
else
{
throw new Exception("Cannot get connection response");
}
HttpUtil.log("file uploaded");
return true;
} catch (Exception e) {
HttpUtil.log("upload file exception");
e.printStackTrace();
throw e;
}
}
public static String uploadFileWithParams(String url, List<String> keys,
List<String> values, List<String> fileKeys, List<File> files) throws Exception {
DefaultHttpClient mHttpClient = new DefaultHttpClient();
Charset charSet = java.nio.charset.Charset.forName("UTF-8");
HttpParams params = new BasicHttpParams();
params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
try
{
HttpUtil.log("strart upload file");
HttpPost httppost = new HttpPost(url);
MultipartEntity multipartEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
if (keys != null && values != null)
{
for (int i = 0; i < keys.size(); i++)
{
multipartEntity.addPart(keys.get(i), new StringBody(values.get(i), "text/plain", charSet));
}
}
if (fileKeys != null && files != null)
{
for (int i = 0; i < fileKeys.size(); i++)
{
multipartEntity.addPart(fileKeys.get(i), new FileBody(files.get(i)));
}
}
StringBuilder urlParametersBuilder = new StringBuilder();
JsonObject jsonParams = null;
if (keys != null && values != null)
{
if (keys.size() != values.size())
{
throw new Exception("keys length and values length not equal.");
}
jsonParams = new JsonObject();
int i;
for (i = 0; i < keys.size(); i++)
{
// LogController.log("keys.get(i) >> " + keys.get(i));
if (i == 0)
{
urlParametersBuilder.append(keys.get(i));
urlParametersBuilder.append("=");
urlParametersBuilder.append(URLEncoder.encode(values.get(i), "utf-8"));
}
else
{
urlParametersBuilder.append("&");
urlParametersBuilder.append(keys.get(i));
urlParametersBuilder.append("=");
urlParametersBuilder.append(URLEncoder.encode(values.get(i), "utf-8"));
}
jsonParams.addProperty(keys.get(i), values.get(i));
}
}
httppost.setEntity(multipartEntity);
httppost.setParams(params);
HttpUtil.log("strart...");
LogController.log("httpPOst>>>>>>" + httppost);
HttpResponse httpResponse = mHttpClient.execute(httppost);
LogController.log("httpPost>>>" + httppost);
String result = null;
int statusCode = httpResponse.getStatusLine().getStatusCode();
HttpUtil.log("file upload statusCode >>> " + statusCode);
if (statusCode == HttpURLConnection.HTTP_OK)
{
result = EntityUtils.toString(httpResponse.getEntity());
}
else
{
throw new Exception("Http Status Code not 200.");
}
HttpUtil.log("file upload result >>> " + result);
HttpUtil.log("file upload call finished");
return result;
}
catch (Exception e)
{
HttpUtil.log("upload file exception");
e.printStackTrace();
throw e;
}
}
public static boolean downloadFile(String url, String filePath, HttpDownloadFileCallback callback) {
HttpURLConnection c = null;
InputStream input = null;
OutputStream output = null;
try
{
URL u = new URL(url);
HttpUtil.log("downloadFile : " + url);
c = (HttpURLConnection) u.openConnection();
c.setRequestMethod("GET");
c.setReadTimeout(Constants.GENERAL_HTTP_REQUEST_TIMEOUT);
c.setConnectTimeout(Constants.GENERAL_HTTP_REQUEST_TIMEOUT);
c.connect();
int fileLength = c.getContentLength();
HttpUtil.log("downloadFile fileLength : " + fileLength);
input = new BufferedInputStream(u.openStream());
output = new FileOutputStream(filePath);
byte data[] = new byte[1024];
long total = 0;
int count;
while ((count = input.read(data)) != -1)
{
total += count;
if(callback != null)
{
callback.currentProgress((int) (total * 100 / fileLength));
}
output.write(data, 0, count);
}
output.flush();
output.close();
input.close();
c.disconnect();
File originalFile = new File(filePath);
File file = new File(filePath + ".tmp");
if (file.exists())
{
file.renameTo(originalFile);
}
}
catch (Exception e)
{
try
{
if (c != null)
{
c.disconnect();
}
}
catch (Exception e2)
{
// TODO: handle exception
}
try
{
if (input != null)
{
input.close();
}
}
catch (Exception e2)
{
// TODO: handle exception
}
try
{
if (output != null)
{
output.close();
}
}
catch (Exception e2)
{
// TODO: handle exception
}
return false;
}
return true;
}
}