45 $url = $sn .
'?&xh_do_validate';
46 $o =
'<div id="xh_linkchecker" data-url="' . $url .
'">' 47 .
'<img src="' . $pth[
'folder'][
'corestyle']
48 .
'ajax-loader-bar.gif" width="128" height="15" alt="' 49 . $tx[
'link'][
'checking'] .
'">' 61 header(
'Content-Type: text/plain; charset=utf-8');
62 echo $this->checkLinks();
73 $links = $this->gatherLinks();
75 400, 404, 500, Link::STATUS_INTERNALFAIL,
76 Link::STATUS_EXTERNALFAIL, Link::STATUS_CONTENT_NOT_FOUND,
77 Link::STATUS_FILE_NOT_FOUND, Link::STATUS_ANCHOR_MISSING
80 foreach ($links as $index => $currentLinks) {
81 foreach ($currentLinks as $link) {
82 $this->determineLinkStatus($link);
83 if ($link->getStatus() !== 200) {
84 $type = in_array($link->getStatus(), $failure)
85 ?
'errors' :
'caveats';
86 $hints[$index][$type][] = $link;
90 return $this->message($this->countLinks($links), $hints);
102 private function gatherLinks()
108 $links[
$i] = array();
109 $pattern =
'/<a.*?href=["]?([^"]*)["]?.*?>(.*?)<\/a>/is';
110 preg_match_all($pattern, $c[
$i], $pageLinks);
111 if (count($pageLinks[1]) > 0) {
112 foreach ($pageLinks[1] as
$j => $url) {
113 $url = str_replace(
'&',
'&', $url);
114 if (strpos($url,
'#') === 0) {
115 $url =
'?' . $u[
$i] . $url;
132 private function countLinks(array $links)
134 return array_sum(array_map(
'count', $links));
146 $parts = parse_url($link->
getURL());
147 if (isset($parts[
'scheme'])) {
148 switch ($parts[
'scheme']) {
150 $status = $this->checkExternalLink($parts);
153 $status = Link::STATUS_MAILTO;
156 $status = $this->checkInternalLink($parts);
159 $status = Link::STATUS_UNKNOWN;
162 $status = $this->checkInternalLink($parts);
180 private function checkInternalLink(array $test)
184 if (isset($test[
'path']) && !isset($test[
'query'])) {
185 $filename = urldecode($test[
'path']);
186 if (is_file($filename) && is_readable($filename)) {
190 if (!isset($test[
'query'])) {
191 return Link::STATUS_INTERNALFAIL;
194 list($query) = explode(
'&', $test[
'query']);
195 if ($query ===
'sitemap' 196 || $query ===
'mailform' && $cf[
'mailform'][
'email'] !==
'' 200 $contentLength =
$cl;
201 if (isset($test[
'path'])
202 && preg_match(
'/\/([A-z]{2})\/[^\/]*/', $test[
'path'], $matches)
208 $query = str_replace(
'/' . $lang .
'/?',
'', $query);
211 return Link::STATUS_CONTENT_NOT_FOUND;
213 $urls = $content[
'urls'];
214 $pages = $content[
'pages'];
215 $contentLength = count($pages);
220 for (
$i = 0;
$i < $contentLength;
$i++) {
221 if ($urls[
$i] === $query) {
222 if (!isset($test[
'fragment'])) {
225 $pattern =
'/<[^>]*[id|name]\s*=\s*"' . $test[
'fragment'] .
'"/i';
226 if (preg_match($pattern, $pages[
$i])) {
230 $template = file_get_contents($pth[
'file'][
'template']);
231 $pattern =
'/<[^>]*[id|name]\s*=\s*"' . $test[
'fragment'] .
'"/i';
232 if (preg_match($pattern, $template)) {
235 return Link::STATUS_ANCHOR_MISSING;
238 $parts = explode(
'=', $test[
'query']);
239 $temp = array(
'download',
'&download',
'&download');
240 if (in_array($parts[0],
$temp)) {
241 if (file_exists($pth[
'folder'][
'downloads'] . $parts[1])) {
244 return Link::STATUS_FILE_NOT_FOUND;
247 return Link::STATUS_INTERNALFAIL;
257 private function checkExternalLink(array $parts)
260 $path = isset($parts[
'path']) ? $parts[
'path'] :
'/';
261 if (isset($parts[
'query'])) {
262 $path .=
"?" . $parts[
'query'];
264 $status = $this->makeHeadRequest($parts[
'host'], $path);
265 return ($status !==
false) ? $status : Link::STATUS_EXTERNALFAIL;
279 $errno = $errstr = null;
280 $socket = fsockopen($host, 80, $errno, $errstr, 5);
282 $request =
"HEAD $path HTTP/1.1\r\nHost: $host\r\n" 283 .
"User-Agent: CMSimple_XH Link-Checker\r\n\r\n";
284 fwrite($socket, $request);
285 $response = fread($socket, 12);
287 $status = substr($response, 9);
288 return (
int) $status;
305 $o =
'<li>' .
"\n" .
'<b>' . $tx[
'link'][
'link'] .
'</b>' 306 .
'<a href="' . $link->
getURL() .
'">' . $link->
getText() .
'</a>' 308 .
'<b>' . $tx[
'link'][
'linked_page'] .
'</b>' . $link->
getURL()
310 .
'<b>' . $tx[
'link'][
'error'] .
'</b>';
312 case Link::STATUS_INTERNALFAIL:
313 case Link::STATUS_CONTENT_NOT_FOUND:
314 $o .= $tx[
'link'][
'int_error'];
316 case Link::STATUS_ANCHOR_MISSING:
317 $o .= $tx[
'link'][
'int_error_fragment'];
319 case Link::STATUS_EXTERNALFAIL:
320 $o .= $tx[
'link'][
'ext_error_domain'];
323 $o .= $tx[
'link'][
'ext_error_page'] .
'<br>' .
"\n" 324 .
'<b>' . $tx[
'link'][
'returned_status'] .
'</b>' 327 $o .=
"\n" .
'</li>' .
"\n";
342 $o =
'<li>' .
"\n" .
'<b>' . $tx[
'link'][
'link'] .
'</b>' 343 .
'<a href="' . $link->
getURL() .
'">' . $link->
getText() .
'</a>' 345 .
'<b>' . $tx[
'link'][
'linked_page'] .
'</b>' 346 . $link->
getURL() .
'<br>' .
"\n";
348 case Link::STATUS_MAILTO:
349 $o .= $tx[
'link'][
'email'] .
"\n";
351 case Link::STATUS_UNKNOWN:
352 $o .= $tx[
'link'][Link::STATUS_UNKNOWN] .
"\n";
356 $o .=
'<b>' . $tx[
'link'][
'error'] .
'</b>' 357 . $tx[
'link'][
'redirect'] .
'<br>' .
"\n";
359 $o .=
'<b>' . $tx[
'link'][
'returned_status'] .
'</b>' 377 public function message($checkedLinks, array $hints)
382 $text = sprintf($tx[
'link'][$key], $checkedLinks);
383 $o =
"\n" .
'<p>' .
$text .
'</p>' .
"\n";
384 if (count($hints) === 0) {
385 $o .=
'<p><b>' . $tx[
'link'][
'check_ok'] .
'</b></p>' .
"\n";
388 $o .=
'<p><b>' . $tx[
'link'][
'check_errors'] .
'</b></p>' .
"\n";
389 $o .=
'<p>' . $tx[
'link'][
'check'] .
'</p>' .
"\n";
390 foreach ($hints as $page => $problems) {
391 $o .=
'<hr>' .
"\n\n" .
'<h4>' . $tx[
'link'][
'page']
392 .
'<a href="?' . $u[$page] .
'">' . $h[$page] .
'</a></h4>' .
"\n";
393 if (isset($problems[
'errors'])) {
394 $o .=
'<h5>' . $tx[
'link'][
'errors'] .
'</h5>' .
"\n" 396 foreach ($problems[
'errors'] as $link) {
397 $o .= $this->reportError($link);
399 $o .=
'</ul>' .
"\n" .
"\n";
401 if (isset($problems[
'caveats'])) {
402 $o .=
'<h5>' . $tx[
'link'][
'hints'] .
'</h5>' .
"\n" 404 foreach ($problems[
'caveats'] as $link) {
405 $o .= $this->reportNotice($link);
407 $o .=
'</ul>' .
"\n";
XH_isLanguageFolder($name)
determineLinkStatus(Link $link)
makeHeadRequest($host, $path)
message($checkedLinks, array $hints)
XH_readContents($language=null)