From 52b18f046d69e091f940d2942f82c81468a897b9 Mon Sep 17 00:00:00 2001 From: Mingun Date: Sun, 13 Mar 2022 12:31:34 +0500 Subject: [PATCH] Handle CDATA events in the deserializer - this fixes almost all CDATA trivial tests failures (1): trivial::struct_::cdata::byte_buf --- Changelog.md | 1 + src/de/map.rs | 2 +- src/de/mod.rs | 2 +- src/de/var.rs | 4 +++- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Changelog.md b/Changelog.md index f2215bf5..d406911d 100644 --- a/Changelog.md +++ b/Changelog.md @@ -32,6 +32,7 @@ - fix: fix internal panic message when parse malformed XML ([#344](https://github.com/tafia/quick-xml/issues/344)) - test: add tests for trivial documents (empty / only comment / `...` -- one tag with content) +- fix: CDATA was not handled in many cases where it should ## 0.23.0-alpha3 diff --git a/src/de/map.rs b/src/de/map.rs index d6fca022..ab0b9943 100644 --- a/src/de/map.rs +++ b/src/de/map.rs @@ -109,7 +109,7 @@ where } else { // try getting from events (value) match self.de.peek()? { - DeEvent::Text(_) => { + DeEvent::Text(_) | DeEvent::CData(_) => { self.state = State::InnerValue; // Deserialize `key` from special attribute name which means // that value should be taken from the text content of the diff --git a/src/de/mod.rs b/src/de/mod.rs index a4e86d88..8426dca7 100644 --- a/src/de/mod.rs +++ b/src/de/mod.rs @@ -597,7 +597,7 @@ where V: Visitor<'de>, { match self.peek()? { - DeEvent::Text(t) if t.is_empty() => visitor.visit_none(), + DeEvent::Text(t) | DeEvent::CData(t) if t.is_empty() => visitor.visit_none(), DeEvent::Eof => visitor.visit_none(), _ => visitor.visit_some(self), } diff --git a/src/de/var.rs b/src/de/var.rs index 9125670f..2dbdd60c 100644 --- a/src/de/var.rs +++ b/src/de/var.rs @@ -36,6 +36,8 @@ where let decoder = self.de.reader.decoder(); let de = match self.de.peek()? { DeEvent::Text(t) => EscapedDeserializer::new(Cow::Borrowed(t), decoder, true), + // Escape sequences does not processed inside CDATA section + DeEvent::CData(t) => EscapedDeserializer::new(Cow::Borrowed(t), decoder, false), DeEvent::Start(e) => EscapedDeserializer::new(Cow::Borrowed(e.name()), decoder, false), _ => { return Err(DeError::Unsupported( @@ -64,7 +66,7 @@ where fn unit_variant(self) -> Result<(), DeError> { match self.de.next()? { DeEvent::Start(e) => self.de.read_to_end(e.name()), - DeEvent::Text(_) => Ok(()), + DeEvent::Text(_) | DeEvent::CData(_) => Ok(()), _ => unreachable!(), } }