]> code.citadel.org Git - citadel.git/blobdiff - webcit/rss.c
* Discovered that Prototype makes it easy to auto-refresh, so I switched
[citadel.git] / webcit / rss.c
index 1c250a91321f6e0894920d8488b9f721ea6cbe5b..2cf83c94e6720c05f293cb1c9aa259c8c661c88a 100644 (file)
@@ -7,6 +7,29 @@
 #include "webcit.h"
 #include "webserver.h"
 
+
+time_t if_modified_since;
+
+
+void display_rss_control(const char *reply_to, const char *subject)
+{
+       wprintf("<div style=\"align: right;\"><p>\n");
+       wprintf("<a href=\"/display_enter?recp=");
+       urlescputs(reply_to);
+       wprintf("&subject=");
+       if (strncasecmp(subject, "Re: ", 3)) wprintf("Re:%20");
+       urlescputs(subject);
+       wprintf("\">[%s]</a> \n", _("Reply"));
+       wprintf("<a href=\"/display_enter?recp=");
+       urlescputs(reply_to);
+       wprintf("&force_room=_MAIL_&subject=");
+       if (strncasecmp(subject, "Re: ", 3)) wprintf("Re:%20");
+       urlescputs(subject);
+       wprintf("\">[%s]</a>\n", _("Email"));
+       wprintf("</p></div>\n");
+}
+
+
 void display_rss(const char *roomname)
 {
        int nummsgs;
@@ -33,37 +56,38 @@ void display_rss(const char *roomname)
        char content_type[256];
        char charset[256];
 
-       lprintf(3, "Running RSS reader\n");
        if (!WC->logged_in) {
-               authorization_required();
+               authorization_required(_("Not logged in"));
                return;
        }
 
-       lprintf(3, "Going to a room %s\n", roomname);
        if (gotoroom(roomname)) {
-               wprintf("HTTP/1.0 404 Not Found\r\n");
+               lprintf(3, "RSS: Can't goto requested room\n");
+               wprintf("HTTP/1.1 404 Not Found\r\n");
                wprintf("Content-Type: text/html\r\n");
                wprintf("\r\n");
-               wprintf("Error retrieving RSS feed: couldn't find room or messages\n");
+               wprintf("Error retrieving RSS feed: couldn't find room\n");
                return;
        }
 
-       lprintf(3, "Loading up all the messages\n");
-       nummsgs = load_msg_ptrs("MSGS LAST|50", 0);
+       nummsgs = load_msg_ptrs("MSGS LAST|15", 0);
        if (nummsgs == 0) {
-               wprintf("HTTP/1.0 404 Not Found\r\n");
+               lprintf(3, "RSS: No messages found\n");
+               wprintf("HTTP/1.1 404 Not Found\r\n");
                wprintf("Content-Type: text/html\r\n");
                wprintf("\r\n");
-               wprintf("Error retrieving RSS feed: couldn't find room or messages\n");
+               wprintf(_("Error retrieving RSS feed: couldn't find messages\n"));
                return;
        }
 
-       lprintf(3, "Getting date of the last one\n");
        /* Read time of last message immediately */
        serv_printf("MSG4 %ld", WC->msgarr[nummsgs - 1]);
        serv_getln(buf, sizeof buf);
        if (buf[0] == '1') {
                while (serv_getln(buf, sizeof buf), strcasecmp(buf, "000")) {
+                       if (!strncasecmp(buf, "msgn=", 5)) {
+                               strcpy(msgn, &buf[5]);
+                       }
                        if (!strncasecmp(buf, "time=", 5)) {
                                now = atol(&buf[5]);
                                gmtime_r(&now, &now_tm);
@@ -72,14 +96,38 @@ void display_rss(const char *roomname)
                }
        }
 
+       if (if_modified_since > 0 && if_modified_since > now) {
+               lprintf(3, "RSS: Feed not updated since the last time you looked\n");
+               wprintf("HTTP/1.1 304 Not Modified\r\n");
+               wprintf("Last-Modified: %s\r\n", date);
+               now = time(NULL);
+               gmtime_r(&now, &now_tm);
+               strftime(date, sizeof date, "%a, %d %b %Y %H:%M:%S GMT", &now_tm);
+               wprintf("Date: %s\r\n", date);
+/*             if (*msgn) wprintf("ETag: %s\r\n\r\n", msgn); */
+               wDumpContent(0);
+               return;
+       }
+
        /* Do RSS header */
-       output_headers(0, 0, 0, 0, 0, 0, 0);
+       lprintf(3, "RSS: Yum yum! This feed is tasty!\n");
+       wprintf("HTTP/1.1 200 OK\r\n");
+       wprintf("Last-Modified: %s\r\n", date);
+/*     if (*msgn) wprintf("ETag: %s\r\n\r\n", msgn); */
        wprintf("Content-Type: application/rss+xml\r\n");
+       wprintf("$erver: %s\r\n", SERVER);
+       wprintf("Connection: close\r\n");
        wprintf("\r\n");
+       if (!strcasecmp(request_method, "HEAD"))
+               return;
+
        wprintf("<?xml version=\"1.0\"?>\n");
        wprintf("<rss version=\"2.0\">\n");
        wprintf("   <channel>\n");
        wprintf("   <title>%s - %s</title>\n", WC->wc_roomname, serv_info.serv_humannode);
+       wprintf("   <link>%s://%s:%d/dotgoto?room=", (is_https ? "https" : "http"), WC->http_host, PORT_NUM);
+       escputs(roomname);
+       wprintf("</link>\n");
        wprintf("   <description>");
        /* Get room info for description */
        serv_puts("RINF");
@@ -89,12 +137,12 @@ void display_rss(const char *roomname)
                        serv_getln(buf, sizeof buf);
                        if (!strcmp(buf, "000"))
                                break;
-                       wprintf("%s", buf);
+                       wprintf("%s\n", buf);
                }
        }
        wprintf("</description>\n");
        if (now) {
-               wprintf("   <pubDate>%s</pubDate>\n", buf);
+               wprintf("   <pubDate>%s</pubDate>\n", date);
        }
        wprintf("   <generator>%s</generator>\n", SERVER);
        wprintf("   <docs>http://blogs.law.harvard.edu/tech/rss</docs>\n");
@@ -102,7 +150,6 @@ void display_rss(const char *roomname)
 
        /* Read all messages and output as RSS items */
        for (a = 0; a < nummsgs; ++a) {
-               lprintf(3, "Sending message %d of %d\n", a+1, nummsgs);
                /* Read message and output each as RSS item */
                serv_printf("MSG4 %ld", WC->msgarr[a]);
                serv_getln(buf, sizeof buf);
@@ -119,7 +166,6 @@ void display_rss(const char *roomname)
 
                while (serv_getln(buf, sizeof buf), strcasecmp(buf, "text")) {
                        if (!strcmp(buf, "000")) {
-                               lprintf(3, "ENDITEM 1\n");
                                goto ENDITEM;   /* screw it */
                        } else if (!strncasecmp(buf, "from=", 5)) {
                                strcpy(from, &buf[5]);
@@ -167,7 +213,6 @@ void display_rss(const char *roomname)
                strcpy(content_type, "text/plain");
                while (serv_getln(buf, sizeof buf), strlen(buf) > 0) {
                        if (!strcmp(buf, "000")) {
-                               lprintf(3, "ENDBODY 1\n");
                                goto ENDBODY;
                        }
                        if (!strncasecmp(buf, "Content-type: ", 14)) {
@@ -224,6 +269,7 @@ void display_rss(const char *roomname)
                                escputs(buf);
                                wprintf("\n");
                        }
+                       display_rss_control(from, subj);
                        wprintf("]]></description>\n");
                }
                /* Boring old 80-column fixed format text gets handled this way... */
@@ -263,6 +309,7 @@ void display_rss(const char *roomname)
                                escputs(buf);
                                wprintf("</tt><br />\n");
                        }
+                       display_rss_control(from, subj);
                        wprintf("]]></description>\n");
                }
                /* HTML is fun, but we've got to strip it first */
@@ -275,7 +322,6 @@ void display_rss(const char *roomname)
 ENDBODY:
                wprintf("   </item>\n");
 ENDITEM:
-               lprintf(3, "Finished message %d of %d\n", a+1, nummsgs);
                now = 0L;
        }