Option to divert PuSH items directly to the target site's queue when local
This commit is contained in:
parent
a75095fa1a
commit
8b9436e8ae
|
@ -149,21 +149,15 @@ class Status_network extends Safe_DataObject
|
|||
$this->decache(); # while we still have the values!
|
||||
return parent::delete();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param string $servername hostname
|
||||
* @param string $pathname URL base path
|
||||
* @param string $wildcard hostname suffix to match wildcard config
|
||||
* @return mixed Status_network or null
|
||||
*/
|
||||
static function setupSite($servername, $pathname, $wildcard)
|
||||
static function getFromHostname($servername, $wildcard)
|
||||
{
|
||||
global $config;
|
||||
|
||||
$sn = null;
|
||||
|
||||
// XXX I18N, probably not crucial for hostnames
|
||||
// XXX This probably needs a tune up
|
||||
|
||||
if (0 == strncasecmp(strrev($wildcard), strrev($servername), strlen($wildcard))) {
|
||||
// special case for exact match
|
||||
if (0 == strcasecmp($servername, $wildcard)) {
|
||||
|
@ -182,6 +176,23 @@ class Status_network extends Safe_DataObject
|
|||
}
|
||||
}
|
||||
}
|
||||
return $sn;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $servername hostname
|
||||
* @param string $pathname URL base path
|
||||
* @param string $wildcard hostname suffix to match wildcard config
|
||||
*/
|
||||
static function setupSite($servername, $pathname, $wildcard)
|
||||
{
|
||||
global $config;
|
||||
|
||||
$sn = null;
|
||||
|
||||
// XXX I18N, probably not crucial for hostnames
|
||||
// XXX This probably needs a tune up
|
||||
$sn = self::getFromHostname($servername, $wildcard);
|
||||
|
||||
if (!empty($sn)) {
|
||||
|
||||
|
|
|
@ -115,11 +115,12 @@ class StompQueueManager extends QueueManager
|
|||
*
|
||||
* @param mixed $object
|
||||
* @param string $queue
|
||||
* @param string $siteNickname optional override to drop into another site's queue
|
||||
*
|
||||
* @return boolean true on success
|
||||
* @throws StompException on connection or send error
|
||||
*/
|
||||
public function enqueue($object, $queue)
|
||||
public function enqueue($object, $queue, $siteNickname=null)
|
||||
{
|
||||
$this->_connect();
|
||||
if (common_config('queue', 'stomp_enqueue_on')) {
|
||||
|
@ -134,7 +135,7 @@ class StompQueueManager extends QueueManager
|
|||
} else {
|
||||
$idx = $this->defaultIdx;
|
||||
}
|
||||
return $this->_doEnqueue($object, $queue, $idx);
|
||||
return $this->_doEnqueue($object, $queue, $idx, $siteNickname);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -144,10 +145,10 @@ class StompQueueManager extends QueueManager
|
|||
* @return boolean true on success
|
||||
* @throws StompException on connection or send error
|
||||
*/
|
||||
protected function _doEnqueue($object, $queue, $idx)
|
||||
protected function _doEnqueue($object, $queue, $idx, $siteNickname=null)
|
||||
{
|
||||
$rep = $this->logrep($object);
|
||||
$envelope = array('site' => common_config('site', 'nickname'),
|
||||
$envelope = array('site' => $siteNickname ? $siteNickname : common_config('site', 'nickname'),
|
||||
'handler' => $queue,
|
||||
'payload' => $this->encode($object));
|
||||
$msg = serialize($envelope);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue
Block a user