From 92c0afe8084f4002853ad0bba79192462338ad60 Mon Sep 17 00:00:00 2001 From: abhilash das Date: Wed, 20 Mar 2024 21:41:23 +0530 Subject: [PATCH 1/4] feat: add headers support for mixpanel proxy api calls --- .../mpmetrics/AutomaticEventsTest.java | 5 +++-- .../mixpanel/android/mpmetrics/HttpTest.java | 3 ++- .../android/mpmetrics/MixpanelBasicTest.java | 5 +++-- .../android/mpmetrics/OptOutTest.java | 3 ++- .../android/mpmetrics/AnalyticsMessages.java | 2 +- .../mixpanel/android/mpmetrics/MPConfig.java | 15 ++++++++++++++ .../android/mpmetrics/MixpanelAPI.java | 12 +++++++++++ .../mixpanel/android/util/HttpService.java | 20 ++++++++++++++++++- .../android/util/MixpanelServerCallback.java | 9 +++++++++ .../mixpanel/android/util/RemoteService.java | 2 +- 10 files changed, 67 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/mixpanel/android/util/MixpanelServerCallback.java diff --git a/src/androidTest/java/com/mixpanel/android/mpmetrics/AutomaticEventsTest.java b/src/androidTest/java/com/mixpanel/android/mpmetrics/AutomaticEventsTest.java index a60ce2750..36dff3371 100644 --- a/src/androidTest/java/com/mixpanel/android/mpmetrics/AutomaticEventsTest.java +++ b/src/androidTest/java/com/mixpanel/android/mpmetrics/AutomaticEventsTest.java @@ -12,6 +12,7 @@ import com.mixpanel.android.util.Base64Coder; import com.mixpanel.android.util.HttpService; +import com.mixpanel.android.util.MixpanelServerCallback; import com.mixpanel.android.util.RemoteService; import org.json.JSONArray; @@ -62,7 +63,7 @@ public void setUp() { private void setUpInstance(boolean trackAutomaticEvents) { final RemoteService mockPoster = new HttpService() { @Override - public byte[] performRequest(String endpointUrl, Map params, SSLSocketFactory socketFactory) { + public byte[] performRequest(String endpointUrl, MixpanelServerCallback callback, Map params, SSLSocketFactory socketFactory) { final String jsonData = Base64Coder.decodeString(params.get("data").toString()); assertTrue(params.containsKey("data")); @@ -211,7 +212,7 @@ public void testAutomaticMultipleInstances() throws InterruptedException { final HttpService mpSecondPoster = new HttpService() { @Override - public byte[] performRequest(String endpointUrl, Map params, SSLSocketFactory socketFactory) { + public byte[] performRequest(String endpointUrl, MixpanelServerCallback callback, Map params, SSLSocketFactory socketFactory) { final String jsonData = Base64Coder.decodeString(params.get("data").toString()); assertTrue(params.containsKey("data")); try { diff --git a/src/androidTest/java/com/mixpanel/android/mpmetrics/HttpTest.java b/src/androidTest/java/com/mixpanel/android/mpmetrics/HttpTest.java index 12c5ceaaa..e97cf1a71 100644 --- a/src/androidTest/java/com/mixpanel/android/mpmetrics/HttpTest.java +++ b/src/androidTest/java/com/mixpanel/android/mpmetrics/HttpTest.java @@ -9,6 +9,7 @@ import androidx.test.platform.app.InstrumentationRegistry; import com.mixpanel.android.util.Base64Coder; +import com.mixpanel.android.util.MixpanelServerCallback; import com.mixpanel.android.util.RemoteService; import com.mixpanel.android.util.HttpService; @@ -61,7 +62,7 @@ public void setUp() { final RemoteService mockPoster = new HttpService() { @Override - public byte[] performRequest(String endpointUrl, Map params, SSLSocketFactory socketFactory) + public byte[] performRequest(String endpointUrl, MixpanelServerCallback callback, Map params, SSLSocketFactory socketFactory) throws ServiceUnavailableException, IOException { try { if (mFlushResults.isEmpty()) { diff --git a/src/androidTest/java/com/mixpanel/android/mpmetrics/MixpanelBasicTest.java b/src/androidTest/java/com/mixpanel/android/mpmetrics/MixpanelBasicTest.java index bf72b2765..892004b6b 100644 --- a/src/androidTest/java/com/mixpanel/android/mpmetrics/MixpanelBasicTest.java +++ b/src/androidTest/java/com/mixpanel/android/mpmetrics/MixpanelBasicTest.java @@ -12,6 +12,7 @@ import com.mixpanel.android.BuildConfig; import com.mixpanel.android.util.Base64Coder; import com.mixpanel.android.util.HttpService; +import com.mixpanel.android.util.MixpanelServerCallback; import com.mixpanel.android.util.RemoteService; import org.json.JSONArray; @@ -702,7 +703,7 @@ public int addJSON(JSONObject message, String token, MPDbAdapter.Table table) { final RemoteService mockPoster = new HttpService() { @Override - public byte[] performRequest(String endpointUrl, Map params, SSLSocketFactory socketFactory) { + public byte[] performRequest(String endpointUrl, MixpanelServerCallback callback, Map params, SSLSocketFactory socketFactory) { final boolean isIdentified = isIdentifiedRef.get(); assertTrue(params.containsKey("data")); final String decoded = Base64Coder.decodeString(params.get("data").toString()); @@ -1397,7 +1398,7 @@ protected AnalyticsMessages getAnalyticsMessages() { public void testAlias() { final RemoteService mockPoster = new HttpService() { @Override - public byte[] performRequest(String endpointUrl, Map params, SSLSocketFactory socketFactory) { + public byte[] performRequest(String endpointUrl, MixpanelServerCallback callback, Map params, SSLSocketFactory socketFactory) { try { assertTrue(params.containsKey("data")); final String jsonData = Base64Coder.decodeString(params.get("data").toString()); diff --git a/src/androidTest/java/com/mixpanel/android/mpmetrics/OptOutTest.java b/src/androidTest/java/com/mixpanel/android/mpmetrics/OptOutTest.java index e6c2ef82f..24db722ea 100644 --- a/src/androidTest/java/com/mixpanel/android/mpmetrics/OptOutTest.java +++ b/src/androidTest/java/com/mixpanel/android/mpmetrics/OptOutTest.java @@ -8,6 +8,7 @@ import com.mixpanel.android.util.Base64Coder; import com.mixpanel.android.util.HttpService; +import com.mixpanel.android.util.MixpanelServerCallback; import com.mixpanel.android.util.RemoteService; import org.json.JSONArray; @@ -57,7 +58,7 @@ public void setUp() { final RemoteService mockPoster = new HttpService() { @Override - public byte[] performRequest(String endpointUrl, Map params, SSLSocketFactory socketFactory) { + public byte[] performRequest(String endpointUrl, MixpanelServerCallback callback, Map params, SSLSocketFactory socketFactory) { if (params != null) { final String jsonData = Base64Coder.decodeString(params.get("data").toString()); assertTrue(params.containsKey("data")); diff --git a/src/main/java/com/mixpanel/android/mpmetrics/AnalyticsMessages.java b/src/main/java/com/mixpanel/android/mpmetrics/AnalyticsMessages.java index 3327f6def..a29d18284 100644 --- a/src/main/java/com/mixpanel/android/mpmetrics/AnalyticsMessages.java +++ b/src/main/java/com/mixpanel/android/mpmetrics/AnalyticsMessages.java @@ -514,7 +514,7 @@ private void sendData(MPDbAdapter dbAdapter, String token, MPDbAdapter.Table tab byte[] response; try { final SSLSocketFactory socketFactory = mConfig.getSSLSocketFactory(); - response = poster.performRequest(url, params, socketFactory); + response = poster.performRequest(url, mConfig.getMixpanelServerCallback(), params, socketFactory); if (null == response) { deleteEvents = false; logAboutMessageToMixpanel("Response was null, unexpected failure posting to " + url + "."); diff --git a/src/main/java/com/mixpanel/android/mpmetrics/MPConfig.java b/src/main/java/com/mixpanel/android/mpmetrics/MPConfig.java index f828416c0..ec577a1c0 100644 --- a/src/main/java/com/mixpanel/android/mpmetrics/MPConfig.java +++ b/src/main/java/com/mixpanel/android/mpmetrics/MPConfig.java @@ -10,6 +10,7 @@ import com.mixpanel.android.BuildConfig; import com.mixpanel.android.util.MPConstants; import com.mixpanel.android.util.MPLog; +import com.mixpanel.android.util.MixpanelServerCallback; import com.mixpanel.android.util.OfflineMode; import java.security.GeneralSecurityException; @@ -303,6 +304,11 @@ public String getEventsEndpoint() { public boolean getTrackAutomaticEvents() { return mTrackAutomaticEvents; } + public void setServerURL(String serverURL, MixpanelServerCallback callback) { + setServerURL(serverURL); + setMixpanelServerCallback(callback); + } + // In parity with iOS SDK public void setServerURL(String serverURL) { setEventsEndpointWithBaseURL(serverURL); @@ -413,6 +419,14 @@ public synchronized OfflineMode getOfflineMode() { /////////////////////////////////////////////// + public MixpanelServerCallback getMixpanelServerCallback() { + return this.serverCallbacks; + } + + public void setMixpanelServerCallback(MixpanelServerCallback callback) { + this.serverCallbacks = callback; + } + // Package access for testing only- do not call directly in library code /* package */ static MPConfig readConfig(Context appContext, String instanceName) { final String packageName = appContext.getPackageName(); @@ -472,5 +486,6 @@ public String toString() { // Mutable, with synchronized accessor and mutator private SSLSocketFactory mSSLSocketFactory; private OfflineMode mOfflineMode; + private MixpanelServerCallback serverCallbacks = null; private static final String LOGTAG = "MixpanelAPI.Conf"; } diff --git a/src/main/java/com/mixpanel/android/mpmetrics/MixpanelAPI.java b/src/main/java/com/mixpanel/android/mpmetrics/MixpanelAPI.java index 6c8efa445..5fc0c8b60 100644 --- a/src/main/java/com/mixpanel/android/mpmetrics/MixpanelAPI.java +++ b/src/main/java/com/mixpanel/android/mpmetrics/MixpanelAPI.java @@ -14,6 +14,7 @@ import android.os.Bundle; import com.mixpanel.android.util.MPLog; +import com.mixpanel.android.util.MixpanelServerCallback; import org.json.JSONArray; import org.json.JSONException; @@ -580,6 +581,17 @@ public void setServerURL(String serverURL) { mConfig.setServerURL(serverURL); } + /** + * Set the base URL used for Mixpanel API requests. + * Useful if you need to proxy Mixpanel requests. Defaults to https://api.mixpanel.com. + * To route data to Mixpanel's EU servers, set to https://api-eu.mixpanel.com + * + * @param serverURL the base URL used for Mixpanel API requests + * @param callback the callback for mixpanel proxy server api headers and status + */ + public void setServerURL(String serverURL, MixpanelServerCallback callback) { + mConfig.setServerURL(serverURL, callback); + } public Boolean getTrackAutomaticEvents() { return mTrackAutomaticEvents; } /** diff --git a/src/main/java/com/mixpanel/android/util/HttpService.java b/src/main/java/com/mixpanel/android/util/HttpService.java index 97e0a5d28..c29981fe2 100644 --- a/src/main/java/com/mixpanel/android/util/HttpService.java +++ b/src/main/java/com/mixpanel/android/util/HttpService.java @@ -1,5 +1,7 @@ package com.mixpanel.android.util; +import static com.mixpanel.android.util.MPConstants.URL.MIXPANEL_API; + import android.annotation.SuppressLint; import android.content.Context; import android.net.ConnectivityManager; @@ -88,7 +90,7 @@ private boolean onOfflineMode(OfflineMode offlineMode) { } @Override - public byte[] performRequest(String endpointUrl, Map params, SSLSocketFactory socketFactory) throws ServiceUnavailableException, IOException { + public byte[] performRequest(String endpointUrl, MixpanelServerCallback callback, Map params, SSLSocketFactory socketFactory) throws ServiceUnavailableException, IOException { MPLog.v(LOGTAG, "Attempting request to " + endpointUrl); byte[] response = null; @@ -112,6 +114,15 @@ public byte[] performRequest(String endpointUrl, Map params, SSL ((HttpsURLConnection) connection).setSSLSocketFactory(socketFactory); } + if (shouldProcessMixpanelCallback(endpointUrl) && callback != null) { + Map headers = callback.getHeaders(); + if (headers != null) { + for (Map.Entry entry : headers.entrySet()) { + connection.setRequestProperty(entry.getKey(), entry.getValue()); + } + } + } + connection.setConnectTimeout(2000); connection.setReadTimeout(30000); if (null != params) { @@ -133,6 +144,9 @@ public byte[] performRequest(String endpointUrl, Map params, SSL out.close(); out = null; } + if (shouldProcessMixpanelCallback(endpointUrl) && callback != null) { + callback.onResponse(endpointUrl, connection.getResponseCode()); + } in = connection.getInputStream(); response = slurp(in); in.close(); @@ -165,6 +179,10 @@ public byte[] performRequest(String endpointUrl, Map params, SSL return response; } + private static boolean shouldProcessMixpanelCallback(String endpointUrl) { + return !endpointUrl.toLowerCase().contains(MIXPANEL_API.toLowerCase()); + } + private static byte[] slurp(final InputStream inputStream) throws IOException { final ByteArrayOutputStream buffer = new ByteArrayOutputStream(); diff --git a/src/main/java/com/mixpanel/android/util/MixpanelServerCallback.java b/src/main/java/com/mixpanel/android/util/MixpanelServerCallback.java new file mode 100644 index 000000000..c5a2c177d --- /dev/null +++ b/src/main/java/com/mixpanel/android/util/MixpanelServerCallback.java @@ -0,0 +1,9 @@ +package com.mixpanel.android.util; + +import java.util.Map; + +public interface MixpanelServerCallback { + Map getHeaders(); + + void onResponse(String apiPath, int responseCode); +} diff --git a/src/main/java/com/mixpanel/android/util/RemoteService.java b/src/main/java/com/mixpanel/android/util/RemoteService.java index c73582f9f..91ccbf137 100644 --- a/src/main/java/com/mixpanel/android/util/RemoteService.java +++ b/src/main/java/com/mixpanel/android/util/RemoteService.java @@ -14,7 +14,7 @@ public interface RemoteService { void checkIsMixpanelBlocked(); - byte[] performRequest(String endpointUrl, Map params, SSLSocketFactory socketFactory) + byte[] performRequest(String endpointUrl, MixpanelServerCallback callback, Map params, SSLSocketFactory socketFactory) throws ServiceUnavailableException, IOException; class ServiceUnavailableException extends Exception { From 888696e4c83a67f1a57abd56675285b075f9cff9 Mon Sep 17 00:00:00 2001 From: abhilash das Date: Wed, 27 Mar 2024 14:53:23 +0530 Subject: [PATCH 2/4] feat: rename callbacks for proxy server --- .../android/mpmetrics/AutomaticEventsTest.java | 6 +++--- .../com/mixpanel/android/mpmetrics/HttpTest.java | 5 ++--- .../android/mpmetrics/MixpanelBasicTest.java | 6 +++--- .../com/mixpanel/android/mpmetrics/OptOutTest.java | 4 ++-- .../com/mixpanel/android/mpmetrics/MPConfig.java | 12 ++++++------ .../java/com/mixpanel/android/util/HttpService.java | 12 ++++++------ .../android/util/MixpanelServerCallback.java | 9 --------- .../mixpanel/android/util/ProxyServerInteractor.java | 9 +++++++++ .../com/mixpanel/android/util/RemoteService.java | 2 +- 9 files changed, 32 insertions(+), 33 deletions(-) delete mode 100644 src/main/java/com/mixpanel/android/util/MixpanelServerCallback.java create mode 100644 src/main/java/com/mixpanel/android/util/ProxyServerInteractor.java diff --git a/src/androidTest/java/com/mixpanel/android/mpmetrics/AutomaticEventsTest.java b/src/androidTest/java/com/mixpanel/android/mpmetrics/AutomaticEventsTest.java index 36dff3371..5ed4e97ab 100644 --- a/src/androidTest/java/com/mixpanel/android/mpmetrics/AutomaticEventsTest.java +++ b/src/androidTest/java/com/mixpanel/android/mpmetrics/AutomaticEventsTest.java @@ -12,7 +12,7 @@ import com.mixpanel.android.util.Base64Coder; import com.mixpanel.android.util.HttpService; -import com.mixpanel.android.util.MixpanelServerCallback; +import com.mixpanel.android.util.ProxyServerInteractor; import com.mixpanel.android.util.RemoteService; import org.json.JSONArray; @@ -63,7 +63,7 @@ public void setUp() { private void setUpInstance(boolean trackAutomaticEvents) { final RemoteService mockPoster = new HttpService() { @Override - public byte[] performRequest(String endpointUrl, MixpanelServerCallback callback, Map params, SSLSocketFactory socketFactory) { + public byte[] performRequest(String endpointUrl, ProxyServerInteractor callback, Map params, SSLSocketFactory socketFactory) { final String jsonData = Base64Coder.decodeString(params.get("data").toString()); assertTrue(params.containsKey("data")); @@ -212,7 +212,7 @@ public void testAutomaticMultipleInstances() throws InterruptedException { final HttpService mpSecondPoster = new HttpService() { @Override - public byte[] performRequest(String endpointUrl, MixpanelServerCallback callback, Map params, SSLSocketFactory socketFactory) { + public byte[] performRequest(String endpointUrl, ProxyServerInteractor callback, Map params, SSLSocketFactory socketFactory) { final String jsonData = Base64Coder.decodeString(params.get("data").toString()); assertTrue(params.containsKey("data")); try { diff --git a/src/androidTest/java/com/mixpanel/android/mpmetrics/HttpTest.java b/src/androidTest/java/com/mixpanel/android/mpmetrics/HttpTest.java index e97cf1a71..25b5766a4 100644 --- a/src/androidTest/java/com/mixpanel/android/mpmetrics/HttpTest.java +++ b/src/androidTest/java/com/mixpanel/android/mpmetrics/HttpTest.java @@ -5,11 +5,10 @@ import android.os.Bundle; import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.filters.LargeTest; import androidx.test.platform.app.InstrumentationRegistry; import com.mixpanel.android.util.Base64Coder; -import com.mixpanel.android.util.MixpanelServerCallback; +import com.mixpanel.android.util.ProxyServerInteractor; import com.mixpanel.android.util.RemoteService; import com.mixpanel.android.util.HttpService; @@ -62,7 +61,7 @@ public void setUp() { final RemoteService mockPoster = new HttpService() { @Override - public byte[] performRequest(String endpointUrl, MixpanelServerCallback callback, Map params, SSLSocketFactory socketFactory) + public byte[] performRequest(String endpointUrl, ProxyServerInteractor callback, Map params, SSLSocketFactory socketFactory) throws ServiceUnavailableException, IOException { try { if (mFlushResults.isEmpty()) { diff --git a/src/androidTest/java/com/mixpanel/android/mpmetrics/MixpanelBasicTest.java b/src/androidTest/java/com/mixpanel/android/mpmetrics/MixpanelBasicTest.java index 892004b6b..705323e8e 100644 --- a/src/androidTest/java/com/mixpanel/android/mpmetrics/MixpanelBasicTest.java +++ b/src/androidTest/java/com/mixpanel/android/mpmetrics/MixpanelBasicTest.java @@ -12,7 +12,7 @@ import com.mixpanel.android.BuildConfig; import com.mixpanel.android.util.Base64Coder; import com.mixpanel.android.util.HttpService; -import com.mixpanel.android.util.MixpanelServerCallback; +import com.mixpanel.android.util.ProxyServerInteractor; import com.mixpanel.android.util.RemoteService; import org.json.JSONArray; @@ -703,7 +703,7 @@ public int addJSON(JSONObject message, String token, MPDbAdapter.Table table) { final RemoteService mockPoster = new HttpService() { @Override - public byte[] performRequest(String endpointUrl, MixpanelServerCallback callback, Map params, SSLSocketFactory socketFactory) { + public byte[] performRequest(String endpointUrl, ProxyServerInteractor callback, Map params, SSLSocketFactory socketFactory) { final boolean isIdentified = isIdentifiedRef.get(); assertTrue(params.containsKey("data")); final String decoded = Base64Coder.decodeString(params.get("data").toString()); @@ -1398,7 +1398,7 @@ protected AnalyticsMessages getAnalyticsMessages() { public void testAlias() { final RemoteService mockPoster = new HttpService() { @Override - public byte[] performRequest(String endpointUrl, MixpanelServerCallback callback, Map params, SSLSocketFactory socketFactory) { + public byte[] performRequest(String endpointUrl, ProxyServerInteractor callback, Map params, SSLSocketFactory socketFactory) { try { assertTrue(params.containsKey("data")); final String jsonData = Base64Coder.decodeString(params.get("data").toString()); diff --git a/src/androidTest/java/com/mixpanel/android/mpmetrics/OptOutTest.java b/src/androidTest/java/com/mixpanel/android/mpmetrics/OptOutTest.java index 24db722ea..94fd2cd12 100644 --- a/src/androidTest/java/com/mixpanel/android/mpmetrics/OptOutTest.java +++ b/src/androidTest/java/com/mixpanel/android/mpmetrics/OptOutTest.java @@ -8,7 +8,7 @@ import com.mixpanel.android.util.Base64Coder; import com.mixpanel.android.util.HttpService; -import com.mixpanel.android.util.MixpanelServerCallback; +import com.mixpanel.android.util.ProxyServerInteractor; import com.mixpanel.android.util.RemoteService; import org.json.JSONArray; @@ -58,7 +58,7 @@ public void setUp() { final RemoteService mockPoster = new HttpService() { @Override - public byte[] performRequest(String endpointUrl, MixpanelServerCallback callback, Map params, SSLSocketFactory socketFactory) { + public byte[] performRequest(String endpointUrl, ProxyServerInteractor callback, Map params, SSLSocketFactory socketFactory) { if (params != null) { final String jsonData = Base64Coder.decodeString(params.get("data").toString()); assertTrue(params.containsKey("data")); diff --git a/src/main/java/com/mixpanel/android/mpmetrics/MPConfig.java b/src/main/java/com/mixpanel/android/mpmetrics/MPConfig.java index ec577a1c0..f9c58f294 100644 --- a/src/main/java/com/mixpanel/android/mpmetrics/MPConfig.java +++ b/src/main/java/com/mixpanel/android/mpmetrics/MPConfig.java @@ -10,7 +10,7 @@ import com.mixpanel.android.BuildConfig; import com.mixpanel.android.util.MPConstants; import com.mixpanel.android.util.MPLog; -import com.mixpanel.android.util.MixpanelServerCallback; +import com.mixpanel.android.util.ProxyServerInteractor; import com.mixpanel.android.util.OfflineMode; import java.security.GeneralSecurityException; @@ -304,9 +304,9 @@ public String getEventsEndpoint() { public boolean getTrackAutomaticEvents() { return mTrackAutomaticEvents; } - public void setServerURL(String serverURL, MixpanelServerCallback callback) { + public void setServerURL(String serverURL, ProxyServerInteractor callback) { setServerURL(serverURL); - setMixpanelServerCallback(callback); + setProxyServerInteractor(callback); } // In parity with iOS SDK @@ -419,11 +419,11 @@ public synchronized OfflineMode getOfflineMode() { /////////////////////////////////////////////// - public MixpanelServerCallback getMixpanelServerCallback() { + public ProxyServerInteractor getMixpanelServerCallback() { return this.serverCallbacks; } - public void setMixpanelServerCallback(MixpanelServerCallback callback) { + public void setProxyServerInteractor(ProxyServerInteractor callback) { this.serverCallbacks = callback; } @@ -486,6 +486,6 @@ public String toString() { // Mutable, with synchronized accessor and mutator private SSLSocketFactory mSSLSocketFactory; private OfflineMode mOfflineMode; - private MixpanelServerCallback serverCallbacks = null; + private ProxyServerInteractor serverCallbacks = null; private static final String LOGTAG = "MixpanelAPI.Conf"; } diff --git a/src/main/java/com/mixpanel/android/util/HttpService.java b/src/main/java/com/mixpanel/android/util/HttpService.java index c29981fe2..92bb1a767 100644 --- a/src/main/java/com/mixpanel/android/util/HttpService.java +++ b/src/main/java/com/mixpanel/android/util/HttpService.java @@ -90,7 +90,7 @@ private boolean onOfflineMode(OfflineMode offlineMode) { } @Override - public byte[] performRequest(String endpointUrl, MixpanelServerCallback callback, Map params, SSLSocketFactory socketFactory) throws ServiceUnavailableException, IOException { + public byte[] performRequest(String endpointUrl, ProxyServerInteractor callback, Map params, SSLSocketFactory socketFactory) throws ServiceUnavailableException, IOException { MPLog.v(LOGTAG, "Attempting request to " + endpointUrl); byte[] response = null; @@ -114,8 +114,8 @@ public byte[] performRequest(String endpointUrl, MixpanelServerCallback callback ((HttpsURLConnection) connection).setSSLSocketFactory(socketFactory); } - if (shouldProcessMixpanelCallback(endpointUrl) && callback != null) { - Map headers = callback.getHeaders(); + if (callback != null && isProxyRequest(endpointUrl)) { + Map headers = callback.getProxyRequestHeaders(); if (headers != null) { for (Map.Entry entry : headers.entrySet()) { connection.setRequestProperty(entry.getKey(), entry.getValue()); @@ -144,8 +144,8 @@ public byte[] performRequest(String endpointUrl, MixpanelServerCallback callback out.close(); out = null; } - if (shouldProcessMixpanelCallback(endpointUrl) && callback != null) { - callback.onResponse(endpointUrl, connection.getResponseCode()); + if (callback != null && isProxyRequest(endpointUrl)) { + callback.onProxyResponse(endpointUrl, connection.getResponseCode()); } in = connection.getInputStream(); response = slurp(in); @@ -179,7 +179,7 @@ public byte[] performRequest(String endpointUrl, MixpanelServerCallback callback return response; } - private static boolean shouldProcessMixpanelCallback(String endpointUrl) { + private static boolean isProxyRequest(String endpointUrl) { return !endpointUrl.toLowerCase().contains(MIXPANEL_API.toLowerCase()); } diff --git a/src/main/java/com/mixpanel/android/util/MixpanelServerCallback.java b/src/main/java/com/mixpanel/android/util/MixpanelServerCallback.java deleted file mode 100644 index c5a2c177d..000000000 --- a/src/main/java/com/mixpanel/android/util/MixpanelServerCallback.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.mixpanel.android.util; - -import java.util.Map; - -public interface MixpanelServerCallback { - Map getHeaders(); - - void onResponse(String apiPath, int responseCode); -} diff --git a/src/main/java/com/mixpanel/android/util/ProxyServerInteractor.java b/src/main/java/com/mixpanel/android/util/ProxyServerInteractor.java new file mode 100644 index 000000000..98eb0e810 --- /dev/null +++ b/src/main/java/com/mixpanel/android/util/ProxyServerInteractor.java @@ -0,0 +1,9 @@ +package com.mixpanel.android.util; + +import java.util.Map; + +public interface ProxyServerInteractor { + Map getProxyRequestHeaders(); + + void onProxyResponse(String apiPath, int responseCode); +} diff --git a/src/main/java/com/mixpanel/android/util/RemoteService.java b/src/main/java/com/mixpanel/android/util/RemoteService.java index 91ccbf137..e89aad6a7 100644 --- a/src/main/java/com/mixpanel/android/util/RemoteService.java +++ b/src/main/java/com/mixpanel/android/util/RemoteService.java @@ -14,7 +14,7 @@ public interface RemoteService { void checkIsMixpanelBlocked(); - byte[] performRequest(String endpointUrl, MixpanelServerCallback callback, Map params, SSLSocketFactory socketFactory) + byte[] performRequest(String endpointUrl, ProxyServerInteractor callback, Map params, SSLSocketFactory socketFactory) throws ServiceUnavailableException, IOException; class ServiceUnavailableException extends Exception { From 5498108e853dda1069a9607c6db54010938f8da7 Mon Sep 17 00:00:00 2001 From: abhilash das Date: Wed, 27 Mar 2024 14:56:51 +0530 Subject: [PATCH 3/4] feat: rename callbacks for proxy server --- .../android/mpmetrics/AutomaticEventsTest.java | 4 ++-- .../java/com/mixpanel/android/mpmetrics/HttpTest.java | 2 +- .../mixpanel/android/mpmetrics/MixpanelBasicTest.java | 4 ++-- .../com/mixpanel/android/mpmetrics/OptOutTest.java | 2 +- .../java/com/mixpanel/android/mpmetrics/MPConfig.java | 8 ++++---- .../java/com/mixpanel/android/util/HttpService.java | 10 +++++----- .../java/com/mixpanel/android/util/RemoteService.java | 2 +- 7 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/androidTest/java/com/mixpanel/android/mpmetrics/AutomaticEventsTest.java b/src/androidTest/java/com/mixpanel/android/mpmetrics/AutomaticEventsTest.java index 5ed4e97ab..c128b2667 100644 --- a/src/androidTest/java/com/mixpanel/android/mpmetrics/AutomaticEventsTest.java +++ b/src/androidTest/java/com/mixpanel/android/mpmetrics/AutomaticEventsTest.java @@ -63,7 +63,7 @@ public void setUp() { private void setUpInstance(boolean trackAutomaticEvents) { final RemoteService mockPoster = new HttpService() { @Override - public byte[] performRequest(String endpointUrl, ProxyServerInteractor callback, Map params, SSLSocketFactory socketFactory) { + public byte[] performRequest(String endpointUrl, ProxyServerInteractor interactor, Map params, SSLSocketFactory socketFactory) { final String jsonData = Base64Coder.decodeString(params.get("data").toString()); assertTrue(params.containsKey("data")); @@ -212,7 +212,7 @@ public void testAutomaticMultipleInstances() throws InterruptedException { final HttpService mpSecondPoster = new HttpService() { @Override - public byte[] performRequest(String endpointUrl, ProxyServerInteractor callback, Map params, SSLSocketFactory socketFactory) { + public byte[] performRequest(String endpointUrl, ProxyServerInteractor interactor, Map params, SSLSocketFactory socketFactory) { final String jsonData = Base64Coder.decodeString(params.get("data").toString()); assertTrue(params.containsKey("data")); try { diff --git a/src/androidTest/java/com/mixpanel/android/mpmetrics/HttpTest.java b/src/androidTest/java/com/mixpanel/android/mpmetrics/HttpTest.java index 25b5766a4..f7aa21326 100644 --- a/src/androidTest/java/com/mixpanel/android/mpmetrics/HttpTest.java +++ b/src/androidTest/java/com/mixpanel/android/mpmetrics/HttpTest.java @@ -61,7 +61,7 @@ public void setUp() { final RemoteService mockPoster = new HttpService() { @Override - public byte[] performRequest(String endpointUrl, ProxyServerInteractor callback, Map params, SSLSocketFactory socketFactory) + public byte[] performRequest(String endpointUrl, ProxyServerInteractor interactor, Map params, SSLSocketFactory socketFactory) throws ServiceUnavailableException, IOException { try { if (mFlushResults.isEmpty()) { diff --git a/src/androidTest/java/com/mixpanel/android/mpmetrics/MixpanelBasicTest.java b/src/androidTest/java/com/mixpanel/android/mpmetrics/MixpanelBasicTest.java index 705323e8e..b4822daff 100644 --- a/src/androidTest/java/com/mixpanel/android/mpmetrics/MixpanelBasicTest.java +++ b/src/androidTest/java/com/mixpanel/android/mpmetrics/MixpanelBasicTest.java @@ -703,7 +703,7 @@ public int addJSON(JSONObject message, String token, MPDbAdapter.Table table) { final RemoteService mockPoster = new HttpService() { @Override - public byte[] performRequest(String endpointUrl, ProxyServerInteractor callback, Map params, SSLSocketFactory socketFactory) { + public byte[] performRequest(String endpointUrl, ProxyServerInteractor interactor, Map params, SSLSocketFactory socketFactory) { final boolean isIdentified = isIdentifiedRef.get(); assertTrue(params.containsKey("data")); final String decoded = Base64Coder.decodeString(params.get("data").toString()); @@ -1398,7 +1398,7 @@ protected AnalyticsMessages getAnalyticsMessages() { public void testAlias() { final RemoteService mockPoster = new HttpService() { @Override - public byte[] performRequest(String endpointUrl, ProxyServerInteractor callback, Map params, SSLSocketFactory socketFactory) { + public byte[] performRequest(String endpointUrl, ProxyServerInteractor interactor, Map params, SSLSocketFactory socketFactory) { try { assertTrue(params.containsKey("data")); final String jsonData = Base64Coder.decodeString(params.get("data").toString()); diff --git a/src/androidTest/java/com/mixpanel/android/mpmetrics/OptOutTest.java b/src/androidTest/java/com/mixpanel/android/mpmetrics/OptOutTest.java index 94fd2cd12..a2e4b98da 100644 --- a/src/androidTest/java/com/mixpanel/android/mpmetrics/OptOutTest.java +++ b/src/androidTest/java/com/mixpanel/android/mpmetrics/OptOutTest.java @@ -58,7 +58,7 @@ public void setUp() { final RemoteService mockPoster = new HttpService() { @Override - public byte[] performRequest(String endpointUrl, ProxyServerInteractor callback, Map params, SSLSocketFactory socketFactory) { + public byte[] performRequest(String endpointUrl, ProxyServerInteractor interactor, Map params, SSLSocketFactory socketFactory) { if (params != null) { final String jsonData = Base64Coder.decodeString(params.get("data").toString()); assertTrue(params.containsKey("data")); diff --git a/src/main/java/com/mixpanel/android/mpmetrics/MPConfig.java b/src/main/java/com/mixpanel/android/mpmetrics/MPConfig.java index f9c58f294..f281fede7 100644 --- a/src/main/java/com/mixpanel/android/mpmetrics/MPConfig.java +++ b/src/main/java/com/mixpanel/android/mpmetrics/MPConfig.java @@ -304,9 +304,9 @@ public String getEventsEndpoint() { public boolean getTrackAutomaticEvents() { return mTrackAutomaticEvents; } - public void setServerURL(String serverURL, ProxyServerInteractor callback) { + public void setServerURL(String serverURL, ProxyServerInteractor interactor) { setServerURL(serverURL); - setProxyServerInteractor(callback); + setProxyServerInteractor(interactor); } // In parity with iOS SDK @@ -423,8 +423,8 @@ public ProxyServerInteractor getMixpanelServerCallback() { return this.serverCallbacks; } - public void setProxyServerInteractor(ProxyServerInteractor callback) { - this.serverCallbacks = callback; + public void setProxyServerInteractor(ProxyServerInteractor interactor) { + this.serverCallbacks = interactor; } // Package access for testing only- do not call directly in library code diff --git a/src/main/java/com/mixpanel/android/util/HttpService.java b/src/main/java/com/mixpanel/android/util/HttpService.java index 92bb1a767..e23361459 100644 --- a/src/main/java/com/mixpanel/android/util/HttpService.java +++ b/src/main/java/com/mixpanel/android/util/HttpService.java @@ -90,7 +90,7 @@ private boolean onOfflineMode(OfflineMode offlineMode) { } @Override - public byte[] performRequest(String endpointUrl, ProxyServerInteractor callback, Map params, SSLSocketFactory socketFactory) throws ServiceUnavailableException, IOException { + public byte[] performRequest(String endpointUrl, ProxyServerInteractor interactor, Map params, SSLSocketFactory socketFactory) throws ServiceUnavailableException, IOException { MPLog.v(LOGTAG, "Attempting request to " + endpointUrl); byte[] response = null; @@ -114,8 +114,8 @@ public byte[] performRequest(String endpointUrl, ProxyServerInteractor callback, ((HttpsURLConnection) connection).setSSLSocketFactory(socketFactory); } - if (callback != null && isProxyRequest(endpointUrl)) { - Map headers = callback.getProxyRequestHeaders(); + if (interactor != null && isProxyRequest(endpointUrl)) { + Map headers = interactor.getProxyRequestHeaders(); if (headers != null) { for (Map.Entry entry : headers.entrySet()) { connection.setRequestProperty(entry.getKey(), entry.getValue()); @@ -144,8 +144,8 @@ public byte[] performRequest(String endpointUrl, ProxyServerInteractor callback, out.close(); out = null; } - if (callback != null && isProxyRequest(endpointUrl)) { - callback.onProxyResponse(endpointUrl, connection.getResponseCode()); + if (interactor != null && isProxyRequest(endpointUrl)) { + interactor.onProxyResponse(endpointUrl, connection.getResponseCode()); } in = connection.getInputStream(); response = slurp(in); diff --git a/src/main/java/com/mixpanel/android/util/RemoteService.java b/src/main/java/com/mixpanel/android/util/RemoteService.java index e89aad6a7..70ce8f4e5 100644 --- a/src/main/java/com/mixpanel/android/util/RemoteService.java +++ b/src/main/java/com/mixpanel/android/util/RemoteService.java @@ -14,7 +14,7 @@ public interface RemoteService { void checkIsMixpanelBlocked(); - byte[] performRequest(String endpointUrl, ProxyServerInteractor callback, Map params, SSLSocketFactory socketFactory) + byte[] performRequest(String endpointUrl, ProxyServerInteractor interactor, Map params, SSLSocketFactory socketFactory) throws ServiceUnavailableException, IOException; class ServiceUnavailableException extends Exception { From 6226d298d76a8068346d4cb548d49e3b81409ecd Mon Sep 17 00:00:00 2001 From: abhilash das Date: Tue, 9 Apr 2024 08:46:25 +0530 Subject: [PATCH 4/4] feat: rename callbacks for proxy server --- .../com/mixpanel/android/mpmetrics/AnalyticsMessages.java | 2 +- src/main/java/com/mixpanel/android/mpmetrics/MPConfig.java | 2 +- src/main/java/com/mixpanel/android/mpmetrics/MixpanelAPI.java | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/mixpanel/android/mpmetrics/AnalyticsMessages.java b/src/main/java/com/mixpanel/android/mpmetrics/AnalyticsMessages.java index a29d18284..aa6a67fa2 100644 --- a/src/main/java/com/mixpanel/android/mpmetrics/AnalyticsMessages.java +++ b/src/main/java/com/mixpanel/android/mpmetrics/AnalyticsMessages.java @@ -514,7 +514,7 @@ private void sendData(MPDbAdapter dbAdapter, String token, MPDbAdapter.Table tab byte[] response; try { final SSLSocketFactory socketFactory = mConfig.getSSLSocketFactory(); - response = poster.performRequest(url, mConfig.getMixpanelServerCallback(), params, socketFactory); + response = poster.performRequest(url, mConfig.getProxyServerInteractor(), params, socketFactory); if (null == response) { deleteEvents = false; logAboutMessageToMixpanel("Response was null, unexpected failure posting to " + url + "."); diff --git a/src/main/java/com/mixpanel/android/mpmetrics/MPConfig.java b/src/main/java/com/mixpanel/android/mpmetrics/MPConfig.java index f281fede7..91d5d86d4 100644 --- a/src/main/java/com/mixpanel/android/mpmetrics/MPConfig.java +++ b/src/main/java/com/mixpanel/android/mpmetrics/MPConfig.java @@ -419,7 +419,7 @@ public synchronized OfflineMode getOfflineMode() { /////////////////////////////////////////////// - public ProxyServerInteractor getMixpanelServerCallback() { + public ProxyServerInteractor getProxyServerInteractor() { return this.serverCallbacks; } diff --git a/src/main/java/com/mixpanel/android/mpmetrics/MixpanelAPI.java b/src/main/java/com/mixpanel/android/mpmetrics/MixpanelAPI.java index 5fc0c8b60..26b112ef8 100644 --- a/src/main/java/com/mixpanel/android/mpmetrics/MixpanelAPI.java +++ b/src/main/java/com/mixpanel/android/mpmetrics/MixpanelAPI.java @@ -14,7 +14,7 @@ import android.os.Bundle; import com.mixpanel.android.util.MPLog; -import com.mixpanel.android.util.MixpanelServerCallback; +import com.mixpanel.android.util.ProxyServerInteractor; import org.json.JSONArray; import org.json.JSONException; @@ -589,7 +589,7 @@ public void setServerURL(String serverURL) { * @param serverURL the base URL used for Mixpanel API requests * @param callback the callback for mixpanel proxy server api headers and status */ - public void setServerURL(String serverURL, MixpanelServerCallback callback) { + public void setServerURL(String serverURL, ProxyServerInteractor callback) { mConfig.setServerURL(serverURL, callback); }