Skip to content

Commit 1cc42ef

Browse files
committed
skip attachment if it throws
1 parent 893ffdc commit 1cc42ef

File tree

6 files changed

+270
-20
lines changed

6 files changed

+270
-20
lines changed

dart/lib/src/sentry_envelope.dart

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,7 @@ class SentryEnvelope {
3838
final newLineData = utf8.encode('\n');
3939
for (final item in items) {
4040
yield newLineData;
41-
await for (final chunk in item.envelopeItemStream()) {
42-
yield chunk;
43-
}
41+
yield await item.envelopeItemStream();
4442
}
4543
}
4644
}

dart/lib/src/sentry_envelope_item.dart

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,18 @@ class SentryEnvelopeItem {
5454
final Future<List<int>> Function() dataFactory;
5555

5656
/// Stream binary data of `Envelope` item.
57-
Stream<List<int>> envelopeItemStream() async* {
58-
yield utf8.encode(jsonEncode(await header.toJson()));
59-
yield utf8.encode('\n');
60-
yield await dataFactory();
57+
Future<List<int>> envelopeItemStream() async {
58+
// Each item needs to be encoded as one unit.
59+
// Otherwise the header alredy got yielded if the content throws
60+
// an exception.
61+
try {
62+
final itemHeader = utf8.encode(jsonEncode(await header.toJson()));
63+
final newLine = utf8.encode('\n');
64+
final data = await dataFactory();
65+
return [...itemHeader, ...newLine, ...data];
66+
} catch (e) {
67+
return [];
68+
}
6169
}
6270
}
6371

dart/test/sentry_client_test.dart

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -725,9 +725,8 @@ void main() {
725725

726726
Future<SentryEvent> eventFromEnvelope(SentryEnvelope envelope) async {
727727
final envelopeItemData = <int>[];
728-
await envelope.items.first
729-
.envelopeItemStream()
730-
.forEach(envelopeItemData.addAll);
728+
envelopeItemData.addAll(await envelope.items.first.envelopeItemStream());
729+
731730
final envelopeItem = utf8.decode(envelopeItemData);
732731
final envelopeItemJson = jsonDecode(envelopeItem.split('\n').last);
733732
return SentryEvent.fromJson(envelopeItemJson as Map<String, dynamic>);

dart/test/sentry_envelope_item_test.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@ void main() {
2424
final headerJsonEncoded = jsonEncode(headerJson);
2525
final expected = utf8.encode('$headerJsonEncoded\n{fixture}');
2626

27-
final actualItem = <int>[];
28-
await sut.envelopeItemStream().forEach(actualItem.addAll);
27+
final actualItem = await sut.envelopeItemStream();
2928

3029
expect(actualItem, expected);
3130
});

dart/test/sentry_envelope_test.dart

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,7 @@ void main() {
3131
final expectedHeaderJson = header.toJson();
3232
final expectedHeaderJsonSerialized = jsonEncode(expectedHeaderJson);
3333

34-
final expectedItem = <int>[];
35-
await item.envelopeItemStream().forEach(expectedItem.addAll);
34+
final expectedItem = await item.envelopeItemStream();
3635
final expectedItemSerialized = utf8.decode(expectedItem);
3736

3837
final expected = utf8.encode(
@@ -60,13 +59,9 @@ void main() {
6059
expect(await sut.items[0].header.length(),
6160
await expectedEnvelopeItem.header.length());
6261

63-
final actualItem = <int>[];
64-
await sut.items[0].envelopeItemStream().forEach(actualItem.addAll);
62+
final actualItem = await sut.items[0].envelopeItemStream();
6563

66-
final expectedItem = <int>[];
67-
await expectedEnvelopeItem
68-
.envelopeItemStream()
69-
.forEach(expectedItem.addAll);
64+
final expectedItem = await expectedEnvelopeItem.envelopeItemStream();
7065

7166
expect(actualItem, expectedItem);
7267
});

dart/test/sentry_envelope_vm_test.dart

Lines changed: 251 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import 'dart:io';
33

44
import 'package:sentry/sentry.dart';
5+
import 'package:sentry/sentry_io.dart';
56
import 'package:sentry/src/sentry_envelope.dart';
67
import 'package:sentry/src/sentry_envelope_header.dart';
78
import 'package:sentry/src/sentry_envelope_item_header.dart';
@@ -42,5 +43,255 @@ void main() {
4243

4344
expect(expectedEnvelopeData, envelopeData);
4445
});
46+
47+
test('skips attachment if path is invalid', () async {
48+
final event = SentryEvent(
49+
eventId: SentryId.empty(),
50+
timestamp: DateTime(1970, 1, 1),
51+
);
52+
final sdkVersion = SdkVersion(name: '', version: '');
53+
final attachment =
54+
IoSentryAttachment.fromPath('this_path_does_not_exist.txt');
55+
56+
final envelope = SentryEnvelope.fromEvent(event, sdkVersion,
57+
attachments: [attachment]);
58+
59+
final data =
60+
(await envelope.envelopeStream().toList()).reduce((a, b) => a + b);
61+
62+
expect(data, envelopeBinaryData);
63+
});
4564
});
4665
}
66+
67+
final envelopeBinaryData = [
68+
123,
69+
34,
70+
101,
71+
118,
72+
101,
73+
110,
74+
116,
75+
95,
76+
105,
77+
100,
78+
34,
79+
58,
80+
34,
81+
48,
82+
48,
83+
48,
84+
48,
85+
48,
86+
48,
87+
48,
88+
48,
89+
48,
90+
48,
91+
48,
92+
48,
93+
48,
94+
48,
95+
48,
96+
48,
97+
48,
98+
48,
99+
48,
100+
48,
101+
48,
102+
48,
103+
48,
104+
48,
105+
48,
106+
48,
107+
48,
108+
48,
109+
48,
110+
48,
111+
48,
112+
48,
113+
34,
114+
44,
115+
34,
116+
115,
117+
100,
118+
107,
119+
34,
120+
58,
121+
123,
122+
34,
123+
110,
124+
97,
125+
109,
126+
101,
127+
34,
128+
58,
129+
34,
130+
34,
131+
44,
132+
34,
133+
118,
134+
101,
135+
114,
136+
115,
137+
105,
138+
111,
139+
110,
140+
34,
141+
58,
142+
34,
143+
34,
144+
125,
145+
125,
146+
10,
147+
123,
148+
34,
149+
99,
150+
111,
151+
110,
152+
116,
153+
101,
154+
110,
155+
116,
156+
95,
157+
116,
158+
121,
159+
112,
160+
101,
161+
34,
162+
58,
163+
34,
164+
97,
165+
112,
166+
112,
167+
108,
168+
105,
169+
99,
170+
97,
171+
116,
172+
105,
173+
111,
174+
110,
175+
47,
176+
106,
177+
115,
178+
111,
179+
110,
180+
34,
181+
44,
182+
34,
183+
116,
184+
121,
185+
112,
186+
101,
187+
34,
188+
58,
189+
34,
190+
101,
191+
118,
192+
101,
193+
110,
194+
116,
195+
34,
196+
44,
197+
34,
198+
108,
199+
101,
200+
110,
201+
103,
202+
116,
203+
104,
204+
34,
205+
58,
206+
56,
207+
54,
208+
125,
209+
10,
210+
123,
211+
34,
212+
101,
213+
118,
214+
101,
215+
110,
216+
116,
217+
95,
218+
105,
219+
100,
220+
34,
221+
58,
222+
34,
223+
48,
224+
48,
225+
48,
226+
48,
227+
48,
228+
48,
229+
48,
230+
48,
231+
48,
232+
48,
233+
48,
234+
48,
235+
48,
236+
48,
237+
48,
238+
48,
239+
48,
240+
48,
241+
48,
242+
48,
243+
48,
244+
48,
245+
48,
246+
48,
247+
48,
248+
48,
249+
48,
250+
48,
251+
48,
252+
48,
253+
48,
254+
48,
255+
34,
256+
44,
257+
34,
258+
116,
259+
105,
260+
109,
261+
101,
262+
115,
263+
116,
264+
97,
265+
109,
266+
112,
267+
34,
268+
58,
269+
34,
270+
49,
271+
57,
272+
55,
273+
48,
274+
45,
275+
48,
276+
49,
277+
45,
278+
48,
279+
49,
280+
84,
281+
48,
282+
48,
283+
58,
284+
48,
285+
48,
286+
58,
287+
48,
288+
48,
289+
46,
290+
48,
291+
48,
292+
48,
293+
90,
294+
34,
295+
125,
296+
10
297+
];

0 commit comments

Comments
 (0)