rust-syndication / rss

Library for serializing the RSS web content syndication format
https://crates.io/crates/rss
Apache License 2.0
419 stars 52 forks source link

Slice panic when trying to render Channel into XML #63

Closed bitemyapp closed 6 years ago

bitemyapp commented 6 years ago
thread '<unnamed>' panicked at 'slice index starts at 30 but ends at 17', /checkout/src/libcore/slice/mod.rs:749:4
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
stack backtrace:
   0: std::sys::imp::backtrace::tracing::imp::unwind_backtrace
             at /checkout/src/libstd/sys/unix/backtrace/tracing/gcc_s.rs:49
   1: std::sys_common::backtrace::_print
             at /checkout/src/libstd/sys_common/backtrace.rs:71
   2: std::panicking::default_hook::{{closure}}
             at /checkout/src/libstd/sys_common/backtrace.rs:60
             at /checkout/src/libstd/panicking.rs:381
   3: std::panicking::default_hook
             at /checkout/src/libstd/panicking.rs:397
   4: std::panicking::rust_panic_with_hook
             at /checkout/src/libstd/panicking.rs:577
   5: std::panicking::begin_panic
             at /checkout/src/libstd/panicking.rs:538
   6: std::panicking::begin_panic_fmt
             at /checkout/src/libstd/panicking.rs:522
   7: rust_begin_unwind
             at /checkout/src/libstd/panicking.rs:498
   8: core::panicking::panic_fmt
             at /checkout/src/libcore/panicking.rs:71
   9: core::slice::slice_index_order_fail
             at /checkout/src/libcore/slice/mod.rs:749
  10: <core::ops::range::Range<usize> as core::slice::SliceIndex<[T]>>::index
             at /checkout/src/libcore/slice/mod.rs:872
  11: core::slice::<impl core::ops::index::Index<I> for [T]>::index
             at /checkout/src/libcore/slice/mod.rs:725
  12: quick_xml::escape::escape
             at /home/callen/.cargo/registry/src/github.com-1ecc6299db9ec823/quick-xml-0.9.1/src/escape.rs:57
  13: quick_xml::events::BytesText::escaped
             at /home/callen/.cargo/registry/src/github.com-1ecc6299db9ec823/quick-xml-0.9.1/src/events/mod.rs:326
  14: <quick_xml::writer::Writer<W>>::write_event
             at /home/callen/.cargo/registry/src/github.com-1ecc6299db9ec823/quick-xml-0.9.1/src/writer.rs:81
  15: <quick_xml::writer::Writer<W> as rss::toxml::WriterExt>::write_text_element
             at /home/callen/.cargo/git/checkouts/rss-1-b8a307c973f0221d/01da285/src/toxml.rs:59
  16: <rss::item::Item as rss::toxml::ToXml>::to_xml
             at /home/callen/.cargo/git/checkouts/rss-1-b8a307c973f0221d/01da285/src/item.rs:617
  17: <&'a T as rss::toxml::ToXml>::to_xml
             at /home/callen/.cargo/git/checkouts/rss-1-b8a307c973f0221d/01da285/src/toxml.rs:20
  18: <quick_xml::writer::Writer<W> as rss::toxml::WriterExt>::write_objects
             at /home/callen/.cargo/git/checkouts/rss-1-b8a307c973f0221d/01da285/src/toxml.rs:103
  19: <rss::channel::Channel as rss::toxml::ToXml>::to_xml
             at /home/callen/.cargo/git/checkouts/rss-1-b8a307c973f0221d/01da285/src/channel.rs:1284
  20: rss::channel::Channel::write_to
             at /home/callen/.cargo/git/checkouts/rss-1-b8a307c973f0221d/01da285/src/channel.rs:1048
  21: <rss::channel::Channel as alloc::string::ToString>::to_string
             at /home/callen/.cargo/git/checkouts/rss-1-b8a307c973f0221d/01da285/src/channel.rs:1058
pub fn open_rss_uri(uri: &str, item_filter: ItemFilter) -> rss::Channel {
    let mut resp = reqwest::get(uri).unwrap();
    assert!(resp.status().is_success());
    let mut content = String::new();
    resp.read_to_string(&mut content);

    // let file = File::open(filename).unwrap();
    let mut channel = Channel::read_from(BufReader::new(content.as_bytes())).unwrap();
    filter_feed(&mut channel, item_filter);
    println!("{:?}", channel.to_string());
    channel
    // println!("{:?}", channel.items);
}

Identical XML to what I tested with can be found at: http://bitemyapp.com/rss.xml

Here's a gist just in case: https://gist.github.com/bitemyapp/d0cab492eeea16d1dc76b72dfd3ca3a9

Any ideas?

bitemyapp commented 6 years ago

Happens if I attempt write_to as well,

    channel.write_to(::std::io::sink()).unwrap(); // // write to the channel to a writer
tafia commented 6 years ago

Can you try updating to last quick-xml? There were some fixes recently regarding escapes.

bitemyapp commented 6 years ago

Works now with these deps:

rss = { git = "https://github.com/bitemyapp/rss-1", rev = "f669d81995824e54b27b264e762ed354906610f7" }
quick-xml = "0.9.4"

Thank you!

frewsxcv commented 6 years ago

FYI, you should be able to do cargo update (or even cargo update -p quick-xml') to get the latest quick-xml without needing to explicitly bump the version in the Cargo.toml. with cargo, 0.9.0 implies ^0.9.0, so 0.9.4 is compatible with 0.9.0

bitemyapp commented 6 years ago

@frewsxcv well, it literally doesn't work <0.9.4 so I'd like my package to say as much.