package ru.shutoff.cgstarter;
import android.os.AsyncTask;
import android.os.Build;
import android.util.Log;
import java.io.IOException;
import java.io.Reader;
import java.net.HttpURLConnection;
import java.net.URLEncoder;
import java.util.concurrent.TimeUnit;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public abstract class HttpTask {
final static String userAgent = System.getProperty("http.agent");
public static final OkHttpClient client = createClient();
AsyncTask<Object, Void, String> bgTask;
String error_text;
boolean canceled;
static OkHttpClient createClient() {
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(15, TimeUnit.SECONDS)
.readTimeout(40, TimeUnit.SECONDS)
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request originalRequest = chain.request();
Request requestWithUserAgent = originalRequest.newBuilder()
.removeHeader("User-Agent")
.addHeader("User-Agent", userAgent)
.build();
return chain.proceed(requestWithUserAgent);
}
}).build();
return client;
}
static String request(Object... params) throws Exception {
String url = params[0].toString();
String data = "";
int last_param = 1;
for (; ; last_param++) {
if (!url.contains("$" + last_param))
break;
}
for (int i = 1; i < last_param; i++) {
url = url.replace("$" + i, URLEncoder.encode(params[i].toString(), "UTF-8"));
}
for (; last_param + 1 < params.length; last_param += 2) {
if (params[last_param + 1] == null)
continue;
url += "&" + params[last_param].toString();
url += "=" + URLEncoder.encode(params[last_param + 1].toString(), "UTF-8");
}
Request.Builder builder = new Request.Builder().url(url);
Request request = builder.build();
Response response = client.newCall(request).execute();
if (response.code() != HttpURLConnection.HTTP_OK) {
Log.v("http", url);
if (data != null)
Log.v("data", data);
throw new Exception(response.message());
}
Reader reader = response.body().charStream();
char[] arr = new char[8 * 1024];
StringBuilder buffer = new StringBuilder();
int numCharsRead;
while ((numCharsRead = reader.read(arr, 0, arr.length)) != -1) {
buffer.append(arr, 0, numCharsRead);
}
return buffer.toString();
}
abstract void result(String res);
abstract void error(String error);
void execute(Object... params) {
if (bgTask != null)
return;
bgTask = new AsyncTask<Object, Void, String>() {
@Override
protected String doInBackground(Object... params) {
try {
return request(params);
} catch (Exception ex) {
ex.printStackTrace();
error_text = ex.getLocalizedMessage();
if (error_text != null) {
int pos = error_text.indexOf(":");
if (pos > 0)
error_text = error_text.substring(0, pos);
}
}
return null;
}
@Override
protected void onPostExecute(String res) {
bgTask = null;
if (canceled) {
canceled = false;
return;
}
if (res != null) {
try {
result(res);
return;
} catch (Exception ex) {
if (error_text == null) {
String msg = ex.getLocalizedMessage();
if (msg == null)
msg = ex.getMessage();
if (msg == null)
msg = ex.toString();
error_text = msg;
}
ex.printStackTrace();
}
}
error(error_text);
}
};
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
bgTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
} else {
bgTask.execute(params);
}
} catch (Exception ex) {
ex.printStackTrace();
error(ex.getLocalizedMessage());
}
}
void cancel() {
canceled = true;
}
}