Skip to content

Commit 3e33891

Browse files
denrasemarandaneto
andauthored
DioEventProcessor: Append http response body (#1557)
Co-authored-by: Manoel Aranda Neto <[email protected]>
1 parent 33d0587 commit 3e33891

13 files changed

+277
-14
lines changed

CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
[Trace origin](https://develop.sentry.dev/sdk/performance/trace-origin/) indicates what created a trace or a span. Not all transactions and spans contain enough information to tell whether the user or what precisely in the SDK created it. Origin solves this problem. The SDK now sends origin for transactions and spans.
1010

1111
- Add `appHangTimeoutInterval` to `SentryFlutterOptions` ([#1568](https://github.com/getsentry/sentry-dart/pull/1568))
12+
- DioEventProcessor: Append http response body ([#1557](https://github.com/getsentry/sentry-dart/pull/1557))
13+
- This is opt-in and depends on `maxResponseBodySize`
14+
- Only for `dio` package
1215

1316
### Dependencies
1417

dart/lib/sentry.dart

+2
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,5 @@ export 'src/utils/url_details.dart';
4646
export 'src/utils/http_header_utils.dart';
4747
// ignore: invalid_export_of_internal_element
4848
export 'src/sentry_trace_origins.dart';
49+
// ignore: invalid_export_of_internal_element
50+
export 'src/utils.dart';

dart/lib/src/sentry_options.dart

-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import 'diagnostic_logger.dart';
1313
import 'environment/environment_variables.dart';
1414
import 'noop_client.dart';
1515
import 'transport/noop_transport.dart';
16-
import 'utils.dart';
1716
import 'version.dart';
1817

1918
// TODO: shutdownTimeout, flushTimeoutMillis

dart/lib/src/utils.dart

+4-1
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@ import 'package:meta/meta.dart';
88

99
/// Sentry does not take a timezone and instead expects the date-time to be
1010
/// submitted in UTC timezone.
11+
@internal
1112
DateTime getUtcDateTime() => DateTime.now().toUtc();
1213

1314
/// Formats a Date as ISO8601 and UTC with millis precision
15+
@internal
1416
String formatDateAsIso8601WithMillisPrecision(DateTime date) {
1517
var iso = date.toIso8601String();
1618
final millisecondSeparatorIndex = iso.lastIndexOf('.');
@@ -22,9 +24,10 @@ String formatDateAsIso8601WithMillisPrecision(DateTime date) {
2224
return '${iso}Z';
2325
}
2426

27+
@internal
2528
final utf8JsonEncoder = JsonUtf8Encoder(null, jsonSerializationFallback, null);
2629

27-
@visibleForTesting
30+
@internal
2831
Object? jsonSerializationFallback(Object? nonEncodable) {
2932
if (nonEncodable == null) {
3033
return null;

dart/test/protocol/breadcrumb_test.dart

-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import 'package:collection/collection.dart';
22
import 'package:sentry/sentry.dart';
33
import 'package:test/test.dart';
4-
import 'package:sentry/src/utils.dart';
54

65
void main() {
76
final timestamp = DateTime.now();

dart/test/sentry_envelope_header_test.dart

-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import 'package:sentry/sentry.dart';
22
import 'package:sentry/src/sentry_envelope_header.dart';
3-
import 'package:sentry/src/utils.dart';
43
import 'package:test/test.dart';
54

65
import 'mocks.dart';

dart/test/sentry_envelope_item_test.dart

-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import 'package:sentry/src/sentry_envelope_item_header.dart';
88
import 'package:sentry/src/sentry_item_type.dart';
99
import 'package:sentry/src/sentry_tracer.dart';
1010
import 'package:sentry/src/transport/data_category.dart';
11-
import 'package:sentry/src/utils.dart';
1211
import 'package:test/test.dart';
1312

1413
import 'mocks/mock_hub.dart';

dart/test/sentry_envelope_test.dart

-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import 'package:sentry/src/sentry_envelope_header.dart';
66
import 'package:sentry/src/sentry_envelope_item_header.dart';
77
import 'package:sentry/src/sentry_item_type.dart';
88
import 'package:sentry/src/sentry_tracer.dart';
9-
import 'package:sentry/src/utils.dart';
109
import 'package:test/test.dart';
1110

1211
import 'mocks.dart';

dart/test/sentry_event_test.dart

-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import 'package:collection/collection.dart';
66
import 'package:sentry/sentry.dart';
77
import 'package:sentry/src/version.dart';
8-
import 'package:sentry/src/utils.dart';
98
import 'package:test/test.dart';
109

1110
void main() {

dart/test/sentry_span_test.dart

-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import 'package:sentry/sentry.dart';
22
import 'package:sentry/src/sentry_tracer.dart';
3-
import 'package:sentry/src/utils.dart';
43
import 'package:test/test.dart';
54

65
import 'mocks/mock_hub.dart';

dart/test/sentry_tracer_test.dart

-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import 'package:sentry/sentry.dart';
22
import 'package:sentry/src/sentry_tracer.dart';
3-
import 'package:sentry/src/utils.dart';
43
import 'package:test/test.dart';
54

65
import 'mocks.dart';

dio/lib/src/dio_event_processor.dart

+70-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
// ignore_for_file: deprecated_member_use
22

3+
import 'dart:convert';
4+
35
import 'package:dio/dio.dart';
46
import 'package:sentry/sentry.dart';
57

@@ -62,7 +64,7 @@ class DioEventProcessor implements EventProcessor {
6264
}
6365

6466
/// Returns the request data, if possible according to the users settings.
65-
Object? _getRequestData(dynamic data) {
67+
Object? _getRequestData(Object? data) {
6668
if (!_options.sendDefaultPii) {
6769
return null;
6870
}
@@ -87,8 +89,74 @@ class DioEventProcessor implements EventProcessor {
8789

8890
return SentryResponse(
8991
headers: _options.sendDefaultPii ? headers : null,
90-
bodySize: dioError.response?.data?.length as int?,
92+
bodySize: _getBodySize(
93+
dioError.response?.data,
94+
dioError.requestOptions.responseType,
95+
),
9196
statusCode: response?.statusCode,
97+
data: _getResponseData(
98+
dioError.response?.data,
99+
dioError.requestOptions.responseType,
100+
),
92101
);
93102
}
103+
104+
/// Returns the response data, if possible according to the users settings.
105+
Object? _getResponseData(Object? data, ResponseType responseType) {
106+
if (!_options.sendDefaultPii || data == null) {
107+
return null;
108+
}
109+
switch (responseType) {
110+
case ResponseType.json:
111+
// ignore: invalid_use_of_internal_member
112+
final jsData = utf8JsonEncoder.convert(data);
113+
if (_options.maxResponseBodySize.shouldAddBody(jsData.length)) {
114+
return data;
115+
}
116+
break;
117+
case ResponseType.stream:
118+
break; // No support for logging stream body.
119+
case ResponseType.plain:
120+
if (data is String &&
121+
_options.maxResponseBodySize.shouldAddBody(data.codeUnits.length)) {
122+
return data;
123+
}
124+
break;
125+
case ResponseType.bytes:
126+
if (data is List<int> &&
127+
_options.maxResponseBodySize.shouldAddBody(data.length)) {
128+
return data;
129+
}
130+
break;
131+
}
132+
return null;
133+
}
134+
135+
int? _getBodySize(Object? data, ResponseType responseType) {
136+
if (data == null) {
137+
return null;
138+
}
139+
switch (responseType) {
140+
case ResponseType.json:
141+
return json.encode(data).codeUnits.length;
142+
case ResponseType.stream:
143+
if (data is String) {
144+
return data.length;
145+
} else {
146+
return null;
147+
}
148+
case ResponseType.plain:
149+
if (data is String) {
150+
return data.codeUnits.length;
151+
} else {
152+
return null;
153+
}
154+
case ResponseType.bytes:
155+
if (data is List<int>) {
156+
return data.length;
157+
} else {
158+
return null;
159+
}
160+
}
161+
}
94162
}

0 commit comments

Comments
 (0)