RSSyl: Convert relative URLs in Atom entries to absolute URLs, using feed's <link...
authorAndrej Kacian <ticho@claws-mail.org>
Sun, 23 Nov 2014 21:20:37 +0000 (22:20 +0100)
committerAndrej Kacian <ticho@claws-mail.org>
Sun, 23 Nov 2014 21:20:37 +0000 (22:20 +0100)
src/plugins/rssyl/libfeed/feed.c
src/plugins/rssyl/libfeed/feed.h
src/plugins/rssyl/libfeed/parser_atom10.c

index cc8c49f86af0b652202df1c0d2dc92164d178ae3..ca048eb4d9bdf5247343c8869d0179139d409ff2 100644 (file)
@@ -45,6 +45,7 @@ Feed *feed_new(gchar *url)
        feed->language = NULL;
        feed->author = NULL;
        feed->generator = NULL;
+       feed->link = NULL;
        feed->items = NULL;
 
        feed->fetcherr = NULL;
@@ -69,6 +70,7 @@ void feed_free(Feed *feed)
        g_free(feed->language);
        g_free(feed->author);
        g_free(feed->generator);
+       g_free(feed->link);
        g_free(feed->fetcherr);
        g_free(feed->cookies_path);
 
index 15ce4567d2c28523939cd4e933d38d4b38e224f8..af9fc3b696e046d5058fcf6e4ba01ef487646471 100644 (file)
@@ -38,6 +38,7 @@ struct _Feed {
        gchar *language;
        gchar *author;
        gchar *generator;
+       gchar *link;
        time_t date;
 
        guint timeout;
@@ -88,6 +89,7 @@ gchar *feed_get_description(Feed *feed);
 gchar *feed_get_language(Feed *feed);
 gchar *feed_get_author(Feed *feed);
 gchar *feed_get_generator(Feed *feed);
+gchar *feed_get_link(Feed *feed);
 gchar *feed_get_fetcherror(Feed *feed);
 
 gchar *feed_get_cookies_path(Feed *feed);
index e758425e189b061bf1eaca8f4ba774a727cd6e11..9215e913cdff5cd4696b21e3c77b800b605f9d97 100644 (file)
@@ -47,6 +47,10 @@ void feed_parser_atom10_start(void *data, const gchar *el, const gchar **attr)
                        /* Start of author info for the feed found.
                         * Set correct location. */
                        ctx->location = FEED_LOC_ATOM10_AUTHOR;
+               } else if( !strcmp(el, "link") ) {
+                       /* Link tag for the feed */
+                       g_free(ctx->feed->link);
+                       ctx->feed->link = g_strdup(feed_parser_get_attribute_value(attr, "href"));
                } else ctx->location = FEED_LOC_ATOM10_NONE;
 
        } else if( ctx->depth == 2 ) {
@@ -97,7 +101,7 @@ void feed_parser_atom10_end(void *data, const gchar *el)
 {
        FeedParserCtx *ctx = (FeedParserCtx *)data;
        Feed *feed = ctx->feed;
-       gchar *text = NULL;
+       gchar *text = NULL, *tmp;
 
        if( ctx->str != NULL )
                text = ctx->str->str;
@@ -126,6 +130,16 @@ void feed_parser_atom10_end(void *data, const gchar *el)
                         * add a complete item to feed */
                        if( !strcmp(el, "entry") ) {
 
+                               /* Fix up URL, if it is relative */
+                               if (!strstr("://", ctx->curitem->url) &&
+                                               ctx->feed->link != NULL) {
+                                       tmp = g_strconcat(ctx->feed->link,
+                                                       (ctx->curitem->url[0] == '/' ? "" : "/"),
+                                                       ctx->curitem->url, NULL);
+                                       feed_item_set_url(ctx->curitem, tmp);
+                                       g_free(tmp);
+                               }
+
                                /* append the complete feed item */
                                if( ctx->curitem->id && ctx->curitem->title
                                                && ctx->curitem->date_modified ) {