You are here

abstract class AbstractCallback in Zircon Profile 8

Same name and namespace in other branches
  1. 8.0 vendor/zendframework/zend-feed/src/PubSubHubbub/AbstractCallback.php \Zend\Feed\PubSubHubbub\AbstractCallback

Hierarchy

Expanded class hierarchy of AbstractCallback

File

vendor/zendframework/zend-feed/src/PubSubHubbub/AbstractCallback.php, line 16

Namespace

Zend\Feed\PubSubHubbub
View source
abstract class AbstractCallback implements CallbackInterface {

  /**
   * An instance of Zend\Feed\Pubsubhubbub\Model\SubscriptionPersistenceInterface
   * used to background save any verification tokens associated with a subscription
   * or other.
   *
   * @var Model\SubscriptionPersistenceInterface
   */
  protected $storage = null;

  /**
   * An instance of a class handling Http Responses. This is implemented in
   * Zend\Feed\Pubsubhubbub\HttpResponse which shares an unenforced interface with
   * (i.e. not inherited from) Zend\Controller\Response\Http.
   *
   * @var HttpResponse|PhpResponse
   */
  protected $httpResponse = null;

  /**
   * The number of Subscribers for which any updates are on behalf of.
   *
   * @var int
   */
  protected $subscriberCount = 1;

  /**
   * Constructor; accepts an array or Traversable object to preset
   * options for the Subscriber without calling all supported setter
   * methods in turn.
   *
   * @param  array|Traversable $options Options array or Traversable object
   */
  public function __construct($options = null) {
    if ($options !== null) {
      $this
        ->setOptions($options);
    }
  }

  /**
   * Process any injected configuration options
   *
   * @param  array|Traversable $options Options array or Traversable object
   * @return AbstractCallback
   * @throws Exception\InvalidArgumentException
   */
  public function setOptions($options) {
    if ($options instanceof Traversable) {
      $options = ArrayUtils::iteratorToArray($options);
    }
    if (!is_array($options)) {
      throw new Exception\InvalidArgumentException('Array or Traversable object' . 'expected, got ' . gettype($options));
    }
    if (is_array($options)) {
      $this
        ->setOptions($options);
    }
    if (array_key_exists('storage', $options)) {
      $this
        ->setStorage($options['storage']);
    }
    return $this;
  }

  /**
   * Send the response, including all headers.
   * If you wish to handle this via Zend\Http, use the getter methods
   * to retrieve any data needed to be set on your HTTP Response object, or
   * simply give this object the HTTP Response instance to work with for you!
   *
   * @return void
   */
  public function sendResponse() {
    $this
      ->getHttpResponse()
      ->send();
  }

  /**
   * Sets an instance of Zend\Feed\Pubsubhubbub\Model\SubscriptionPersistence used
   * to background save any verification tokens associated with a subscription
   * or other.
   *
   * @param  Model\SubscriptionPersistenceInterface $storage
   * @return AbstractCallback
   */
  public function setStorage(Model\SubscriptionPersistenceInterface $storage) {
    $this->storage = $storage;
    return $this;
  }

  /**
   * Gets an instance of Zend\Feed\Pubsubhubbub\Model\SubscriptionPersistence used
   * to background save any verification tokens associated with a subscription
   * or other.
   *
   * @return Model\SubscriptionPersistenceInterface
   * @throws Exception\RuntimeException
   */
  public function getStorage() {
    if ($this->storage === null) {
      throw new Exception\RuntimeException('No storage object has been' . ' set that subclasses Zend\\Feed\\Pubsubhubbub\\Model\\SubscriptionPersistence');
    }
    return $this->storage;
  }

  /**
   * An instance of a class handling Http Responses. This is implemented in
   * Zend\Feed\Pubsubhubbub\HttpResponse which shares an unenforced interface with
   * (i.e. not inherited from) Zend\Controller\Response\Http.
   *
   * @param  HttpResponse|PhpResponse $httpResponse
   * @return AbstractCallback
   * @throws Exception\InvalidArgumentException
   */
  public function setHttpResponse($httpResponse) {
    if (!$httpResponse instanceof HttpResponse && !$httpResponse instanceof PhpResponse) {
      throw new Exception\InvalidArgumentException('HTTP Response object must' . ' implement one of Zend\\Feed\\Pubsubhubbub\\HttpResponse or' . ' Zend\\Http\\PhpEnvironment\\Response');
    }
    $this->httpResponse = $httpResponse;
    return $this;
  }

  /**
   * An instance of a class handling Http Responses. This is implemented in
   * Zend\Feed\Pubsubhubbub\HttpResponse which shares an unenforced interface with
   * (i.e. not inherited from) Zend\Controller\Response\Http.
   *
   * @return HttpResponse|PhpResponse
   */
  public function getHttpResponse() {
    if ($this->httpResponse === null) {
      $this->httpResponse = new HttpResponse();
    }
    return $this->httpResponse;
  }

  /**
   * Sets the number of Subscribers for which any updates are on behalf of.
   * In other words, is this class serving one or more subscribers? How many?
   * Defaults to 1 if left unchanged.
   *
   * @param  string|int $count
   * @return AbstractCallback
   * @throws Exception\InvalidArgumentException
   */
  public function setSubscriberCount($count) {
    $count = intval($count);
    if ($count <= 0) {
      throw new Exception\InvalidArgumentException('Subscriber count must be' . ' greater than zero');
    }
    $this->subscriberCount = $count;
    return $this;
  }

  /**
   * Gets the number of Subscribers for which any updates are on behalf of.
   * In other words, is this class serving one or more subscribers? How many?
   *
   * @return int
   */
  public function getSubscriberCount() {
    return $this->subscriberCount;
  }

  /**
   * Attempt to detect the callback URL (specifically the path forward)
   * @return string
   */
  protected function _detectCallbackUrl() {
    $callbackUrl = '';
    if (isset($_SERVER['HTTP_X_ORIGINAL_URL'])) {
      $callbackUrl = $_SERVER['HTTP_X_ORIGINAL_URL'];
    }
    elseif (isset($_SERVER['HTTP_X_REWRITE_URL'])) {
      $callbackUrl = $_SERVER['HTTP_X_REWRITE_URL'];
    }
    elseif (isset($_SERVER['REQUEST_URI'])) {
      $callbackUrl = $_SERVER['REQUEST_URI'];
      $scheme = 'http';
      if ($_SERVER['HTTPS'] == 'on') {
        $scheme = 'https';
      }
      $schemeAndHttpHost = $scheme . '://' . $this
        ->_getHttpHost();
      if (strpos($callbackUrl, $schemeAndHttpHost) === 0) {
        $callbackUrl = substr($callbackUrl, strlen($schemeAndHttpHost));
      }
    }
    elseif (isset($_SERVER['ORIG_PATH_INFO'])) {
      $callbackUrl = $_SERVER['ORIG_PATH_INFO'];
      if (!empty($_SERVER['QUERY_STRING'])) {
        $callbackUrl .= '?' . $_SERVER['QUERY_STRING'];
      }
    }
    return $callbackUrl;
  }

  /**
   * Get the HTTP host
   *
   * @return string
   */
  protected function _getHttpHost() {
    if (!empty($_SERVER['HTTP_HOST'])) {
      return $_SERVER['HTTP_HOST'];
    }
    $scheme = 'http';
    if ($_SERVER['HTTPS'] == 'on') {
      $scheme = 'https';
    }
    $name = $_SERVER['SERVER_NAME'];
    $port = $_SERVER['SERVER_PORT'];
    if ($scheme == 'http' && $port == 80 || $scheme == 'https' && $port == 443) {
      return $name;
    }
    return $name . ':' . $port;
  }

  /**
   * Retrieve a Header value from either $_SERVER or Apache
   *
   * @param string $header
   * @return bool|string
   */
  protected function _getHeader($header) {
    $temp = strtoupper(str_replace('-', '_', $header));
    if (!empty($_SERVER[$temp])) {
      return $_SERVER[$temp];
    }
    $temp = 'HTTP_' . strtoupper(str_replace('-', '_', $header));
    if (!empty($_SERVER[$temp])) {
      return $_SERVER[$temp];
    }
    if (function_exists('apache_request_headers')) {
      $headers = apache_request_headers();
      if (!empty($headers[$header])) {
        return $headers[$header];
      }
    }
    return false;
  }

  /**
   * Return the raw body of the request
   *
   * @return string|false Raw body, or false if not present
   */
  protected function _getRawBody() {
    $body = file_get_contents('php://input');
    if (strlen(trim($body)) == 0 && isset($GLOBALS['HTTP_RAW_POST_DATA'])) {
      $body = $GLOBALS['HTTP_RAW_POST_DATA'];
    }
    if (strlen(trim($body)) > 0) {
      return $body;
    }
    return false;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
AbstractCallback::$httpResponse protected property An instance of a class handling Http Responses. This is implemented in Zend\Feed\Pubsubhubbub\HttpResponse which shares an unenforced interface with (i.e. not inherited from) Zend\Controller\Response\Http.
AbstractCallback::$storage protected property An instance of Zend\Feed\Pubsubhubbub\Model\SubscriptionPersistenceInterface used to background save any verification tokens associated with a subscription or other.
AbstractCallback::$subscriberCount protected property The number of Subscribers for which any updates are on behalf of.
AbstractCallback::getHttpResponse public function An instance of a class handling Http Responses. This is implemented in Zend\Feed\Pubsubhubbub\HttpResponse which shares an unenforced interface with (i.e. not inherited from) Zend\Controller\Response\Http. Overrides CallbackInterface::getHttpResponse
AbstractCallback::getStorage public function Gets an instance of Zend\Feed\Pubsubhubbub\Model\SubscriptionPersistence used to background save any verification tokens associated with a subscription or other.
AbstractCallback::getSubscriberCount public function Gets the number of Subscribers for which any updates are on behalf of. In other words, is this class serving one or more subscribers? How many?
AbstractCallback::sendResponse public function Send the response, including all headers. If you wish to handle this via Zend\Http, use the getter methods to retrieve any data needed to be set on your HTTP Response object, or simply give this object the HTTP Response instance to work with for you! Overrides CallbackInterface::sendResponse
AbstractCallback::setHttpResponse public function An instance of a class handling Http Responses. This is implemented in Zend\Feed\Pubsubhubbub\HttpResponse which shares an unenforced interface with (i.e. not inherited from) Zend\Controller\Response\Http. Overrides CallbackInterface::setHttpResponse
AbstractCallback::setOptions public function Process any injected configuration options
AbstractCallback::setStorage public function Sets an instance of Zend\Feed\Pubsubhubbub\Model\SubscriptionPersistence used to background save any verification tokens associated with a subscription or other.
AbstractCallback::setSubscriberCount public function Sets the number of Subscribers for which any updates are on behalf of. In other words, is this class serving one or more subscribers? How many? Defaults to 1 if left unchanged.
AbstractCallback::_detectCallbackUrl protected function Attempt to detect the callback URL (specifically the path forward)
AbstractCallback::_getHeader protected function Retrieve a Header value from either $_SERVER or Apache
AbstractCallback::_getHttpHost protected function Get the HTTP host
AbstractCallback::_getRawBody protected function Return the raw body of the request
AbstractCallback::__construct public function Constructor; accepts an array or Traversable object to preset options for the Subscriber without calling all supported setter methods in turn.
CallbackInterface::handle public function Handle any callback from a Hub Server responding to a subscription or unsubscription request. This should be the Hub Server confirming the the request prior to taking action on it.