/** * Sets server url (scheme and host-related stuff without request URI) * * E.g. http://www.example.com * * @param string $serverUrl server URL to set (only * scheme and host) * @throws \Zend\URI\Exception if invalid server URL * @return \Zend\View\Helper\Navigation\Sitemap fluent interface, returns * self */ public function setServerUrl($serverUrl) { $uri = \Zend\Uri\Uri::factory($serverUrl); $uri->setFragment(''); $uri->setPath(''); $uri->setQuery(''); if ($uri->valid()) { $this->_serverUrl = $uri->getUri(); } else { $e = new \Zend\URI\Exception(sprintf('Invalid server URL: "%s"', $serverUrl)); $e->setView($this->view); throw $e; } return $this; }
/** * Pingback * * @param string $source ページのPing送信用のアドレス * @param string $target ページのPing待受用のアドレス * @return int */ public function ping($source, $target) { // Zend\Uri\Uriオブジェクトを生成 $source_url = Uri::factory($source); $target_url = Uri::factory($target); // 無効なアドレス if (!$target_url->isValid()) { return self::RESPONSE_FAULT_TARGET_INVALID; } if (!$source_url->isValid()) { return self::RESPONSE_FAULT_GENERIC; } if ($target_url->getHost() === $source_url->getHost()) { // ターゲットとソースのホストが一緒 // TODO: 同じドメインのサイトの場合、同じサイトとみなされる return self::RESPONSE_FAULT_SOURCE; } // 相手のサイトに接続 $source_client = new Client($source_url); $source_response = $source_client->request(Client::GET); // 接続できたかをチェック if (!$source_response->isSuccessful()) { return self::RESPONSE_FAULT_SOURCE; } // 相手のサイトの中身を取得 $source_body = $source_response->getBody(); // 中身を取得できない if (!$source_body) { return self::RESPONSE_FAULT_SOURCE; } if ($target_url->getHost() !== $source_url->getHost() && strpos($source_body, $source_url) === false) { // ソース URI のデータにターゲット URI へのリンクが存在しないため、ソースとして使用できない。 return self::RESPONSE_FAULT_SOURCE_LINK; } // 相手サイトのタイトルを取得(XMLとして処理した方がいい?) $source_titles = array(); preg_match('/<title>([^<]*?)</title>/is', $source_body, $source_titles); // タイトルが存在しないUntitled $source_title = empty($source_titles[1]) ? self::UNTITLED_TITLE : $source_titles[1]; // ターゲットのクエリを取得(自サイト) $query = $target_url->getQuery(); if (empty($query)) { // http://[host]/[pagename]の場合(スラッシュは再エンコード) $r_page = str_replace('/', '%2F', $target_url->getPath()); // $url_suffixが含まれる場合、正規表現でそこを削除 //$page = empty($url_suffix) ? $r_page : preg_replace('/'.$url_suffix.'$/', '', $r_page); $page = rawurldecode($r_page); unset($r_page); } else { // ターゲットに=が含まれる場合はページではないので無効 if (strpbrk($query, '=')) { return self::RESPONSE_FAULT_TARGET_INVALID; } $page = $query; } // ページ名からWikiを呼び出す $wiki = Factory::Wiki($page); if (!$wiki->isValied()) { // 無効なページ名 return self::RESPONSE_FAULT_TARGET_INVALID; } if (!$wiki->isReadable()) { // 読み込み不可なページ return self::RESPONSE_FAULT_ACCESS_DENIED; } // PingBackファイルを読み込む $pb = new PingBackFile($page); $lines = $pb->get(); if (count($lines) !== 0) { foreach ($lines as $line) { list($time, $url, $title) = explode("\t", $line); if ($url === $target_url) { // すでに登録されている return self::RESPONSE_FAULT_ALREADY_REGISTERED; } } } // 新しいデーターを登録 $lines[] = join("\t", array(UTIME, $source_url, $source_title)); // 保存 $pb->set($lines); return self::RESPONSE_SUCCESS; }