From 87de0b58833dc23735f808903608ed5754db4373 Mon Sep 17 00:00:00 2001 From: ftilde Date: Thu, 30 Dec 2021 14:46:51 +0100 Subject: [PATCH] Return broken messages unchanged from messages() Without this change, a batch with a message that cannot be deserialized (for whatever reason) means that the batch cannot be processed at all by the caller. Now, those messages are returned unchanged in the batch so that the caller can handle them. --- crates/matrix-sdk/src/room/common.rs | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/crates/matrix-sdk/src/room/common.rs b/crates/matrix-sdk/src/room/common.rs index e6127fd40..b9d32a230 100644 --- a/crates/matrix-sdk/src/room/common.rs +++ b/crates/matrix-sdk/src/room/common.rs @@ -132,6 +132,10 @@ impl Common { /// returns a `Messages` struct that contains a chunk of room and state /// events (`RoomEvent` and `AnyStateEvent`). /// + /// With the encryption feature, messages are decrypted if possible. If + /// decryption fails for an individual message, that message is returned + /// undecrypted. + /// /// # Arguments /// /// * `request` - The easiest way to create this request is using the @@ -175,14 +179,19 @@ impl Common { state: http_response.state, }; - for event in &http_response.chunk { - let event = event.deserialize()?; - + for event in http_response.chunk { #[cfg(feature = "encryption")] - let event = self.client.decrypt_room_event(&event).await?; + let event = match event.deserialize() { + Ok(event) => self.client.decrypt_room_event(&event).await?, + Err(_) => { + // "Broken" messages (i.e., those that cannot be deserialized) are + // returned unchanged so that the caller can handle them individually. + RoomEvent { event, encryption_info: None } + } + }; #[cfg(not(feature = "encryption"))] - let event = RoomEvent { event: Raw::new(&event)?, encryption_info: None }; + let event = RoomEvent { event, encryption_info: None }; response.chunk.push(event); }