Attention
TYPO3 v6 has reached its end-of-life April 18th, 2017 and is not maintained by the community anymore. Looking for a stable version? Use the version switch on the top left.
There is no further ELTS support. It is strongly recommended updating your project.
HTTP request library¶
Since TYPO3 CMS 4.6, a library for easily making HTTP requests is available. It is actually a wrapper around the HTTP_Request2 PEAR package, which is shipped with the Core.
Basic usage¶
The basic usage is as simple as it gets:
$request = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(
'TYPO3\\CMS\\Core\\Http\\HttpRequest',
'http://typo3.org/'
);
$result = $request->send();
$content = $result->getBody();
The above example will read the content of the "typo3.org" home page.
Example¶
This example is taken from the "linkvalidator" system extension.
$config = array(
'follow_redirects' => TRUE,
'strict_redirects' => TRUE
);
/** @var \TYPO3\CMS\Core\Http\HttpRequest|\HTTP_Request2 $request */
$request = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(
'TYPO3\\CMS\\Core\\Http\\HttpRequest',
$url,
'HEAD',
$config
);
// Observe cookies
$request->setCookieJar(TRUE);
try {
/** @var \HTTP_Request2_Response $response */
$response = $request->send();
// HEAD was not allowed, now trying GET
if (isset($response) && $response->getStatus() === 405) {
$request->setMethod('GET');
$request->setHeader('Range', 'bytes = 0 - 4048');
/** @var \HTTP_Request2_Response $response */
$response = $request->send();
}
} catch (\Exception $e) {
$isValidUrl = FALSE;
// A redirect loop occurred
if ($e->getCode() === 40) {
// Parse the exception for more information
$trace = $e->getTrace();
$traceUrl = $trace[0]['args'][0]->getUrl()->getUrl();
$traceCode = $trace[0]['args'][1]->getStatus();
$errorParams['errorType'] = 'loop';
$errorParams['location'] = $traceUrl;
$errorParams['errorCode'] = $traceCode;
} else {
$errorParams['errorType'] = 'exception';
}
$errorParams['message'] = $e->getMessage();
}
This is the code that checks external links. To keep the traffic low, it first checks
only with HEAD. In case the server does not allow this, the check is retried
with GET. In such a case, we get only the first 4 kilobytes, as we don't really
care about the content itself.
It may happen that the check gets stuck in a redirect loop, in which case an exception
is thrown. This particular case it tested for in the catch block above
to better inform the user about what happened.