From 35a9b49ed06c58b53f81cf5ef476191807157925 Mon Sep 17 00:00:00 2001 From: Mike Macgirvin Date: Fri, 15 Oct 2010 04:20:42 -0700 Subject: [PATCH] allow for multiple pubsub hubs so everything can still work when/if one goes flaky (Google's hub has been particularly unreliable recently and the symptoms are that you just stop receiving updates, and/or updates you send are silently dropped and never delivered). Also add more instrumentation to help debug pubsub issues. --- include/items.php | 33 ++++++++++++++++++++++++--------- include/notifier.php | 33 +++++++++++++++++++++++++++------ include/poller.php | 12 ++++++++++-- mod/pubsub.php | 8 ++++++-- 4 files changed, 67 insertions(+), 19 deletions(-) diff --git a/include/items.php b/include/items.php index 7958c78c36..7647eed5cb 100644 --- a/include/items.php +++ b/include/items.php @@ -125,7 +125,18 @@ function get_feed_for(&$a, $dfrn_id, $owner_id, $last_update, $direction = 0) { $hub = get_config('system','huburl'); - $hubxml = ((strlen($hub)) ? '' . "\n" : ''); + $hubxml = ''; + if(strlen($hub)) { + $hubs = explode(',', $hub); + if(count($hubs)) { + foreach($hubs as $h) { + $h = trim($h); + if(! strlen($h)) + continue; + $hubxml .= '' . "\n" ; + } + } + } $salmon = '' . "\n" ; $salmon = ''; // remove this line when salmon handler is finished @@ -599,10 +610,10 @@ function consume_feed($xml,$importer,$contact, &$hub) { $photo_url = ''; - $foundhub = $feed->get_link(0,'hub'); + $hubs = $feed->get_links('hub'); - if(strlen($foundhub)) - $hub = $foundhub; + if(count($hubs)) + $hub = implode(',', $hubs); $rawtags = $feed->get_feed_tags( SIMPLEPIE_NAMESPACE_ATOM_10, 'author'); if($rawtags) { @@ -834,14 +845,18 @@ function subscribe_to_hub($url,$importer,$contact) { $push_url = get_config('system','url') . '/pubsub/' . $r[0]['nickname'] . '/' . $contact['id']; - $verify_token = random_string(); + // Use a single verify token, even if multiple hubs + + $verify_token = ((strlen($contact['hub-verify'])) ? $contact['hub-verify'] : random_string()); $params= 'hub.mode=subscribe&hub.callback=' . urlencode($push_url) . '&hub.topic=' . urlencode($contact['poll']) . '&hub.verify=async&hub.verify_token=' . $verify_token; - $r = q("UPDATE `contact` SET `hub-verify` = '%s' WHERE `id` = %d LIMIT 1", - dbesc($verify_token), - intval($contact['id']) - ); + if(! strlen($contact['hub-verify'])) { + $r = q("UPDATE `contact` SET `hub-verify` = '%s' WHERE `id` = %d LIMIT 1", + dbesc($verify_token), + intval($contact['id']) + ); + } post_url($url,$params); return; diff --git a/include/notifier.php b/include/notifier.php index 9866c02325..bef46677c4 100644 --- a/include/notifier.php +++ b/include/notifier.php @@ -149,8 +149,18 @@ $atom = ''; - $hubxml = ((strlen($hub)) ? '' . "\n" : ''); - + $hubxml = ''; + if(strlen($hub)) { + $hubs = explode(',', $hub); + if(count($hubs)) { + foreach($hubs as $h) { + $h = trim($h); + if(! strlen($h)) + continue; + $hubxml .= '' . "\n" ; + } + } + } $atom .= replace_macros($feed_template, array( '$feed_id' => xmlify($a->get_baseurl() . '/profile/' . $owner['nickname'] ), @@ -314,10 +324,21 @@ } if((strlen($hub)) && ($notify_hub)) { - $params = 'hub.mode=publish&hub.url=' . urlencode($a->get_baseurl() . '/dfrn_poll/' . $owner['nickname'] ); - post_url($hub,$params); - if($debugging) { - file_put_contents('pubsub.out', "\n\n" . "Pinged hub at " . datetime_convert() . "\n" . "Hub returned " . $a->get_curl_code() . "\n\n" , FILE_APPEND); + $hubs = explode(',', $hub); + if(count($hubs)) { + foreach($hubs as $h) { + $h = trim($h); + if(! strlen($h)) + continue; + $params = 'hub.mode=publish&hub.url=' . urlencode($a->get_baseurl() . '/dfrn_poll/' . $owner['nickname'] ); + post_url($h,$params); + if($debugging) { + file_put_contents('pubsub.out', "\n\n" . "Pinged hub " . $h . ' at ' + . datetime_convert() . "\n" . "Hub returned " . $a->get_curl_code() . "\n\n" , FILE_APPEND); + } + if(count($hubs) > 1) + sleep(7); // try and avoid multiple hubs responding at precisely the same time + } } } diff --git a/include/poller.php b/include/poller.php index bf2803b637..bb82e5eda7 100644 --- a/include/poller.php +++ b/include/poller.php @@ -22,7 +22,7 @@ $a->set_baseurl(get_config('system','url')); $contacts = q("SELECT * FROM `contact` - WHERE ( `dfrn-id` != '' OR (`issued-id` != '' AND `duplex` = 1)) + WHERE `network` = 'dfrn' AND ( `dfrn-id` != '' OR (`issued-id` != '' AND `duplex` = 1)) AND `self` = 0 AND `blocked` = 0 AND `readonly` = 0 ORDER BY RAND()"); if(! count($contacts)) @@ -174,7 +174,15 @@ if((strlen($hub)) && ($contact['rel'] == REL_BUD) && ($contact['priority'] == 0)) { - subscribe_to_hub($hub,$importer,$contact); + $hubs = explode(',', $hub); + if(count($hubs)) { + foreach($hubs as $h) { + $h = trim($h); + if(! strlen($h)) + continue; + subscribe_to_hub($h,$importer,$contact); + } + } } diff --git a/mod/pubsub.php b/mod/pubsub.php index 7dea2afb13..693fcbf81c 100644 --- a/mod/pubsub.php +++ b/mod/pubsub.php @@ -39,7 +39,10 @@ function pubsub_init(&$a) { $hub_lease = notags(trim($_GET['hub_lease_seconds'])); $hub_verify = notags(trim($_GET['hub_verify_token'])); - + $debugging = get_config('system','debugging'); + if($debugging) { + file_put_contents('pubsub.out', 'Pubsubhubbub subscription called from ' . $_SERVER['REMOTE_ADDR'] . ' at ' . datetime_convert() . "\n" . print_r($_GET,true), FILE_APPEND); + } $subscribe = (($hub_mode === 'subscribe') ? 1 : 0); @@ -86,8 +89,9 @@ function pubsub_post(&$a) { $xml = file_get_contents('php://input'); $debugging = get_config('system','debugging'); + $remote_host = 'Pubsub feed arrived from ' . $_SERVER['REMOTE_ADDR'] . ' at ' . datetime_convert() . "\n\n"; if($debugging) - file_put_contents('pubsub.out',$xml,FILE_APPEND); + file_put_contents('pubsub.out', $remote_host . $xml, FILE_APPEND); $nick = (($a->argc > 1) ? notags(trim($a->argv[1])) : ''); $contact_id = (($a->argc > 2) ? intval($a->argv[2]) : 0);