package me.ccrama.redditslide.Synccit.http; import android.os.AsyncTask; import android.util.Log; import android.util.Pair; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; import okhttp3.MultipartBody; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public abstract class HttpPostTask<Result> extends AsyncTask<String, Long, Result> { private static final String TAG = HttpPostTask.class.getSimpleName(); private static final int CONNECTION_TIMEOUT_MILLIS = 5000; private static final int SOCKET_TIMEOUT_MILLIS = 20000; private final OkHttpClient mClient = HttpClientFactory.getOkHttpClient().newBuilder() .readTimeout(SOCKET_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS) .connectTimeout(CONNECTION_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS).build(); private String mUrl; /** * @param url Required. */ public HttpPostTask(String url) { mUrl = url; } /** * params come in pairs: key/value */ @Override protected Result doInBackground(String... params) { List<Pair<String, String>> nvps = getPostArgs(params); MultipartBody.Builder formBuilder = new MultipartBody.Builder().setType(MultipartBody.FORM); for(Pair<String, String> p : nvps) { formBuilder.addFormDataPart(p.first, p.second); } Request request = new Request.Builder().url(mUrl) .header("User-Agent", getUserAgent()).addHeader("Content-Encoding", "gzip") .post(formBuilder.build()) .build(); try { Response res = mClient.newCall(request).execute(); if (!res.isSuccessful()) { throw new IOException("Unexpected code " + res); } return onInput(res.body().string()); } catch (Exception ex) { Log.e(TAG, "Error during POST", ex); } return null; } private List<Pair<String, String>> getPostArgs(String... params) { List<Pair<String, String>> nvps = new ArrayList<>(); for (int i = 0; i < params.length; i += 2) { try { nvps.add(new Pair<>(params[i], params[i+1])); } catch (ArrayIndexOutOfBoundsException ex) { Log.e(TAG, "Params didn't come in name/value pairs", ex); } } return nvps; } protected Result onInput(String in) throws Exception { return null; } protected abstract String getUserAgent(); }