[BUGFIX] Respect HTTP headers from JsonView 39/34839/8
authorHelmut Hummel <helmut.hummel@typo3.org>
Sun, 30 Nov 2014 22:16:46 +0000 (23:16 +0100)
committerMarkus Klein <klein.t3@reelworx.at>
Sun, 18 Jan 2015 13:22:08 +0000 (14:22 +0100)
When rendering the json view, headers are set to the response
which are then sent by Extbase after the plugin is rendered.

However this takes place before the core (TypoScriptFrontendController)
sends the same header unless deactivated.

This change adds a new property to TypoScriptFrontendController to
be able for plugins to set the content type header to be sent.

Additionally the JsonView now makes use of this.

This is a temporary solution unless we have a proper
request/response model for frontend rendering.

Releases: master
Resolves: #60624
Change-Id: I29fa92e21495864a3c7777bbb0bc8e375267850e
Reviewed-on: http://review.typo3.org/34839
Reviewed-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Tested-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Reviewed-by: Stefan Neufeind <typo3.neufeind@speedpartner.de>
Reviewed-by: Markus Klein <klein.t3@reelworx.at>
Tested-by: Markus Klein <klein.t3@reelworx.at>
typo3/sysext/extbase/Classes/Mvc/View/JsonView.php
typo3/sysext/frontend/Classes/Controller/TypoScriptFrontendController.php

index 57e3c43..c3dd0c0 100644 (file)
@@ -15,6 +15,7 @@ namespace TYPO3\CMS\Extbase\Mvc\View;
  */
 
 use TYPO3\CMS\Extbase\Mvc\Web\Response as WebResponse;
+use TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController;
 
 /**
  * A JSON view
@@ -194,7 +195,23 @@ class JsonView extends AbstractView {
        public function render() {
                $response = $this->controllerContext->getResponse();
                if ($response instanceof WebResponse) {
-                       $response->setHeader('Content-Type', 'application/json');
+                       // @todo Ticket: #63643 This should be solved differently once request/response model is available for TSFE.
+                       if (!empty($GLOBALS['TSFE']) && $GLOBALS['TSFE'] instanceof TypoScriptFrontendController) {
+                               /** @var TypoScriptFrontendController $typoScriptFrontendController */
+                               $typoScriptFrontendController = $GLOBALS['TSFE'];
+                               if (empty($typoScriptFrontendController->config['config']['disableCharsetHeader'])) {
+                                       // If the charset header is *not* disabled in configuration,
+                                       // TypoScriptFrontendController will send the header later with the Content-Type which we set here.
+                                       $typoScriptFrontendController->setContentType('application/json');
+                               } else {
+                                       // Although the charset header is disabled in configuration, we *must* send a Content-Type header here.
+                                       // Content-Type headers optionally carry charset information at the same time.
+                                       // Since we have the information about the charset, there is no reason to not include the charset information although disabled in TypoScript.
+                                       $response->setHeader('Content-Type', 'application/json; charset=' . trim($typoScriptFrontendController->metaCharset));
+                               }
+                       } else {
+                               $response->setHeader('Content-Type', 'application/json');
+                       }
                }
                $propertiesToRender = $this->renderArray();
                return json_encode($propertiesToRender);
index c076046..bd5cafd 100644 (file)
@@ -724,7 +724,7 @@ class TypoScriptFrontendController {
         * Internal charset of the frontend during rendering. (Default: UTF-8)
         * @var string
         */
-       public $renderCharset = '';
+       public $renderCharset = 'utf-8';
 
        /**
         * Output charset of the websites content. This is the charset found in the
@@ -732,7 +732,7 @@ class TypoScriptFrontendController {
         * happens before output to browser. Defaults to ->renderCharset if not set.
         * @var string
         */
-       public $metaCharset = '';
+       public $metaCharset = 'utf-8';
 
        /**
         * Assumed charset of locale strings.
@@ -810,6 +810,15 @@ class TypoScriptFrontendController {
        protected $domainDataCache = array();
 
        /**
+        * Content type HTTP header being sent in the request.
+        * @todo Ticket: #63642 Should be refactored to a request/response model later
+        * @internal Should only be used by TYPO3 core for now
+        *
+        * @var string
+        */
+       protected $contentType = 'text/html';
+
+       /**
         * Class constructor
         * Takes a number of GET/POST input variable as arguments and stores them internally.
         * The processing of these variables goes on later in this class.
@@ -859,6 +868,14 @@ class TypoScriptFrontendController {
        }
 
        /**
+        * @param string $contentType
+        * @internal Should only be used by TYPO3 core for now
+        */
+       public function setContentType($contentType) {
+               $this->contentType = $contentType;
+       }
+
+       /**
         * Connect to SQL database. May exit after outputting an error message
         * or some JavaScript redirecting to the install tool.
         *
@@ -3605,7 +3622,7 @@ class TypoScriptFrontendController {
        public function processOutput() {
                // Set header for charset-encoding unless disabled
                if (empty($this->config['config']['disableCharsetHeader'])) {
-                       $headLine = 'Content-Type: text/html; charset=' . trim($this->metaCharset);
+                       $headLine = 'Content-Type: ' . $this->contentType . '; charset=' . trim($this->metaCharset);
                        header($headLine);
                }
                // Set cache related headers to client (used to enable proxy / client caching!)