Closes #2. Kudo to @jwykeham for the fix!.
This commit is contained in:
parent
55b6fccefd
commit
ca06a16bd9
3
TODO.md
3
TODO.md
@ -31,6 +31,3 @@
|
|||||||
- [ ] Make Podcast cover fetchng and loading not block the execution of the program at startup.
|
- [ ] Make Podcast cover fetchng and loading not block the execution of the program at startup.
|
||||||
- [ ] Lazy evaluate episode loading based on the show_widget's scrolling.
|
- [ ] Lazy evaluate episode loading based on the show_widget's scrolling.
|
||||||
|
|
||||||
**FIXME:**
|
|
||||||
|
|
||||||
- [ ] Fix Etag/Last-modified implementation. [#2](https://gitlab.gnome.org/alatiera/Hammond/issues/2)
|
|
||||||
|
|||||||
@ -26,7 +26,7 @@ pub struct Feed {
|
|||||||
impl Feed {
|
impl Feed {
|
||||||
/// Constructor that consumes a `Source` and returns the corresponding `Feed` struct.
|
/// Constructor that consumes a `Source` and returns the corresponding `Feed` struct.
|
||||||
pub fn from_source(s: Source) -> Result<Feed> {
|
pub fn from_source(s: Source) -> Result<Feed> {
|
||||||
s.into_feed()
|
s.into_feed(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Constructor that consumes a `Source` and a `rss::Channel` returns a `Feed` struct.
|
/// Constructor that consumes a `Source` and a `rss::Channel` returns a `Feed` struct.
|
||||||
@ -112,19 +112,22 @@ pub fn index(feed: &Feed) {
|
|||||||
|
|
||||||
/// Consume a `Source` and return a `Feed`.
|
/// Consume a `Source` and return a `Feed`.
|
||||||
fn fetch(source: Source) -> Result<Feed> {
|
fn fetch(source: Source) -> Result<Feed> {
|
||||||
let uri = source.uri().to_owned();
|
Feed::from_source(source)
|
||||||
let feed = Feed::from_source(source);
|
|
||||||
if feed.is_err() {
|
|
||||||
error!("Error While trying to fetch from source url: {}.", uri);
|
|
||||||
}
|
|
||||||
feed
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Index a "list" of `Source`s.
|
/// Index a "list" of `Source`s.
|
||||||
pub fn index_loop<S: IntoParallelIterator<Item = Source>>(sources: S) {
|
pub fn index_loop<S: IntoParallelIterator<Item = Source>>(sources: S) {
|
||||||
sources
|
sources
|
||||||
.into_par_iter()
|
.into_par_iter()
|
||||||
.filter_map(|x| fetch(x).ok())
|
.filter_map(|x| {
|
||||||
|
let foo = fetch(x);
|
||||||
|
if let Err(err) = foo {
|
||||||
|
error!("Error: {}", err);
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
foo.ok()
|
||||||
|
}
|
||||||
|
})
|
||||||
.for_each(|x| index(&x));
|
.for_each(|x| index(&x));
|
||||||
|
|
||||||
info!("Indexing done.");
|
info!("Indexing done.");
|
||||||
@ -223,8 +226,8 @@ mod tests {
|
|||||||
assert_eq!(s1, s2);
|
assert_eq!(s1, s2);
|
||||||
assert_eq!(s1.id(), s2.id());
|
assert_eq!(s1.id(), s2.id());
|
||||||
|
|
||||||
let f1 = s1.into_feed().unwrap();
|
let f1 = s1.into_feed(false).unwrap();
|
||||||
let f2 = s2.into_feed().unwrap();
|
let f2 = s2.into_feed(false).unwrap();
|
||||||
|
|
||||||
let p1 = f1.get_podcast().unwrap();
|
let p1 = f1.get_podcast().unwrap();
|
||||||
let p2 = {
|
let p2 = {
|
||||||
|
|||||||
@ -640,18 +640,22 @@ impl<'a> Source {
|
|||||||
///
|
///
|
||||||
/// Consumes `self` and Returns the corresponding `Feed` Object.
|
/// Consumes `self` and Returns the corresponding `Feed` Object.
|
||||||
// TODO: Refactor into TryInto once it lands on stable.
|
// TODO: Refactor into TryInto once it lands on stable.
|
||||||
pub fn into_feed(mut self) -> Result<Feed> {
|
pub fn into_feed(mut self, ignore_etags: bool) -> Result<Feed> {
|
||||||
use reqwest::header::{ETag, EntityTag, Headers, HttpDate, LastModified};
|
use reqwest::header::{EntityTag, Headers, HttpDate, IfModifiedSince, IfNoneMatch};
|
||||||
|
|
||||||
let mut headers = Headers::new();
|
let mut headers = Headers::new();
|
||||||
|
|
||||||
if let Some(foo) = self.http_etag() {
|
if !ignore_etags {
|
||||||
headers.set(ETag(EntityTag::new(true, foo.to_owned())));
|
if let Some(foo) = self.http_etag() {
|
||||||
}
|
headers.set(IfNoneMatch::Items(vec![
|
||||||
|
EntityTag::new(true, foo.to_owned()),
|
||||||
|
]));
|
||||||
|
}
|
||||||
|
|
||||||
if let Some(foo) = self.last_modified() {
|
if let Some(foo) = self.last_modified() {
|
||||||
if let Ok(x) = foo.parse::<HttpDate>() {
|
if let Ok(x) = foo.parse::<HttpDate>() {
|
||||||
headers.set(LastModified(x));
|
headers.set(IfModifiedSince(x));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -663,17 +667,17 @@ impl<'a> Source {
|
|||||||
|
|
||||||
info!("GET to {} , returned: {}", self.uri(), req.status());
|
info!("GET to {} , returned: {}", self.uri(), req.status());
|
||||||
|
|
||||||
|
self.update_etag(&req)?;
|
||||||
|
|
||||||
// TODO match on more stuff
|
// TODO match on more stuff
|
||||||
// 301: Permanent redirect of the url
|
// 301: Permanent redirect of the url
|
||||||
// 302: Temporary redirect of the url
|
// 302: Temporary redirect of the url
|
||||||
// 304: Up to date Feed, checked with the Etag
|
// 304: Up to date Feed, checked with the Etag
|
||||||
// 410: Feed deleted
|
// 410: Feed deleted
|
||||||
// match req.status() {
|
match req.status() {
|
||||||
// reqwest::StatusCode::NotModified => (),
|
reqwest::StatusCode::NotModified => bail!("304, skipping.."),
|
||||||
// _ => (),
|
_ => (),
|
||||||
// };
|
};
|
||||||
|
|
||||||
self.update_etag(&req)?;
|
|
||||||
|
|
||||||
let mut buf = String::new();
|
let mut buf = String::new();
|
||||||
req.read_to_string(&mut buf)?;
|
req.read_to_string(&mut buf)?;
|
||||||
|
|||||||
@ -214,7 +214,7 @@ mod tests {
|
|||||||
let sid = source.id().clone();
|
let sid = source.id().clone();
|
||||||
|
|
||||||
// Convert Source it into a Feed and index it
|
// Convert Source it into a Feed and index it
|
||||||
let feed = source.into_feed().unwrap();
|
let feed = source.into_feed(true).unwrap();
|
||||||
index(&feed);
|
index(&feed);
|
||||||
|
|
||||||
// Get the Podcast
|
// Get the Podcast
|
||||||
|
|||||||
@ -113,7 +113,7 @@ mod tests {
|
|||||||
let sid = source.id().clone();
|
let sid = source.id().clone();
|
||||||
|
|
||||||
// Convert Source it into a Feed and index it
|
// Convert Source it into a Feed and index it
|
||||||
let feed = source.into_feed().unwrap();
|
let feed = source.into_feed(true).unwrap();
|
||||||
index(&feed);
|
index(&feed);
|
||||||
|
|
||||||
// Get the Podcast
|
// Get the Podcast
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user