Option to divert PuSH items directly to the target site's queue when local

This commit is contained in:
Brion Vibber
2010-06-03 17:49:20 -07:00
parent a75095fa1a
commit 8b9436e8ae
3 changed files with 56 additions and 13 deletions

View File

@@ -260,6 +260,37 @@ class HubSub extends Memcached_DataObject
$retries = intval(common_config('ostatus', 'hub_retries'));
}
if (common_config('ostatus', 'local_push_bypass')) {
// If target is a local site, bypass the web server and drop the
// item directly into the target's input queue.
$url = parse_url($this->callback);
$wildcard = common_config('ostatus', 'local_wildcard');
$site = Status_network::getFromHostname($url['host'], $wildcard);
if ($site) {
if ($this->secret) {
$hmac = 'sha1=' . hash_hmac('sha1', $atom, $this->secret);
} else {
$hmac = '';
}
// Hack: at the moment we stick the subscription ID in the callback
// URL so we don't have to look inside the Atom to route the subscription.
// For now this means we need to extract that from the target URL
// so we can include it in the data.
$parts = explode('/', $url['path']);
$subId = intval(array_pop($parts));
$data = array('feedsub_id' => $subId,
'post' => $atom,
'hmac' => $hmac);
common_log(LOG_DEBUG, "Cross-site PuSH bypass enqueueing straight to $site->nickname feed $subId");
$qm = QueueManager::get();
$qm->enqueue($data, 'pushin', $site->nickname);
return;
}
}
// We dare not clone() as when the clone is discarded it'll
// destroy the result data for the parent query.
// @fixme use clone() again when it's safe to copy an