exit(1);
}
-class RSSCloudNotifier {
-
+/**
+ * Class for notifying cloud-enabled RSS aggregators that StatusNet
+ * feeds have been updated.
+ *
+ * @category Plugin
+ * @package StatusNet
+ * @author Zach Copley <zach@status.net>
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link http://status.net/
+ **/
+class RSSCloudNotifier
+{
const MAX_FAILURES = 3;
+ /**
+ * Send an HTTP GET to the notification handler with a
+ * challenge string to see if it repsonds correctly.
+ *
+ * @param string $endpoint URL of the notification handler
+ * @param string $feed the feed being subscribed to
+ *
+ * @return boolean success
+ */
function challenge($endpoint, $feed)
{
$code = common_confirmation_code(128);
$url = $endpoint . '?' . http_build_query($params);
try {
- $client = new HTTPClient();
+ $client = new HTTPClient();
$response = $client->get($url);
} catch (HTTP_Request2_Exception $e) {
- common_log(LOG_INFO, 'RSSCloud plugin - failure testing notify handler ' .
+ common_log(LOG_INFO,
+ 'RSSCloud plugin - failure testing notify handler ' .
$endpoint . ' - ' . $e->getMessage());
return false;
}
// NOTE: the spec says that the body must contain the string
// challenge. It doesn't say that the body must contain the
// challenge string ONLY, although that seems to be the way
- // the other implementations have interpreted it.
+ // the other implementors have interpreted it.
if (strpos($body, $code) !== false) {
common_log(LOG_INFO, 'RSSCloud plugin - ' .
}
}
- function postUpdate($endpoint, $feed) {
+ /**
+ * HTTP POST a notification that a feed has been updated
+ * ('ping the cloud').
+ *
+ * @param String $endpoint URL of the notification handler
+ * @param String $feed the feed being subscribed to
+ *
+ * @return boolean success
+ */
+ function postUpdate($endpoint, $feed)
+ {
$headers = array();
$postdata = array('url' => $feed);
try {
- $client = new HTTPClient();
+ $client = new HTTPClient();
$response = $client->post($endpoint, $headers, $postdata);
} catch (HTTP_Request2_Exception $e) {
common_log(LOG_INFO, 'RSSCloud plugin - failure notifying ' .
}
}
+ /**
+ * Notify all subscribers to a profile feed that it has changed.
+ *
+ * @param Profile $profile the profile whose feed has been
+ * updated
+ *
+ * @return boolean success
+ */
function notify($profile)
{
$feed = common_path('api/statuses/user_timeline/') .
$profile->nickname . '.rss';
$cloudSub = new RSSCloudSubscription();
+
$cloudSub->subscribed = $profile->id;
if ($cloudSub->find()) {
return true;
}
+ /**
+ * Handle problems posting cloud notifications. Increment the failure
+ * count, or delete the subscription if the maximum number of failures
+ * is exceeded.
+ *
+ * XXX: Redo with proper DB_DataObject methods once I figure out what
+ * what the problem is with pluginized DB_DataObjects. -Z
+ *
+ * @param RSSCloudSubscription $cloudSub the subscription in question
+ *
+ * @return boolean success
+ */
function handleFailure($cloudSub)
{
$failCnt = $cloudSub->failures + 1;
if ($failCnt == self::MAX_FAILURES) {
common_log(LOG_INFO,
- 'Deleting RSSCloud subcription (max failure count reached), profile: ' .
+ 'Deleting RSSCloud subcription ' .
+ '(max failure count reached), profile: ' .
$cloudSub->subscribed .
' handler: ' .
$cloudSub->url);
} else {
- common_debug('Updating failure count on RSSCloud subscription. ' . $failCnt);
+ common_debug('Updating failure count on RSSCloud subscription. ' .
+ $failCnt);
$failCnt = $cloudSub->failures + 1;
' WHERE subscribed = ' . $cloudSub->subscribed .
' AND url = \'' . $cloudSub->url . '\'';
- common_debug($qry);
-
$result = $cloudSub->query($qry);
if (!$result) {
common_log_db_error($cloudsub, 'UPDATE', __FILE__);
- common_log(LOG_ERR, 'Could not update failure count on RSSCloud subscription');
+ common_log(LOG_ERR,
+ 'Could not update failure ' .
+ 'count on RSSCloud subscription');
}
- }
+ }
}
}