/** * Schedule delivery of a 'fat ping' to the subscriber's callback * endpoint. If queues are disabled, this will run immediately. * * @param string $atom well-formed Atom feed * @param int $retries optional count of retries if POST fails; defaults to hub_retries from config or 0 if unset */ function distribute($atom, $retries = null) { if ($retries === null) { $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 // individual item from a multi-item query again. $sub = HubSub::staticGet($this->topic, $this->callback); $data = array('sub' => $sub, 'atom' => $atom, 'retries' => $retries); common_log(LOG_INFO, "Queuing PuSH: {$this->topic} to {$this->callback}"); $qm = QueueManager::get(); $qm->enqueue($data, 'hubout'); }