controller = $controller ?: $GLOBALS['TSFE']; $this->timeTracker = $timeTracker ?: GeneralUtility::makeInstance(TimeTracker::class); } /** * Initialize TypoScriptFrontendController to the point right before rendering of the page is triggered * * @param ServerRequestInterface $request * @param PsrRequestHandlerInterface $handler * @return ResponseInterface */ public function process(ServerRequestInterface $request, PsrRequestHandlerInterface $handler): ResponseInterface { // Get from cache $this->timeTracker->push('Get Page from cache'); // Locks may be acquired here $this->controller->getFromCache(); $this->timeTracker->pull(); // Get config if not already gotten // After this, we should have a valid config-array ready $this->controller->getConfigArray(); // Merge Query Parameters with config.defaultGetVars // This is done in getConfigArray as well, but does not override the current middleware request object // Since we want to stay in sync with this, the option needs to be set as well. $pageArguments = $request->getAttribute('routing'); if (!empty($this->controller->config['config']['defaultGetVars.'] ?? null)) { $modifiedGetVars = GeneralUtility::removeDotsFromTS($this->controller->config['config']['defaultGetVars.']); if ($pageArguments instanceof PageArguments) { $pageArguments = $pageArguments->withQueryArguments($modifiedGetVars); $this->controller->setPageArguments($pageArguments); $request = $request->withAttribute('routing', $pageArguments); } if (!empty($request->getQueryParams())) { ArrayUtility::mergeRecursiveWithOverrule($modifiedGetVars, $request->getQueryParams()); } $request = $request->withQueryParams($modifiedGetVars); $GLOBALS['TYPO3_REQUEST'] = $request; } // Setting language and locale $this->timeTracker->push('Setting language and locale'); $this->controller->settingLanguage(); $this->controller->settingLocale(); $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; $parsedBody = $request->getParsedBody(); $this->convertCharsetRecursivelyToUtf8($parsedBody, $this->controller->metaCharset); $request = $request->withParsedBody($parsedBody); $GLOBALS['TYPO3_REQUEST'] = $request; } // @deprecated since TYPO3 v9.3, will be removed in TYPO3 v10.0 $this->controller->initializeRedirectUrlHandlers(true); return $handler->handle($request); } /** * Small helper function to convert charsets for arrays to UTF-8 * * @param mixed $data given by reference (string/array usually) * @param string $fromCharset convert FROM this charset */ protected function convertCharsetRecursivelyToUtf8(&$data, string $fromCharset) { foreach ($data as $key => $value) { if (is_array($data[$key])) { $this->convertCharsetRecursivelyToUtf8($data[$key], $fromCharset); } elseif (is_string($data[$key])) { $data[$key] = mb_convert_encoding($data[$key], 'utf-8', $fromCharset); } } } }