diff --git a/plugin.xml b/plugin.xml
index e027bf0..b5beef8 100644
--- a/plugin.xml
+++ b/plugin.xml
@@ -50,7 +50,7 @@
-
+
@@ -61,17 +61,14 @@
-->
-
-
+
+
-
-
-
-
-
+
+
+
-
diff --git a/src/android/com/silkimen/cordovahttp/CordovaHttpDownload.java b/src/android/com/silkimen/cordovahttp/CordovaHttpDownload.java
new file mode 100644
index 0000000..05f73fe
--- /dev/null
+++ b/src/android/com/silkimen/cordovahttp/CordovaHttpDownload.java
@@ -0,0 +1,105 @@
+package com.silkimen.cordovahttp;
+
+import java.io.File;
+import java.net.SocketTimeoutException;
+import java.net.UnknownHostException;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import javax.net.ssl.SSLHandshakeException;
+
+import com.silkimen.http.HttpBodyDecoder;
+import com.silkimen.http.HttpRequest;
+import com.silkimen.http.HttpRequest.HttpRequestException;
+import com.silkimen.http.JsonUtils;
+
+import org.apache.cordova.CallbackContext;
+import org.apache.cordova.file.FileUtils;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import android.util.Log;
+
+class CordovaHttpDownload implements Runnable {
+ private static final String TAG = "Cordova-Plugin-HTTP";
+
+ private String url;
+ private JSONObject params;
+ private JSONObject headers;
+ private String filePath;
+ private int timeout;
+ private CallbackContext callbackContext;
+
+ public CordovaHttpDownload(String url, JSONObject params, JSONObject headers, String filePath, int timeout,
+ CallbackContext callbackContext) {
+
+ this.url = url;
+ this.params = params;
+ this.headers = headers;
+ this.filePath = filePath;
+ this.timeout = timeout;
+ this.callbackContext = callbackContext;
+ }
+
+ @Override
+ public void run() {
+ CordovaHttpResponse response = new CordovaHttpResponse();
+
+ try {
+ String processedUrl = HttpRequest.encode(HttpRequest.append(this.url, JsonUtils.getObjectMap(this.params)));
+
+ HttpRequest request = new HttpRequest(processedUrl, "GET")
+ .followRedirects(true /* @TODO */)
+ .readTimeout(this.timeout)
+ .acceptCharset("UTF-8")
+ .uncompress(true)
+ .headers(JsonUtils.getStringMap(this.headers));
+
+ response.setStatus(request.code());
+ response.setUrl(request.url().toString());
+ response.setHeaders(request.headers());
+
+ if (request.code() >= 200 && request.code() < 300) {
+ File file = new File(new URI(filePath));
+
+ request.receive(file);
+ response.setFileEntry(FileUtils.getFilePlugin().getEntryForFile(file));
+ } else {
+ response.setErrorMessage("There was an error downloading the file");
+ }
+ } catch (HttpRequestException e) {
+ if (e.getCause() instanceof SSLHandshakeException) {
+ response.setStatus(-2);
+ response.setErrorMessage("SSL handshake failed: " + e.getMessage());
+ Log.w(TAG, "SSL handshake failed", e);
+ } else if (e.getCause() 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) {
+ response.setStatus(-4);
+ response.setErrorMessage("Request timed out: " + e.getMessage());
+ Log.w(TAG, "Request timed out", e);
+ } else {
+ response.setStatus(-1);
+ response.setErrorMessage("There was an error with the request: " + e.getCause().getMessage());
+ Log.w(TAG, "Generic request error", e);
+ }
+ } catch (Exception e) {
+ response.setStatus(-1);
+ response.setErrorMessage(e.getMessage());
+ Log.e(TAG, "An unexpected error occured", e);
+ }
+
+ try {
+ if (response.hasFailed()) {
+ this.callbackContext.error(response.toJSON());
+ } else {
+ this.callbackContext.success(response.toJSON());
+ }
+ } catch (JSONException e) {
+ Log.e(TAG, "An unexpected error occured while processing HTTP response", e);
+ }
+ }
+}
diff --git a/src/android/com/silkimen/cordovahttp/CordovaHttpPlugin.java b/src/android/com/silkimen/cordovahttp/CordovaHttpPlugin.java
new file mode 100644
index 0000000..8f73e00
--- /dev/null
+++ b/src/android/com/silkimen/cordovahttp/CordovaHttpPlugin.java
@@ -0,0 +1,220 @@
+package com.silkimen.cordovahttp;
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import java.security.GeneralSecurityException;
+import java.security.KeyStore;
+import java.security.KeyStore.TrustedCertificateEntry;
+import java.security.cert.Certificate;
+
+import java.util.ArrayList;
+import java.util.Enumeration;
+
+import org.apache.cordova.CallbackContext;
+import org.apache.cordova.CordovaInterface;
+import org.apache.cordova.CordovaPlugin;
+import org.apache.cordova.CordovaWebView;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import android.util.Log;
+import android.content.res.AssetManager;
+
+public class CordovaHttpPlugin extends CordovaPlugin {
+ private static final String TAG = "Cordova-Plugin-HTTP";
+
+ private static boolean followRedirects = true;
+
+ @Override
+ public void initialize(CordovaInterface cordova, CordovaWebView webView) {
+ super.initialize(cordova, webView);
+
+ try {
+ // HttpRequest.clearCerts();
+ this.pinSSLCertsFromCAStore();
+ } catch (Exception e) {
+ Log.e(TAG, "An error occured while loading system's CA certificates", e);
+ }
+ }
+
+ @Override
+ public boolean execute(String action, final JSONArray args, final CallbackContext callbackContext)
+ throws JSONException {
+
+ if (action == null) {
+ return false;
+ }
+
+ switch (action) {
+ case "get":
+ return this.executeHttpRequestWithParams(action, args, callbackContext);
+ case "post":
+ return this.executeHttpRequestWithData(action, args, callbackContext);
+ case "put":
+ return this.executeHttpRequestWithData(action, args, callbackContext);
+ case "patch":
+ return this.executeHttpRequestWithData(action, args, callbackContext);
+ case "head":
+ return this.executeHttpRequestWithParams(action, args, callbackContext);
+ case "delete":
+ return this.executeHttpRequestWithParams(action, args, callbackContext);
+ case "uploadFile":
+ return this.uploadFile(args, callbackContext);
+ case "downloadFile":
+ return this.downloadFile(args, callbackContext);
+ case "setSSLCertMode":
+ return this.setSSLCertMode(args, callbackContext);
+ case "disableRedirect":
+ return this.disableRedirect(args, callbackContext);
+ default:
+ return false;
+ }
+ }
+
+ private boolean executeHttpRequestWithParams(final String method, final JSONArray args,
+ final CallbackContext callbackContext) throws JSONException {
+
+ String url = args.getString(0);
+ JSONObject params = args.getJSONObject(1);
+ JSONObject headers = args.getJSONObject(2);
+ int timeout = args.getInt(3) * 1000;
+
+ CordovaHttpRequest get = new CordovaHttpRequest(method.toUpperCase(), url, params, headers, timeout,
+ callbackContext);
+
+ cordova.getThreadPool().execute(get);
+
+ return true;
+ }
+
+ private boolean executeHttpRequestWithData(final String method, final JSONArray args,
+ final CallbackContext callbackContext) throws JSONException {
+
+ String url = args.getString(0);
+ Object data = args.get(1);
+ String serializer = args.getString(2);
+ JSONObject headers = args.getJSONObject(3);
+ int timeout = args.getInt(4) * 1000;
+
+ CordovaHttpRequest request = new CordovaHttpRequest(method.toUpperCase(), url, serializer, data, headers, timeout,
+ callbackContext);
+
+ cordova.getThreadPool().execute(request);
+
+ return true;
+ }
+
+ private boolean uploadFile(final JSONArray args, final CallbackContext callbackContext) throws JSONException {
+ String url = args.getString(0);
+ JSONObject params = args.getJSONObject(1);
+ JSONObject headers = args.getJSONObject(2);
+ String filePath = args.getString(3);
+ String uploadName = args.getString(4);
+ int timeout = args.getInt(5) * 1000;
+
+ CordovaHttpUpload upload = new CordovaHttpUpload(url, params, headers,
+ filePath, uploadName, timeout, callbackContext);
+
+ cordova.getThreadPool().execute(upload);
+
+ return true;
+ }
+
+ private boolean downloadFile(final JSONArray args, final CallbackContext callbackContext) throws JSONException {
+ String url = args.getString(0);
+ JSONObject params = args.getJSONObject(1);
+ JSONObject headers = args.getJSONObject(2);
+ String filePath = args.getString(3);
+ int timeout = args.getInt(4) * 1000;
+
+ CordovaHttpDownload download = new CordovaHttpDownload(url, params, headers, filePath, timeout, callbackContext);
+
+ cordova.getThreadPool().execute(download);
+
+ return true;
+ }
+
+ private boolean setSSLCertMode(final JSONArray args, final CallbackContext callbackContext) throws JSONException {
+ String mode = args.getString(0);
+
+ // HttpRequest.clearCerts();
+
+ if (mode.equals("legacy")) {
+ // HttpRequest.setSSLCertMode(HttpRequest.CERT_MODE_DEFAULT);
+ callbackContext.success();
+ } else if (mode.equals("nocheck")) {
+ // HttpRequest.setSSLCertMode(HttpRequest.CERT_MODE_TRUSTALL);
+ callbackContext.success();
+ } else if (mode.equals("pinned")) {
+ try {
+ this.loadSSLCertsFromBundle();
+ // HttpRequest.setSSLCertMode(HttpRequest.CERT_MODE_PINNED);
+ callbackContext.success();
+ } catch (Exception e) {
+ e.printStackTrace();
+ callbackContext.error("There was an error setting up ssl pinning");
+ }
+ } else if (mode.equals("default")) {
+ try {
+ this.pinSSLCertsFromCAStore();
+ callbackContext.success();
+ } catch (Exception e) {
+ e.printStackTrace();
+ callbackContext.error("There was an error loading system's CA certificates");
+ }
+ }
+
+ return true;
+ }
+
+ private boolean disableRedirect(final JSONArray args, final CallbackContext callbackContext) throws JSONException {
+ followRedirects = !args.getBoolean(0);
+
+ callbackContext.success();
+
+ return true;
+ }
+
+ private void pinSSLCertsFromCAStore() throws GeneralSecurityException, IOException {
+ this.loadSSLCertsFromKeyStore("AndroidCAStore");
+ // HttpRequest.setSSLCertMode(HttpRequest.CERT_MODE_PINNED);
+ }
+
+ private void loadSSLCertsFromKeyStore(String storeType) throws GeneralSecurityException, IOException {
+ KeyStore ks = KeyStore.getInstance(storeType);
+ ks.load(null);
+ Enumeration aliases = ks.aliases();
+
+ while (aliases.hasMoreElements()) {
+ String alias = aliases.nextElement();
+ TrustedCertificateEntry certEntry = (TrustedCertificateEntry) ks.getEntry(alias, null);
+ Certificate cert = certEntry.getTrustedCertificate();
+ // HttpRequest.addCert(cert);
+ }
+ }
+
+ private void loadSSLCertsFromBundle() throws GeneralSecurityException, IOException {
+ AssetManager assetManager = cordova.getActivity().getAssets();
+ String[] files = assetManager.list("www/certificates");
+ ArrayList cerFiles = new ArrayList();
+
+ for (int i = 0; i < files.length; i++) {
+ int index = files[i].lastIndexOf('.');
+ if (index != -1) {
+ if (files[i].substring(index).equals(".cer")) {
+ cerFiles.add("www/certificates/" + files[i]);
+ }
+ }
+ }
+
+ for (int i = 0; i < cerFiles.size(); i++) {
+ InputStream in = cordova.getActivity().getAssets().open(cerFiles.get(i));
+ InputStream caInput = new BufferedInputStream(in);
+ // HttpRequest.addCert(caInput);
+ }
+ }
+}
diff --git a/src/android/com/silkimen/cordovahttp/CordovaHttpRequest.java b/src/android/com/silkimen/cordovahttp/CordovaHttpRequest.java
index a8fe13f..65b0a49 100644
--- a/src/android/com/silkimen/cordovahttp/CordovaHttpRequest.java
+++ b/src/android/com/silkimen/cordovahttp/CordovaHttpRequest.java
@@ -1,8 +1,10 @@
package com.silkimen.cordovahttp;
import java.io.ByteArrayOutputStream;
+
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;
+
import java.nio.ByteBuffer;
import javax.net.ssl.SSLHandshakeException;
@@ -10,16 +12,18 @@ import javax.net.ssl.SSLHandshakeException;
import com.silkimen.http.HttpBodyDecoder;
import com.silkimen.http.HttpRequest;
import com.silkimen.http.HttpRequest.HttpRequestException;
-import com.silkimen.http.HttpResponse;
import com.silkimen.http.JsonUtils;
import org.apache.cordova.CallbackContext;
+
import org.json.JSONException;
import org.json.JSONObject;
import android.util.Log;
public class CordovaHttpRequest implements Runnable {
+ private static final String TAG = "Cordova-Plugin-HTTP";
+
private String method;
private String url;
private String serializer = "none";
@@ -54,7 +58,7 @@ public class CordovaHttpRequest implements Runnable {
@Override
public void run() {
- HttpResponse response = new HttpResponse();
+ CordovaHttpResponse response = new CordovaHttpResponse();
try {
String processedUrl = HttpRequest.encode(HttpRequest.append(this.url, JsonUtils.getObjectMap(this.params)));
@@ -82,33 +86,31 @@ public class CordovaHttpRequest implements Runnable {
if (request.code() >= 200 && request.code() < 300) {
response.setBody(decodedBody);
- this.callbackContext.success(response.toJSON());
} else {
response.setErrorMessage(decodedBody);
- this.callbackContext.error(response.toJSON());
}
} catch (HttpRequestException e) {
if (e.getCause() instanceof SSLHandshakeException) {
response.setStatus(-2);
response.setErrorMessage("SSL handshake failed: " + e.getMessage());
- Log.w("Cordova-Plugin-HTTP", "SSL handshake failed", e);
+ Log.w(TAG, "SSL handshake failed", e);
} else if (e.getCause() instanceof UnknownHostException) {
response.setStatus(-3);
response.setErrorMessage("Host could not be resolved: " + e.getMessage());
- Log.w("Cordova-Plugin-HTTP", "Host could not be resolved", e);
+ Log.w(TAG, "Host could not be resolved", e);
} else if (e.getCause() instanceof SocketTimeoutException) {
response.setStatus(-4);
response.setErrorMessage("Request timed out: " + e.getMessage());
- Log.w("Cordova-Plugin-HTTP", "Request timed out", e);
+ Log.w(TAG, "Request timed out", e);
} else {
response.setStatus(-1);
response.setErrorMessage("There was an error with the request: " + e.getCause().getMessage());
- Log.w("Cordova-Plugin-HTTP", "Generic request error", e);
+ Log.w(TAG, "Generic request error", e);
}
} catch (Exception e) {
response.setStatus(-1);
response.setErrorMessage(e.getMessage());
- Log.e("Cordova-Plugin-HTTP", "An unexpected error occured", e);
+ Log.e(TAG, "An unexpected error occured", e);
}
try {
@@ -118,7 +120,7 @@ public class CordovaHttpRequest implements Runnable {
this.callbackContext.success(response.toJSON());
}
} catch (JSONException e) {
- Log.e("Cordova-Plugin-HTTP", "An unexpected error occured while processing HTTP response", e);
+ Log.e(TAG, "An unexpected error occured while processing HTTP response", e);
}
}
diff --git a/src/android/com/silkimen/http/HttpResponse.java b/src/android/com/silkimen/cordovahttp/CordovaHttpResponse.java
similarity index 76%
rename from src/android/com/silkimen/http/HttpResponse.java
rename to src/android/com/silkimen/cordovahttp/CordovaHttpResponse.java
index cab1285..7fd7cc6 100644
--- a/src/android/com/silkimen/http/HttpResponse.java
+++ b/src/android/com/silkimen/cordovahttp/CordovaHttpResponse.java
@@ -1,4 +1,4 @@
-package com.silkimen.http;
+package com.silkimen.cordovahttp;
import java.util.HashMap;
import java.util.List;
@@ -10,12 +10,14 @@ import org.json.JSONObject;
import android.text.TextUtils;
import android.util.Log;
-public class HttpResponse {
+public class CordovaHttpResponse {
private int status;
private String url;
private Map> headers;
private String body;
- private boolean failed;
+ private JSONObject fileEntry;
+ private boolean hasFailed;
+ private boolean isFileOperation;
private String error;
public void setStatus(int status) {
@@ -34,13 +36,18 @@ public class HttpResponse {
this.body = body;
}
+ public void setFileEntry(JSONObject entry) {
+ this.isFileOperation = true;
+ this.fileEntry = entry;
+ }
+
public void setErrorMessage(String message) {
- this.failed = true;
+ this.hasFailed = true;
this.error = message;
}
public boolean hasFailed() {
- return this.failed;
+ return this.hasFailed;
}
public JSONObject toJSON() throws JSONException {
@@ -49,8 +56,11 @@ public class HttpResponse {
json.put("status", this.status);
json.put("url", this.url);
- if (this.failed) {
+ if (this.hasFailed) {
json.put("error", this.error);
+ } else if (this.isFileOperation) {
+ json.put("headers", new JSONObject(getFilteredHeaders()));
+ json.put("file", this.fileEntry);
} else {
json.put("headers", new JSONObject(getFilteredHeaders()));
json.put("data", this.body);
diff --git a/src/android/com/silkimen/cordovahttp/CordovaHttpUpload.java b/src/android/com/silkimen/cordovahttp/CordovaHttpUpload.java
new file mode 100644
index 0000000..8d96b50
--- /dev/null
+++ b/src/android/com/silkimen/cordovahttp/CordovaHttpUpload.java
@@ -0,0 +1,128 @@
+package com.silkimen.cordovahttp;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+
+import java.net.SocketTimeoutException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.UnknownHostException;
+
+import java.nio.ByteBuffer;
+
+import javax.net.ssl.SSLHandshakeException;
+
+import com.silkimen.http.HttpBodyDecoder;
+import com.silkimen.http.HttpRequest;
+import com.silkimen.http.HttpRequest.HttpRequestException;
+import com.silkimen.http.JsonUtils;
+
+import org.apache.cordova.CallbackContext;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import android.webkit.MimeTypeMap;
+import android.util.Log;
+
+class CordovaHttpUpload implements Runnable {
+ private static final String TAG = "Cordova-Plugin-HTTP";
+
+ private String url;
+ private JSONObject params;
+ private JSONObject headers;
+ private String filePath;
+ private String uploadName;
+ private int timeout;
+ private CallbackContext callbackContext;
+
+ public CordovaHttpUpload(String url, JSONObject params, JSONObject headers, String filePath, String uploadName,
+ int timeout, CallbackContext callbackContext) {
+
+ this.url = url;
+ this.params = params;
+ this.headers = headers;
+ this.filePath = filePath;
+ this.uploadName = uploadName;
+ this.timeout = timeout;
+ this.callbackContext = callbackContext;
+ }
+
+ @Override
+ public void run() {
+ CordovaHttpResponse response = new CordovaHttpResponse();
+
+ try {
+ String processedUrl = HttpRequest.encode(HttpRequest.append(this.url, JsonUtils.getObjectMap(this.params)));
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+
+ HttpRequest request = new HttpRequest(processedUrl, "POST")
+ .followRedirects(true /* @TODO */)
+ .readTimeout(this.timeout)
+ .acceptCharset("UTF-8")
+ .uncompress(true)
+ .headers(JsonUtils.getStringMap(this.headers));
+
+ int filenameIndex = filePath.lastIndexOf('/');
+ String filename = filePath.substring(filenameIndex + 1);
+
+ int extIndex = filePath.lastIndexOf('.');
+ String ext = filePath.substring(extIndex + 1);
+
+ MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
+ String mimeType = mimeTypeMap.getMimeTypeFromExtension(ext);
+
+ request.part(this.uploadName, filename, mimeType, new File(new URI(this.filePath)))
+ .receive(outputStream);
+
+ ByteBuffer rawOutput = ByteBuffer.wrap(outputStream.toByteArray());
+ String decodedBody = HttpBodyDecoder.decodeBody(rawOutput, request.charset());
+
+ response.setStatus(request.code());
+ response.setUrl(request.url().toString());
+ response.setHeaders(request.headers());
+
+ if (request.code() >= 200 && request.code() < 300) {
+ response.setBody(decodedBody);
+ } else {
+ response.setErrorMessage(decodedBody);
+ }
+ } catch (HttpRequestException e) {
+ if (e.getCause() instanceof SSLHandshakeException) {
+ response.setStatus(-2);
+ response.setErrorMessage("SSL handshake failed: " + e.getMessage());
+ Log.w(TAG, "SSL handshake failed", e);
+ } else if (e.getCause() 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) {
+ response.setStatus(-4);
+ response.setErrorMessage("Request timed out: " + e.getMessage());
+ Log.w(TAG, "Request timed out", e);
+ } else {
+ response.setStatus(-1);
+ response.setErrorMessage("There was an error with the request: " + e.getCause().getMessage());
+ Log.w(TAG, "Generic request error", e);
+ }
+ } catch (URISyntaxException e) {
+ response.setStatus(-1);
+ response.setErrorMessage("An error occured while loading file");
+ Log.e(TAG, "An error occured while loading file", e);
+ } catch (Exception e) {
+ response.setStatus(-1);
+ response.setErrorMessage(e.getMessage());
+ Log.e(TAG, "An unexpected error occured", e);
+ }
+
+ try {
+ if (response.hasFailed()) {
+ this.callbackContext.error(response.toJSON());
+ } else {
+ this.callbackContext.success(response.toJSON());
+ }
+ } catch (JSONException e) {
+ Log.e(TAG, "An unexpected error occured while processing HTTP response", e);
+ }
+ }
+}
diff --git a/src/android/com/synconset/cordovahttp/CordovaHttpDownload.java b/src/android/com/synconset/cordovahttp/CordovaHttpDownload.java
deleted file mode 100644
index 93ed3dd..0000000
--- a/src/android/com/synconset/cordovahttp/CordovaHttpDownload.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/**
- * A HTTP plugin for Cordova / Phonegap
- */
-package com.synconset.cordovahttp;
-
-import com.silkimen.http.HttpRequest;
-import com.silkimen.http.HttpRequest.HttpRequestException;
-
-import java.io.File;
-import java.net.SocketTimeoutException;
-import java.net.UnknownHostException;
-import java.net.URI;
-import java.net.URISyntaxException;
-
-import javax.net.ssl.SSLHandshakeException;
-
-import org.apache.cordova.CallbackContext;
-import org.apache.cordova.file.FileUtils;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-
-class CordovaHttpDownload extends CordovaHttp implements Runnable {
- private String filePath;
-
- public CordovaHttpDownload(String urlString, Object params, JSONObject headers, String filePath, int timeout, CallbackContext callbackContext) {
- super(urlString, params, headers, timeout, callbackContext);
- this.filePath = filePath;
- }
-
- @Override
- public void run() {
- try {
- HttpRequest request = HttpRequest.get(this.getUrlString(), this.getParamsMap(), false);
-
- this.prepareRequest(request);
-
- JSONObject response = new JSONObject();
- int code = request.code();
-
- response.put("status", code);
- response.put("url", request.url().toString());
- this.addResponseHeaders(request, response);
-
- if (code >= 200 && code < 300) {
- URI uri = new URI(filePath);
- File file = new File(uri);
- request.receive(file);
- JSONObject fileEntry = FileUtils.getFilePlugin().getEntryForFile(file);
- response.put("file", fileEntry);
- this.getCallbackContext().success(response);
- } else {
- response.put("error", "There was an error downloading the file");
- this.getCallbackContext().error(response);
- }
- } catch(URISyntaxException e) {
- this.respondWithError("There was an error with the given filePath");
- } catch (JSONException e) {
- this.respondWithError("There was an error generating the response");
- } catch (HttpRequestException e) {
- this.handleHttpRequestException(e);
- } catch (Exception e) {
- this.respondWithError(e.getMessage());
- }
- }
-}
diff --git a/src/android/com/synconset/cordovahttp/CordovaHttpPlugin.java b/src/android/com/synconset/cordovahttp/CordovaHttpPlugin.java
deleted file mode 100644
index 3bfbb41..0000000
--- a/src/android/com/synconset/cordovahttp/CordovaHttpPlugin.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/**
- * A HTTP plugin for Cordova / Phonegap
- */
-package com.synconset.cordovahttp;
-
-import java.io.BufferedInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-import java.security.GeneralSecurityException;
-import java.security.KeyStore;
-import java.security.KeyStore.TrustedCertificateEntry;
-import java.security.cert.Certificate;
-
-import java.util.ArrayList;
-import java.util.Enumeration;
-
-import org.apache.cordova.CallbackContext;
-import org.apache.cordova.CordovaInterface;
-import org.apache.cordova.CordovaPlugin;
-import org.apache.cordova.CordovaWebView;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import android.content.res.AssetManager;
-
-import com.silkimen.http.HttpRequest;
-import com.silkimen.cordovahttp.CordovaHttpRequest;
-
-public class CordovaHttpPlugin extends CordovaPlugin {
- private static final String TAG = "CordovaHTTP";
-
- @Override
- public void initialize(CordovaInterface cordova, CordovaWebView webView) {
- super.initialize(cordova, webView);
-
- try {
- //HttpRequest.clearCerts();
- this.pinSSLCertsFromCAStore();
- } catch (Exception e) {
- e.printStackTrace();
- System.err.println("There was an error loading system's CA certificates");
- }
- }
-
- @Override
- public boolean execute(String action, final JSONArray args, final CallbackContext callbackContext) throws JSONException {
- if (action.equals("post")) {
- String url = args.getString(0);
- Object data = args.get(1);
- String serializer = args.getString(2);
- JSONObject headers = args.getJSONObject(3);
- int timeout = args.getInt(4) * 1000;
-
- CordovaHttpRequest post = new CordovaHttpRequest("POST", url, serializer, data, headers, timeout, callbackContext);
-
- cordova.getThreadPool().execute(post);
- } else if (action.equals("get")) {
- String url = args.getString(0);
- JSONObject params = args.getJSONObject(1);
- JSONObject headers = args.getJSONObject(2);
- int timeout = args.getInt(3) * 1000;
-
- CordovaHttpRequest get = new CordovaHttpRequest("GET", url, params, headers, timeout, callbackContext);
-
- cordova.getThreadPool().execute(get);
- } else if (action.equals("put")) {
- String url = args.getString(0);
- Object data = args.get(1);
- String serializer = args.getString(2);
- JSONObject headers = args.getJSONObject(3);
- int timeout = args.getInt(4) * 1000;
-
- CordovaHttpRequest put = new CordovaHttpRequest("PUT", url, serializer, data, headers, timeout, callbackContext);
-
- cordova.getThreadPool().execute(put);
- } else if (action.equals("patch")) {
- String url = args.getString(0);
- Object data = args.get(1);
- String serializer = args.getString(2);
- JSONObject headers = args.getJSONObject(3);
- int timeout = args.getInt(4) * 1000;
-
- CordovaHttpRequest patch = new CordovaHttpRequest("PATCH", url, serializer, data, headers, timeout, callbackContext);
-
- cordova.getThreadPool().execute(patch);
- }
- else if (action.equals("delete")) {
- String url = args.getString(0);
- JSONObject params = args.getJSONObject(1);
- JSONObject headers = args.getJSONObject(2);
- int timeout = args.getInt(3) * 1000;
-
- CordovaHttpRequest delete = new CordovaHttpRequest("DELETE", url, params, headers, timeout, callbackContext);
-
- cordova.getThreadPool().execute(delete);
- } else if (action.equals("head")) {
- String url = args.getString(0);
- JSONObject params = args.getJSONObject(1);
- JSONObject headers = args.getJSONObject(2);
- int timeout = args.getInt(3) * 1000;
-
- CordovaHttpRequest head = new CordovaHttpRequest("HEAD", url, params, headers, timeout, callbackContext);
-
- cordova.getThreadPool().execute(head);
- } else if (action.equals("setSSLCertMode")) {
- String mode = args.getString(0);
-
- //HttpRequest.clearCerts();
-
- if (mode.equals("legacy")) {
- //HttpRequest.setSSLCertMode(HttpRequest.CERT_MODE_DEFAULT);
- callbackContext.success();
- } else if (mode.equals("nocheck")) {
- //HttpRequest.setSSLCertMode(HttpRequest.CERT_MODE_TRUSTALL);
- callbackContext.success();
- } else if (mode.equals("pinned")) {
- try {
- this.loadSSLCertsFromBundle();
- //HttpRequest.setSSLCertMode(HttpRequest.CERT_MODE_PINNED);
- callbackContext.success();
- } catch (Exception e) {
- e.printStackTrace();
- callbackContext.error("There was an error setting up ssl pinning");
- }
- } else if (mode.equals("default")) {
- try {
- this.pinSSLCertsFromCAStore();
- callbackContext.success();
- } catch (Exception e) {
- e.printStackTrace();
- callbackContext.error("There was an error loading system's CA certificates");
- }
- }
- } else if (action.equals("uploadFile")) {
- String url = args.getString(0);
- Object params = args.get(1);
- JSONObject headers = args.getJSONObject(2);
- String filePath = args.getString(3);
- String name = args.getString(4);
- int timeout = args.getInt(5) * 1000;
-
- CordovaHttpUpload upload = new CordovaHttpUpload(url, params, headers, filePath, name, timeout, callbackContext);
-
- cordova.getThreadPool().execute(upload);
- } else if (action.equals("downloadFile")) {
- String url = args.getString(0);
- Object params = args.get(1);
- JSONObject headers = args.getJSONObject(2);
- String filePath = args.getString(3);
- int timeout = args.getInt(4) * 1000;
-
- CordovaHttpDownload download = new CordovaHttpDownload(url, params, headers, filePath, timeout, callbackContext);
-
- cordova.getThreadPool().execute(download);
- } else if (action.equals("disableRedirect")) {
- boolean disable = args.getBoolean(0);
- CordovaHttp.disableRedirect(disable);
- callbackContext.success();
- } else {
- return false;
- }
- return true;
- }
-
- private void pinSSLCertsFromCAStore() throws GeneralSecurityException, IOException {
- this.loadSSLCertsFromKeyStore("AndroidCAStore");
- //HttpRequest.setSSLCertMode(HttpRequest.CERT_MODE_PINNED);
- }
-
- private void loadSSLCertsFromKeyStore(String storeType) throws GeneralSecurityException, IOException {
- KeyStore ks = KeyStore.getInstance(storeType);
- ks.load(null);
- Enumeration aliases = ks.aliases();
-
- while (aliases.hasMoreElements()) {
- String alias = aliases.nextElement();
- TrustedCertificateEntry certEntry = (TrustedCertificateEntry) ks.getEntry(alias, null);
- Certificate cert = certEntry.getTrustedCertificate();
- //HttpRequest.addCert(cert);
- }
- }
-
- private void loadSSLCertsFromBundle() throws GeneralSecurityException, IOException {
- AssetManager assetManager = cordova.getActivity().getAssets();
- String[] files = assetManager.list("www/certificates");
- ArrayList cerFiles = new ArrayList();
-
- for (int i = 0; i < files.length; i++) {
- int index = files[i].lastIndexOf('.');
- if (index != -1) {
- if (files[i].substring(index).equals(".cer")) {
- cerFiles.add("www/certificates/" + files[i]);
- }
- }
- }
-
- for (int i = 0; i < cerFiles.size(); i++) {
- InputStream in = cordova.getActivity().getAssets().open(cerFiles.get(i));
- InputStream caInput = new BufferedInputStream(in);
- //HttpRequest.addCert(caInput);
- }
- }
-}
diff --git a/src/android/com/synconset/cordovahttp/CordovaHttpUpload.java b/src/android/com/synconset/cordovahttp/CordovaHttpUpload.java
deleted file mode 100644
index b43794e..0000000
--- a/src/android/com/synconset/cordovahttp/CordovaHttpUpload.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/**
- * A HTTP plugin for Cordova / Phonegap
- */
-package com.synconset.cordovahttp;
-
-import java.io.File;
-
-import java.net.SocketTimeoutException;
-import java.net.UnknownHostException;
-import java.net.URI;
-import java.net.URISyntaxException;
-
-import java.util.Iterator;
-import java.util.Map.Entry;
-import java.util.Set;
-
-import org.apache.cordova.CallbackContext;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import javax.net.ssl.SSLHandshakeException;
-
-import android.webkit.MimeTypeMap;
-
-import com.silkimen.http.HttpRequest;
-import com.silkimen.http.HttpRequest.HttpRequestException;
-
-class CordovaHttpUpload extends CordovaHttp implements Runnable {
- private String filePath;
- private String name;
-
- public CordovaHttpUpload(String urlString, Object params, JSONObject headers, String filePath, String name, int timeout, CallbackContext callbackContext) {
- super(urlString, params, headers, timeout, callbackContext);
- this.filePath = filePath;
- this.name = name;
- }
-
- @Override
- public void run() {
- try {
- HttpRequest request = HttpRequest.post(this.getUrlString());
-
- this.prepareRequest(request);
-
- URI uri = new URI(filePath);
-
- int filenameIndex = filePath.lastIndexOf('/');
- String filename = filePath.substring(filenameIndex + 1);
-
- int extIndex = filePath.lastIndexOf('.');
- String ext = filePath.substring(extIndex + 1);
-
- MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
- String mimeType = mimeTypeMap.getMimeTypeFromExtension(ext);
-
- Set> set = (Set>)this.getParamsMap().entrySet();
- Iterator> i = set.iterator();
-
- while (i.hasNext()) {
- Entry, ?> e = (Entry, ?>)i.next();
- String key = (String)e.getKey();
- Object value = e.getValue();
- if (value instanceof Number) {
- request.part(key, (Number)value);
- } else if (value instanceof String) {
- request.part(key, (String)value);
- } else {
- this.respondWithError("All parameters must be Numbers or Strings");
- return;
- }
- }
-
- request.part(this.name, filename, mimeType, new File(uri));
-
- this.returnResponseObject(request);
- } catch (URISyntaxException e) {
- this.respondWithError("There was an error loading the file");
- } catch (JSONException e) {
- this.respondWithError("There was an error generating the response");
- } catch (HttpRequestException e) {
- this.handleHttpRequestException(e);
- } catch (Exception e) {
- this.respondWithError(e.getMessage());
- }
- }
-}