| 
1 | 1 | // ignore_for_file: deprecated_member_use  | 
2 | 2 | 
 
  | 
3 |  | -import 'dart:convert';  | 
4 |  | - | 
5 | 3 | import 'package:dio/dio.dart';  | 
6 | 4 | import 'package:sentry/sentry.dart';  | 
7 | 5 | 
 
  | 
@@ -34,17 +32,13 @@ class DioEventProcessor implements EventProcessor {  | 
34 | 32 |       return event;  | 
35 | 33 |     }  | 
36 | 34 | 
 
  | 
37 |  | -    final response = _responseFrom(dioError);  | 
 | 35 | +    hint.response ??= _responseFrom(dioError);  | 
38 | 36 | 
 
  | 
39 |  | -    var contexts = event.contexts;  | 
40 |  | -    if (event.contexts.response == null) {  | 
41 |  | -      contexts = contexts.copyWith(response: response);  | 
42 |  | -    }  | 
43 | 37 |     // Don't override just parts of the original request.  | 
44 | 38 |     // Keep the original one or if there's none create one.  | 
45 | 39 |     event = event.copyWith(  | 
46 | 40 |       request: event.request ?? _requestFrom(dioError),  | 
47 |  | -      contexts: contexts,  | 
 | 41 | +      contexts: event.contexts,  | 
48 | 42 |     );  | 
49 | 43 | 
 
  | 
50 | 44 |     return event;  | 
@@ -86,77 +80,31 @@ class DioEventProcessor implements EventProcessor {  | 
86 | 80 |     final headers = response?.headers.map.map(  | 
87 | 81 |       (key, value) => MapEntry(key, value.join('; ')),  | 
88 | 82 |     );  | 
 | 83 | +    final contentLengthHeader = headers?['content-length'];  | 
 | 84 | +    int? contentLength;  | 
 | 85 | +    if (contentLengthHeader != null) {  | 
 | 86 | +      contentLength = int.tryParse(contentLengthHeader);  | 
 | 87 | +    }  | 
89 | 88 | 
 
  | 
90 | 89 |     return SentryResponse(  | 
91 | 90 |       headers: _options.sendDefaultPii ? headers : null,  | 
92 |  | -      bodySize: _getBodySize(  | 
93 |  | -        dioError.response?.data,  | 
94 |  | -        dioError.requestOptions.responseType,  | 
95 |  | -      ),  | 
 | 91 | +      bodySize: contentLength,  | 
96 | 92 |       statusCode: response?.statusCode,  | 
97 |  | -      data: _getResponseData(  | 
98 |  | -        dioError.response?.data,  | 
99 |  | -        dioError.requestOptions.responseType,  | 
100 |  | -      ),  | 
 | 93 | +      data: _getResponseData(dioError.response?.data, contentLength),  | 
101 | 94 |     );  | 
102 | 95 |   }  | 
103 | 96 | 
 
  | 
104 |  | -  /// Returns the response data, if possible according to the users settings.  | 
105 |  | -  Object? _getResponseData(Object? data, ResponseType responseType) {  | 
 | 97 | +  Object? _getResponseData(Object? data, int? contentLength) {  | 
106 | 98 |     if (!_options.sendDefaultPii || data == null) {  | 
107 | 99 |       return null;  | 
108 | 100 |     }  | 
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) {  | 
 | 101 | +    if (contentLength == null) {  | 
137 | 102 |       return null;  | 
138 | 103 |     }  | 
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 |  | -        }  | 
 | 104 | +    // ignore: invalid_use_of_internal_member  | 
 | 105 | +    if (contentLength > Hint.maxResponseBodySize) {  | 
 | 106 | +      return null;  | 
160 | 107 |     }  | 
 | 108 | +    return data;  | 
161 | 109 |   }  | 
162 | 110 | }  | 
0 commit comments