Skip to content

Commit ee4e2d5

Browse files
chore: add the Android implementation for network obfuscation and filtering.
1 parent 5b94fef commit ee4e2d5

File tree

2 files changed

+95
-3
lines changed

2 files changed

+95
-3
lines changed

android/src/main/java/com/instabug/reactlibrary/RNInstabugNetworkLoggerModule.java

Lines changed: 92 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,37 @@
77

88
import androidx.annotation.NonNull;
99

10+
import com.facebook.react.bridge.Arguments;
1011
import com.facebook.react.bridge.Promise;
1112
import com.facebook.react.bridge.ReactApplicationContext;
1213
import com.facebook.react.bridge.ReactMethod;
14+
import com.facebook.react.bridge.ReadableMap;
15+
import com.facebook.react.bridge.WritableMap;
16+
import com.facebook.react.bridge.WritableNativeMap;
1317
import com.instabug.apm.InternalAPM;
18+
import com.instabug.apm.sanitization.AsyncSanitizer;
19+
import com.instabug.apm.sanitization.OnCompleteCallback;
20+
import com.instabug.library.logging.listeners.networklogs.NetworkLogSnapshot;
1421
import com.instabug.reactlibrary.utils.EventEmitterModule;
1522
import com.instabug.reactlibrary.utils.MainThreadHandler;
1623

24+
import org.json.JSONException;
25+
import org.json.JSONObject;
26+
27+
import java.util.HashMap;
28+
import java.util.Map;
29+
import java.util.concurrent.ConcurrentHashMap;
30+
1731

1832
public class RNInstabugNetworkLoggerModule extends EventEmitterModule {
1933

34+
private final ConcurrentHashMap<String, OnCompleteCallback<NetworkLogSnapshot>> callbackMap = new ConcurrentHashMap<String, OnCompleteCallback<NetworkLogSnapshot>>();
35+
2036
public RNInstabugNetworkLoggerModule(ReactApplicationContext reactContext) {
2137
super(reactContext);
2238
}
2339

40+
2441
@NonNull
2542
@Override
2643
public String getName() {
@@ -39,7 +56,17 @@ public void removeListeners(Integer count) {
3956
}
4057

4158
private boolean getFlagValue(String key) {
42-
return InternalAPM._isFeatureEnabledCP( key , "");
59+
return InternalAPM._isFeatureEnabledCP(key, "");
60+
}
61+
62+
private WritableMap convertFromMapToWriteableMap(Map map) {
63+
WritableMap writableMap = new WritableNativeMap();
64+
for (int i = 0; i < map.size(); i++) {
65+
Object key = map.keySet().toArray()[i];
66+
Object value = map.get(key);
67+
writableMap.putString((String) key, (String) value);
68+
}
69+
return writableMap;
4370
}
4471

4572
/**
@@ -81,4 +108,68 @@ public void run() {
81108
}
82109
});
83110
}
111+
112+
113+
@ReactMethod
114+
public void registerNetworkLogsListener() {
115+
MainThreadHandler.runOnMainThread(new Runnable() {
116+
@Override
117+
public void run() {
118+
InternalAPM._registerNetworkLogSanitizer((networkLogSnapshot, onCompleteCallback) -> {
119+
final String id = String.valueOf(onCompleteCallback.hashCode());
120+
callbackMap.put(id, onCompleteCallback);
121+
122+
WritableMap networkSnapshotParams = Arguments.createMap();
123+
networkSnapshotParams.putString("id", id);
124+
networkSnapshotParams.putString("url", networkLogSnapshot.getUrl());
125+
networkSnapshotParams.putInt("responseCode", networkLogSnapshot.getResponseCode());
126+
networkSnapshotParams.putString("requestBody", networkLogSnapshot.getRequestBody());
127+
networkSnapshotParams.putString("response", networkLogSnapshot.getResponse());
128+
final Map<String, Object> requestHeaders = networkLogSnapshot.getRequestHeaders();
129+
if (requestHeaders != null) {
130+
networkSnapshotParams.putMap("requestHeader", convertFromMapToWriteableMap(networkLogSnapshot.getRequestHeaders()));
131+
}
132+
final Map<String, Object> responseHeaders = networkLogSnapshot.getResponseHeaders();
133+
if (responseHeaders != null) {
134+
networkSnapshotParams.putMap("responseHeader", convertFromMapToWriteableMap(networkLogSnapshot.getResponseHeaders()));
135+
}
136+
137+
sendEvent("IBGNetworkLoggerHandler", networkSnapshotParams);
138+
});
139+
}
140+
});
141+
}
142+
143+
@ReactMethod
144+
protected void updateNetworkLogSnapshot(String jsonString) {
145+
146+
JSONObject newJSONObject = null;
147+
String url = "";
148+
NetworkLogSnapshot modifiedSnapshot = null;
149+
try {
150+
newJSONObject = new JSONObject(jsonString);
151+
url = newJSONObject.optString("url");
152+
} catch (JSONException e) {
153+
throw new RuntimeException(e);
154+
}
155+
final String ID = newJSONObject.optString("id");
156+
157+
if (!url.isEmpty()) {
158+
modifiedSnapshot = new NetworkLogSnapshot(
159+
url,
160+
null,
161+
null,
162+
null,
163+
null,
164+
newJSONObject.optInt("responseCode")
165+
);
166+
}
167+
168+
final OnCompleteCallback<NetworkLogSnapshot> callback = callbackMap.get(ID);
169+
if (callback != null) {
170+
callback.onComplete(modifiedSnapshot);
171+
}
172+
callbackMap.remove(ID);
173+
174+
}
84175
}

src/modules/NetworkLogger.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,9 +115,10 @@ export const setRequestFilterExpression = (expression: string) => {
115115
// For iOS True == Request will be saved, False == will be ignored
116116
NativeNetworkLogger.setNetworkLoggingRequestFilterPredicateIOS(networkSnapshot.id, !value);
117117
} else {
118-
// For Android Setting the passed data to empty string will ignore the request;
118+
// For Android Setting the [url] to an empty string will ignore the request;
119119
if (value) {
120-
NativeNetworkLogger.updateNetworkLogSnapshot('');
120+
networkSnapshot.url = '';
121+
NativeNetworkLogger.updateNetworkLogSnapshot(JSON.stringify(networkSnapshot));
121122
}
122123
}
123124
});

0 commit comments

Comments
 (0)