Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
add response body in failed request client
  • Loading branch information
denrase committed Jul 17, 2023
commit 642c4350d02062dc633a73c79a00b622b38d16e5
17 changes: 17 additions & 0 deletions dart/lib/src/http_client/failed_request_client.dart
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ class FailedRequestClient extends BaseClient {
try {
response = await _client.send(request);
statusCode = response.statusCode;

return response;
} catch (e, st) {
exception = e;
Expand Down Expand Up @@ -210,6 +211,9 @@ class FailedRequestClient extends BaseClient {
headers: _hub.options.sendDefaultPii ? response.headers : null,
bodySize: response.contentLength,
statusCode: response.statusCode,
data: _hub.options.sendDefaultPii
? await _getDataFromStreamedResponse(response)
: null,
);
hint.set(TypeCheckHint.httpResponse, response);
}
Expand All @@ -221,6 +225,19 @@ class FailedRequestClient extends BaseClient {
);
}

Future<Object?> _getDataFromStreamedResponse(
StreamedResponse streamedResponse) async {
final contentLength = streamedResponse.contentLength;
if (contentLength == null) {
return null;
}
if (!_hub.options.maxResponseBodySize.shouldAddBody(contentLength)) {
return null;
}
var response = await Response.fromStream(streamedResponse);
return response.body;
}

// Types of Request can be found here:
// https://pub.dev/documentation/http/latest/http/http-library.html
Object? _getDataFromRequest(BaseRequest request) {
Expand Down
52 changes: 52 additions & 0 deletions dart/test/http_client/failed_request_client_test.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import 'dart:convert';

import 'package:http/http.dart';
import 'package:http/testing.dart';
import 'package:mockito/mockito.dart';
Expand Down Expand Up @@ -281,6 +283,56 @@ void main() {
}
});

test('response body is included according to $MaxResponseBodySize',
() async {
final scenarios = [
// never
MaxBodySizeTestConfig(MaxResponseBodySize.never, 0, false),
MaxBodySizeTestConfig(MaxResponseBodySize.never, 4001, false),
MaxBodySizeTestConfig(MaxResponseBodySize.never, 10001, false),
// always
MaxBodySizeTestConfig(MaxResponseBodySize.always, 0, true),
MaxBodySizeTestConfig(MaxResponseBodySize.always, 4001, true),
MaxBodySizeTestConfig(MaxResponseBodySize.always, 10001, true),
// small
MaxBodySizeTestConfig(MaxResponseBodySize.small, 0, true),
MaxBodySizeTestConfig(MaxResponseBodySize.small, 4000, true),
MaxBodySizeTestConfig(MaxResponseBodySize.small, 4001, false),
// medium
MaxBodySizeTestConfig(MaxResponseBodySize.medium, 0, true),
MaxBodySizeTestConfig(MaxResponseBodySize.medium, 4001, true),
MaxBodySizeTestConfig(MaxResponseBodySize.medium, 10000, true),
MaxBodySizeTestConfig(MaxResponseBodySize.medium, 10001, false),
];

fixture._hub.options.captureFailedRequests = true;
fixture._hub.options.sendDefaultPii = true;

for (final scenario in scenarios) {
fixture._hub.options.maxResponseBodySize = scenario.maxBodySize;
fixture.transport.reset();

final bodyBytes = List.generate(scenario.contentLength, (index) => 0);
final bodyString = utf8.decode(bodyBytes);

final sut = fixture.getSut(
client: fixture.getClient(statusCode: 401, body: bodyString),
failedRequestStatusCodes: [SentryStatusCode(401)],
);

final request = Request('GET', requestUri);
await sut.send(request);

expect(fixture.transport.calls, 1);

final eventCall = fixture.transport.events.first;
final capturedResponse = eventCall.contexts.response;
expect(capturedResponse, isNotNull);
expect(capturedResponse?.data,
scenario.shouldBeIncluded ? isNotNull : isNull);
}
});

test('request passed to hint', () async {
fixture._hub.options.captureFailedRequests = true;

Expand Down