Monday, April 04, 2011 at 1:06 AM.
rssCloudSuite.notifyOne
on notifyOne (adrsubscription, flLog=true) {
<<Changes
<<3/16/11; 12:00:38 AM by DW
<<Don't try to log the subscription if it's undefined.
<<10/2/09; 10:39:28 AM by DW
<<Improve log message.
<<9/13/09; 9:59:47 AM by DW
<<If HTTP returned code from POST is 400 or greater, return an error.
<<7/21/09; 12:17:55 PM by DW
<<Setting the timeout has no effect when its not possible to open a connection on the server because tcp.openStream doesn't take a timeout parameter. It's always 20 seconds, near as I can tell. Once I get into the C source again I'll have to check this out.
<<7/19/09; 11:20:01 AM by DW
<<Optional param, flLog, defaults true. If we're just testing the connection we don't want to log the notification.
<<7/19/09; 8:53:56 AM by DW
<<Created. Factored out of notifySubscribers.
local (adrdata = rssCloudSuite.init (), startticks = clock.ticks (), flerror = false);
local (server = nameof (adrsubscription^), feedurl = nameof (parentof (adrsubscription^)^));
rssCloudSuite.initSubscription (adrsubscription);
local (adrsubscriber = @adrdata^.subscribers.[server]);
system.temp.rssCloud.ctNotifyThreads++;
try {
if server beginswith "http://" { //special case for http-post
local (params, code);
new (tabletype, @params);
params.url = feedurl;
tcp.httppost (server, @params, adrcode:code);
if number (code) >= 400 { //9/13/09 by DW
scripterror ("HTTP error code " + code + ".")}}
else {
if server beginswith "xmlrpc://" { //we need to set the timeout so we have to go low-level
local (urllist = string.urlSplit (server), domain = urllist [2], port = 80, params = {feedurl});
if domain contains ":" {
port = string.nthField (domain, ':', string.countFields (domain, ':'));
domain = string.popSuffix (domain, ':')};
betty.rpc.client (domain, port, adrsubscriber^.notifyProcedure, @params, rpcPath:urllist [3], fldebug:false, flShowMessages:false, ticksToTimeOut:adrdata^.prefs.notifyTimeoutTicks)}
else {
[server].[adrsubscriber^.notifyProcedure] (feedurl)}};
adrsubscription^.whenLastUpdate = clock.now ();
adrsubscription^.ctUpdates++;
adrsubscription^.ctConsecutiveErrors = 0}
<<bundle //log the event
<<local (urllist = string.urlsplit (server))
<<local (servername = string.nthfield (urllist [2], ":", 1)) //pop the port off the name of the server
<<local (protocolname = urllist [1] - "://")
<<local (s = "Subscriber <a href=\"" + server + "\">" + servername + "</a> was notified that the <a href=\"" + feedurl + "\"> feed</a> has changed via <i>" + protocolname + "</i> protocol.")
<<log2.add (rssCloudInfo.name, "Notify", s, startticks)
else {
flerror = true;
adrsubscriber^.lastError = tryerror;
<<log2.add (rssCloudInfo.name, "Notify", "Error: " + tryerror, startticks)
if defined (adrsubscription^) { //3/16/11 by DW
adrsubscription^.ctErrors++;
adrsubscription^.ctConsecutiveErrors++;
adrsubscription^.whenLastError = clock.now ()}};
system.temp.rssCloud.ctNotifyThreads--;
bundle { //log the event
if flLog {
local (urllist = string.urlsplit (server), feedlink);
local (servername = string.nthfield (urllist [2], ":", 1)); //pop the port off the name of the server
local (protocolname = urllist [1] - "://");
bundle { //set feedlink
local (feedinfo);
rssCloudSuite.getFeedInfo (feedurl, @feedinfo);
if defined (feedinfo.title) {
feedlink = "<a href=\"" + feedurl + "\">" + feedinfo.title + "</a>"}
else {
feedlink = "the <a href=\"" + feedurl + "\">feed</a>"}};
local (s = "Subscriber <a href=\"" + server + "\">" + servername + "</a> was notified that " + feedlink + " has changed via <i>" + protocolname + "</i> protocol.");
if flerror {
s = s + "<br /><br />Error: " + adrsubscriber^.lastError};
log2.add (rssCloudInfo.name, "Notify", s, startticks)}};
return (not flerror)};
bundle { //test code
notifyOne (@config.rssCloud.subscriptions.["http://www.scripting.com/rss.xml"].["xmlrpc://75.37.83.20:5337/RPC2"])}
This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.