package com.samknows.measurement.net;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.commons.io.IOUtils;
import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicHeader;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import android.util.Log;
import com.samknows.libcore.SKPorting;
import com.samknows.libcore.SKConstants;
public class NetAction {
static final String TAG = "NetAction";
private String request, errorString;
private final List<Header> headers = new ArrayList<>();
private final HttpParams params = new BasicHttpParams();
private String body;
protected HttpResponse response;
private boolean isPost = false;
private boolean isSuccess = false;
public void setPost(boolean isPost) {
this.isPost = isPost;
}
public void execute() {
HttpParams httpParameters = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, SKConstants.CONNECTION_TIMEOUT_30_SECONDS_IN_MILLIS);
HttpConnectionParams.setSoTimeout(httpParameters, SKConstants.CONNECTION_TIMEOUT_30_SECONDS_IN_MILLIS);
HttpClient httpclient = new DefaultHttpClient(httpParameters);
HttpRequestBase mess = null;
if (isPost) {
mess = new HttpPost(request);
if (body != null) {
try {
((HttpPost)mess).setEntity(new StringEntity(body));
} catch (UnsupportedEncodingException e) {
SKPorting.sAssertE(this, "error creating http message", e);
}
}
} else {
mess = new HttpGet(request);
}
mess.setParams(params);
for (Header h : headers) {
mess.addHeader(h);
}
try{
Log.d(TAG, "net request: " + request);
response = httpclient.execute(mess);
} catch (Exception e) {
Log.e("NetAction", "failed to execute request: " + request + ", exception=" + e.toString());
SKPorting.sAssert(getClass(), false);
}
if (isResponseOk()) {
onActionFinished();
} else if (response != null && response.getStatusLine() != null) {
isSuccess = false;
SKPorting.sAssertE(this, "failed request, response code: " + response.getStatusLine().getStatusCode());
try {
InputStream content = response.getEntity().getContent();
List<String> lines = IOUtils.readLines(content);
errorString = "";
for (String s : lines) {
errorString += "\n" + s;
}
} catch (Exception e) {
SKPorting.sAssert(false);
}
SKPorting.sAssertE(this, errorString);
}
}
public String getErrorString() {
return errorString;
}
protected boolean isResponseOk() {
return response != null && response.getStatusLine() != null && response.getStatusLine().getStatusCode() == HttpStatus.SC_OK;
}
public boolean isSuccess() {
return isSuccess;
}
protected void onActionFinished() {isSuccess = true;}
public void addHeader(Map<String,String> _headers){
for(String name: _headers.keySet()){
addHeader(name, _headers.get(name));
}
}
public void addHeader(String name, String value) {
headers.add(new BasicHeader(name, value));
}
public void addParam(String name, String value) {
params.setParameter(name, value);
}
public String getRequest() {
return request;
}
public void setRequest(String request) {
this.request = request;
}
public void setBodyString(String body) {
this.body = body;
}
}