IMAP: Fix fetch responses (closes #2940) (credits to @markstos)

This commit is contained in:
Maurus Decimus
2026-04-23 18:02:30 +02:00
parent a82948318a
commit 5e87009ca1
23 changed files with 1065 additions and 124 deletions

View File

@@ -309,6 +309,20 @@ impl<'x> DecodedParts<'x> {
DecodedPartContent::Binary(binary) => binary.as_ref(),
})
}
#[inline]
pub fn transfer_decoded_contents(
&self,
message_id: usize,
part: &ArchivedMessageMetadataPart,
) -> Option<Cow<'_, [u8]>> {
match self.raw_messages.get(message_id)? {
DecodedRawMessage::Borrowed(chain) => Some(part.contents(chain)),
DecodedRawMessage::Owned(vec) => Some(Cow::Owned(
part.contents(&ChainedBytes::new(vec)).into_owned(),
)),
}
}
}
impl DecodedPartContent<'_> {

View File

@@ -1077,12 +1077,12 @@ impl AsImapDataItem for ArchivedMessageMetadata {
let part_offset = u32::from(part.offset_header) as usize;
Ok(match &part.body {
ArchivedMetadataPartType::Text | ArchivedMetadataPartType::Html => {
BodyContents::Text(String::from_utf8_lossy(get_partial_bytes(
BodyContents::Bytes(get_cow_partial_bytes(
decoded
.binary_part(message_id, part_offset)
.transfer_decoded_contents(message_id, part)
.unwrap_or_default(),
partial,
)))
))
.into()
}
ArchivedMetadataPartType::Binary | ArchivedMetadataPartType::InlineBinary => {
@@ -1152,10 +1152,11 @@ impl AsImapDataItem for ArchivedMessageMetadata {
}
match &part.body {
ArchivedMetadataPartType::Text
| ArchivedMetadataPartType::Html
| ArchivedMetadataPartType::Binary
| ArchivedMetadataPartType::InlineBinary => decoded
ArchivedMetadataPartType::Text | ArchivedMetadataPartType::Html => decoded
.transfer_decoded_contents(message_id, part)
.map(|p| p.len())
.unwrap_or_default(),
ArchivedMetadataPartType::Binary | ArchivedMetadataPartType::InlineBinary => decoded
.part(message_id, u32::from(part.offset_header) as usize)
.map(|p| p.len())
.unwrap_or_default(),