diff --git a/src/android/com/silkimen/cordovahttp/CordovaHttpBase.java b/src/android/com/silkimen/cordovahttp/CordovaHttpBase.java index c107e3a..ecba843 100644 --- a/src/android/com/silkimen/cordovahttp/CordovaHttpBase.java +++ b/src/android/com/silkimen/cordovahttp/CordovaHttpBase.java @@ -72,8 +72,8 @@ abstract class CordovaHttpBase implements Runnable { @Override public void run() { CordovaHttpResponse response = new CordovaHttpResponse(); - HttpRequest request = null; + try { request = this.createRequest(); this.prepareRequest(request); @@ -81,27 +81,27 @@ abstract class CordovaHttpBase implements Runnable { this.processResponse(request, response); request.disconnect(); } catch (HttpRequestException e) { - if (e.getCause() instanceof SSLException) { + Throwable cause = e.getCause(); + String message = cause.getMessage(); + + if (cause instanceof SSLException) { response.setStatus(-2); response.setErrorMessage("TLS connection could not be established: " + e.getMessage()); Log.w(TAG, "TLS connection could not be established", e); - } else if (e.getCause() instanceof UnknownHostException) { + } else if (cause instanceof UnknownHostException) { response.setStatus(-3); response.setErrorMessage("Host could not be resolved: " + e.getMessage()); Log.w(TAG, "Host could not be resolved", e); - } else if (e.getCause() instanceof SocketTimeoutException) { + } else if (cause instanceof SocketTimeoutException) { response.setStatus(-4); response.setErrorMessage("Request timed out: " + e.getMessage()); Log.w(TAG, "Request timed out", e); + } else if (cause instanceof InterruptedIOException && "thread interrupted".equals(message.toLowerCase())) { + this.setAborted(request, response); } else { - String cause = e.getCause().getMessage(); - if(e.getCause() instanceof InterruptedIOException && "thread interrupted".equals(cause.toLowerCase())){ - this.setAborted(request, response); - } else { - response.setStatus(-1); - response.setErrorMessage("There was an error with the request: " + cause); - Log.w(TAG, "Generic request error", e); - } + response.setStatus(-1); + response.setErrorMessage("There was an error with the request: " + message); + Log.w(TAG, "Generic request error", e); } } catch (InterruptedException ie) { this.setAborted(request, response); @@ -213,13 +213,15 @@ abstract class CordovaHttpBase implements Runnable { protected void setAborted(HttpRequest request, CordovaHttpResponse response) { response.setStatus(-8); response.setErrorMessage("Request was aborted"); - if(request != null){ - try{ + + if (request != null) { + try { request.disconnect(); } catch(Exception any){ Log.w(TAG, "Failed to close aborted request", any); } } + Log.i(TAG, "Request was aborted"); } } diff --git a/src/android/com/silkimen/cordovahttp/CordovaHttpPlugin.java b/src/android/com/silkimen/cordovahttp/CordovaHttpPlugin.java index 245e4b2..bdec147 100644 --- a/src/android/com/silkimen/cordovahttp/CordovaHttpPlugin.java +++ b/src/android/com/silkimen/cordovahttp/CordovaHttpPlugin.java @@ -199,16 +199,17 @@ public class CordovaHttpPlugin extends CordovaPlugin implements Observer { } private boolean abort(final JSONArray args, final CallbackContext callbackContext) throws JSONException { - int reqId = args.getInt(0); boolean result = false; // NOTE no synchronized (reqMapLock), since even if the req was already removed from reqMap, // the worst that would happen calling task.cancel(true) is a result of false // (i.e. same result as locking & not finding the req in reqMap) Future task = this.reqMap.get(reqId); + if (task != null && !task.isDone()) { result = task.cancel(true); } + callbackContext.success(new JSONObject().put("aborted", result)); return true; @@ -216,7 +217,7 @@ public class CordovaHttpPlugin extends CordovaPlugin implements Observer { private void addReq(final Integer reqId, final Future task, final CordovaObservableCallbackContext observableCallbackContext) { synchronized (reqMapLock) { - if(!task.isDone()){ + if (!task.isDone()){ this.reqMap.put(reqId, task); } }