87 lines
2.9 KiB
ReStructuredText
87 lines
2.9 KiB
ReStructuredText
.. include:: /Includes.rst.txt
|
|
|
|
.. _deprecation-94316:
|
|
|
|
=======================================================================
|
|
Deprecation: #94316 - HTTP header manipulating methods from HttpUtility
|
|
=======================================================================
|
|
|
|
See :issue:`94316`
|
|
|
|
Description
|
|
===========
|
|
|
|
In order to properly handle PSR-7 response objects, explicit :php:`die()`
|
|
or :php:`exit()` calls, as well as directly manipulating HTTP headers with
|
|
:php:`header()` should be avoided. Therefore following methods from
|
|
:php:`\TYPO3\CMS\Core\Utility\HttpUtility` have been marked as deprecated:
|
|
|
|
* :php:`redirect()`
|
|
* :php:`setResponseCode()`
|
|
* :php:`setResponseCodeAndExit()`
|
|
|
|
The TYPO3 Core already provides a couple of possibilities to properly handle
|
|
such events in a PSR-7 conform way. Most of the time, a proper PSR-7 response
|
|
can be passed back to the call stack (request handler). Unfortunately there
|
|
might still be some places, inside the call stack, where it's not possible to
|
|
directly return a PSR-7 response. In such case, the
|
|
:php:`\TYPO3\CMS\Core\Http\PropagateResponseException`
|
|
could be thrown. It will automatically be caught by a PSR-15 middleware and the
|
|
given PSR-7 response will then directly be returned, making any :php:`die()`
|
|
or :php:`exit()` call obsolete.
|
|
|
|
The usage is as following:
|
|
|
|
.. code-block:: php
|
|
|
|
// Before
|
|
HttpUtility::redirect('https://example.com', HttpUtility::HTTP_STATUS_303);
|
|
|
|
// After
|
|
|
|
// Inject PSR-17 ResponseFactoryInterface
|
|
public function __construct(ResponseFactoryInterface $responseFactory)
|
|
{
|
|
$this->responseFactory = $responseFactory
|
|
}
|
|
|
|
// Create redirect response
|
|
$response = $this->responseFactory
|
|
->createResponse(303)
|
|
->withAddedHeader('location', 'https://example.com')
|
|
|
|
// Return Response directly
|
|
return $reponse;
|
|
|
|
// or throw PropagateResponseException
|
|
throw new PropagateResponseException($response);
|
|
|
|
.. note::
|
|
|
|
Throwing exceptions for returning an immediate PSR-7 Response is considered
|
|
as an intermediate solution only, until it's possible to return PSR-7
|
|
responses in every relevant place. Therefore, the exception is marked
|
|
as :php:`@internal` and will most likely vanish again in the future.
|
|
|
|
Impact
|
|
======
|
|
|
|
Calling one of those methods will trigger a PHP :php:`E_USER_DEPRECATED` error.
|
|
|
|
Affected Installations
|
|
======================
|
|
|
|
All TYPO3 installations calling those methods in custom code. The extension
|
|
scanner will find all usages as strong match.
|
|
|
|
Migration
|
|
=========
|
|
|
|
Replace all occurrences in custom extension code. Therefore, create a redirect
|
|
response with the PSR-17 ResponseFactoryInterface, and pass it back to the call
|
|
stack (request handler). In case, it's not possible to directly return a PSR-7
|
|
Response, you can use the :php:`\TYPO3\CMS\Core\Http\PropagateResponseException`
|
|
as an intermediate solution.
|
|
|
|
.. index:: PHP-API, FullyScanned, ext:core
|