diff --git a/typo3/sysext/backend/Classes/Http/RequestHandler.php b/typo3/sysext/backend/Classes/Http/RequestHandler.php index d117e393d9072c3c175aa757d5bc1ad28e99a936..469b5164a557bba3ba8f5bacd116691faeb3bdab 100644 --- a/typo3/sysext/backend/Classes/Http/RequestHandler.php +++ b/typo3/sysext/backend/Classes/Http/RequestHandler.php @@ -19,6 +19,7 @@ use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; use TYPO3\CMS\Backend\Routing\Exception\InvalidRequestTokenException; +use TYPO3\CMS\Backend\Routing\UriBuilder; use TYPO3\CMS\Backend\Template\DocumentTemplate; use TYPO3\CMS\Core\Http\RedirectResponse; use TYPO3\CMS\Core\Utility\GeneralUtility; @@ -35,6 +36,32 @@ use TYPO3\CMS\Core\Utility\GeneralUtility; */ class RequestHandler implements RequestHandlerInterface { + /** + * Sets the global GET and POST to the values, so if people access $_GET and $_POST + * Within hooks starting NOW (e.g. cObject), they get the "enriched" data from query params. + * + * This needs to be run after the request object has been enriched with modified GET/POST variables. + * + * @param ServerRequestInterface $request + * @internal this safety net will be removed in TYPO3 v10.0. + */ + protected function resetGlobalsToCurrentRequest(ServerRequestInterface $request) + { + if ($request->getQueryParams() !== $_GET) { + $queryParams = $request->getQueryParams(); + $_GET = $queryParams; + $GLOBALS['HTTP_GET_VARS'] = $_GET; + } + if ($request->getMethod() === 'POST') { + $parsedBody = $request->getParsedBody(); + if (is_array($parsedBody) && $parsedBody !== $_POST) { + $_POST = $parsedBody; + $GLOBALS['HTTP_POST_VARS'] = $_POST; + } + } + $GLOBALS['TYPO3_REQUEST'] = $request; + } + /** * Handles a backend request, after finishing running middlewares * Dispatch the request to the appropriate controller through the @@ -49,14 +76,17 @@ class RequestHandler implements RequestHandlerInterface // PageRenderer (= which is a singleton) to populate Backend Styles from TBE_STYLES // which should be built only if necessary, but currently done all over the place. GeneralUtility::makeInstance(DocumentTemplate::class); + // safety net to have the fully-added request object globally available as long as + // there are Core classes that need the Request object but do not get it handed in + $this->resetGlobalsToCurrentRequest($request); try { // Check if the router has the available route and dispatch. $dispatcher = GeneralUtility::makeInstance(RouteDispatcher::class); return $dispatcher->dispatch($request); } catch (InvalidRequestTokenException $e) { // When token was invalid redirect to login - $url = GeneralUtility::getIndpEnv('TYPO3_SITE_URL') . TYPO3_mainDir; - return new RedirectResponse($url); + $loginPage = GeneralUtility::makeInstance(UriBuilder::class)->buildUriFromRoute('login'); + return new RedirectResponse((string)$loginPage); } } } diff --git a/typo3/sysext/backend/Classes/Middleware/SiteResolver.php b/typo3/sysext/backend/Classes/Middleware/SiteResolver.php index 328ccb545840b0457d9682966aa7d1984a4ef0bb..9d601f9b2ec5459321d65162f6ed1845594b49a9 100644 --- a/typo3/sysext/backend/Classes/Middleware/SiteResolver.php +++ b/typo3/sysext/backend/Classes/Middleware/SiteResolver.php @@ -54,7 +54,6 @@ class SiteResolver implements MiddlewareInterface } $site = GeneralUtility::makeInstance(SiteMatcher::class)->matchByPageId($pageId, $rootLine); $request = $request->withAttribute('site', $site); - $GLOBALS['TYPO3_REQUEST'] = $request; } return $handler->handle($request); } diff --git a/typo3/sysext/core/Classes/Middleware/NormalizedParamsAttribute.php b/typo3/sysext/core/Classes/Middleware/NormalizedParamsAttribute.php index e0e9358d0b94c35c41b5ed7cc70b235dee4a801e..f1496bdb5d30a8e04053e61dc6c1e4edb54f654b 100644 --- a/typo3/sysext/core/Classes/Middleware/NormalizedParamsAttribute.php +++ b/typo3/sysext/core/Classes/Middleware/NormalizedParamsAttribute.php @@ -49,12 +49,6 @@ class NormalizedParamsAttribute implements MiddlewareInterface Environment::getPublicPath() ) ); - - // Set $request as global variable. This is needed in a transition phase until core code has been - // refactored to have ServerRequest object available where it is needed. This global will be - // deprecated then and removed. - $GLOBALS['TYPO3_REQUEST'] = $request; - return $handler->handle($request); } } diff --git a/typo3/sysext/core/Documentation/Changelog/master/Breaking-87193-DeprecatedFunctionalityRemoved.rst b/typo3/sysext/core/Documentation/Changelog/master/Breaking-87193-DeprecatedFunctionalityRemoved.rst index b1f158928c78c801f93b12f83a88063ceeca1fa4..3614a90ba22e3663f993ebc9e6c2342ffd1cc365 100644 --- a/typo3/sysext/core/Documentation/Changelog/master/Breaking-87193-DeprecatedFunctionalityRemoved.rst +++ b/typo3/sysext/core/Documentation/Changelog/master/Breaking-87193-DeprecatedFunctionalityRemoved.rst @@ -1431,6 +1431,7 @@ The following features have been removed: * EXT:form: renderingOptions._isHiddenFormElement and renderingOptions._isReadOnlyFormElement are dropped * :php:`$TBE_MODULES`: configuring a module via a custom "configureModuleFunction" is dropped * CLI Command alias "lang:language:update" is dropped in favor of "language:update" +* Accessing or modifying $_GET/$_POST parameters during any PSR-15 middleware will not reflect any change during the actual Request processing anymore as it is overridden by the incoming PSR-7 request object, but overriden again when the RequestHandler is accessed The following database tables have been removed: diff --git a/typo3/sysext/frontend/Classes/Http/RequestHandler.php b/typo3/sysext/frontend/Classes/Http/RequestHandler.php index 59cbdf765b0cceb7a426bb96bda089faead2adf4..f74176df93d466c6f23d181f2694700923a44571 100644 --- a/typo3/sysext/frontend/Classes/Http/RequestHandler.php +++ b/typo3/sysext/frontend/Classes/Http/RequestHandler.php @@ -27,7 +27,6 @@ use TYPO3\CMS\Core\Site\Entity\SiteLanguage; use TYPO3\CMS\Core\TimeTracker\TimeTracker; use TYPO3\CMS\Core\Type\File\ImageInfo; use TYPO3\CMS\Core\TypoScript\TypoScriptService; -use TYPO3\CMS\Core\Utility\ArrayUtility; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\Utility\PathUtility; use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer; @@ -63,41 +62,6 @@ class RequestHandler implements RequestHandlerInterface */ protected $timeTracker; - /** - * Puts parameters that have been added or removed from the global _GET or _POST arrays - * into the given request (however, the PSR-7 request information takes precedence). - * - * @param ServerRequestInterface $request - * @return ServerRequestInterface - */ - protected function addModifiedGlobalsToIncomingRequest(ServerRequestInterface $request): ServerRequestInterface - { - $originalGetParameters = $request->getAttribute('_originalGetParameters', null); - if ($originalGetParameters !== null && !empty($_GET) && $_GET !== $originalGetParameters) { - // Find out what has been changed. - $modifiedGetParameters = ArrayUtility::arrayDiffAssocRecursive($_GET ?? [], $originalGetParameters); - if (!empty($modifiedGetParameters)) { - $queryParams = array_replace_recursive($modifiedGetParameters, $request->getQueryParams()); - $request = $request->withQueryParams($queryParams); - $GLOBALS['TYPO3_REQUEST'] = $request; - $this->timeTracker->setTSlogMessage('GET parameters have been modified during Request building in a hook.'); - } - } - // do same for $_POST if the request is a POST request - $originalPostParameters = $request->getAttribute('_originalPostParameters', null); - if ($request->getMethod() === 'POST' && $originalPostParameters !== null && !empty($_POST) && $_POST !== $originalPostParameters) { - // Find out what has been changed - $modifiedPostParameters = ArrayUtility::arrayDiffAssocRecursive($_POST ?? [], $originalPostParameters); - if (!empty($modifiedPostParameters)) { - $parsedBody = array_replace_recursive($modifiedPostParameters, $request->getParsedBody()); - $request = $request->withParsedBody($parsedBody); - $GLOBALS['TYPO3_REQUEST'] = $request; - $this->timeTracker->setTSlogMessage('POST parameters have been modified during Request building in a hook.'); - } - } - return $request; - } - /** * Sets the global GET and POST to the values, so if people access $_GET and $_POST * Within hooks starting NOW (e.g. cObject), they get the "enriched" data from query params. @@ -121,7 +85,9 @@ class RequestHandler implements RequestHandlerInterface $GLOBALS['HTTP_POST_VARS'] = $_POST; } } + $GLOBALS['TYPO3_REQUEST'] = $request; } + /** * Handles a frontend request, after finishing running middlewares * @@ -135,8 +101,6 @@ class RequestHandler implements RequestHandlerInterface /** @var TypoScriptFrontendController $controller */ $controller = $GLOBALS['TSFE']; - // safety net, will be removed in TYPO3 v10.0. Aligns $_GET/$_POST to the incoming request. - $request = $this->addModifiedGlobalsToIncomingRequest($request); $this->resetGlobalsToCurrentRequest($request); // Generate page diff --git a/typo3/sysext/frontend/Classes/Middleware/FrontendUserAuthenticator.php b/typo3/sysext/frontend/Classes/Middleware/FrontendUserAuthenticator.php index a5f35fe90c9ee8ba8b1dc3955ce28cf4e1e5d4a7..15293abf37191b4dc8c9aa61ea9619d2965ee130 100644 --- a/typo3/sysext/frontend/Classes/Middleware/FrontendUserAuthenticator.php +++ b/typo3/sysext/frontend/Classes/Middleware/FrontendUserAuthenticator.php @@ -99,8 +99,6 @@ class FrontendUserAuthenticator implements MiddlewareInterface $cookieParams = $request->getCookieParams(); $cookieParams[$cookieName] = $sessionId; $request = $request->withCookieParams($cookieParams); - // @deprecated: we override the current request because it was enriched by cookie information here. - $GLOBALS['TYPO3_REQUEST'] = $request; $frontendUser->forceSetCookie = true; $frontendUser->dontSetCookie = false; } diff --git a/typo3/sysext/frontend/Classes/Middleware/PageResolver.php b/typo3/sysext/frontend/Classes/Middleware/PageResolver.php index 4d782af296db287f0d273acf42da2f42fd06b5ec..508ad4b1ca2199c6b3147f1dee7debb7ea7562bc 100644 --- a/typo3/sysext/frontend/Classes/Middleware/PageResolver.php +++ b/typo3/sysext/frontend/Classes/Middleware/PageResolver.php @@ -132,12 +132,11 @@ class PageResolver implements MiddlewareInterface $queryParams = array_replace_recursive($request->getQueryParams(), $pageArguments->getArguments()); $request = $request->withQueryParams($queryParams); $this->controller->setPageArguments($pageArguments); - - // At this point, we later get further route modifiers - // for bw-compat we update $GLOBALS[TYPO3_REQUEST] to be used later in TSFE. - $GLOBALS['TYPO3_REQUEST'] = $request; } + // as long as TSFE throws errors with the global object, this needs to be set, but + // should be removed later-on + $GLOBALS['TYPO3_REQUEST'] = $request; $this->controller->determineId(); // No access? Then remove user & Re-evaluate the page-id diff --git a/typo3/sysext/frontend/Classes/Middleware/PrepareTypoScriptFrontendRendering.php b/typo3/sysext/frontend/Classes/Middleware/PrepareTypoScriptFrontendRendering.php index 8452c9cff86c67f6d42130426ce2bc0b671e5e73..fb0b0a71f6d0a0bcfb8ac8c22c23420d56a32823 100644 --- a/typo3/sysext/frontend/Classes/Middleware/PrepareTypoScriptFrontendRendering.php +++ b/typo3/sysext/frontend/Classes/Middleware/PrepareTypoScriptFrontendRendering.php @@ -60,6 +60,9 @@ class PrepareTypoScriptFrontendRendering implements MiddlewareInterface */ public function process(ServerRequestInterface $request, PsrRequestHandlerInterface $handler): ResponseInterface { + // as long as TSFE throws errors with the global object, this needs to be set, but + // should be removed later-on once TypoScript Condition Matcher is built with the current request object. + $GLOBALS['TYPO3_REQUEST'] = $request; // Get from cache $this->timeTracker->push('Get Page from cache'); // Locks may be acquired here @@ -84,7 +87,6 @@ class PrepareTypoScriptFrontendRendering implements MiddlewareInterface ArrayUtility::mergeRecursiveWithOverrule($modifiedGetVars, $request->getQueryParams()); } $request = $request->withQueryParams($modifiedGetVars); - $GLOBALS['TYPO3_REQUEST'] = $request; } // Setting language and locale @@ -94,13 +96,12 @@ class PrepareTypoScriptFrontendRendering implements MiddlewareInterface $this->timeTracker->pull(); // Convert POST data to utf-8 for internal processing if metaCharset is different - if ($this->controller->metaCharset !== 'utf-8' && is_array($_POST) && !empty($_POST)) { - $this->convertCharsetRecursivelyToUtf8($_POST, $this->controller->metaCharset); - $GLOBALS['HTTP_POST_VARS'] = $_POST; + if ($this->controller->metaCharset !== 'utf-8' && $request->getMethod() === 'POST') { $parsedBody = $request->getParsedBody(); - $this->convertCharsetRecursivelyToUtf8($parsedBody, $this->controller->metaCharset); - $request = $request->withParsedBody($parsedBody); - $GLOBALS['TYPO3_REQUEST'] = $request; + if (is_array($parsedBody) && !empty($parsedBody)) { + $this->convertCharsetRecursivelyToUtf8($parsedBody, $this->controller->metaCharset); + $request = $request->withParsedBody($parsedBody); + } } return $handler->handle($request); } diff --git a/typo3/sysext/frontend/Classes/Middleware/PreprocessRequestHook.php b/typo3/sysext/frontend/Classes/Middleware/PreprocessRequestHook.php deleted file mode 100644 index 9f224788b90af251fee2a0446d903bd8484279fa..0000000000000000000000000000000000000000 --- a/typo3/sysext/frontend/Classes/Middleware/PreprocessRequestHook.php +++ /dev/null @@ -1,50 +0,0 @@ -<?php -declare(strict_types = 1); -namespace TYPO3\CMS\Frontend\Middleware; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -use Psr\Http\Message\ResponseInterface; -use Psr\Http\Message\ServerRequestInterface; -use Psr\Http\Server\MiddlewareInterface; -use Psr\Http\Server\RequestHandlerInterface; - -/** - * Calls a hook before processing a request for the TYPO3 Frontend. - * - * @internal - * @deprecated since TYPO3 v9, will be removed in TYPO3 v10.0. - */ -class PreprocessRequestHook implements MiddlewareInterface -{ - - /** - * Hook to preprocess the current request - * - * @param ServerRequestInterface $request - * @param RequestHandlerInterface $handler - * @return ResponseInterface - */ - public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface - { - // Legacy functionality to check if any hook modified global GET/POST - // This is a safety net, see RequestHandler for how this is validated. - // This information is just a compat layer which will be removed in TYPO3 v10.0. - $request = $request->withAttribute('_originalGetParameters', $_GET); - if ($request->getMethod() === 'POST') { - $request = $request->withAttribute('_originalPostParameters', $_POST); - } - return $handler->handle($request); - } -} diff --git a/typo3/sysext/frontend/Classes/Middleware/SiteResolver.php b/typo3/sysext/frontend/Classes/Middleware/SiteResolver.php index 7f5d60febe2ce0927b981e2db39b1cf92098345e..8423e557af4437311889e4f1d582c5fef3a9793b 100644 --- a/typo3/sysext/frontend/Classes/Middleware/SiteResolver.php +++ b/typo3/sysext/frontend/Classes/Middleware/SiteResolver.php @@ -60,11 +60,6 @@ class SiteResolver implements MiddlewareInterface $request = $request->withAttribute('site', $routeResult->getSite()); $request = $request->withAttribute('language', $routeResult->getLanguage()); $request = $request->withAttribute('routing', $routeResult); - - // At this point, we later get further route modifiers - // for bw-compat we update $GLOBALS[TYPO3_REQUEST] to be used later in TSFE. - $GLOBALS['TYPO3_REQUEST'] = $request; - return $handler->handle($request); } } diff --git a/typo3/sysext/frontend/Classes/Middleware/TypoScriptFrontendInitialization.php b/typo3/sysext/frontend/Classes/Middleware/TypoScriptFrontendInitialization.php index b83d686a571248d6a75ac5c2e0df15f4e8f8e54b..7ccf12b8a52845f64aba6844556ce06eee8a417e 100644 --- a/typo3/sysext/frontend/Classes/Middleware/TypoScriptFrontendInitialization.php +++ b/typo3/sysext/frontend/Classes/Middleware/TypoScriptFrontendInitialization.php @@ -32,9 +32,6 @@ use TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController; * Creates an instance of TypoScriptFrontendController and makes this globally available * via $GLOBALS['TSFE']. * - * For now, GeneralUtility::_GP() is used in favor of $request->getQueryParams() due to - * hooks who could have $_GET/$_POST modified before. - * * @internal this middleware might get removed in TYPO3 v10.0. */ class TypoScriptFrontendInitialization implements MiddlewareInterface, LoggerAwareInterface @@ -54,14 +51,14 @@ class TypoScriptFrontendInitialization implements MiddlewareInterface, LoggerAwa $GLOBALS['TSFE'] = GeneralUtility::makeInstance( TypoScriptFrontendController::class, null, - GeneralUtility::_GP('id'), - GeneralUtility::_GP('type'), + $request->getParsedBody()['id'] ?? $request->getQueryParams()['id'] ?? 0, + $request->getParsedBody()['type'] ?? $request->getQueryParams()['type'] ?? 0, null, - GeneralUtility::_GP('cHash'), + $request->getParsedBody()['cHash'] ?? $request->getQueryParams()['cHash'] ?? '', null, - GeneralUtility::_GP('MP') + $request->getParsedBody()['MP'] ?? $request->getQueryParams()['MP'] ?? '' ); - if (GeneralUtility::_GP('no_cache')) { + if ($request->getParsedBody()['no_cache'] ?? $request->getQueryParams()['no_cache'] ?? false) { $GLOBALS['TSFE']->set_no_cache('&no_cache=1 has been supplied, so caching is disabled! URL: "' . (string)$request->getUri() . '"'); } diff --git a/typo3/sysext/frontend/Configuration/RequestMiddlewares.php b/typo3/sysext/frontend/Configuration/RequestMiddlewares.php index b0f6a662e50e3f4f2c82bccbde4a05567ba65489..bf043ef2cd1a85bf2f1fd1a0e5e7b923e6f255a8 100644 --- a/typo3/sysext/frontend/Configuration/RequestMiddlewares.php +++ b/typo3/sysext/frontend/Configuration/RequestMiddlewares.php @@ -23,17 +23,10 @@ return [ ] ], /** internal: do not use or reference this middleware in your own code, as this will be possibly be removed */ - 'typo3/cms-frontend/preprocessing' => [ - 'target' => \TYPO3\CMS\Frontend\Middleware\PreprocessRequestHook::class, - 'after' => [ - 'typo3/cms-core/normalized-params-attribute', - ] - ], - /** internal: do not use or reference this middleware in your own code, as this will be possibly be removed */ 'typo3/cms-frontend/eid' => [ 'target' => \TYPO3\CMS\Frontend\Middleware\EidHandler::class, 'after' => [ - 'typo3/cms-frontend/preprocessing' + 'typo3/cms-core/normalized-params-attribute', ] ], 'typo3/cms-frontend/maintenance-mode' => [ diff --git a/typo3/sysext/frontend/Tests/Unit/Http/RequestHandlerTest.php b/typo3/sysext/frontend/Tests/Unit/Http/RequestHandlerTest.php index 784d11449f3020a9ba103a8d34c753a82b1863fc..4590cdc42ae953d7b4306dc59a359334ca7b1005 100644 --- a/typo3/sysext/frontend/Tests/Unit/Http/RequestHandlerTest.php +++ b/typo3/sysext/frontend/Tests/Unit/Http/RequestHandlerTest.php @@ -420,153 +420,6 @@ class RequestHandlerTest extends UnitTestCase $pageRendererProphecy->setMetaTag($expectedTags[1]['type'], $expectedTags[1]['name'], $expectedTags[1]['content'], [], false)->shouldHaveBeenCalled(); } - /** - * Test if the method is called, and the object is still the same. - * - * @test - */ - public function addModifiedGlobalsToIncomingRequestFindsSameObject() - { - GeneralUtility::flushInternalRuntimeCaches(); - $_SERVER['REQUEST_METHOD'] = 'POST'; - $_SERVER['HTTP_HOST'] = 'https://www.example.com/my/path/'; - $_GET = ['foo' => '1']; - $_POST = ['bar' => 'yo']; - $request = ServerRequestFactory::fromGlobals(); - $request = $request->withAttribute('_originalGetParameters', $_GET); - $request = $request->withAttribute('_originalPostParameters', $_POST); - - $subject = $this->getAccessibleMock(RequestHandler::class, ['dummy'], [], '', false); - $resultRequest = $subject->_call('addModifiedGlobalsToIncomingRequest', $request); - $this->assertSame($request, $resultRequest); - } - - /** - * @return array - */ - public function addModifiedGlobalsToIncomingRequestDataProvider() - { - return [ - 'No parameters have been modified via hook or middleware' => [ - ['batman' => '1'], - ['no_cache' => 1], - // Enriched within PSR-7 query params + parsed body - [], - [], - // modified GET / POST parameters - [], - [], - // expected merged results - ['batman' => '1'], - ['no_cache' => 1], - ], - 'No parameters have been modified via hook' => [ - ['batman' => '1'], - [], - // Enriched within PSR-7 query params + parsed body - ['ARD' => 'TV', 'Oscars' => 'Cinema'], - ['no_cache' => '1'], - // modified GET / POST parameters - [], - [], - // expected merged results - ['batman' => '1', 'ARD' => 'TV', 'Oscars' => 'Cinema'], - ['no_cache' => 1], - ], - 'Hooks and Middlewares modified' => [ - ['batman' => '1'], - [], - // Enriched within PSR-7 query params + parsed body - ['ARD' => 'TV', 'Oscars' => 'Cinema'], - ['no_cache' => '1'], - // modified GET / POST parameters - ['batman' => '1', 'add_via_hook' => 'yes'], - ['submitForm' => 'download now'], - // expected merged results - ['batman' => '1', 'add_via_hook' => 'yes', 'ARD' => 'TV', 'Oscars' => 'Cinema'], - ['submitForm' => 'download now', 'no_cache' => 1], - ], - 'Hooks and Middlewares modified with middleware overruling hooks' => [ - ['batman' => '1'], - [], - // Enriched within PSR-7 query params + parsed body - ['ARD' => 'TV', 'Oscars' => 'Cinema'], - ['no_cache' => '1'], - // modified GET / POST parameters - ['batman' => '0', 'add_via_hook' => 'yes'], - ['submitForm' => 'download now', 'no_cache' => 0], - // expected merged results - ['batman' => '1', 'add_via_hook' => 'yes', 'ARD' => 'TV', 'Oscars' => 'Cinema'], - ['submitForm' => 'download now', 'no_cache' => 1], - ], - 'Hooks and Middlewares modified with middleware overruling hooks with nested parameters' => [ - ['batman' => '1'], - [['tx_siteexample_pi2' => ['uid' => 13]]], - // Enriched within PSR-7 query params + parsed body - ['ARD' => 'TV', 'Oscars' => 'Cinema', ['tx_blogexample_pi1' => ['uid' => 123]]], - ['no_cache' => '1', ['tx_siteexample_pi2' => ['name' => 'empty-tail']]], - // modified GET / POST parameters - ['batman' => '0', 'add_via_hook' => 'yes', ['tx_blogexample_pi1' => ['uid' => 234]]], - ['submitForm' => 'download now', 'no_cache' => 0], - // expected merged results - ['batman' => '1', 'add_via_hook' => 'yes', 'ARD' => 'TV', 'Oscars' => 'Cinema', ['tx_blogexample_pi1' => ['uid' => 123]]], - ['submitForm' => 'download now', 'no_cache' => '1', ['tx_siteexample_pi2' => ['uid' => 13, 'name' => 'empty-tail']]], - ], - ]; - } - - /** - * Test if the method modifies GET and POST to the expected result, when enriching an object. - * - * @param array $initialGetParams - * @param array $initialPostParams - * @param array $addedQueryParams - * @param array $addedParsedBody - * @param array $modifiedGetParams - * @param array $modifiedPostParams - * @param array $expectedQueryParams - * @param array $expectedParsedBody - * @dataProvider addModifiedGlobalsToIncomingRequestDataProvider - * @test - */ - public function addModifiedGlobalsToIncomingRequestModifiesObject( - $initialGetParams, - $initialPostParams, - $addedQueryParams, - $addedParsedBody, - $modifiedGetParams, - $modifiedPostParams, - $expectedQueryParams, - $expectedParsedBody - ) { - GeneralUtility::flushInternalRuntimeCaches(); - $_SERVER['REQUEST_METHOD'] = 'POST'; - $_SERVER['HTTP_HOST'] = 'https://www.example.com/my/path/'; - $_GET = $initialGetParams; - $_POST = $initialPostParams; - $request = ServerRequestFactory::fromGlobals(); - $request = $request->withAttribute('_originalGetParameters', $initialGetParams); - $request = $request->withAttribute('_originalPostParameters', $initialPostParams); - - // Now enriching the request object with other GET / POST parameters - $queryParams = $request->getQueryParams(); - $queryParams = array_replace_recursive($queryParams, $addedQueryParams); - $request = $request->withQueryParams($queryParams); - $parsedBody = $request->getParsedBody() ?? []; - $parsedBody = array_replace_recursive($parsedBody, $addedParsedBody); - $request = $request->withParsedBody($parsedBody); - - // Now overriding GET and POST parameters - $_GET = $modifiedGetParams; - $_POST = $modifiedPostParams; - - $subject = $this->getAccessibleMock(RequestHandler::class, ['dummy'], [], '', false); - $subject->_set('timeTracker', new TimeTracker(false)); - $resultRequest = $subject->_call('addModifiedGlobalsToIncomingRequest', $request); - $this->assertEquals($expectedQueryParams, $resultRequest->getQueryParams()); - $this->assertEquals($expectedParsedBody, $resultRequest->getParsedBody()); - } - /** * Test if the method is called, and the globals are still the same after calling the method *