Skip to content

Commit 642c435

Browse files
committed
add response body in failed request client
1 parent 1e094d3 commit 642c435

File tree

2 files changed

+69
-0
lines changed

2 files changed

+69
-0
lines changed

dart/lib/src/http_client/failed_request_client.dart

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ class FailedRequestClient extends BaseClient {
104104
try {
105105
response = await _client.send(request);
106106
statusCode = response.statusCode;
107+
107108
return response;
108109
} catch (e, st) {
109110
exception = e;
@@ -210,6 +211,9 @@ class FailedRequestClient extends BaseClient {
210211
headers: _hub.options.sendDefaultPii ? response.headers : null,
211212
bodySize: response.contentLength,
212213
statusCode: response.statusCode,
214+
data: _hub.options.sendDefaultPii
215+
? await _getDataFromStreamedResponse(response)
216+
: null,
213217
);
214218
hint.set(TypeCheckHint.httpResponse, response);
215219
}
@@ -221,6 +225,19 @@ class FailedRequestClient extends BaseClient {
221225
);
222226
}
223227

228+
Future<Object?> _getDataFromStreamedResponse(
229+
StreamedResponse streamedResponse) async {
230+
final contentLength = streamedResponse.contentLength;
231+
if (contentLength == null) {
232+
return null;
233+
}
234+
if (!_hub.options.maxResponseBodySize.shouldAddBody(contentLength)) {
235+
return null;
236+
}
237+
var response = await Response.fromStream(streamedResponse);
238+
return response.body;
239+
}
240+
224241
// Types of Request can be found here:
225242
// https://pub.dev/documentation/http/latest/http/http-library.html
226243
Object? _getDataFromRequest(BaseRequest request) {

dart/test/http_client/failed_request_client_test.dart

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import 'dart:convert';
2+
13
import 'package:http/http.dart';
24
import 'package:http/testing.dart';
35
import 'package:mockito/mockito.dart';
@@ -281,6 +283,56 @@ void main() {
281283
}
282284
});
283285

286+
test('response body is included according to $MaxResponseBodySize',
287+
() async {
288+
final scenarios = [
289+
// never
290+
MaxBodySizeTestConfig(MaxResponseBodySize.never, 0, false),
291+
MaxBodySizeTestConfig(MaxResponseBodySize.never, 4001, false),
292+
MaxBodySizeTestConfig(MaxResponseBodySize.never, 10001, false),
293+
// always
294+
MaxBodySizeTestConfig(MaxResponseBodySize.always, 0, true),
295+
MaxBodySizeTestConfig(MaxResponseBodySize.always, 4001, true),
296+
MaxBodySizeTestConfig(MaxResponseBodySize.always, 10001, true),
297+
// small
298+
MaxBodySizeTestConfig(MaxResponseBodySize.small, 0, true),
299+
MaxBodySizeTestConfig(MaxResponseBodySize.small, 4000, true),
300+
MaxBodySizeTestConfig(MaxResponseBodySize.small, 4001, false),
301+
// medium
302+
MaxBodySizeTestConfig(MaxResponseBodySize.medium, 0, true),
303+
MaxBodySizeTestConfig(MaxResponseBodySize.medium, 4001, true),
304+
MaxBodySizeTestConfig(MaxResponseBodySize.medium, 10000, true),
305+
MaxBodySizeTestConfig(MaxResponseBodySize.medium, 10001, false),
306+
];
307+
308+
fixture._hub.options.captureFailedRequests = true;
309+
fixture._hub.options.sendDefaultPii = true;
310+
311+
for (final scenario in scenarios) {
312+
fixture._hub.options.maxResponseBodySize = scenario.maxBodySize;
313+
fixture.transport.reset();
314+
315+
final bodyBytes = List.generate(scenario.contentLength, (index) => 0);
316+
final bodyString = utf8.decode(bodyBytes);
317+
318+
final sut = fixture.getSut(
319+
client: fixture.getClient(statusCode: 401, body: bodyString),
320+
failedRequestStatusCodes: [SentryStatusCode(401)],
321+
);
322+
323+
final request = Request('GET', requestUri);
324+
await sut.send(request);
325+
326+
expect(fixture.transport.calls, 1);
327+
328+
final eventCall = fixture.transport.events.first;
329+
final capturedResponse = eventCall.contexts.response;
330+
expect(capturedResponse, isNotNull);
331+
expect(capturedResponse?.data,
332+
scenario.shouldBeIncluded ? isNotNull : isNull);
333+
}
334+
});
335+
284336
test('request passed to hint', () async {
285337
fixture._hub.options.captureFailedRequests = true;
286338

0 commit comments

Comments
 (0)