package org.zpcat.test.network;
import android.net.http.AndroidHttpClient;
import android.os.AsyncTask;
import android.util.Log;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.conn.scheme.HostNameResolver;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SocketFactory;
import org.apache.http.params.HttpParams;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.UnrecoverableKeyException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.net.ssl.SSLSocketFactory;
/**
* Created by moses on 4/23/15.
*/
public class HttpClientRequest implements AsyncNetRequest {
private final String TAG = "TLSdemo";
private ReqCallback mReqCallback;
private String mUrl;
private Map<String, String> mParms;
private SSLSocketFactory mSSLSocketFactory;
private KeyStore mKeyStore;
private String mKeyStorePasswd;
@Override
public void request(String url,
SSLSocketFactory sslSocketFactory,
HashMap<String, String> params,
ReqCallback callback) {
mReqCallback = callback;
mUrl = url;
mParms = params;
mSSLSocketFactory = sslSocketFactory;
new NetAsyncTask().execute();
}
public void request(String url, Map<String, String> params, ReqCallback callback,
KeyStore keystore, String passwd) {
mReqCallback = callback;
mUrl = url;
mParms = params;
mKeyStore = keystore;
mKeyStorePasswd = passwd;
new NetAsyncTask().execute();
}
private class NetAsyncTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
AndroidHttpClient httpClient = AndroidHttpClient.newInstance("android");
if (mKeyStore != null) {
Scheme https = null;
try {
https = new Scheme("https", new AdapterSSLSocketFactory(mKeyStore,
mKeyStorePasswd), 443);
Log.e(TAG, "initialize https scheme");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
} catch (KeyStoreException e) {
e.printStackTrace();
} catch (UnrecoverableKeyException e) {
e.printStackTrace();
}
/* List<String> schemes =
httpClient.getConnectionManager().getSchemeRegistry().getSchemeNames();
for (String name : schemes) {
httpClient.getConnectionManager().getSchemeRegistry().unregister(name);
}*/
httpClient.getConnectionManager().getSchemeRegistry().register(https);
}
HttpGet httpGet = new HttpGet(mUrl);
HttpResponse response;
try {
response = httpClient.execute(httpGet);
Log.e(TAG, "reponse statusline: " + response.getStatusLine().toString());
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream in = entity.getContent();
String result = convertStreamToString(in);
in.close();
return result;
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String ret) {
super.onPostExecute(ret);
if (mReqCallback != null) {
mReqCallback.onResult(ret);
}
}
}
private String convertStreamToString(InputStream input) {
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
StringBuilder sb = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
// direct implementation of apache's SSLSocketFactory
class AdapterSSLSocketFactory extends org.apache.http.conn.ssl.SSLSocketFactory {
public AdapterSSLSocketFactory(KeyStore keystore, String keystorePassword)
throws NoSuchAlgorithmException, KeyManagementException,
KeyStoreException, UnrecoverableKeyException {
super(keystore, keystorePassword);
}
}
}