Esempio n. 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;
 }
Esempio n. 2
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::getByHashkey($feed, $callback);
 }
Esempio n. 3
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'));
     }
     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');
 }
 /**
  * Make sure necessary tables are filled out.
  */
 function onCheckSchema()
 {
     $schema = Schema::get();
     $schema->ensureTable('ostatus_profile', Ostatus_profile::schemaDef());
     $schema->ensureTable('ostatus_source', Ostatus_source::schemaDef());
     $schema->ensureTable('feedsub', FeedSub::schemaDef());
     $schema->ensureTable('hubsub', HubSub::schemaDef());
     $schema->ensureTable('magicsig', Magicsig::schemaDef());
     return true;
 }
 /**
  * Queue up direct feed update pushes to subscribers on our internal hub.
  * @param string $atom update feed, containing only new/changed items
  * @param HubSub $sub open query of subscribers
  */
 function pushFeedInternal($atom, $sub)
 {
     common_log(LOG_INFO, "Preparing {$sub->N} PuSH distribution(s) for {$sub->topic}");
     while ($sub->fetch()) {
         $sub->distribute($atom);
     }
 }
Esempio n. 6
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);
 }
 /**
  * Queue up direct feed update pushes to subscribers on our internal hub.
  * If there are a large number of subscriber sites, intermediate bulk
  * distribution triggers may be queued.
  *
  * @param string $atom update feed, containing only new/changed items
  * @param HubSub $sub open query of subscribers
  */
 function pushFeedInternal($atom, $sub)
 {
     common_log(LOG_INFO, "Preparing {$sub->N} PuSH distribution(s) for {$sub->topic}");
     $n = 0;
     $batch = array();
     while ($sub->fetch()) {
         $n++;
         if ($n < self::MAX_UNBATCHED) {
             $sub->distribute($atom);
         } else {
             $batch[] = $sub->callback;
             if (count($batch) >= self::BATCH_SIZE) {
                 $sub->bulkDistribute($atom, $batch);
                 $batch = array();
             }
         }
     }
     if (count($batch) >= 0) {
         $sub->bulkDistribute($atom, $batch);
     }
 }
 /**
  * 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');
 }