diff --git a/include/rssfuncs.php b/include/rssfuncs.php index 6c342971f..fbb26ef90 100644 --- a/include/rssfuncs.php +++ b/include/rssfuncs.php @@ -595,7 +595,7 @@ if ($feed_hub_url && $feed_self_url && function_exists('curl_init') && !ini_get("open_basedir")) { - require_once 'lib/pubsubhubbub/subscriber.php'; + require_once 'lib/pubsubhubbub/Subscriber.php'; $callback_url = get_self_url_prefix() . "/public.php?op=pubsub&id=$feed"; diff --git a/lib/pubsubhubbub/Subscriber.php b/lib/pubsubhubbub/Subscriber.php new file mode 100644 index 000000000..5b980a111 --- /dev/null +++ b/lib/pubsubhubbub/Subscriber.php @@ -0,0 +1,210 @@ +hub_url = $hub_url; + $this->callback_url = $callback_url; + $this->credentials = $credentials; + } + + /** + * $use_regexp lets you choose whether to use google AJAX feed api (faster, but cached) or a regexp to read from site. + * + * @param string $url + * @param callable $http_function + * + * @return string + */ + public function find_feed($url, $http_function = false) + { + // using google feed API + $url = "http://ajax.googleapis.com/ajax/services/feed/lookup?key={$this->google_key}&v=1.0&q=" . urlencode($url); + // fetch the content + if ($http_function) { + $response = $http_function($url); + } else { + $response = $this->http($url); + } + + $result = json_decode($response, true); + $rss_url = $result['responseData']['url']; + + return $rss_url; + } + + /** + * Subscribe to a topic. + * + * @param string $topic_url + * @param callable $http_function + * + * @return mixed + */ + public function subscribe($topic_url, $http_function = false) + { + return $this->change_subscription('subscribe', $topic_url, $http_function); + } + + /** + * Unsubscribe from a topic. + * + * @param string $topic_url + * @param callable $http_function + * + * @return mixed + */ + public function unsubscribe($topic_url, $http_function = false) + { + return $this->change_subscription('unsubscribe', $topic_url, $http_function); + } + + /** + * Helper function since sub/unsub are handled the same way. + * + * @param string $mode + * @param string $topic_url + * @param callable $http_function + * + * @return mixed + */ + private function change_subscription($mode, $topic_url, $http_function = false) + { + if (! isset($topic_url)) { + throw new InvalidArgumentException('Please specify a topic url'); + } + + // lightweight check that we're actually working w/ a valid url + if (! preg_match('|^https?://|i', $topic_url)) { + throw new InvalidArgumentException('The specified topic url does not appear to be valid: ' . $topic_url); + } + + // set the mode subscribe/unsubscribe + $post_string = 'hub.mode=' . $mode; + $post_string .= '&hub.callback=' . urlencode($this->callback_url); + $post_string .= '&hub.verify=' . $this->verify; + $post_string .= '&hub.verify_token=' . $this->verify_token; + $post_string .= '&hub.lease_seconds=' . $this->lease_seconds; + + // append the topic url parameters + $post_string .= '&hub.topic=' . urlencode($topic_url); + + // make the http post request and return true/false + // easy to over-write to use your own http function + if ($http_function) { + return call_user_func_array($http_function, [$this->hub_url, $post_string]); + } + + return $this->http($this->hub_url, $post_string); + } + + /** + * Default http function that uses curl to post to the hub endpoint. + * + * @param string $url + * @param string $post_string + * + * @return mixed + */ + private function http($url, $post_string) + { + + // add any additional curl options here + $options = [ + CURLOPT_URL => $url, + CURLOPT_USERAGENT => 'PubSubHubbub-Subscriber-PHP/1.0', + CURLOPT_RETURNTRANSFER => true, + ]; + + if ($post_string) { + $options[CURLOPT_POST] = true; + $options[CURLOPT_POSTFIELDS] = $post_string; + } + + if ($this->credentials) { + $options[CURLOPT_USERPWD] = $this->credentials; + } + + $ch = curl_init(); + curl_setopt_array($ch, $options); + + $response = curl_exec($ch); + $info = curl_getinfo($ch); + + // all good -- anything in the 200 range + if (substr($info['http_code'], 0, 1) == '2') { + return $response; + } + + return false; + } +} diff --git a/lib/pubsubhubbub/subscriber.php b/lib/pubsubhubbub/subscriber.php deleted file mode 100644 index 139ec271d..000000000 --- a/lib/pubsubhubbub/subscriber.php +++ /dev/null @@ -1,120 +0,0 @@ -hub_url = $hub_url; - $this->callback_url = $callback_url; - $this->credentials = $credentials; - } - - // $use_regexp lets you choose whether to use google AJAX feed api (faster, but cached) or a regexp to read from site - public function find_feed($url, $http_function = false) { - // using google feed API - $url = "http://ajax.googleapis.com/ajax/services/feed/lookup?key={$this->google_key}&v=1.0&q=".urlencode($url); - // fetch the content - if ($http_function) - $response = $http_function($url); - else - $response = $this->http($url); - - $result = json_decode($response, true); - $rss_url = $result['responseData']['url']; - return $rss_url; - } - - public function subscribe($topic_url, $http_function = false) { - return $this->change_subscription("subscribe", $topic_url, $http_function = false); - } - - public function unsubscribe($topic_url, $http_function = false) { - return $this->change_subscription("unsubscribe", $topic_url, $http_function = false); - } - - // helper function since sub/unsub are handled the same way - private function change_subscription($mode, $topic_url, $http_function = false) { - if (!isset($topic_url)) - throw new Exception('Please specify a topic url'); - - // lightweight check that we're actually working w/ a valid url - if (!preg_match("|^https?://|i",$topic_url)) - throw new Exception('The specified topic url does not appear to be valid: '.$topic_url); - - // set the mode subscribe/unsubscribe - $post_string = "hub.mode=".$mode; - $post_string .= "&hub.callback=".urlencode($this->callback_url); - $post_string .= "&hub.verify=".$this->verify; - $post_string .= "&hub.verify_token=".$this->verify_token; - $post_string .= "&hub.lease_seconds=".$this->lease_seconds; - - // append the topic url parameters - $post_string .= "&hub.topic=".urlencode($topic_url); - - // make the http post request and return true/false - // easy to over-write to use your own http function - if ($http_function) - return $http_function($this->hub_url,$post_string); - else - return $this->http($this->hub_url,$post_string); - } - - // default http function that uses curl to post to the hub endpoint - private function http($url, $post_string) { - - // add any additional curl options here - $options = array(CURLOPT_URL => $url, - CURLOPT_USERAGENT => "PubSubHubbub-Subscriber-PHP/1.0", - CURLOPT_RETURNTRANSFER => true); - - if ($post_string) { - $options[CURLOPT_POST] = true; - $options[CURLOPT_POSTFIELDS] = $post_string; - } - - if ($this->credentials) - $options[CURLOPT_USERPWD] = $this->credentials; - - $ch = curl_init(); - curl_setopt_array($ch, $options); - - $response = curl_exec($ch); - $info = curl_getinfo($ch); - - // all good -- anything in the 200 range - if (substr($info['http_code'],0,1) == "2") { - return $response; - } - return false; - } -} - - -?> \ No newline at end of file