Skip to content

Commit 96306fe

Browse files
committed
feat: add body size checks inside network manager and cache retrieved in feature flags manager
- Added `_networkBodyMaxSize` to `FeatureFlagsManager` for managing network body size limits. - Introduced `didRequestBodyExceedSizeLimit` and `didResponseBodyExceedSizeLimit` methods in `NetworkManager` to validate request and response body sizes against the limit. - Created `InstabugConstants` for standardized logging messages related to network body size limits. - Implemented caching for network body size retrieval to optimize performance.
1 parent c9d0ac6 commit 96306fe

File tree

3 files changed

+133
-0
lines changed

3 files changed

+133
-0
lines changed

lib/src/utils/feature_flags_manager.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ class FeatureFlagsManager implements FeatureFlagsFlutterApi {
4242
bool _isAndroidW3CExternalTraceID = false;
4343
bool _isAndroidW3CExternalGeneratedHeader = false;
4444
bool _isAndroidW3CCaughtHeader = false;
45+
int _networkBodyMaxSize = 0;
46+
47+
int get networkBodyMaxSize => _networkBodyMaxSize;
4548

4649
Future<W3cFeatureFlags> getW3CFeatureFlagsHeader() async {
4750
if (IBGBuildInfo.instance.isAndroid) {
@@ -89,4 +92,9 @@ class FeatureFlagsManager implements FeatureFlagsFlutterApi {
8992
_isAndroidW3CExternalTraceID = isW3cExternalTraceIDEnabled;
9093
_isAndroidW3CExternalGeneratedHeader = isW3cExternalGeneratedHeaderEnabled;
9194
}
95+
96+
@override
97+
void onNetworkLogBodyMaxSizeChange(int networkBodyMaxSize) {
98+
_networkBodyMaxSize = networkBodyMaxSize;
99+
}
92100
}

lib/src/utils/instabug_constants.dart

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/// Constants used throughout the Instabug Flutter SDK
2+
class InstabugConstants {
3+
InstabugConstants._();
4+
5+
// Network logging constants
6+
static const String networkLoggerTag = 'NetworkLogger';
7+
static const String networkManagerTag = 'NetworkManager';
8+
9+
// Network body replacement messages
10+
static const String requestBodyReplacedPrefix = '[REQUEST_BODY_REPLACED]';
11+
static const String responseBodyReplacedPrefix = '[RESPONSE_BODY_REPLACED]';
12+
static const String exceedsLimitSuffix = 'exceeds limit';
13+
14+
/// Generates a request body replacement message
15+
static String getRequestBodyReplacementMessage(int size) {
16+
return '$requestBodyReplacedPrefix - Size: $size $exceedsLimitSuffix';
17+
}
18+
19+
/// Generates a response body replacement message
20+
static String getResponseBodyReplacementMessage(int size) {
21+
return '$responseBodyReplacedPrefix - Size: $size $exceedsLimitSuffix';
22+
}
23+
24+
/// Generates a network body size limit exceeded log message
25+
static String getNetworkBodyLimitExceededMessage({
26+
required String type,
27+
required int bodySize,
28+
}) {
29+
return 'Network body size limit exceeded for $type - Size: $bodySize';
30+
}
31+
}

lib/src/utils/network_manager.dart

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import 'dart:async';
22

33
import 'package:instabug_flutter/instabug_flutter.dart';
4+
import 'package:instabug_flutter/src/generated/instabug.api.g.dart';
5+
import 'package:instabug_flutter/src/utils/feature_flags_manager.dart';
6+
import 'package:instabug_flutter/src/utils/instabug_constants.dart';
7+
import 'package:instabug_flutter/src/utils/instabug_logger.dart';
48

59
typedef ObfuscateLogCallback = FutureOr<NetworkData> Function(NetworkData data);
610
typedef OmitLogCallback = FutureOr<bool> Function(NetworkData data);
@@ -10,6 +14,8 @@ typedef OmitLogCallback = FutureOr<bool> Function(NetworkData data);
1014
class NetworkManager {
1115
ObfuscateLogCallback? _obfuscateLogCallback;
1216
OmitLogCallback? _omitLogCallback;
17+
int? _cachedNetworkBodyMaxSize;
18+
final _host = InstabugHostApi();
1319

1420
// ignore: use_setters_to_change_properties
1521
void setObfuscateLogCallback(ObfuscateLogCallback callback) {
@@ -36,4 +42,92 @@ class NetworkManager {
3642

3743
return _omitLogCallback!(data);
3844
}
45+
46+
/// Checks if network request body exceeds backend size limits
47+
///
48+
/// Returns true if request body size exceeds the limit
49+
Future<bool> didRequestBodyExceedSizeLimit(NetworkData data) async {
50+
try {
51+
final limit = await _getNetworkBodyMaxSize();
52+
if (limit == null) {
53+
return false; // If we can't get the limit, don't block logging
54+
}
55+
56+
final requestExceeds = data.requestBodySize > limit;
57+
if (requestExceeds) {
58+
InstabugLogger.I.d(
59+
InstabugConstants.getNetworkBodyLimitExceededMessage(
60+
type: 'request',
61+
bodySize: data.requestBodySize,
62+
),
63+
tag: InstabugConstants.networkManagerTag,
64+
);
65+
}
66+
67+
return requestExceeds;
68+
} catch (error) {
69+
InstabugLogger.I.e(
70+
'Error checking network request body size limit: $error',
71+
tag: InstabugConstants.networkManagerTag,
72+
);
73+
return false; // Don't block logging on error
74+
}
75+
}
76+
77+
/// Checks if network response body exceeds backend size limits
78+
///
79+
/// Returns true if response body size exceeds the limit
80+
Future<bool> didResponseBodyExceedSizeLimit(NetworkData data) async {
81+
try {
82+
final limit = await _getNetworkBodyMaxSize();
83+
if (limit == null) {
84+
return false; // If we can't get the limit, don't block logging
85+
}
86+
87+
final responseExceeds = data.responseBodySize > limit;
88+
if (responseExceeds) {
89+
InstabugLogger.I.d(
90+
InstabugConstants.getNetworkBodyLimitExceededMessage(
91+
type: 'response',
92+
bodySize: data.responseBodySize,
93+
),
94+
tag: InstabugConstants.networkManagerTag,
95+
);
96+
}
97+
98+
return responseExceeds;
99+
} catch (error) {
100+
InstabugLogger.I.e(
101+
'Error checking network response body size limit: $error',
102+
tag: InstabugConstants.networkManagerTag,
103+
);
104+
return false; // Don't block logging on error
105+
}
106+
}
107+
108+
/// Gets the network body max size from native SDK, with caching
109+
Future<int?> _getNetworkBodyMaxSize() async {
110+
if (_cachedNetworkBodyMaxSize != null) {
111+
return _cachedNetworkBodyMaxSize;
112+
}
113+
114+
final ffmNetworkBodyLimit = FeatureFlagsManager().networkBodyMaxSize;
115+
116+
if (ffmNetworkBodyLimit > 0) {
117+
_cachedNetworkBodyMaxSize = ffmNetworkBodyLimit;
118+
return ffmNetworkBodyLimit;
119+
}
120+
121+
try {
122+
final limit = await _host.getNetworkBodyMaxSize();
123+
_cachedNetworkBodyMaxSize = limit;
124+
return limit;
125+
} catch (error) {
126+
InstabugLogger.I.e(
127+
'Failed to get network body max size from native API: $error',
128+
tag: InstabugConstants.networkManagerTag,
129+
);
130+
return null;
131+
}
132+
}
39133
}

0 commit comments

Comments
 (0)