use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface as PsrRequestHandlerInterface;
+use TYPO3\CMS\Core\Routing\PageArguments;
use TYPO3\CMS\Core\TimeTracker\TimeTracker;
+use TYPO3\CMS\Core\Utility\ArrayUtility;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController;
* Initialization of TypoScriptFrontendController
*
* Do all necessary preparation steps for rendering
+ *
+ * @internal this middleware might get removed in TYPO3 v10.0.
*/
class PrepareTypoScriptFrontendRendering implements MiddlewareInterface
{
*/
public function process(ServerRequestInterface $request, PsrRequestHandlerInterface $handler): ResponseInterface
{
- // Starts the template
- $this->timeTracker->push('Start Template', '');
- $this->controller->initTemplate();
- $this->timeTracker->pull();
// Get from cache
- $this->timeTracker->push('Get Page 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->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
- $this->controller->convPOSTCharset();
-
- $this->controller->initializeRedirectUrlHandlers();
- $this->controller->handleDataSubmission();
+ 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);
+ }
+ }
+ }
}