package org.commcare.tasks; import android.content.Context; import org.commcare.CommCareApplication; import org.commcare.core.interfaces.HttpResponseProcessor; import org.commcare.core.interfaces.ResponseStreamAccessor; import org.commcare.core.network.ModernHttpRequester; import org.commcare.modern.util.Pair; import org.commcare.network.AndroidModernHttpRequester; import org.commcare.tasks.templates.CommCareTask; import org.commcare.utils.AndroidCacheDirSetup; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.HashMap; /** * Makes get/post request and delegates http response to receiver on completion * * @author Phillip Mates (pmates@dimagi.com) */ public class SimpleHttpTask extends CommCareTask<Void, Void, Void, HttpResponseProcessor> implements HttpResponseProcessor, ResponseStreamAccessor { public static final int SIMPLE_HTTP_TASK_ID = 11; private final ModernHttpRequester requestor; private int responseCode; private InputStream responseDataStream; private IOException ioException; public SimpleHttpTask(Context context, URL url, HashMap<String, String> params, boolean isPostRequest, Pair<String, String> usernameAndPasswordToAuthWith) { taskId = SIMPLE_HTTP_TASK_ID; if (usernameAndPasswordToAuthWith != null) { // Means the the user for which we are submitting this request is not yet logged in requestor = new AndroidModernHttpRequester(new AndroidCacheDirSetup(context), url, params, usernameAndPasswordToAuthWith, isPostRequest); } else { // Means the the user for which we are submitting this request is already logged in requestor = CommCareApplication.instance().buildHttpRequesterForLoggedInUser(context, url, params, true, isPostRequest); } requestor.setResponseProcessor(this); } public void setResponseProcessor(HttpResponseProcessor responseProcessor) { requestor.setResponseProcessor(responseProcessor); } @Override protected Void doTaskBackground(Void... params) { requestor.request(); return null; } @Override protected void deliverResult(HttpResponseProcessor httpResponseProcessor, Void result) { if (ioException != null) { httpResponseProcessor.handleIOException(ioException); } else { // route to appropriate callback based on http response code ModernHttpRequester.processResponse( httpResponseProcessor, responseCode, this); } } @Override protected void deliverUpdate(HttpResponseProcessor httpResponseProcessor, Void... update) { } @Override protected void deliverError(HttpResponseProcessor httpResponseProcessor, Exception e) { } @Override public void processSuccess(int responseCode, InputStream responseData) { this.responseCode = responseCode; responseDataStream = responseData; } @Override public void processRedirection(int responseCode) { this.responseCode = responseCode; } @Override public void processClientError(int responseCode) { this.responseCode = responseCode; } @Override public void processServerError(int responseCode) { this.responseCode = responseCode; } @Override public void processOther(int responseCode) { this.responseCode = responseCode; } @Override public void handleIOException(IOException exception) { this.ioException = exception; } @Override public InputStream getResponseStream() throws IOException { return responseDataStream; } }