PINNED_CERTS;
private static HostnameVerifier TRUSTED_VERIFIER;
@@ -274,7 +274,7 @@ public class HttpRequest {
else
return CHARSET_UTF8;
}
-
+
private static SSLSocketFactory getPinnedFactory()
throws HttpRequestException {
if (PINNED_FACTORY != null) {
@@ -305,7 +305,7 @@ public class HttpRequest {
try {
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, trustAllCerts, new SecureRandom());
-
+
if (android.os.Build.VERSION.SDK_INT < 20) {
TRUSTED_FACTORY = new TLSSocketFactory(context);
} else {
@@ -429,8 +429,8 @@ public class HttpRequest {
else
CONNECTION_FACTORY = connectionFactory;
}
-
-
+
+
/**
* Add a certificate to test against when using ssl pinning.
*
@@ -447,27 +447,27 @@ public class HttpRequest {
String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
-
+
for (int i = 0; i < PINNED_CERTS.size(); i++) {
keyStore.setCertificateEntry("CA" + i, PINNED_CERTS.get(i));
}
-
+
// Create a TrustManager that trusts the CAs in our KeyStore
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);
-
+
// Create an SSLContext that uses our TrustManager
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, tmf.getTrustManagers(), null);
-
+
if (android.os.Build.VERSION.SDK_INT < 20) {
PINNED_FACTORY = new TLSSocketFactory(sslContext);
} else {
PINNED_FACTORY = sslContext.getSocketFactory();
}
}
-
+
/**
* Add a certificate to test against when using ssl pinning.
*
@@ -3256,7 +3256,7 @@ public class HttpRequest {
form(entry, charset);
return this;
}
-
+
/**
* Configure HTTPS connection to trust only certain certificates
*
@@ -3275,7 +3275,7 @@ public class HttpRequest {
}
return this;
}
-
+
/**
* Configure HTTPS connection to trust all certificates
*
diff --git a/src/android/com/synconset/CordovaHTTP/TLSSocketFactory.java b/src/android/com/github/kevinsawicki/http/TLSSocketFactory.java
similarity index 95%
rename from src/android/com/synconset/CordovaHTTP/TLSSocketFactory.java
rename to src/android/com/github/kevinsawicki/http/TLSSocketFactory.java
index 8d3170f..e39df61 100644
--- a/src/android/com/synconset/CordovaHTTP/TLSSocketFactory.java
+++ b/src/android/com/github/kevinsawicki/http/TLSSocketFactory.java
@@ -4,8 +4,6 @@ import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
-import java.security.KeyManagementException;
-import java.security.NoSuchAlgorithmException;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
@@ -60,4 +58,4 @@ public class TLSSocketFactory extends SSLSocketFactory {
}
return socket;
}
-}
\ No newline at end of file
+}
diff --git a/src/android/com/synconset/CordovaHTTP/CordovaHttp.java b/src/android/com/synconset/cordovahttp/CordovaHttp.java
similarity index 61%
rename from src/android/com/synconset/CordovaHTTP/CordovaHttp.java
rename to src/android/com/synconset/cordovahttp/CordovaHttp.java
index 71b4709..0303f51 100644
--- a/src/android/com/synconset/CordovaHTTP/CordovaHttp.java
+++ b/src/android/com/synconset/cordovahttp/CordovaHttp.java
@@ -1,63 +1,58 @@
/**
* A HTTP plugin for Cordova / Phonegap
*/
-package com.synconset;
+package com.synconset.cordovahttp;
import org.apache.cordova.CallbackContext;
import org.json.JSONException;
import org.json.JSONObject;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.BufferedReader;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLConnection;
-
-import javax.net.ssl.HttpsURLConnection;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.HostnameVerifier;
-
import java.util.Iterator;
-import android.util.Log;
-
import com.github.kevinsawicki.http.HttpRequest;
-
-public abstract class CordovaHttp {
+
+abstract class CordovaHttp {
protected static final String TAG = "CordovaHTTP";
protected static final String CHARSET = "UTF-8";
-
+
private static AtomicBoolean sslPinning = new AtomicBoolean(false);
private static AtomicBoolean acceptAllCerts = new AtomicBoolean(false);
private static AtomicBoolean validateDomainName = new AtomicBoolean(true);
private String urlString;
- private Map, ?> params;
- private Map headers;
+ private JSONObject params;
+ private String serializerName;
+ private JSONObject headers;
private CallbackContext callbackContext;
-
- public CordovaHttp(String urlString, Map, ?> params, Map headers, CallbackContext callbackContext) {
+
+ public CordovaHttp(String urlString, JSONObject params, JSONObject headers, CallbackContext callbackContext) {
this.urlString = urlString;
this.params = params;
+ this.serializerName = "default";
this.headers = headers;
this.callbackContext = callbackContext;
}
-
+
+ public CordovaHttp(String urlString, JSONObject params, String serializerName, JSONObject headers, CallbackContext callbackContext) {
+ this.urlString = urlString;
+ this.params = params;
+ this.serializerName = serializerName;
+ this.headers = headers;
+ this.callbackContext = callbackContext;
+ }
+
public static void enableSSLPinning(boolean enable) {
sslPinning.set(enable);
if (enable) {
acceptAllCerts.set(false);
}
}
-
+
public static void acceptAllCerts(boolean accept) {
acceptAllCerts.set(accept);
if (accept) {
@@ -72,19 +67,31 @@ public abstract class CordovaHttp {
protected String getUrlString() {
return this.urlString;
}
-
- protected Map, ?> getParams() {
+
+ protected JSONObject getParamsObject() {
return this.params;
}
-
- protected Map getHeaders() {
+
+ protected String getSerializerName() {
+ return this.serializerName;
+ }
+
+ protected HashMap getParamsMap() throws JSONException {
+ return this.getMapFromJSONObject(this.params);
+ }
+
+ protected JSONObject getHeadersObject() {
return this.headers;
}
-
+
+ protected HashMap getHeadersMap() throws JSONException {
+ return this.getStringMapFromJSONObject(this.headers);
+ }
+
protected CallbackContext getCallbackContext() {
return this.callbackContext;
}
-
+
protected HttpRequest setupSecurity(HttpRequest request) {
if (acceptAllCerts.get()) {
request.trustAllCerts();
@@ -97,7 +104,7 @@ public abstract class CordovaHttp {
}
return request;
}
-
+
protected void respondWithError(int status, String msg) {
try {
JSONObject response = new JSONObject();
@@ -108,7 +115,7 @@ public abstract class CordovaHttp {
this.callbackContext.error(msg);
}
}
-
+
protected void respondWithError(String msg) {
this.respondWithError(500, msg);
}
@@ -125,4 +132,26 @@ public abstract class CordovaHttp {
}
response.put("headers", new JSONObject(parsed_headers));
}
+
+ protected HashMap getStringMapFromJSONObject(JSONObject object) throws JSONException {
+ HashMap map = new HashMap();
+ Iterator> i = object.keys();
+
+ while (i.hasNext()) {
+ String key = (String)i.next();
+ map.put(key, object.getString(key));
+ }
+ return map;
+ }
+
+ protected HashMap getMapFromJSONObject(JSONObject object) throws JSONException {
+ HashMap map = new HashMap();
+ Iterator> i = object.keys();
+
+ while(i.hasNext()) {
+ String key = (String)i.next();
+ map.put(key, object.get(key));
+ }
+ return map;
+ }
}
diff --git a/src/android/com/synconset/CordovaHTTP/CordovaHttpDownload.java b/src/android/com/synconset/cordovahttp/CordovaHttpDownload.java
similarity index 84%
rename from src/android/com/synconset/CordovaHTTP/CordovaHttpDownload.java
rename to src/android/com/synconset/cordovahttp/CordovaHttpDownload.java
index cd0a9d5..b5c213c 100644
--- a/src/android/com/synconset/CordovaHTTP/CordovaHttpDownload.java
+++ b/src/android/com/synconset/cordovahttp/CordovaHttpDownload.java
@@ -1,9 +1,7 @@
/**
* A HTTP plugin for Cordova / Phonegap
*/
-package com.synconset;
-
-import android.util.Log;
+package com.synconset.cordovahttp;
import com.github.kevinsawicki.http.HttpRequest;
import com.github.kevinsawicki.http.HttpRequest.HttpRequestException;
@@ -12,7 +10,6 @@ import java.io.File;
import java.net.UnknownHostException;
import java.net.URI;
import java.net.URISyntaxException;
-import java.util.Map;
import javax.net.ssl.SSLHandshakeException;
@@ -22,23 +19,23 @@ import org.apache.cordova.file.FileUtils;
import org.json.JSONException;
import org.json.JSONObject;
-public class CordovaHttpDownload extends CordovaHttp implements Runnable {
+class CordovaHttpDownload extends CordovaHttp implements Runnable {
private String filePath;
-
- public CordovaHttpDownload(String urlString, Map, ?> params, Map headers, CallbackContext callbackContext, String filePath) {
+
+ public CordovaHttpDownload(String urlString, JSONObject params, JSONObject headers, CallbackContext callbackContext, String filePath) {
super(urlString, params, headers, callbackContext);
this.filePath = filePath;
}
-
+
@Override
public void run() {
try {
- HttpRequest request = HttpRequest.get(this.getUrlString(), this.getParams(), true);
+ HttpRequest request = HttpRequest.get(this.getUrlString(), this.getParamsMap(), true);
this.setupSecurity(request);
request.acceptCharset(CHARSET);
- request.headers(this.getHeaders());
+ request.headers(this.getHeadersMap());
int code = request.code();
-
+
JSONObject response = new JSONObject();
this.addResponseHeaders(request, response);
response.put("status", code);
diff --git a/src/android/com/synconset/CordovaHTTP/CordovaHttpPost.java b/src/android/com/synconset/cordovahttp/CordovaHttpGet.java
similarity index 76%
rename from src/android/com/synconset/CordovaHTTP/CordovaHttpPost.java
rename to src/android/com/synconset/cordovahttp/CordovaHttpGet.java
index 2b8e227..dc10242 100644
--- a/src/android/com/synconset/CordovaHTTP/CordovaHttpPost.java
+++ b/src/android/com/synconset/cordovahttp/CordovaHttpGet.java
@@ -1,40 +1,41 @@
/**
* A HTTP plugin for Cordova / Phonegap
*/
-package com.synconset;
+package com.synconset.cordovahttp;
import java.net.UnknownHostException;
-import java.util.Map;
-
-import org.apache.cordova.CallbackContext;
-import org.json.JSONException;
-import org.json.JSONObject;
import javax.net.ssl.SSLHandshakeException;
-import android.util.Log;
+import org.apache.cordova.CallbackContext;
+
+import org.json.JSONException;
+import org.json.JSONObject;
import com.github.kevinsawicki.http.HttpRequest;
import com.github.kevinsawicki.http.HttpRequest.HttpRequestException;
-
-public class CordovaHttpPost extends CordovaHttp implements Runnable {
- public CordovaHttpPost(String urlString, Map, ?> params, Map headers, CallbackContext callbackContext) {
+
+class CordovaHttpGet extends CordovaHttp implements Runnable {
+ public CordovaHttpGet(String urlString, JSONObject params, JSONObject headers, CallbackContext callbackContext) {
super(urlString, params, headers, callbackContext);
}
-
+
@Override
public void run() {
try {
- HttpRequest request = HttpRequest.post(this.getUrlString());
+ HttpRequest request = HttpRequest.get(this.getUrlString(), this.getParamsMap(), false);
+
this.setupSecurity(request);
request.acceptCharset(CHARSET);
- request.headers(this.getHeaders());
- request.form(this.getParams());
+ request.headers(this.getHeadersMap());
+
int code = request.code();
String body = request.body(CHARSET);
JSONObject response = new JSONObject();
+
this.addResponseHeaders(request, response);
response.put("status", code);
+
if (code >= 200 && code < 300) {
response.put("data", body);
this.getCallbackContext().success(response);
@@ -44,7 +45,7 @@ public class CordovaHttpPost extends CordovaHttp implements Runnable {
}
} catch (JSONException e) {
this.respondWithError("There was an error generating the response");
- } catch (HttpRequestException e) {
+ } catch (HttpRequestException e) {
if (e.getCause() instanceof UnknownHostException) {
this.respondWithError(0, "The host could not be resolved");
} else if (e.getCause() instanceof SSLHandshakeException) {
diff --git a/src/android/com/synconset/CordovaHTTP/CordovaHttpHead.java b/src/android/com/synconset/cordovahttp/CordovaHttpHead.java
similarity index 74%
rename from src/android/com/synconset/CordovaHTTP/CordovaHttpHead.java
rename to src/android/com/synconset/cordovahttp/CordovaHttpHead.java
index 9be50b7..bafa3b5 100644
--- a/src/android/com/synconset/CordovaHTTP/CordovaHttpHead.java
+++ b/src/android/com/synconset/cordovahttp/CordovaHttpHead.java
@@ -1,18 +1,9 @@
/**
* A HTTP plugin for Cordova / Phonegap
*/
-package com.synconset;
+package com.synconset.cordovahttp;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
import java.net.UnknownHostException;
-import java.util.Map;
-
-import javax.net.ssl.HttpsURLConnection;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLHandshakeException;
@@ -20,27 +11,29 @@ import org.apache.cordova.CallbackContext;
import org.json.JSONException;
import org.json.JSONObject;
-import android.util.Log;
-
import com.github.kevinsawicki.http.HttpRequest;
import com.github.kevinsawicki.http.HttpRequest.HttpRequestException;
-
-public class CordovaHttpHead extends CordovaHttp implements Runnable {
- public CordovaHttpHead(String urlString, Map, ?> params, Map headers, CallbackContext callbackContext) {
+
+class CordovaHttpHead extends CordovaHttp implements Runnable {
+ public CordovaHttpHead(String urlString, JSONObject params, JSONObject headers, CallbackContext callbackContext) {
super(urlString, params, headers, callbackContext);
}
-
+
@Override
public void run() {
try {
- HttpRequest request = HttpRequest.head(this.getUrlString(), this.getParams(), true);
+ HttpRequest request = HttpRequest.head(this.getUrlString(), this.getParamsMap(), true);
+
this.setupSecurity(request);
request.acceptCharset(CHARSET);
- request.headers(this.getHeaders());
+ request.headers(this.getHeadersMap());
+
int code = request.code();
JSONObject response = new JSONObject();
+
this.addResponseHeaders(request, response);
response.put("status", code);
+
if (code >= 200 && code < 300) {
// no 'body' to return for HEAD request
this.getCallbackContext().success(response);
@@ -61,4 +54,4 @@ public class CordovaHttpHead extends CordovaHttp implements Runnable {
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/android/com/synconset/CordovaHTTP/CordovaHttpPlugin.java b/src/android/com/synconset/cordovahttp/CordovaHttpPlugin.java
similarity index 67%
rename from src/android/com/synconset/CordovaHTTP/CordovaHttpPlugin.java
rename to src/android/com/synconset/cordovahttp/CordovaHttpPlugin.java
index 7efcae9..c39693e 100644
--- a/src/android/com/synconset/CordovaHTTP/CordovaHttpPlugin.java
+++ b/src/android/com/synconset/cordovahttp/CordovaHttpPlugin.java
@@ -1,39 +1,26 @@
/**
* A HTTP plugin for Cordova / Phonegap
*/
-package com.synconset;
+package com.synconset.cordovahttp;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
-import java.net.HttpURLConnection;
-import java.security.GeneralSecurityException;
-import java.security.KeyStore;
-import java.security.cert.Certificate;
-import java.security.cert.CertificateException;
-import java.security.cert.CertificateFactory;
-import java.security.cert.X509Certificate;
-import java.util.Iterator;
-import java.util.ArrayList;
-import java.util.HashMap;
-import javax.net.ssl.HttpsURLConnection;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.TrustManagerFactory;
-import javax.net.ssl.TrustManager;
-import javax.net.ssl.HostnameVerifier;
+import java.security.GeneralSecurityException;
+
+import java.util.ArrayList;
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 android.util.Base64;
-import android.util.Log;
import com.github.kevinsawicki.http.HttpRequest;
@@ -51,25 +38,23 @@ public class CordovaHttpPlugin extends CordovaPlugin {
String urlString = args.getString(0);
JSONObject params = args.getJSONObject(1);
JSONObject headers = args.getJSONObject(2);
- HashMap, ?> paramsMap = this.getMapFromJSONObject(params);
- HashMap headersMap = this.getStringMapFromJSONObject(headers);
- CordovaHttpGet get = new CordovaHttpGet(urlString, paramsMap, headersMap, callbackContext);
+ CordovaHttpGet get = new CordovaHttpGet(urlString, params, headers, callbackContext);
+
cordova.getThreadPool().execute(get);
} else if (action.equals("head")) {
String urlString = args.getString(0);
JSONObject params = args.getJSONObject(1);
JSONObject headers = args.getJSONObject(2);
- HashMap, ?> paramsMap = this.getMapFromJSONObject(params);
- HashMap headersMap = this.getStringMapFromJSONObject(headers);
- CordovaHttpHead head = new CordovaHttpHead(urlString, paramsMap, headersMap, callbackContext);
+ CordovaHttpHead head = new CordovaHttpHead(urlString, params, headers, callbackContext);
+
cordova.getThreadPool().execute(head);
} else if (action.equals("post")) {
String urlString = args.getString(0);
JSONObject params = args.getJSONObject(1);
- JSONObject headers = args.getJSONObject(2);
- HashMap, ?> paramsMap = this.getMapFromJSONObject(params);
- HashMap headersMap = this.getStringMapFromJSONObject(headers);
- CordovaHttpPost post = new CordovaHttpPost(urlString, paramsMap, headersMap, callbackContext);
+ String serializerName = args.getString(2);
+ JSONObject headers = args.getJSONObject(3);
+ CordovaHttpPost post = new CordovaHttpPost(urlString, params, serializerName, headers, callbackContext);
+
cordova.getThreadPool().execute(post);
} else if (action.equals("enableSSLPinning")) {
try {
@@ -82,30 +67,30 @@ public class CordovaHttpPlugin extends CordovaPlugin {
}
} else if (action.equals("acceptAllCerts")) {
boolean accept = args.getBoolean(0);
+
CordovaHttp.acceptAllCerts(accept);
callbackContext.success();
} else if (action.equals("validateDomainName")) {
boolean accept = args.getBoolean(0);
+
CordovaHttp.validateDomainName(accept);
callbackContext.success();
} else if (action.equals("uploadFile")) {
String urlString = args.getString(0);
JSONObject params = args.getJSONObject(1);
JSONObject headers = args.getJSONObject(2);
- HashMap, ?> paramsMap = this.getMapFromJSONObject(params);
- HashMap headersMap = this.getStringMapFromJSONObject(headers);
String filePath = args.getString(3);
String name = args.getString(4);
- CordovaHttpUpload upload = new CordovaHttpUpload(urlString, paramsMap, headersMap, callbackContext, filePath, name);
+ CordovaHttpUpload upload = new CordovaHttpUpload(urlString, params, headers, callbackContext, filePath, name);
+
cordova.getThreadPool().execute(upload);
} else if (action.equals("downloadFile")) {
String urlString = args.getString(0);
JSONObject params = args.getJSONObject(1);
JSONObject headers = args.getJSONObject(2);
- HashMap, ?> paramsMap = this.getMapFromJSONObject(params);
- HashMap headersMap = this.getStringMapFromJSONObject(headers);
String filePath = args.getString(3);
- CordovaHttpDownload download = new CordovaHttpDownload(urlString, paramsMap, headersMap, callbackContext, filePath);
+ CordovaHttpDownload download = new CordovaHttpDownload(urlString, params, headers, callbackContext, filePath);
+
cordova.getThreadPool().execute(download);
} else {
return false;
@@ -149,26 +134,4 @@ public class CordovaHttpPlugin extends CordovaPlugin {
CordovaHttp.enableSSLPinning(false);
}
}
-
- private HashMap getStringMapFromJSONObject(JSONObject object) throws JSONException {
- HashMap map = new HashMap();
- Iterator> i = object.keys();
-
- while (i.hasNext()) {
- String key = (String)i.next();
- map.put(key, object.getString(key));
- }
- return map;
- }
-
- private HashMap getMapFromJSONObject(JSONObject object) throws JSONException {
- HashMap map = new HashMap();
- Iterator> i = object.keys();
-
- while(i.hasNext()) {
- String key = (String)i.next();
- map.put(key, object.get(key));
- }
- return map;
- }
}
diff --git a/src/android/com/synconset/CordovaHTTP/CordovaHttpGet.java b/src/android/com/synconset/cordovahttp/CordovaHttpPost.java
similarity index 65%
rename from src/android/com/synconset/CordovaHTTP/CordovaHttpGet.java
rename to src/android/com/synconset/cordovahttp/CordovaHttpPost.java
index 32ec56a..af9c25a 100644
--- a/src/android/com/synconset/CordovaHTTP/CordovaHttpGet.java
+++ b/src/android/com/synconset/cordovahttp/CordovaHttpPost.java
@@ -1,47 +1,47 @@
/**
* A HTTP plugin for Cordova / Phonegap
*/
-package com.synconset;
+package com.synconset.cordovahttp;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
import java.net.UnknownHostException;
-import java.util.Map;
-
-import javax.net.ssl.HttpsURLConnection;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.HostnameVerifier;
-
-import javax.net.ssl.SSLHandshakeException;
import org.apache.cordova.CallbackContext;
import org.json.JSONException;
import org.json.JSONObject;
-import android.util.Log;
+import javax.net.ssl.SSLHandshakeException;
import com.github.kevinsawicki.http.HttpRequest;
import com.github.kevinsawicki.http.HttpRequest.HttpRequestException;
-
-public class CordovaHttpGet extends CordovaHttp implements Runnable {
- public CordovaHttpGet(String urlString, Map, ?> params, Map headers, CallbackContext callbackContext) {
- super(urlString, params, headers, callbackContext);
+
+class CordovaHttpPost extends CordovaHttp implements Runnable {
+ public CordovaHttpPost(String urlString, JSONObject params, String serializerName, JSONObject headers, CallbackContext callbackContext) {
+ super(urlString, params, serializerName, headers, callbackContext);
}
-
+
@Override
public void run() {
try {
- HttpRequest request = HttpRequest.get(this.getUrlString(), this.getParams(), false);
+ HttpRequest request = HttpRequest.post(this.getUrlString());
+
this.setupSecurity(request);
request.acceptCharset(CHARSET);
- request.headers(this.getHeaders());
+ request.headers(this.getHeadersMap());
+
+ if (new String("json").equals(this.getSerializerName())) {
+ request.contentType(request.CONTENT_TYPE_JSON, request.CHARSET_UTF8);
+ request.send(this.getParamsObject().toString());
+ } else {
+ request.form(this.getParamsMap());
+ }
+
int code = request.code();
String body = request.body(CHARSET);
JSONObject response = new JSONObject();
+
this.addResponseHeaders(request, response);
response.put("status", code);
+
if (code >= 200 && code < 300) {
response.put("data", body);
this.getCallbackContext().success(response);
@@ -51,7 +51,7 @@ public class CordovaHttpGet extends CordovaHttp implements Runnable {
}
} catch (JSONException e) {
this.respondWithError("There was an error generating the response");
- } catch (HttpRequestException e) {
+ } catch (HttpRequestException e) {
if (e.getCause() instanceof UnknownHostException) {
this.respondWithError(0, "The host could not be resolved");
} else if (e.getCause() instanceof SSLHandshakeException) {
@@ -61,4 +61,4 @@ public class CordovaHttpGet extends CordovaHttp implements Runnable {
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/android/com/synconset/CordovaHTTP/CordovaHttpUpload.java b/src/android/com/synconset/cordovahttp/CordovaHttpUpload.java
similarity index 81%
rename from src/android/com/synconset/CordovaHTTP/CordovaHttpUpload.java
rename to src/android/com/synconset/cordovahttp/CordovaHttpUpload.java
index 2e89558..1ad144e 100644
--- a/src/android/com/synconset/CordovaHTTP/CordovaHttpUpload.java
+++ b/src/android/com/synconset/cordovahttp/CordovaHttpUpload.java
@@ -1,57 +1,65 @@
/**
* A HTTP plugin for Cordova / Phonegap
*/
-package com.synconset;
+package com.synconset.cordovahttp;
import java.io.File;
+
import java.net.UnknownHostException;
import java.net.URI;
import java.net.URISyntaxException;
+
import java.util.Iterator;
-import java.util.Map;
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.util.Log;
import android.webkit.MimeTypeMap;
import com.github.kevinsawicki.http.HttpRequest;
import com.github.kevinsawicki.http.HttpRequest.HttpRequestException;
-
-public class CordovaHttpUpload extends CordovaHttp implements Runnable {
+
+class CordovaHttpUpload extends CordovaHttp implements Runnable {
private String filePath;
private String name;
-
- public CordovaHttpUpload(String urlString, Map, ?> params, Map headers, CallbackContext callbackContext, String filePath, String name) {
+
+ public CordovaHttpUpload(String urlString, JSONObject params, JSONObject headers, CallbackContext callbackContext, String filePath, String name) {
super(urlString, params, headers, callbackContext);
this.filePath = filePath;
this.name = name;
}
-
+
@Override
public void run() {
try {
HttpRequest request = HttpRequest.post(this.getUrlString());
+
this.setupSecurity(request);
request.acceptCharset(CHARSET);
- request.headers(this.getHeaders());
+ request.headers(this.getHeadersMap());
+
URI uri = new URI(filePath);
- int index = filePath.lastIndexOf('/');
- String filename = filePath.substring(index + 1);
- index = filePath.lastIndexOf('.');
- String ext = filePath.substring(index + 1);
+
+ 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.name, filename, mimeType, new File(uri));
-
- Set> set = (Set>)this.getParams().entrySet();
+
+ Set> set = (Set>)this.getParamsMap().entrySet();
Iterator> i = set.iterator();
+
while (i.hasNext()) {
Entry, ?> e = (Entry, ?>)i.next();
String key = (String)e.getKey();
@@ -65,13 +73,15 @@ public class CordovaHttpUpload extends CordovaHttp implements Runnable {
return;
}
}
-
+
int code = request.code();
String body = request.body(CHARSET);
-
+
JSONObject response = new JSONObject();
+
this.addResponseHeaders(request, response);
response.put("status", code);
+
if (code >= 200 && code < 300) {
response.put("data", body);
this.getCallbackContext().success(response);
diff --git a/src/ios/CordovaHttpPlugin.m b/src/ios/CordovaHttpPlugin.m
index ecfdee3..3214524 100644
--- a/src/ios/CordovaHttpPlugin.m
+++ b/src/ios/CordovaHttpPlugin.m
@@ -19,8 +19,15 @@
securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
}
-- (void)setRequestHeaders:(NSDictionary*)headers forManager:(AFHTTPSessionManager*)manager {
+- (void)setRequestSerializer:(NSString*)serializerName forManager:(AFHTTPSessionManager*)manager {
+ if ([serializerName isEqualToString:@"json"]) {
+ manager.requestSerializer = [AFJSONRequestSerializer serializer];
+ } else {
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
+ }
+}
+
+- (void)setRequestHeaders:(NSDictionary*)headers forManager:(AFHTTPSessionManager*)manager {
[headers enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
[manager.requestSerializer setValue:obj forHTTPHeaderField:key];
}];
@@ -41,7 +48,7 @@
} else {
securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
}
-
+
CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
[self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
}
@@ -49,9 +56,9 @@
- (void)acceptAllCerts:(CDVInvokedUrlCommand*)command {
CDVPluginResult* pluginResult = nil;
bool allow = [[command.arguments objectAtIndex:0] boolValue];
-
+
securityPolicy.allowInvalidCertificates = allow;
-
+
pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
[self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
}
@@ -59,9 +66,9 @@
- (void)validateDomainName:(CDVInvokedUrlCommand*)command {
CDVPluginResult* pluginResult = nil;
bool validate = [[command.arguments objectAtIndex:0] boolValue];
-
+
securityPolicy.validatesDomainName = validate;
-
+
pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
[self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
}
@@ -71,9 +78,11 @@
manager.securityPolicy = securityPolicy;
NSString *url = [command.arguments objectAtIndex:0];
NSDictionary *parameters = [command.arguments objectAtIndex:1];
- NSDictionary *headers = [command.arguments objectAtIndex:2];
+ NSString *serializerName = [command.arguments objectAtIndex:2];
+ NSDictionary *headers = [command.arguments objectAtIndex:3];
+ [self setRequestSerializer: serializerName forManager: manager];
[self setRequestHeaders: headers forManager: manager];
-
+
CordovaHttpPlugin* __weak weakSelf = self;
manager.responseSerializer = [TextResponseSerializer serializer];
[manager POST:url parameters:parameters progress:nil success:^(NSURLSessionTask *task, id responseObject) {
@@ -98,10 +107,11 @@
NSString *url = [command.arguments objectAtIndex:0];
NSDictionary *parameters = [command.arguments objectAtIndex:1];
NSDictionary *headers = [command.arguments objectAtIndex:2];
+ [self setRequestSerializer: @"default" forManager: manager];
[self setRequestHeaders: headers forManager: manager];
-
+
CordovaHttpPlugin* __weak weakSelf = self;
-
+
manager.responseSerializer = [TextResponseSerializer serializer];
[manager GET:url parameters:parameters progress:nil success:^(NSURLSessionTask *task, id responseObject) {
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
@@ -126,9 +136,9 @@
NSDictionary *parameters = [command.arguments objectAtIndex:1];
NSDictionary *headers = [command.arguments objectAtIndex:2];
[self setRequestHeaders: headers forManager: manager];
-
+
CordovaHttpPlugin* __weak weakSelf = self;
-
+
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager HEAD:url parameters:parameters success:^(NSURLSessionTask *task) {
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
@@ -154,11 +164,11 @@
NSDictionary *headers = [command.arguments objectAtIndex:2];
NSString *filePath = [command.arguments objectAtIndex: 3];
NSString *name = [command.arguments objectAtIndex: 4];
-
+
NSURL *fileURL = [NSURL URLWithString: filePath];
-
+
[self setRequestHeaders: headers forManager: manager];
-
+
CordovaHttpPlugin* __weak weakSelf = self;
manager.responseSerializer = [TextResponseSerializer serializer];
[manager POST:url parameters:parameters constructingBodyWithBlock:^(id formData) {
@@ -195,13 +205,13 @@
NSDictionary *parameters = [command.arguments objectAtIndex:1];
NSDictionary *headers = [command.arguments objectAtIndex:2];
NSString *filePath = [command.arguments objectAtIndex: 3];
-
+
[self setRequestHeaders: headers forManager: manager];
-
+
if ([filePath hasPrefix:@"file://"]) {
filePath = [filePath substringFromIndex:7];
}
-
+
CordovaHttpPlugin* __weak weakSelf = self;
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager GET:url parameters:parameters progress:nil success:^(NSURLSessionTask *task, id responseObject) {
@@ -229,7 +239,7 @@
*/
// Download response is okay; begin streaming output to file
NSString* parentPath = [filePath stringByDeletingLastPathComponent];
-
+
// create parent directories if needed
NSError *error;
if ([[NSFileManager defaultManager] createDirectoryAtPath:parentPath withIntermediateDirectories:YES attributes:nil error:&error] == NO) {
@@ -253,7 +263,7 @@
[weakSelf.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
return;
}
-
+
id filePlugin = [self.commandDelegate getCommandInstance:@"File"];
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
[self setResults: dictionary withTask: task];
diff --git a/www/cordovaHTTP.js b/www/cordovaHTTP.js
index bbcd2e0..a5ebe2b 100644
--- a/www/cordovaHTTP.js
+++ b/www/cordovaHTTP.js
@@ -1,14 +1,40 @@
/*global angular*/
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ * Modified by Andrew Stephan for Sync OnSet
+ * Modified by Sefa Ilkimen:
+ * - added configurable params serializer
+ *
+*/
+
/*
* An HTTP Plugin for PhoneGap.
*/
var exec = require('cordova/exec');
+var validSerializers = ['urlencoded', 'json'];
// Thanks Mozilla: https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_.22Unicode_Problem.22
function b64EncodeUnicode(str) {
- return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) {
+ return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function (match, p1) {
return String.fromCharCode('0x' + p1);
}));
}
@@ -25,68 +51,65 @@ function mergeHeaders(globalHeaders, localHeaders) {
return localHeaders;
}
+function checkSerializer(serializer) {
+ serializer = serializer || '';
+ serializer = serializer.trim().toLowerCase();
+
+ if (validSerializers.indexOf(serializer) > -1) {
+ return serializer;
+ }
+
+ return serializer[0];
+}
+
var http = {
headers: {},
+ paramSerializer: 'urlencoded',
sslPinning: false,
- getBasicAuthHeader: function(username, password) {
+ getBasicAuthHeader: function (username, password) {
return {'Authorization': 'Basic ' + b64EncodeUnicode(username + ':' + password)};
},
- useBasicAuth: function(username, password) {
+ useBasicAuth: function (username, password) {
this.headers.Authorization = 'Basic ' + b64EncodeUnicode(username + ':' + password);
},
- setHeader: function(header, value) {
+ setHeader: function (header, value) {
this.headers[header] = value;
},
- enableSSLPinning: function(enable, success, failure) {
- return exec(success, failure, "CordovaHttpPlugin", "enableSSLPinning", [enable]);
+ setParamSerializer: function (serializer) {
+ this.paramSerializer = checkSerializer(serializer);
},
- acceptAllCerts: function(allow, success, failure) {
- return exec(success, failure, "CordovaHttpPlugin", "acceptAllCerts", [allow]);
+ enableSSLPinning: function (enable, success, failure) {
+ return exec(success, failure, 'CordovaHttpPlugin', 'enableSSLPinning', [enable]);
},
- validateDomainName: function(validate, success, failure) {
- return exec(success, failure, "CordovaHttpPlugin", "validateDomainName", [validate]);
+ acceptAllCerts: function (allow, success, failure) {
+ return exec(success, failure, 'CordovaHttpPlugin', 'acceptAllCerts', [allow]);
},
- post: function(url, params, headers, success, failure) {
+ validateDomainName: function (validate, success, failure) {
+ return exec(success, failure, 'CordovaHttpPlugin', 'validateDomainName', [validate]);
+ },
+ post: function (url, params, headers, success, failure) {
+ params = params || {};
+ headers = headers || {};
headers = mergeHeaders(this.headers, headers);
- return exec(success, failure, "CordovaHttpPlugin", "post", [url, params, headers]);
+ return exec(success, failure, 'CordovaHttpPlugin', 'post', [url, params, this.paramSerializer, headers]);
},
- get: function(url, params, headers, success, failure) {
+ get: function (url, params, headers, success, failure) {
+ params = params || {};
+ headers = headers || {};
headers = mergeHeaders(this.headers, headers);
- return exec(success, failure, "CordovaHttpPlugin", "get", [url, params, headers]);
+ return exec(success, failure, 'CordovaHttpPlugin', 'get', [url, params, headers]);
},
- head: function(url, params, headers, success, failure) {
+ head: function (url, params, headers, success, failure) {
headers = mergeHeaders(this.headers, headers);
- return exec(success, failure, "CordovaHttpPlugin", "head", [url, params, headers]);
+ return exec(success, failure, 'CordovaHttpPlugin', 'head', [url, params, headers]);
},
- uploadFile: function(url, params, headers, filePath, name, success, failure) {
+ uploadFile: function (url, params, headers, filePath, name, success, failure) {
headers = mergeHeaders(this.headers, headers);
- return exec(success, failure, "CordovaHttpPlugin", "uploadFile", [url, params, headers, filePath, name]);
+ return exec(success, failure, 'CordovaHttpPlugin', 'uploadFile', [url, params, headers, filePath, name]);
},
- downloadFile: function(url, params, headers, filePath, success, failure) {
- /*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Modified by Andrew Stephan for Sync OnSet
- *
- */
+ downloadFile: function (url, params, headers, filePath, success, failure) {
headers = mergeHeaders(this.headers, headers);
- var win = function(result) {
+ var win = function (result) {
var entry = new (require('cordova-plugin-file.FileEntry'))();
entry.isDirectory = false;
entry.isFile = true;
@@ -96,75 +119,78 @@ var http = {
entry.nativeURL = result.file.nativeURL;
success(entry);
};
- return exec(win, failure, "CordovaHttpPlugin", "downloadFile", [url, params, headers, filePath]);
+ return exec(win, failure, 'CordovaHttpPlugin', 'downloadFile', [url, params, headers, filePath]);
}
};
module.exports = http;
-if (typeof angular !== "undefined") {
- angular.module('cordovaHTTP', []).factory('cordovaHTTP', function($timeout, $q) {
+if (typeof angular !== 'undefined') {
+ angular.module('cordovaHTTP', []).factory('cordovaHTTP', function ($timeout, $q) {
function makePromise(fn, args, async) {
var deferred = $q.defer();
-
- var success = function(response) {
+
+ var success = function (response) {
if (async) {
- $timeout(function() {
+ $timeout(function () {
deferred.resolve(response);
});
} else {
deferred.resolve(response);
}
};
-
- var fail = function(response) {
+
+ var fail = function (response) {
if (async) {
- $timeout(function() {
+ $timeout(function () {
deferred.reject(response);
});
} else {
deferred.reject(response);
}
};
-
+
args.push(success);
args.push(fail);
-
+
fn.apply(http, args);
-
+
return deferred.promise;
}
-
+
var cordovaHTTP = {
getBasicAuthHeader: http.getBasicAuthHeader,
- useBasicAuth: function(username, password) {
+ useBasicAuth: function (username, password) {
return http.useBasicAuth(username, password);
},
- setHeader: function(header, value) {
+ setHeader: function (header, value) {
return http.setHeader(header, value);
},
- enableSSLPinning: function(enable) {
+ setParamSerializer: function (serializer) {
+ return http.setParamSerializer(serializer);
+ },
+ enableSSLPinning: function (enable) {
return makePromise(http.enableSSLPinning, [enable]);
},
- acceptAllCerts: function(allow) {
+ acceptAllCerts: function (allow) {
return makePromise(http.acceptAllCerts, [allow]);
},
- validateDomainName: function(validate) {
+ validateDomainName: function (validate) {
return makePromise(http.validateDomainName, [validate]);
},
- post: function(url, params, headers) {
+ post: function (url, params, headers) {
return makePromise(http.post, [url, params, headers], true);
},
- get: function(url, params, headers) {
+ get: function (url, params, headers) {
return makePromise(http.get, [url, params, headers], true);
},
- head: function(url, params, headers) {
+ head: function (url, params, headers) {
return makePromise(http.head, [url, params, headers], true);
},
- uploadFile: function(url, params, headers, filePath, name) {
+ uploadFile: function (url, params, headers, filePath, name) {
return makePromise(http.uploadFile, [url, params, headers, filePath, name], true);
},
- downloadFile: function(url, params, headers, filePath) {
+ downloadFile: function (url, params, headers, filePath) {
return makePromise(http.downloadFile, [url, params, headers, filePath], true);
}
};
diff --git a/zedconfig.json b/zedconfig.json
deleted file mode 100644
index e6a16fa..0000000
--- a/zedconfig.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
- "preferences": {
- "tabSize": 2,
- "wordWrap": true,
- "useSoftTabs": true,
- "gotoExclude": []
- },
- "packages": [
- "gh:wymsee/zed-tools/mobile"
- ],
- "modes": {
- "javascript": {
- "commands": {
- "Tools:Check": {
- "options": {
- "globals": {
- "angular": true,
- "$": true,
- "device": true,
- "persistence": true,
- "moment": true,
- "sos": true,
- "LocalFileSystem": true,
- "Hammer": true,
- "AnimationFrame": true,
- "Bloodhound": true
- }
- }
- }
- }
- }
- }
-}
\ No newline at end of file