public void does_not_update_feed_that_was_not_modified() { var cached = new LocalFeedInfo() { Url = "http://cached.feed/rss", Content = "cached-content", Etag = "cached-etag", LastFetch = new DateTime(2012, 2, 3) }; _feedsProvider.Db().LocalFeedInfo.Insert(cached); A.CallTo( () => _remoteData.ReadRemoteSource( A <LocalFeedInfo> .That.Matches(x => x.Url == cached.Url && x.Etag == cached.Etag && x.LastFetch == cached.LastFetch) ) ) .Returns(RemoteContentResponse.NotModified(HttpStatusCode.OK)); execute(cached.Url); List <LocalFeedInfo> fromDb = _feedsProvider.Db().LocalFeedInfo.All().ToList <LocalFeedInfo>(); Assert.Equal(1, fromDb.Count); Assert.Equal(cached.Url, fromDb[0].Url); Assert.Equal(cached.Content, fromDb[0].Content); Assert.Equal(cached.Etag, fromDb[0].Etag); Assert.Equal(cached.LastFetch, fromDb[0].LastFetch); }
protected virtual void OnFeedUpdated(dynamic db, LocalFeedInfo feed, RemoteContentResponse remoteResponse) { }
protected virtual void OnNoNewContentInRemoteSource(dynamic db, LocalFeedInfo feed, RemoteContentResponse remoteResponse) { }
public void UpdateFeed(string url) { var db = _localFeedsProvider.Db(); dynamic read_view = GetLocalFeedInfoView(db); LocalFeedInfo feed = read_view.FindByUrl(url) ?? new LocalFeedInfo { Url = url, }; _log.Debug("Updating {0} feed '{1}'", feed.Id == 0 ? "new" : "existing", url); RemoteContentResponse remoteResponse = null; try { OnBeforeReadingRemoteSource(db, feed); remoteResponse = _remoteData.ReadRemoteSource(feed); } catch (Exception exc) { OnReadingRemoteSourceError(db, feed, remoteResponse, exc); throw; } if (remoteResponse.HasNewContent == false) { _log.Debug("Feed '{0}' does not have new content", url); OnNoNewContentInRemoteSource(db, feed, remoteResponse); return; } bool newFeed = feed.LastFetch == null; string previousContent = feed.Content ?? string.Empty; feed.Content = GetFeedStringContent(remoteResponse); feed.LastFetch = ApplicationTime.Current; feed.Etag = remoteResponse.Etag; if (newFeed) { _log.Info("Inserting new feed '{0}' to local cache", url); InsertNewFeed(db, feed, url); } else { _log.Info("Updating feed '{0}' in local cache", url); UpdateExistingFeed(db, feed, url); } OnFeedUpdated(db, feed, remoteResponse); if (previousContent.GetHashCode() == feed.Content.GetHashCode()) { _log.Warn("Wasting resources: updating feed '{0}' with the same content it already had!", url); } }
/// <summary> /// Gets whole feed content as string made of all it's items. /// </summary> protected virtual string GetFeedStringContent(RemoteContentResponse remoteResponse) { return(remoteResponse.Content.GetRssString()); }
protected virtual void OnReadingRemoteSourceError(dynamic db, LocalFeedInfo feed, RemoteContentResponse remoteResponse, Exception exc) { }