Index: src/core.rs ================================================================== --- src/core.rs +++ src/core.rs @@ -102,10 +102,12 @@ impl Drop for Token { /// Releases this token's claim on the shared running-set when the token is dropped. /// /// The token's identifier is removed from the shared `running` set so that future /// operations for the same id may proceed. + /// + /// TODO: is using block_on inside block_on safe? Currently tested and working fine. fn drop (&mut self) { smol::block_on(async { let mut set = self.running.lock_arc().await; set.remove(&self.my_id); }) @@ -228,10 +230,11 @@ let mut builder = self.http_client.get(&source.url); if let Some(last_scrape) = last_scrape { builder = builder.header(LAST_MODIFIED, last_scrape.to_rfc2822()); }; let response = builder.send().await.stack()?; + #[cfg(debug_assertions)] { let headers = response.headers(); let expires = headers.get(EXPIRES); let cache = headers.get(CACHE_CONTROL); if expires.is_some() || cache.is_some() { @@ -274,12 +277,20 @@ Err(err) => match err { rss::Error::InvalidStartTag => { match atom_syndication::Feed::read_from(&content[..]) { Ok(feed) => { for item in feed.entries() { - let date = item.published().unwrap(); - let uri = item.links()[0].href().to_string(); + let date = item.published() + .stack_err("Feed item missing publishing date.")?; + let uri = { + let links = item.links(); + if links.is_empty() { + bail!("Feed item missing post links."); + } else { + links[0].href().to_string() + } + }; let title = item.title().to_string(); let authors = item.authors().iter().map(|x| format!("{} <{:?}>", x.name(), x.email())).collect::>().join(", "); let summary = if let Some(sum) = item.summary() { sum.value.clone() } else { String::new() }; posts.insert(*date, Post{ uri,