[Commits] [SCM] claws branch, master, updated. 4.3.1-89-g73f147dd4
paul at claws-mail.org
paul at claws-mail.org
Mon Apr 7 11:54:13 UTC 2025
The branch, master has been updated
via 73f147dd45d559c01178822a1f8b6b5ebf3ffbbc (commit)
from ab5e823391194ba948a129fa5e49b4b6794b944a (commit)
Summary of changes:
AUTHORS | 1 +
src/gtk/authors.h | 1 +
src/plugins/rssyl/libfeed/feed.c | 84 ++++++++++++++++++++++++++++++++---
src/plugins/rssyl/libfeed/feed.h | 10 ++++-
src/plugins/rssyl/rssyl_update_feed.c | 2 +-
5 files changed, 89 insertions(+), 9 deletions(-)
- Log -----------------------------------------------------------------
commit 73f147dd45d559c01178822a1f8b6b5ebf3ffbbc
Author: Paul <paul at claws-mail.org>
Date: Mon Apr 7 12:54:06 2025 +0100
store and send ETag and Last-Modified; remove unused last_update argument from feed_update()
patch by Ivan Krylov
diff --git a/AUTHORS b/AUTHORS
index 572ce2c2d..6c2bbe3b9 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -355,3 +355,4 @@ contributors (in addition to the above; based on Changelog)
MatN
Jan Willamowius
Konstantin Tokarev
+ Ivan Krylov
diff --git a/src/gtk/authors.h b/src/gtk/authors.h
index 17aafc8af..789e68a57 100644
--- a/src/gtk/authors.h
+++ b/src/gtk/authors.h
@@ -204,6 +204,7 @@ static char *CONTRIBS_LIST[] = {
"Jakub Kiciński",
"Martin Kluge",
"IWAMOTO Kouichi",
+"Ivan Krylov",
"Mikhail Kurinnoi",
"Abhay S. Kushwaha",
"Joshua M. Kwan",
diff --git a/src/plugins/rssyl/libfeed/feed.c b/src/plugins/rssyl/libfeed/feed.c
index 29b0bb26d..1baa786ca 100644
--- a/src/plugins/rssyl/libfeed/feed.c
+++ b/src/plugins/rssyl/libfeed/feed.c
@@ -51,6 +51,8 @@ Feed *feed_new(gchar *url)
feed->fetcherr = NULL;
feed->cookies_path = NULL;
+ feed->last_modified = NULL;
+ feed->etag = NULL;
feed->ssl_verify_peer = TRUE;
feed->cacert_file = NULL;
@@ -94,6 +96,8 @@ void feed_free(Feed *feed)
g_free(feed->fetcherr);
g_free(feed->cookies_path);
g_free(feed->cacert_file);
+ g_free(feed->last_modified);
+ g_free(feed->etag);
if( feed->items != NULL ) {
g_slist_foreach(feed->items, _free_items, NULL);
@@ -246,7 +250,7 @@ FeedItem *feed_nth_item(Feed *feed, guint n)
* Takes initialized feed with url set, fetches the feed from this url,
* updates rest of Feed struct members and returns HTTP response code
* we got from url's server. */
-guint feed_update(Feed *feed, time_t last_update, const gchar *user_agent)
+guint feed_update(Feed *feed, const gchar *user_agent)
{
CURL *eh = NULL;
CURLcode res;
@@ -295,12 +299,29 @@ guint feed_update(Feed *feed, time_t last_update, const gchar *user_agent)
curl_easy_setopt(eh, CURLOPT_USERAGENT, user_agent);
curl_easy_setopt(eh, CURLOPT_NETRC, CURL_NETRC_OPTIONAL);
- /* Use HTTP's If-Modified-Since feature, if application provided
- * the timestamp of last update. */
- if( last_update != -1 ) {
- curl_easy_setopt(eh, CURLOPT_TIMECONDITION,
- CURL_TIMECOND_IFMODSINCE);
- curl_easy_setopt(eh, CURLOPT_TIMEVALUE, (long)last_update);
+ /* Send conditional requests using If-Modified-Since: or
+ * If-None-Match: if the previous value of Last-Modified: or ETag:
+ * is known, respectively. */
+ struct curl_slist *headers = NULL;
+ if (feed->etag) {
+ /* libcurl asks for a "<header>: <value>" string */
+ gchar *header = g_strdup_printf("If-None-Match: %s",
+ feed->etag);
+ headers = curl_slist_append(headers, header);
+ /* ...and copies it, so free the one we made */
+ g_free(header);
+ }
+ if (feed->last_modified) {
+ gchar *header = g_strdup_printf("If-Modified-Since: %s",
+ feed->last_modified);
+ struct curl_slist *headers_ = curl_slist_append(headers,
+ header);
+ g_free(header);
+ /* Avoid a leak by overwriting a non-NULL pointer with a NULL */
+ if (headers_) headers = headers_;
+ }
+ if (headers) {
+ curl_easy_setopt(eh, CURLOPT_HTTPHEADER, headers);
}
#if LIBCURL_VERSION_NUM >= 0x070a00
@@ -341,10 +362,23 @@ guint feed_update(Feed *feed, time_t last_update, const gchar *user_agent)
response_code = FEED_ERR_FETCH;
} else {
curl_easy_getinfo(eh, CURLINFO_RESPONSE_CODE, &response_code);
+ struct curl_header *header;
+ CURLHcode ret = curl_easy_header(eh, "ETag", 0,
+ CURLH_HEADER, -1,
+ &header);
+ feed_set_etag(feed, ret == CURLHE_OK ? header->value
+ : NULL);
+ ret = curl_easy_header(eh, "Last-Modified", 0,
+ CURLH_HEADER, -1,
+ &header);
+ feed_set_last_modified(feed,
+ ret == CURLHE_OK ? header->value
+ : NULL);
}
cleanup:
curl_easy_cleanup(eh);
+ curl_slist_free_all(headers);
/* Cleanup, we should be done. */
XML_ParserFree(feed_ctx->parser);
@@ -415,6 +449,42 @@ void feed_set_cookies_path(Feed *feed, gchar *path)
feed->cookies_path = (path != NULL ? g_strdup(path) : NULL);
}
+gchar *feed_get_last_modified(Feed *feed)
+{
+ g_return_val_if_fail(feed != NULL, NULL);
+ return feed->last_modified;
+}
+
+void feed_set_last_modified(Feed *feed, gchar *value)
+{
+ g_return_if_fail(feed != NULL);
+
+ if( feed->last_modified != NULL ) {
+ g_free(feed->last_modified);
+ feed->last_modified = NULL;
+ }
+
+ feed->last_modified = (value != NULL ? g_strdup(value) : NULL);
+}
+
+gchar *feed_get_etag(Feed *feed)
+{
+ g_return_val_if_fail(feed != NULL, NULL);
+ return feed->etag;
+}
+
+void feed_set_etag(Feed *feed, gchar *value)
+{
+ g_return_if_fail(feed != NULL);
+
+ if( feed->etag != NULL ) {
+ g_free(feed->etag);
+ feed->etag = NULL;
+ }
+
+ feed->etag = (value != NULL ? g_strdup(value) : NULL);
+}
+
gboolean feed_get_ssl_verify_peer(Feed *feed)
{
g_return_val_if_fail(feed != NULL, FALSE);
diff --git a/src/plugins/rssyl/libfeed/feed.h b/src/plugins/rssyl/libfeed/feed.h
index 46e95094a..2986ce1bd 100644
--- a/src/plugins/rssyl/libfeed/feed.h
+++ b/src/plugins/rssyl/libfeed/feed.h
@@ -59,6 +59,8 @@ struct _Feed {
gchar *cookies_path;
gboolean ssl_verify_peer;
gchar *cacert_file;
+ gchar *last_modified;
+ gchar *etag;
GSList *items;
};
@@ -129,7 +131,13 @@ gboolean feed_prepend_item(Feed *feed, FeedItem *item);
gboolean feed_append_item(Feed *feed, FeedItem *item);
gboolean feed_insert_item(Feed *feed, FeedItem *item, gint pos);
-guint feed_update(Feed *feed, time_t last_update, const gchar *user_agent);
+gchar *feed_get_etag(Feed *feed);
+void feed_set_etag(Feed *feed, gchar *etag);
+
+gchar *feed_get_last_modified(Feed *feed);
+void feed_set_last_modified(Feed *feed, gchar *last_modified);
+
+guint feed_update(Feed *feed, const gchar *user_agent);
#define FILL(n) do { g_free(n); n = g_strdup(text); } while(0);
diff --git a/src/plugins/rssyl/rssyl_update_feed.c b/src/plugins/rssyl/rssyl_update_feed.c
index 314bbabad..98799ab0a 100644
--- a/src/plugins/rssyl/rssyl_update_feed.c
+++ b/src/plugins/rssyl/rssyl_update_feed.c
@@ -95,7 +95,7 @@ static void *rssyl_fetch_feed_thr(void *arg)
gchar *user_agent = rssyl_get_user_agent(ctx->ritem);
/* Fetch and parse the feed. */
- ctx->response_code = feed_update(ctx->feed, -1, user_agent);
+ ctx->response_code = feed_update(ctx->feed, user_agent);
g_free(user_agent);
/* Signal main thread that we're done here. */
-----------------------------------------------------------------------
hooks/post-receive
--
Claws Mail
More information about the Commits
mailing list