[FEATURE] Create an Exception hierarchy for HTTP Status Exceptions
authorSteffen Gebert <steffen.gebert@typo3.org>
Fri, 1 Apr 2011 10:13:20 +0000 (12:13 +0200)
committerSusanne Moog <typo3@susannemoog.de>
Sun, 10 Apr 2011 15:07:38 +0000 (17:07 +0200)
This change creates an Exception hierarchy for the most frequently used
cases, when a request should be canceled with an Error 40x/50x.

Change-Id: If68f5f1f975b34c97b00a6a82c7eb47f38dc08cb
Resolves: #25697
Reviewed-on: http://review.typo3.org/1396
Reviewed-by: Helmut Hummel
Tested-by: Helmut Hummel
Reviewed-by: Susanne Moog
Tested-by: Susanne Moog
t3lib/core_autoload.php
t3lib/error/class.t3lib_error_abstractexceptionhandler.php
t3lib/error/class.t3lib_error_debugexceptionhandler.php
t3lib/error/class.t3lib_error_productionexceptionhandler.php
t3lib/error/http/class.t3lib_error_http_badrequestexception.php [new file with mode: 0644]
t3lib/error/http/class.t3lib_error_http_forbiddenexception.php [new file with mode: 0644]
t3lib/error/http/class.t3lib_error_http_pagenotfoundexception.php [new file with mode: 0644]
t3lib/error/http/class.t3lib_error_http_serviceunavailableexception.php [new file with mode: 0644]
t3lib/error/http/class.t3lib_error_http_statusexception.php [new file with mode: 0644]
t3lib/error/http/class.t3lib_error_http_unauthorizedexception.php [new file with mode: 0644]

index ba96fa7..1dc03a3 100644 (file)
@@ -120,6 +120,12 @@ $t3libClasses = array(
        't3lib_error_productionexceptionhandler' => PATH_t3lib . 'error/class.t3lib_error_productionexceptionhandler.php',
        't3lib_error_errorhandlerinterface' => PATH_t3lib . 'error/interface.t3lib_error_errorhandlerinterface.php',
        't3lib_error_exceptionhandlerinterface' => PATH_t3lib . 'error/interface.t3lib_error_exceptionhandlerinterface.php',
+       't3lib_error_http_statusexception' => PATH_t3lib . 'error/http/class.t3lib_error_http_statusexception.php',
+       't3lib_error_http_badrequestexception' => PATH_t3lib . 'error/http/class.t3lib_error_http_badrequestexception.php',
+       't3lib_error_http_unauthorizedexception' => PATH_t3lib . 'error/http/class.t3lib_error_http_unauthorizedexception.php',
+       't3lib_error_http_forbiddenexception' => PATH_t3lib . 'error/http/class.t3lib_error_http_forbiddenexception.php',
+       't3lib_error_http_pagenotfoundexception' => PATH_t3lib . 'error/http/class.t3lib_error_http_pagenotfoundexception.php',
+       't3lib_error_http_serviceunavailableexception' => PATH_t3lib . 'error/http/class.t3lib_error_http_serviceunavailableexception.php',
        't3lib_browselinkshook' => PATH_t3lib . 'interfaces/interface.t3lib_browselinkshook.php',
        't3lib_extfilefunctions_processdatahook' => PATH_t3lib . 'interfaces/interface.t3lib_extfilefunctions_processdatahook.php',
        't3lib_formprotection_factory' => PATH_t3lib . 'formprotection/class.t3lib_formprotection_factory.php',
index 46f72ac..be5de69 100644 (file)
@@ -137,7 +137,25 @@ abstract class t3lib_error_AbstractExceptionHandler implements t3lib_error_Excep
                }
        }
 
-
+       /**
+        * Sends the HTTP Status 500 code, if $exception is *not* a t3lib_error_http_StatusException
+        * and headers are not sent, yet.
+        *
+        * @param Exception $exception
+        * @return void
+        */
+       protected function sendStatusHeaders(Exception $exception) {
+               if (method_exists($exception, 'getStatusHeaders')) {
+                       $headers = $exception->getStatusHeaders();
+               } else {
+                       $headers = array(t3lib_utility_Http::HTTP_STATUS_500);
+               }
+               if (!headers_sent()) {
+                       foreach($headers as $header) {
+                               header($header);
+                       }
+               }
+       }
 }
 
 if (defined('TYPO3_MODE') && isset($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['t3lib/error/class.t3lib_error_abstractexceptionhandler.php'])) {
index cd83414..4001dbf 100644 (file)
@@ -52,9 +52,7 @@ class t3lib_error_DebugExceptionHandler extends t3lib_error_AbstractExceptionHan
         * @author Robert Lemke <robert@typo3.org>
         */
        public function echoExceptionWeb(Exception $exception) {
-               if (!headers_sent()) {
-                       header("HTTP/1.1 500 Internal Server Error");
-               }
+               $this->sendStatusHeaders($exception);
 
                $filePathAndName = $exception->getFile();
 
index d6576c4..3b0e62d 100644 (file)
@@ -49,9 +49,8 @@ class t3lib_error_ProductionExceptionHandler extends t3lib_error_AbstractExcepti
         * @return void
         */
        public function echoExceptionWeb(Exception $exception) {
-               if (!headers_sent()) {
-                       header("HTTP/1.1 500 Internal Server Error");
-               }
+               $this->sendStatusHeaders($exception);
+
                $this->writeLogEntries($exception, self::CONTEXT_WEB);
 
                if ($exception->getCode() > 0) {
@@ -61,8 +60,13 @@ class t3lib_error_ProductionExceptionHandler extends t3lib_error_AbstractExcepti
                        $moreInformationLink = '';
                }
 
+               $title = 'Oops, an error occurred!';
+
+               if (method_exists($exception, 'getTitle') && strlen($exception->getTitle()) > 0) {
+                       $title = $exception->getTitle();
+               }
                        // we use a nice-looking title for our visitors instead of the exception's class name
-               $messageObj = t3lib_div::makeInstance('t3lib_message_ErrorPageMessage', $exception->getMessage() . $moreInformationLink, 'Oops, an error occured!');
+               $messageObj = t3lib_div::makeInstance('t3lib_message_ErrorPageMessage', $exception->getMessage() . $moreInformationLink, $title);
                $messageObj->output();
        }
 
diff --git a/t3lib/error/http/class.t3lib_error_http_badrequestexception.php b/t3lib/error/http/class.t3lib_error_http_badrequestexception.php
new file mode 100644 (file)
index 0000000..2a84273
--- /dev/null
@@ -0,0 +1,68 @@
+<?php
+/***************************************************************
+ *  Copyright notice
+ *
+ *  (c) 2011 Steffen Gebert <steffen.gebert@typo3.org>
+ *  All rights reserved
+ *
+ *  This script is part of the TYPO3 project. The TYPO3 project is
+ *  free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  The GNU General Public License can be found at
+ *  http://www.gnu.org/copyleft/gpl.html.
+ *
+ *  This script is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  This copyright notice MUST APPEAR in all copies of the script!
+ ***************************************************************/
+
+/**
+ * Exception for Error 400 - Bad Request
+ *
+ * @author     Steffen Gebert <steffen.gebert@typo3.org>
+ * @package TYPO3
+ * @subpackage error
+ */
+class t3lib_error_http_BadRequestException extends t3lib_error_http_StatusException {
+
+       /**
+        * @var array HTTP Status Header lines
+        */
+       protected $statusHeaders = array(t3lib_utility_Http::HTTP_STATUS_400);
+
+       /**
+        * @var string Title of the message
+        */
+       protected $title = 'Bad Request (400)';
+
+       /**
+        * @var string Error Message
+        */
+       protected $message = 'The request cannot be fulfilled due to bad syntax.';
+
+       /**
+        * Constructor for this Status Exception
+        *
+        * @param string $message Error Message
+        * @param int $code Exception Code
+        */
+       public function __construct($message = NULL, $code = 0) {
+               if (!empty($message)) {
+                       $this->message = $message;
+               }
+
+               parent::__construct($this->statusHeaders, $this->message, $this->title, $code);
+       }
+}
+
+if (defined('TYPO3_MODE') && isset($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['t3lib/error/t3lib_error_http_badrequestexecption.php'])) {
+       include_once($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['t3lib/error/t3lib_error_http_badrequestexecption.php']);
+}
+
+?>
\ No newline at end of file
diff --git a/t3lib/error/http/class.t3lib_error_http_forbiddenexception.php b/t3lib/error/http/class.t3lib_error_http_forbiddenexception.php
new file mode 100644 (file)
index 0000000..cc19662
--- /dev/null
@@ -0,0 +1,68 @@
+<?php
+/***************************************************************
+ *  Copyright notice
+ *
+ *  (c) 2011 Steffen Gebert <steffen.gebert@typo3.org>
+ *  All rights reserved
+ *
+ *  This script is part of the TYPO3 project. The TYPO3 project is
+ *  free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  The GNU General Public License can be found at
+ *  http://www.gnu.org/copyleft/gpl.html.
+ *
+ *  This script is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  This copyright notice MUST APPEAR in all copies of the script!
+ ***************************************************************/
+
+/**
+ * Exception for Error 403 - Forbidden
+ *
+ * @author     Steffen Gebert <steffen.gebert@typo3.org>
+ * @package TYPO3
+ * @subpackage error
+ */
+class t3lib_error_http_ForbiddenException extends t3lib_error_http_StatusException {
+
+       /**
+        * @var array HTTP Status Header lines
+        */
+       protected $statusHeaders = array(t3lib_utility_Http::HTTP_STATUS_403);
+
+       /**
+        * @var string Title of the message
+        */
+       protected $title = 'Forbidden (403)';
+
+       /**
+        * @var string Error Message
+        */
+       protected $message = 'You are not allowed to access this page.';
+
+       /**
+        * Constructor for this Status Exception
+        *
+        * @param string $message Error Message
+        * @param int $code Exception Code
+        */
+       public function __construct($message = NULL, $code = 0) {
+               if (!empty($message)) {
+                       $this->message = $message;
+               }
+
+               parent::__construct($this->statusHeaders, $this->message, $this->title, $code);
+       }
+}
+
+if (defined('TYPO3_MODE') && isset($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['t3lib/error/t3lib_error_http_forbiddenexecption.php'])) {
+       include_once($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['t3lib/error/t3lib_error_http_forbiddenexecption.php']);
+}
+
+?>
\ No newline at end of file
diff --git a/t3lib/error/http/class.t3lib_error_http_pagenotfoundexception.php b/t3lib/error/http/class.t3lib_error_http_pagenotfoundexception.php
new file mode 100644 (file)
index 0000000..a8c32ad
--- /dev/null
@@ -0,0 +1,67 @@
+<?php
+/***************************************************************
+ *  Copyright notice
+ *
+ *  (c) 2011 Steffen Gebert <steffen.gebert@typo3.org>
+ *  All rights reserved
+ *
+ *  This script is part of the TYPO3 project. The TYPO3 project is
+ *  free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  The GNU General Public License can be found at
+ *  http://www.gnu.org/copyleft/gpl.html.
+ *
+ *  This script is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  This copyright notice MUST APPEAR in all copies of the script!
+ ***************************************************************/
+
+/**
+ * Exception for Error 404 - Page Not Found
+ *
+ * @author     Steffen Gebert <steffen.gebert@typo3.org>
+ * @package TYPO3
+ * @subpackage error
+ */
+class t3lib_error_http_PageNotFoundException extends t3lib_error_http_StatusException {
+
+       /**
+        * @var array HTTP Status Header lines
+        */
+       protected $statusHeaders = array(t3lib_utility_Http::HTTP_STATUS_404);
+
+       /**
+        * @var string Title of the message
+        */
+       protected $title = 'Page Not Found (404)';
+
+       /**
+        * @var string Error Message
+        */
+       protected $message = 'The page you tried to access was not found.';
+
+       /**
+        * Constructor for this Status Exception
+        *
+        * @param string $message Error Message
+        * @param int $code Exception Code
+        */
+       public function __construct($message = NULL, $code = 0) {
+               if (!empty($message)) {
+                       $this->message = $message;
+               }
+
+               parent::__construct($this->statusHeaders, $this->message, $this->title, $code);
+       }
+}
+if (defined('TYPO3_MODE') && isset($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['t3lib/error/t3lib_error_http_pagenotfoundexecption.php'])) {
+       include_once($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['t3lib/error/t3lib_error_http_pagenotfoundexecption.php']);
+}
+
+?>
\ No newline at end of file
diff --git a/t3lib/error/http/class.t3lib_error_http_serviceunavailableexception.php b/t3lib/error/http/class.t3lib_error_http_serviceunavailableexception.php
new file mode 100644 (file)
index 0000000..26026c4
--- /dev/null
@@ -0,0 +1,68 @@
+<?php
+/***************************************************************
+ *  Copyright notice
+ *
+ *  (c) 2011 Steffen Gebert <steffen.gebert@typo3.org>
+ *  All rights reserved
+ *
+ *  This script is part of the TYPO3 project. The TYPO3 project is
+ *  free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  The GNU General Public License can be found at
+ *  http://www.gnu.org/copyleft/gpl.html.
+ *
+ *  This script is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  This copyright notice MUST APPEAR in all copies of the script!
+ ***************************************************************/
+
+/**
+ * Exception for Error 503 - Service Unavailable
+ *
+ * @author     Steffen Gebert <steffen.gebert@typo3.org>
+ * @package TYPO3
+ * @subpackage error
+ */
+class t3lib_error_http_ServiceUnavailableException extends t3lib_error_http_StatusException {
+
+       /**
+        * @var array HTTP Status Header lines
+        */
+       protected $statusHeaders = array(t3lib_utility_Http::HTTP_STATUS_503);
+
+       /**
+        * @var string Title of the message
+        */
+       protected $title = 'Service Unvailable (503)';
+
+       /**
+        * @var string Error Message
+        */
+       protected $message = 'This page is currently not available.';
+
+       /**
+        * Constructor for this Status Exception
+        *
+        * @param string $message Error Message
+        * @param int $code Exception Code
+        */
+       public function __construct($message = NULL, $code = 0) {
+               if (!empty($message)) {
+                       $this->message = $message;
+               }
+
+               parent::__construct($this->statusHeaders, $this->message, $this->title, $code);
+       }
+}
+
+if (defined('TYPO3_MODE') && isset($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['t3lib/error/t3lib_error_http_serviceunavailableexception.php'])) {
+       include_once($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['t3lib/error/t3lib_error_http_serviceunavailableexception.php']);
+}
+
+?>
\ No newline at end of file
diff --git a/t3lib/error/http/class.t3lib_error_http_statusexception.php b/t3lib/error/http/class.t3lib_error_http_statusexception.php
new file mode 100644 (file)
index 0000000..838ceb2
--- /dev/null
@@ -0,0 +1,95 @@
+<?php
+/***************************************************************
+ *  Copyright notice
+ *
+ *  (c) 2011 Steffen Gebert <steffen.gebert@typo3.org>
+ *  All rights reserved
+ *
+ *  This script is part of the TYPO3 project. The TYPO3 project is
+ *  free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  The GNU General Public License can be found at
+ *  http://www.gnu.org/copyleft/gpl.html.
+ *
+ *  This script is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  This copyright notice MUST APPEAR in all copies of the script!
+ ***************************************************************/
+
+/**
+ * HTTP Status Exception
+ *
+ * @author     Steffen Gebert <steffen.gebert@typo3.org>
+ * @package TYPO3
+ * @subpackage error
+ */
+class t3lib_error_http_StatusException extends t3lib_error_Exception {
+
+       /**
+        * @var array HTTP Status Header lines
+        */
+       protected $statusHeaders;
+
+       /**
+        * @var string Title of the message
+        */
+       protected $title = 'Oops, an error occurred!';
+
+       /**
+        * Constructor for this Status Exception
+        *
+        * @param string|array $statusHeaders HTTP Status header line(s)
+        * @param string $title Title of the error message
+        * @param string $message Error Message
+        * @param int $code Exception Code
+        */
+       public function __construct($statusHeaders, $message, $title = '', $code = 0) {
+               if (is_array($statusHeaders)) {
+                       $this->statusHeaders = $statusHeaders;
+               } else {
+                       $this->statusHeaders = array($statusHeaders);
+               }
+               $this->title = $title ? $title : $this->title;
+               parent::__construct($message, $code);
+       }
+
+       /**
+        * Setter for the title.
+        *
+        * @param  string $title
+        * @return void
+        */
+       public function setTitle($title) {
+               $this->title = $title;
+       }
+
+       /**
+        * Getter for the title.
+        *
+        * @return string
+        */
+       public function getTitle() {
+               return $this->title;
+       }
+
+       /**
+        * Getter for the Status Header.
+        *
+        * @return string
+        */
+       public function getStatusHeaders() {
+               return $this->statusHeaders;
+       }
+}
+
+if (defined('TYPO3_MODE') && isset($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['t3lib/error/t3lib_error_http_statusexception'])) {
+       include_once($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['t3lib/error/t3lib_error_http_statusexception']);
+}
+
+?>
\ No newline at end of file
diff --git a/t3lib/error/http/class.t3lib_error_http_unauthorizedexception.php b/t3lib/error/http/class.t3lib_error_http_unauthorizedexception.php
new file mode 100644 (file)
index 0000000..ee5bca4
--- /dev/null
@@ -0,0 +1,68 @@
+<?php
+/***************************************************************
+ *  Copyright notice
+ *
+ *  (c) 2011 Steffen Gebert <steffen.gebert@typo3.org>
+ *  All rights reserved
+ *
+ *  This script is part of the TYPO3 project. The TYPO3 project is
+ *  free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  The GNU General Public License can be found at
+ *  http://www.gnu.org/copyleft/gpl.html.
+ *
+ *  This script is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  This copyright notice MUST APPEAR in all copies of the script!
+ ***************************************************************/
+
+/**
+ * Exception for Error 401 - Unauthorized
+ *
+ * @author     Steffen Gebert <steffen.gebert@typo3.org>
+ * @package TYPO3
+ * @subpackage error
+ */
+class t3lib_error_http_UnauthorizedException extends t3lib_error_http_StatusException {
+
+       /**
+        * @var array HTTP Status Header lines
+        */
+       protected $statusHeaders = array(t3lib_utility_Http::HTTP_STATUS_401);
+
+       /**
+        * @var string Title of the message
+        */
+       protected $title = 'Unauthorized (401)';
+
+       /**
+        * @var string Error Message
+        */
+       protected $message = 'Accessing this page requires authorization.';
+
+       /**
+        * Constructor for this Status Exception
+        *
+        * @param string $message Error Message
+        * @param int $code Exception Code
+        */
+       public function __construct($message = NULL, $code = 0) {
+               if (!empty($message)) {
+                       $this->message = $message;
+               }
+
+               parent::__construct($this->statusHeaders, $this->message, $this->title, $code);
+       }
+}
+
+if (defined('TYPO3_MODE') && isset($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['t3lib/error/t3lib_error_http_unauthorizedexecption.php'])) {
+       include_once($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['t3lib/error/t3lib_error_http_unauthorizedexecption.php']);
+}
+
+?>
\ No newline at end of file