Skip to content

Commit 12b483b

Browse files
authored
Fix raw envelope roundtrips (#568)
We used to print an empty `{}` header in front of raw envelopes, which is wrong. Now we test for perfect roundtrips of arbitrary bytes, which is what "raw" means. Also offers a `from_bytes_raw` now which takes an in-memory buffer.
1 parent deb5a84 commit 12b483b

File tree

1 file changed

+31
-9
lines changed

1 file changed

+31
-9
lines changed

sentry-types/src/protocol/envelope.rs

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -303,18 +303,18 @@ impl Envelope {
303303
where
304304
W: Write,
305305
{
306+
let items = match &self.items {
307+
Items::Raw(bytes) => return writer.write_all(bytes).map(|_| ()),
308+
Items::EnvelopeItems(items) => items,
309+
};
310+
306311
// write the headers:
307312
let event_id = self.uuid();
308313
match event_id {
309314
Some(uuid) => writeln!(writer, r#"{{"event_id":"{uuid}"}}"#)?,
310315
_ => writeln!(writer, "{{}}")?,
311316
}
312317

313-
let items = match &self.items {
314-
Items::Raw(bytes) => return writer.write_all(bytes).map(|_| ()),
315-
Items::EnvelopeItems(items) => items,
316-
};
317-
318318
let mut item_buf = Vec::new();
319319
// write each item:
320320
for item in items {
@@ -376,6 +376,14 @@ impl Envelope {
376376
Ok(envelope)
377377
}
378378

379+
/// Creates a new raw Envelope from the given buffer.
380+
pub fn from_bytes_raw(bytes: Vec<u8>) -> Result<Self, EnvelopeError> {
381+
Ok(Self {
382+
event_id: None,
383+
items: Items::Raw(bytes),
384+
})
385+
}
386+
379387
/// Creates a new Envelope from path.
380388
pub fn from_path<P: AsRef<Path>>(path: P) -> Result<Envelope, EnvelopeError> {
381389
let bytes = std::fs::read(path).map_err(|_| EnvelopeError::UnexpectedEof)?;
@@ -388,10 +396,7 @@ impl Envelope {
388396
/// be contained verbatim in the `items` field.
389397
pub fn from_path_raw<P: AsRef<Path>>(path: P) -> Result<Self, EnvelopeError> {
390398
let bytes = std::fs::read(path).map_err(|_| EnvelopeError::UnexpectedEof)?;
391-
Ok(Self {
392-
event_id: None,
393-
items: Items::Raw(bytes),
394-
})
399+
Self::from_bytes_raw(bytes)
395400
}
396401

397402
fn parse_header(slice: &[u8]) -> Result<(EnvelopeHeader, usize), EnvelopeError> {
@@ -540,6 +545,23 @@ mod test {
540545
assert_eq!(to_str(Envelope::new()), "{}\n");
541546
}
542547

548+
#[test]
549+
fn raw_roundtrip() {
550+
let buf = r#"{"event_id":"22d00b3f-d1b1-4b5d-8d20-49d138cd8a9c"}
551+
{"type":"event","length":74}
552+
{"event_id":"22d00b3fd1b14b5d8d2049d138cd8a9c","timestamp":1595256674.296}
553+
"#;
554+
let envelope = Envelope::from_bytes_raw(buf.to_string().into_bytes()).unwrap();
555+
let serialized = to_str(envelope);
556+
assert_eq!(&serialized, buf);
557+
558+
let random_invalid_bytes = b"oh stahp!\0\x01\x02";
559+
let envelope = Envelope::from_bytes_raw(random_invalid_bytes.to_vec()).unwrap();
560+
let mut serialized = Vec::new();
561+
envelope.to_writer(&mut serialized).unwrap();
562+
assert_eq!(&serialized, random_invalid_bytes);
563+
}
564+
543565
#[test]
544566
fn test_event() {
545567
let event_id = Uuid::parse_str("22d00b3f-d1b1-4b5d-8d20-49d138cd8a9c").unwrap();

0 commit comments

Comments
 (0)