@@ -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