예제 #1
0
 function handle($data)
 {
     $topic = $data['topic'];
     $atom = $data['atom'];
     $pushCallbacks = $data['pushCallbacks'];
     assert(is_string($atom));
     assert(is_string($topic));
     assert(is_array($pushCallbacks));
     // Set up distribution for the first n subscribing sites...
     // If we encounter an uncatchable error, queue handling should
     // automatically re-run the batch, which could lead to some dupe
     // distributions.
     //
     // Worst case is if one of these hubprep entries dies too many
     // times and gets dropped; the rest of the batch won't get processed.
     try {
         $n = 0;
         while (count($pushCallbacks) && $n < self::ROLLING_BATCH) {
             $n++;
             $callback = array_shift($pushCallbacks);
             $sub = HubSub::staticGet($topic, $callback);
             if (!$sub) {
                 common_log(LOG_ERR, "Skipping PuSH delivery for deleted(?) consumer {$callback} on {$topic}");
                 continue;
             }
             $sub->distribute($atom);
         }
     } catch (Exception $e) {
         common_log(LOG_ERR, "Exception during PuSH batch out: " . $e->getMessage() . " prepping {$topic} to {$callback}");
     }
     // And re-queue the rest of the batch!
     if (count($pushCallbacks) > 0) {
         $sub = new HubSub();
         $sub->topic = $topic;
         $sub->bulkDistribute($atom, $pushCallbacks);
     }
     return true;
 }
예제 #2
0
파일: HubSub.php 프로젝트: Br3nda/StatusNet
 /**
  * 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');
 }
예제 #3
0
 /**
  * Get HubSub subscription record for a given feed & subscriber.
  *
  * @param string $feed
  * @param string $callback
  * @return mixed HubSub or false
  */
 protected function getSub($feed, $callback)
 {
     return HubSub::staticGet($feed, $callback);
 }
예제 #4
0
 /**
  * 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'));
     }
     // 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');
 }