Project

General

Profile

Feature #13680 » linkval-cleanup.diff

Philipp Gampe, 2011-03-12 17:08

View differences:

classes/linktype/class.tx_linkvalidator_linktype_external.php (Arbeitskopie)
protected $urlErrorParams = array();
/**
* List of headers to be used for metching an URL for the current processing
*
* @var array
*/
protected $additionalHeaders = array();
/**
* Checks a given URL + /path/filename.ext for validity
*
* @param string $url: url to check
......
*/
public function checkLink($url, $softRefEntry, $reference) {
$errorParams = array();
$report = array();
$additionalHeaders['User-Agent'] = 'User-Agent: Mozilla/5.0 TYPO3-linkvalidator';
if (isset($this->urlReports[$url])) {
if(!$this->urlReports[$url]) {
if(is_array($this->urlErrorParams[$url])) {
......
}
// try to fetch the content of the URL (headers only)
$report = array();
$content = t3lib_div::getURL($url, 2, $additionalHeaders, $report);
// try fetching the content of the URL (just fetching the headers does not work correctly)
$content = '';
$content = t3lib_div::getURL($url, 1, FALSE, $report);
$tries = 0;
$currentUrl = $url;
$haveNewUrl = FALSE;
$location = array();
$cookie = array();
while (($report['http_code'] == 301 || $report['http_code'] == 302
|| $report['http_code'] == 303 || $report['http_code'] == 307)
&& ($tries < 5)) {
$isCodeRedirect = preg_match('/Location: (.*)/', $content, $location);
if (isset($location[1])) {
$content = t3lib_div::getURL($location[1], 2, FALSE, $report);
// split header into lines and parse them
$responseHeaders = t3lib_div::trimExplode(chr(10), $content, TRUE);
$cookies = '';
foreach($responseHeaders as $line) {
if (preg_match('/Location: ([^\r\n]+)/', $line, $location)) {
if (isset($location[1])) {
$parsedUrl = parse_url($location[1]);
if (!isset($parsedUrl['host'])) {
// the location did not contain a complete URI, build it!
$parsedUrl = parse_url($lastUrl);
$newUrl = $parsedUrl['scheme'].'://'.(isset($parsedUrl['user'])?$parsedUrl['user'].(isset($parsedUrl['pass'])?':'.$parsedUrl['pass']:''):'').$parsedUrl['host'].(isset($parsedUrl['port'])?':'.$parsedUrl['port']:'').$location[1];
}
else {
$newUrl = $location[1];
}
if ($currentUrl === $newUrl) break 2;
$currentUrl = $newUrl;
$haveNewUrl = TRUE;
} else break 2;
}
// find cookies
if (preg_match('/Set-Cookie: (.*); path=(.+)/', $line, $cookie)) {
$cookies .= (isset($cookie[1]) ? $cookie[1] : '') . '; ';
}
}
// add cookies if we have some
if (!empty($cookies)) $additionalHeaders['Cookie'] = 'Cookie: ' . $cookies;
// now try to fetch again
if ($haveNewUrl) {
$content = t3lib_div::getURL($currentUrl, 2, $additionalHeaders, $report);
$tries++;
} else break;
}
$response = TRUE;
// analyze the response
......
if (($report['http_code'] == 301) || ($report['http_code'] == 302)
|| ($report['http_code'] == 303) || ($report['http_code'] == 307)) {
$errorParams['errorType'] = $report['http_code'];
$errorParams['location'] = $location[1];
$errorParams['location'] = $currentUrl;
$response = FALSE;
}
if ($report['http_code'] == 404 || $report['http_code'] == 403) {
$errorParams['errorType'] = $report['http_code'];
$response = FALSE;
}
if ($report['http_code'] >= 300 && $response) {
$errorParams['errorType'] = $report['http_code'];
$response = FALSE;
......
$response = sprintf($GLOBALS['LANG']->getLL('list.report.redirectloop'), $errorType, $errorParams['location']);
break;
case 403:
$response = $GLOBALS['LANG']->getLL('list.report.pageforbidden403');
break;
case 404:
$response = $GLOBALS['LANG']->getLL('list.report.pagenotfound404');
break;
case 403:
$response = $GLOBALS['LANG']->getLL('list.report.pageforbidden403');
break;
case 500:
$response = $GLOBALS['LANG']->getLL('list.report.internalerror500');
break;
(1-1/3)